'use client'; import { useEffect } from 'react'; import { useMutation, useQueryClient } from '@tanstack/react-query'; import { zodResolver } from '@hookform/resolvers/zod'; import { useForm } from 'react-hook-form'; import { Loader2 } from 'lucide-react'; import { toast } from 'sonner'; import { z } from 'zod'; import { Button } from '@/components/ui/button'; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '@/components/ui/dialog'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { ZoneService, zoneQueryKey, type ZoneItem, } from '@/lib/services/openflare'; import { useTranslations } from 'next-intl'; type Values = { domain: string }; export function ZoneEditorDialog({ open, onOpenChange, zone, }: { open: boolean; onOpenChange(open: boolean): void; zone?: ZoneItem | null; }) { const t = useTranslations('websites'); const tc = useTranslations('common'); const queryClient = useQueryClient(); const schema = z.object({ domain: z .string() .trim() .min(1, t('rootRequired')) .refine( (value) => !/[*/?#@]|:\/\//.test(value), t('rootInvalid'), ), }); const form = useForm({ resolver: zodResolver(schema), defaultValues: { domain: '' }, }); useEffect(() => { if (open) form.reset({ domain: zone?.domain ?? '' }); }, [form, open, zone]); const mutation = useMutation({ mutationFn: (values: Values) => zone ? ZoneService.update(zone.id, { domain: values.domain.toLowerCase() }) : ZoneService.create({ domain: values.domain.toLowerCase() }), onSuccess: async () => { toast.success(zone ? t('zoneUpdated') : t('zoneCreated')); await queryClient.invalidateQueries({ queryKey: zoneQueryKey }); onOpenChange(false); }, onError: (error) => toast.error(error instanceof Error ? error.message : t('saveFailed')), }); return ( {zone ? t('editZone') : t('createZone')} {t('editorDesc')}
mutation.mutate({ domain: values.domain.toLowerCase() }), )} >
{form.formState.errors.domain && (

{form.formState.errors.domain.message}

)}
); }