"use client" import { useEffect } from "react" import { useForm, type DefaultValues, type FieldValues, type UseFormReturn } from "react-hook-form" import { zodResolver } from "@hookform/resolvers/zod" import { useQuery, type QueryKey } from "@tanstack/react-query" import type { ZodType } from "zod" type UseResourceFormOptions = { schema: ZodType defaultValues: DefaultValues resourceId?: string | null initialize?: (id: string) => Promise mapToFormValues: (data: TApiData) => TFormValues initialData?: TApiData | null queryKey?: QueryKey } type UseResourceFormReturn = { form: UseFormReturn isEditing: boolean isInitializing: boolean } export function useResourceForm({ schema, defaultValues, resourceId, initialize, mapToFormValues, initialData, queryKey, }: UseResourceFormOptions): UseResourceFormReturn { const isEditing = !!resourceId const { data: queriedData, isLoading: isQueryLoading } = useQuery({ queryKey: queryKey ?? ["resource", resourceId], queryFn: () => initialize!(resourceId!), enabled: isEditing && !!initialize, }) const resolvedData = queriedData ?? (isEditing ? initialData : undefined) const form = useForm({ resolver: zodResolver(schema) as any, defaultValues, }) useEffect(() => { if (!isEditing) { form.reset(defaultValues) return } if (resolvedData) { form.reset(mapToFormValues(resolvedData) as any) } }, [isEditing, resolvedData]) // eslint-disable-line react-hooks/exhaustive-deps return { form, isEditing, isInitializing: isEditing && !!initialize && isQueryLoading } }