import ActivityIndicator from "../indicators/activity-indicator"; import { Button } from "../ui/button"; import { useCallback, useMemo, useState } from "react"; import { isMobile } from "react-device-detect"; import { FiMoreVertical } from "react-icons/fi"; import { Skeleton } from "../ui/skeleton"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogTitle, } from "../ui/dialog"; import { Input } from "../ui/input"; import useKeyboardListener from "@/hooks/use-keyboard-listener"; import { DeleteClipType, Export, ExportCase } from "@/types/export"; import { baseUrl } from "@/api/baseUrl"; import { cn } from "@/lib/utils"; import { shareOrCopy } from "@/utils/browserUtil"; import { useTranslation } from "react-i18next"; import { ImageShadowOverlay } from "../overlay/ImageShadowOverlay"; import BlurredIconButton from "../button/BlurredIconButton"; import { useIsAdmin } from "@/hooks/use-is-admin"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "../ui/dropdown-menu"; import { FaFolder } from "react-icons/fa"; type CaseCardProps = { className: string; exportCase: ExportCase; exports: Export[]; onSelect: () => void; }; export function CaseCard({ className, exportCase, exports, onSelect, }: CaseCardProps) { const firstExport = useMemo( () => exports.find((exp) => exp.thumb_path && exp.thumb_path.length > 0), [exports], ); return (
onSelect()} > {firstExport && ( )}
{exportCase.name}
); } type ExportCardProps = { className: string; exportedRecording: Export; onSelect: (selected: Export) => void; onRename: (original: string, update: string) => void; onDelete: ({ file, exportName }: DeleteClipType) => void; onAssignToCase?: (selected: Export) => void; }; export function ExportCard({ className, exportedRecording, onSelect, onRename, onDelete, onAssignToCase, }: ExportCardProps) { const { t } = useTranslation(["views/exports"]); const isAdmin = useIsAdmin(); const [loading, setLoading] = useState( exportedRecording.thumb_path.length > 0, ); // editing name const [editName, setEditName] = useState<{ original: string; update?: string; }>(); const submitRename = useCallback(() => { if (editName == undefined) { return; } onRename(exportedRecording.id, editName.update ?? ""); setEditName(undefined); }, [editName, exportedRecording, onRename, setEditName]); useKeyboardListener( editName != undefined ? ["Enter"] : [], (key, modifiers) => { if ( key == "Enter" && modifiers.down && !modifiers.repeat && editName && (editName.update?.length ?? 0) > 0 ) { submitRename(); return true; } return false; }, ); return ( <> { if (!open) { setEditName(undefined); } }} > { if (isMobile) { e.preventDefault(); } }} > {t("editExport.title")} {t("editExport.desc")} {editName && ( <> setEditName({ original: editName.original ?? "", update: e.target.value, }) } /> )}
{ if (!exportedRecording.in_progress) { onSelect(exportedRecording); } }} > {exportedRecording.in_progress ? ( ) : ( <> {exportedRecording.thumb_path.length > 0 ? ( setLoading(false)} /> ) : (
)} )} {!exportedRecording.in_progress && (
e.stopPropagation()} > { e.stopPropagation(); shareOrCopy( `${baseUrl}export?id=${exportedRecording.id}`, exportedRecording.name.replaceAll("_", " "), ); }} > {t("tooltip.shareExport")} e.stopPropagation()} > {t("tooltip.downloadVideo")} {isAdmin && onAssignToCase && ( { e.stopPropagation(); onAssignToCase(exportedRecording); }} > {t("tooltip.assignToCase")} )} {isAdmin && ( { e.stopPropagation(); setEditName({ original: exportedRecording.name, update: undefined, }); }} > {t("tooltip.editName")} )} {isAdmin && ( { e.stopPropagation(); onDelete({ file: exportedRecording.id, exportName: exportedRecording.name, }); }} > {t("tooltip.deleteExport")} )}
)} {loading && ( )}
{exportedRecording.name.replaceAll("_", " ")}
); }