import { Button } from "@/components/ui/button"; import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form"; import { zodResolver } from "@hookform/resolvers/zod"; import { useForm } from "react-hook-form"; import { z } from "zod"; import { Switch } from "@/components/ui/switch"; import ActivityIndicator from "@/components/indicators/activity-indicator"; import { useState } from "react"; import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle, DialogDescription, } from "@/components/ui/dialog"; import { Trans, useTranslation } from "react-i18next"; import { FrigateConfig } from "@/types/frigateConfig"; import { CameraNameLabel } from "@/components/camera/FriendlyNameLabel"; type EditRoleCamerasOverlayProps = { show: boolean; config: FrigateConfig; role: string; currentCameras: string[]; onSave: (cameras: string[]) => void; onCancel: () => void; }; export default function EditRoleCamerasDialog({ show, config, role, currentCameras, onSave, onCancel, }: EditRoleCamerasOverlayProps) { const { t } = useTranslation(["views/settings"]); const [isLoading, setIsLoading] = useState(false); const cameras = Object.keys(config.cameras || {}); const formSchema = z.object({ cameras: z .array(z.string()) .min(1, t("roles.dialog.form.cameras.required")), }); const form = useForm>({ resolver: zodResolver(formSchema), mode: "onChange", defaultValues: { cameras: currentCameras, }, }); const onSubmit = async (values: z.infer) => { setIsLoading(true); try { await onSave(values.cameras); form.reset(); } catch (error) { // Error handled in parent } finally { setIsLoading(false); } }; const handleCancel = () => { form.reset({ cameras: currentCameras, }); onCancel(); }; return ( {t("roles.dialog.editCameras.title", { role })} }} > roles.dialog.editCameras.desc
{t("roles.dialog.form.cameras.title")} {t("roles.dialog.form.cameras.desc")}
{cameras.map((camera) => ( { return (
{ return checked ? field.onChange([ ...(field.value as string[]), camera, ]) : field.onChange( (field.value as string[])?.filter( (value: string) => value !== camera, ) || [], ); }} />
); }} /> ))}
); }