Files
frigate/web/src/hooks/use-navigation.ts
T

106 lines
2.7 KiB
TypeScript
Raw Normal View History

2024-04-11 14:54:09 -06:00
import { ENV } from "@/env";
2024-11-26 13:41:49 -07:00
import { FrigateConfig } from "@/types/frigateConfig";
2024-04-11 14:54:09 -06:00
import { NavData } from "@/types/navigation";
import { useMemo } from "react";
2024-11-26 13:41:49 -07:00
import { isDesktop } from "react-device-detect";
2024-04-11 14:54:09 -06:00
import { FaCompactDisc, FaVideo } from "react-icons/fa";
2024-06-23 14:58:00 -06:00
import { IoSearch } from "react-icons/io5";
2024-04-11 14:54:09 -06:00
import { LuConstruction } from "react-icons/lu";
import { MdCategory, MdChat, MdVideoLibrary } from "react-icons/md";
2024-11-26 13:41:49 -07:00
import { TbFaceId } from "react-icons/tb";
import useSWR from "swr";
import { useIsAdmin } from "./use-is-admin";
2024-04-11 14:54:09 -06:00
2024-06-23 14:58:00 -06:00
export const ID_LIVE = 1;
export const ID_REVIEW = 2;
export const ID_EXPLORE = 3;
2024-06-23 14:58:00 -06:00
export const ID_EXPORT = 4;
2024-09-11 13:20:41 -06:00
export const ID_PLAYGROUND = 5;
2024-11-26 13:41:49 -07:00
export const ID_FACE_LIBRARY = 6;
2025-06-04 17:09:55 -06:00
export const ID_CLASSIFICATION = 7;
export const ID_CHAT = 8;
2024-06-23 14:58:00 -06:00
2024-04-11 14:54:09 -06:00
export default function useNavigation(
variant: "primary" | "secondary" = "primary",
) {
2024-11-26 13:41:49 -07:00
const { data: config } = useSWR<FrigateConfig>("config", {
revalidateOnFocus: false,
});
const isAdmin = useIsAdmin();
2024-11-26 13:41:49 -07:00
2026-05-02 17:35:42 -05:00
const hasChatAgent = useMemo(
() =>
Object.values(config?.genai ?? {}).some((agent) =>
agent?.roles?.includes("chat"),
),
[config?.genai],
);
2024-04-11 14:54:09 -06:00
return useMemo(
() =>
[
{
2024-06-23 14:58:00 -06:00
id: ID_LIVE,
2024-04-11 14:54:09 -06:00
variant,
icon: FaVideo,
2025-03-17 07:26:01 -05:00
title: "menu.live.title",
2024-04-11 14:54:09 -06:00
url: "/",
},
{
2024-06-23 14:58:00 -06:00
id: ID_REVIEW,
2024-04-11 14:54:09 -06:00
variant,
icon: MdVideoLibrary,
title: "menu.review",
2024-04-11 14:54:09 -06:00
url: "/review",
},
{
id: ID_EXPLORE,
2024-06-23 14:58:00 -06:00
variant,
icon: IoSearch,
title: "menu.explore",
url: "/explore",
2024-06-23 14:58:00 -06:00
},
{
id: ID_EXPORT,
2024-04-11 14:54:09 -06:00
variant,
icon: FaCompactDisc,
title: "menu.export",
2024-04-11 14:54:09 -06:00
url: "/export",
},
{
2024-06-23 14:58:00 -06:00
id: ID_PLAYGROUND,
2024-04-11 14:54:09 -06:00
variant,
icon: LuConstruction,
title: "menu.uiPlayground",
2024-04-11 14:54:09 -06:00
url: "/playground",
enabled: ENV !== "production",
},
2024-11-26 13:41:49 -07:00
{
id: ID_FACE_LIBRARY,
variant,
icon: TbFaceId,
title: "menu.faceLibrary",
2024-11-26 13:41:49 -07:00
url: "/faces",
enabled: isDesktop && config?.face_recognition.enabled && isAdmin,
2024-11-26 13:41:49 -07:00
},
2025-06-04 17:09:55 -06:00
{
id: ID_CLASSIFICATION,
variant,
icon: MdCategory,
title: "menu.classification",
url: "/classification",
enabled: isDesktop && isAdmin,
2025-06-04 17:09:55 -06:00
},
{
id: ID_CHAT,
variant,
icon: MdChat,
title: "menu.chat",
url: "/chat",
2026-05-02 17:35:42 -05:00
enabled: isDesktop && isAdmin && hasChatAgent,
},
2024-04-11 14:54:09 -06:00
] as NavData[],
2026-05-02 17:35:42 -05:00
[config?.face_recognition?.enabled, hasChatAgent, variant, isAdmin],
2024-04-11 14:54:09 -06:00
);
}