import { Dialog, DialogContent, DialogTrigger } from "@/components/ui/dialog"; import { Drawer, DrawerContent, DrawerTrigger } from "@/components/ui/drawer"; import { cn } from "@/lib/utils"; import { ReviewSegment, ThreatLevel } from "@/types/review"; import { useEffect, useMemo, useState } from "react"; import { isDesktop } from "react-device-detect"; import { useTranslation } from "react-i18next"; import { MdAutoAwesome } from "react-icons/md"; type GenAISummaryChipProps = { review?: ReviewSegment; onClick: () => void; }; export function GenAISummaryChip({ review, onClick }: GenAISummaryChipProps) { const [isVisible, setIsVisible] = useState(false); useEffect(() => { setIsVisible(review?.data?.metadata != undefined); }, [review]); return (
{review?.data.metadata?.title}
); } type GenAISummaryDialogProps = { review?: ReviewSegment; onOpen?: (open: boolean) => void; }; export function GenAISummaryDialog({ review, onOpen, }: GenAISummaryDialogProps) { const { t } = useTranslation(["views/explore"]); // data const aiAnalysis = useMemo(() => review?.data?.metadata, [review]); const aiThreatLevel = useMemo(() => { if ( !aiAnalysis || (!aiAnalysis.potential_threat_level && !aiAnalysis.other_concerns) ) { return "None"; } let concerns = ""; switch (aiAnalysis.potential_threat_level) { case ThreatLevel.SUSPICIOUS: concerns = `• ${t("suspiciousActivity", { ns: "views/events" })}\n`; break; case ThreatLevel.DANGER: concerns = `• ${t("threateningActivity", { ns: "views/events" })}\n`; break; } (aiAnalysis.other_concerns ?? []).forEach((c) => { concerns += `• ${c}\n`; }); return concerns || "None"; }, [aiAnalysis, t]); // layout const [open, setOpen] = useState(false); const Overlay = isDesktop ? Dialog : Drawer; const Trigger = isDesktop ? DialogTrigger : DrawerTrigger; const Content = isDesktop ? DialogContent : DrawerContent; useEffect(() => { if (onOpen) { onOpen(open); } }, [open, onOpen]); if (!aiAnalysis) { return null; } return ( setOpen(true)} /> {t("aiAnalysis.title")}
{t("details.description.label")}
{aiAnalysis.scene}
{t("details.score.label")}
{aiAnalysis.confidence * 100}%
{t("concerns.label")}
{aiThreatLevel}
); }