import { useState, ReactNode } from "react"; import { SearchResult } from "@/types/search"; import { FrigateConfig } from "@/types/frigateConfig"; import { baseUrl } from "@/api/baseUrl"; import { toast } from "sonner"; import axios from "axios"; import { LuCamera, LuDownload, LuTrash2 } from "react-icons/lu"; import { FiMoreVertical } from "react-icons/fi"; import { FaArrowsRotate } from "react-icons/fa6"; import { MdImageSearch } from "react-icons/md"; import FrigatePlusIcon from "@/components/icons/FrigatePlusIcon"; import { isMobileOnly } from "react-device-detect"; import { buttonVariants } from "@/components/ui/button"; import { ContextMenu, ContextMenuContent, ContextMenuItem, ContextMenuTrigger, } from "@/components/ui/context-menu"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from "@/components/ui/alert-dialog"; import { Tooltip, TooltipContent, TooltipTrigger, } from "@/components/ui/tooltip"; import useSWR from "swr"; import { Trans, useTranslation } from "react-i18next"; type SearchResultActionsProps = { searchResult: SearchResult; findSimilar: () => void; refreshResults: () => void; showObjectLifecycle: () => void; showSnapshot: () => void; isContextMenu?: boolean; children?: ReactNode; }; export default function SearchResultActions({ searchResult, findSimilar, refreshResults, showObjectLifecycle, showSnapshot, isContextMenu = false, children, }: SearchResultActionsProps) { const { t } = useTranslation(["views/explore"]); const { data: config } = useSWR("config"); const [deleteDialogOpen, setDeleteDialogOpen] = useState(false); const handleDelete = () => { axios .delete(`events/${searchResult.id}`) .then((resp) => { if (resp.status == 200) { toast.success(t("searchResult.deleteTrackedObject.toast.success"), { position: "top-center", }); refreshResults(); } }) .catch((error) => { const errorMessage = error.response?.data?.message || error.response?.data?.detail || "Unknown error"; toast.error( t("searchResult.deleteTrackedObject.toast.error", { errorMessage }), { position: "top-center", }, ); }); }; const MenuItem = isContextMenu ? ContextMenuItem : DropdownMenuItem; const menuItems = ( <> {searchResult.has_clip && ( {t("itemMenu.downloadVideo")} )} {searchResult.has_snapshot && ( {t("itemMenu.downloadSnapshot.label")} )} {searchResult.data.type == "object" && ( {t("itemMenu.viewObjectLifecycle.label")} )} {config?.semantic_search?.enabled && isContextMenu && ( {t("itemMenu.findSimilar.label")} )} {isMobileOnly && config?.plus?.enabled && searchResult.has_snapshot && searchResult.end_time && searchResult.data.type == "object" && !searchResult.plus_id && ( {t("itemMenu.submitToPlus")} )} setDeleteDialogOpen(true)} > {t("button.delete", { ns: "common" })} ); return ( <> setDeleteDialogOpen(!deleteDialogOpen)} > {t("dialog.confirmDelete")} dialog.confirmDelete.desc {t("button.cancel", { ns: "common" })} {t("button.delete", { ns: "common" })} {isContextMenu ? ( {children} {menuItems} ) : ( <> {config?.semantic_search?.enabled && searchResult.data.type == "object" && ( {t("itemMenu.findSimilar.label")} )} {!isMobileOnly && config?.plus?.enabled && searchResult.has_snapshot && searchResult.end_time && searchResult.data.type == "object" && !searchResult.plus_id && ( {t("itemMenu.submitToPlus.label")} )} {menuItems} )} ); }