import StepIndicator from "@/components/indicators/StepIndicator"; import ImageEntry from "@/components/input/ImageEntry"; import TextEntry from "@/components/input/TextEntry"; import { MobilePage, MobilePageContent, MobilePageDescription, MobilePageHeader, MobilePageTitle, } from "@/components/mobile/MobilePage"; import { Button } from "@/components/ui/button"; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { cn } from "@/lib/utils"; import axios from "axios"; import { useCallback, useState } from "react"; import { isDesktop } from "react-device-detect"; import { Trans, useTranslation } from "react-i18next"; import { LuExternalLink } from "react-icons/lu"; import { Link } from "react-router-dom"; import { toast } from "sonner"; const STEPS = ["Enter Face Name", "Upload Face Image", "Next Steps"]; type CreateFaceWizardDialogProps = { open: boolean; setOpen: (open: boolean) => void; onFinish: () => void; }; export default function CreateFaceWizardDialog({ open, setOpen, onFinish, }: CreateFaceWizardDialogProps) { const { t } = useTranslation("views/faceLibrary"); // wizard const [step, setStep] = useState(0); const [name, setName] = useState(""); const handleReset = useCallback(() => { setStep(0); setName(""); setOpen(false); }, [setOpen]); // data handling const onUploadImage = useCallback( (file: File) => { const formData = new FormData(); formData.append("file", file); axios .post(`faces/${name}/register`, formData, { headers: { "Content-Type": "multipart/form-data", }, }) .then((resp) => { if (resp.status == 200) { setStep(2); toast.success(t("toast.success.uploadedImage"), { position: "top-center", }); } }) .catch((error) => { const errorMessage = error.response?.data?.message || error.response?.data?.detail || "Unknown error"; toast.error(t("toast.error.uploadingImageFailed", { errorMessage }), { position: "top-center", }); }); }, [name, t], ); // layout const Overlay = isDesktop ? Dialog : MobilePage; const Content = isDesktop ? DialogContent : MobilePageContent; const Header = isDesktop ? DialogHeader : MobilePageHeader; const Title = isDesktop ? DialogTitle : MobilePageTitle; const Description = isDesktop ? DialogDescription : MobilePageDescription; return ( { if (!open) { handleReset(); } }} >
{t("button.addFace")} {isDesktop && {t("description.addFace")}}
{step == 0 && ( { setName(name); setStep(1); }} >
)} {step == 1 && (
)} {step == 2 && (
{t("toast.success.addFaceLibrary", { name })}

    createFaceLibrary.nextSteps

{t("readTheDocs")}
)}
); }