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" && (
)}
-
+ {isAdmin && (
+
+ )}
>
);
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")}
+
+
+ )}