import { useId } from "react" import { Controller, useForm } from "react-hook-form" import { zodResolver } from "@hookform/resolvers/zod" import { z } from "zod" import { Loader2, Save } from "lucide-react" import { Button } from "@/components/ui/button" import { Checkbox } from "@/components/ui/checkbox" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Field, FieldContent, FieldError, FieldGroup, FieldLabel, FieldSet, } from "@/components/ui/field" import { useSchedule, useUpdateSchedule } from "@/hooks/useApi" import type { Schedule } from "@/api/types" const scheduleFormSchema = z.object({ intervalSeconds: z .number({ error: "Укажите интервал в секундах" }) .int("Интервал — целое число секунд") .min(60, "Интервал не может быть меньше 60 секунд"), enabled: z.boolean(), }) type ScheduleForm = z.infer const DEFAULT_SCHEDULE: Schedule = { intervalSeconds: 300, enabled: false } // Rendered only once the current schedule is loaded, so useForm's // defaultValues (a one-time snapshot in react-hook-form) are always seeded // with the real values — no reset()-after-fetch race between the query and // the form's first render. function ScheduleFormCard({ initial }: { initial: Schedule }) { const updateSchedule = useUpdateSchedule() const intervalFieldId = useId() const { control, handleSubmit, formState: { errors }, } = useForm({ resolver: zodResolver(scheduleFormSchema), defaultValues: initial, }) function onSubmit(values: ScheduleForm) { updateSchedule.mutate(values) } return (
Интервал (секунд) ( field.onChange(e.target.valueAsNumber)} /> )} /> ( )} />
{updateSchedule.isError && ( {updateSchedule.error.message} )}
) } export function SchedulePage() { const schedule = useSchedule() return (
scheduler

Расписание проверок

{schedule.isPending ? (
Загружаю расписание…
) : ( )}
) }