diff --git a/web/src/components/filter/ReviewActionGroup.tsx b/web/src/components/filter/ReviewActionGroup.tsx index 54f69ba62..31c5a56f4 100644 --- a/web/src/components/filter/ReviewActionGroup.tsx +++ b/web/src/components/filter/ReviewActionGroup.tsx @@ -19,6 +19,7 @@ import { import useKeyboardListener from "@/hooks/use-keyboard-listener"; import { Trans, useTranslation } from "react-i18next"; import { toast } from "sonner"; +import { useIsAdmin } from "@/hooks/use-is-admin"; type ReviewActionGroupProps = { selectedReviews: ReviewSegment[]; @@ -33,6 +34,7 @@ export default function ReviewActionGroup({ pullLatestData, }: ReviewActionGroupProps) { const { t } = useTranslation(["components/dialog"]); + const isAdmin = useIsAdmin(); const onClearSelected = useCallback(() => { setSelectedReviews([]); }, [setSelectedReviews]); @@ -185,21 +187,23 @@ export default function ReviewActionGroup({ )} - + {isAdmin && ( + + )} diff --git a/web/src/components/filter/SearchActionGroup.tsx b/web/src/components/filter/SearchActionGroup.tsx index 0ba024792..cea02377d 100644 --- a/web/src/components/filter/SearchActionGroup.tsx +++ b/web/src/components/filter/SearchActionGroup.tsx @@ -16,6 +16,7 @@ import { import useKeyboardListener from "@/hooks/use-keyboard-listener"; import { toast } from "sonner"; import { Trans, useTranslation } from "react-i18next"; +import { useIsAdmin } from "@/hooks/use-is-admin"; type SearchActionGroupProps = { selectedObjects: string[]; @@ -28,6 +29,7 @@ export default function SearchActionGroup({ pullLatestData, }: SearchActionGroupProps) { const { t } = useTranslation(["components/filter"]); + const isAdmin = useIsAdmin(); const onClearSelected = useCallback(() => { setSelectedObjects([]); }, [setSelectedObjects]); @@ -123,23 +125,25 @@ export default function SearchActionGroup({ {t("button.unselect", { ns: "common" })} -
- -
+ {isAdmin && ( +
+ +
+ )} ); diff --git a/web/src/components/menu/SearchResultActions.tsx b/web/src/components/menu/SearchResultActions.tsx index 623005220..976c71d32 100644 --- a/web/src/components/menu/SearchResultActions.tsx +++ b/web/src/components/menu/SearchResultActions.tsx @@ -31,6 +31,7 @@ import { import useSWR from "swr"; import { Trans, useTranslation } from "react-i18next"; import BlurredIconButton from "../button/BlurredIconButton"; +import { useIsAdmin } from "@/hooks/use-is-admin"; type SearchResultActionsProps = { searchResult: SearchResult; @@ -52,6 +53,7 @@ export default function SearchResultActions({ children, }: SearchResultActionsProps) { const { t } = useTranslation(["views/explore"]); + const isAdmin = useIsAdmin(); const { data: config } = useSWR("config"); @@ -137,7 +139,8 @@ export default function SearchResultActions({ {t("itemMenu.findSimilar.label")} )} - {config?.semantic_search?.enabled && + {isAdmin && + config?.semantic_search?.enabled && searchResult.data.type == "object" && ( {t("itemMenu.addTrigger.label")} )} - setDeleteDialogOpen(true)} - > - {t("button.delete", { ns: "common" })} - + {isAdmin && ( + setDeleteDialogOpen(true)} + > + {t("button.delete", { ns: "common" })} + + )} ); diff --git a/web/src/components/overlay/detail/DetailActionsMenu.tsx b/web/src/components/overlay/detail/DetailActionsMenu.tsx index ca85fd550..ee4184d0f 100644 --- a/web/src/components/overlay/detail/DetailActionsMenu.tsx +++ b/web/src/components/overlay/detail/DetailActionsMenu.tsx @@ -15,6 +15,7 @@ import { import { HiDotsHorizontal } from "react-icons/hi"; import { SearchResult } from "@/types/search"; import { FrigateConfig } from "@/types/frigateConfig"; +import { useIsAdmin } from "@/hooks/use-is-admin"; type Props = { search: SearchResult | Event; @@ -35,6 +36,7 @@ export default function DetailActionsMenu({ const { t } = useTranslation(["views/explore", "views/faceLibrary"]); const navigate = useNavigate(); const [isOpen, setIsOpen] = useState(false); + const isAdmin = useIsAdmin(); const clipTimeRange = useMemo(() => { const startTime = (search.start_time ?? 0) - REVIEW_PADDING; @@ -130,22 +132,24 @@ export default function DetailActionsMenu({ )} - {config?.semantic_search.enabled && search.data.type == "object" && ( - { - setIsOpen(false); - setTimeout(() => { - navigate( - `/settings?page=triggers&camera=${search.camera}&event_id=${search.id}`, - ); - }, 0); - }} - > -
- {t("itemMenu.addTrigger.label")} -
-
- )} + {isAdmin && + config?.semantic_search.enabled && + search.data.type == "object" && ( + { + setIsOpen(false); + setTimeout(() => { + navigate( + `/settings?page=triggers&camera=${search.camera}&event_id=${search.id}`, + ); + }, 0); + }} + > +
+ {t("itemMenu.addTrigger.label")} +
+
+ )}