import { baseUrl } from "@/api/baseUrl"; import ExportCard from "@/components/card/ExportCard"; import { AlertDialog, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from "@/components/ui/alert-dialog"; import { Button } from "@/components/ui/button"; import { Dialog, DialogContent, DialogTitle } from "@/components/ui/dialog"; import { Input } from "@/components/ui/input"; import { Toaster } from "@/components/ui/sonner"; import useKeyboardListener from "@/hooks/use-keyboard-listener"; import { useSearchEffect } from "@/hooks/use-overlay-state"; import { cn } from "@/lib/utils"; import { DeleteClipType, Export } from "@/types/export"; import axios from "axios"; import { useCallback, useEffect, useMemo, useRef, useState } from "react"; import { isMobile } from "react-device-detect"; import { useTranslation } from "react-i18next"; import { LuFolderX } from "react-icons/lu"; import { toast } from "sonner"; import useSWR from "swr"; function Exports() { const { t } = useTranslation(["views/exports"]); const { data: exports, mutate } = useSWR("exports"); useEffect(() => { document.title = t("documentTitle"); }, [t]); // Search const [search, setSearch] = useState(""); const filteredExports = useMemo(() => { if (!search || !exports) { return exports; } return exports.filter((exp) => exp.name .toLowerCase() .replaceAll("_", " ") .includes(search.toLowerCase()), ); }, [exports, search]); // Viewing const [selected, setSelected] = useState(); const [selectedAspect, setSelectedAspect] = useState(0.0); useSearchEffect("id", (id) => { if (!exports) { return false; } setSelected(exports.find((exp) => exp.id == id)); return true; }); // Deleting const [deleteClip, setDeleteClip] = useState(); const onHandleDelete = useCallback(() => { if (!deleteClip) { return; } axios.delete(`export/${deleteClip.file}`).then((response) => { if (response.status == 200) { setDeleteClip(undefined); mutate(); } }); }, [deleteClip, mutate]); // Renaming const onHandleRename = useCallback( (id: string, update: string) => { axios .patch(`export/${id}/rename`, { name: update, }) .then((response) => { if (response.status === 200) { setDeleteClip(undefined); mutate(); } }) .catch((error) => { const errorMessage = error.response?.data?.message || error.response?.data?.detail || "Unknown error"; toast.error(t("toast.error.renameExportFailed", { errorMessage }), { position: "top-center", }); }); }, [mutate, t], ); // Keyboard Listener const contentRef = useRef(null); useKeyboardListener([], undefined, contentRef); return (
setDeleteClip(undefined)} > {t("deleteExport")} {t("deleteExport.desc", { exportName: deleteClip?.exportName })} {t("button.cancel", { ns: "common" })} { if (!open) { setSelected(undefined); } }} > {selected?.name?.replaceAll("_", " ")} {exports && (
setSearch(e.target.value)} />
)}
{exports && filteredExports && filteredExports.length > 0 ? (
{Object.values(exports).map((item) => ( setDeleteClip({ file, exportName }) } /> ))}
) : (
{t("noExports")}
)}
); } export default Exports;