import { zodResolver } from "@hookform/resolvers/zod";
import { useMutation } from "@tanstack/react-query";
import { Controller, useForm } from "react-hook-form";
import { postSearchAlert } from "@/lib/api";
import { zSearchAlert } from "@/lib/api/zod.gen"; // généré
import { handleSdkError } from "@/lib/parseViolations";
type FormValues = z.infer<typeof zSearchAlert>;
const form = useForm<FormValues>({
resolver: zodResolver(zSearchAlert),
defaultValues: { channels: [], email: "" },
});
const mutation = useMutation({
mutationFn: async (values: FormValues) => {
const result = await postSearchAlert({ body: values });
const errors = handleSdkError(result);
if (errors) {
// Les champs dans l'ordre de l'écran : le premier fautif prend le focus.
const first = FIELD_ORDER.find((name) => name in errors);
Object.entries(errors).forEach(([field, message]) =>
form.setError(field as any, { message }, { shouldFocus: field === first }),
);
throw new Error("Validation failed");
}
},
});
<Controller
name="channels"
control={form.control}
render={({ field, fieldState }) => (
<Field data-invalid={fieldState.invalid}>
<FieldLabel htmlFor={field.name}>Canaux</FieldLabel>
<Input id={field.name} aria-invalid={fieldState.invalid} {...field} />
{fieldState.invalid && <FieldError errors={[fieldState.error]} />}
</Field>
)}
/>;