| 1 |
857e289 |
Mrdn |
2y ago |
|
| 2 |
857e289 |
Mrdn |
2y ago |
import { zodResolver } from "@hookform/resolvers/zod"; |
| 3 |
857e289 |
Mrdn |
2y ago |
import { UseMutationResult } from "@tanstack/react-query"; |
| 4 |
857e289 |
Mrdn |
2y ago |
import { useEffect } from "react"; |
| 5 |
857e289 |
Mrdn |
2y ago |
import { FieldValues, SubmitHandler, useForm } from "react-hook-form"; |
| 6 |
857e289 |
Mrdn |
2y ago |
import { ZodSchema } from "zod"; |
| 7 |
857e289 |
Mrdn |
2y ago |
|
| 8 |
857e289 |
Mrdn |
2y ago |
interface IMutationDialog<TData, TError = unknown, TVariables = unknown> { |
| 9 |
857e289 |
Mrdn |
2y ago |
entity: TData | null |
| 10 |
857e289 |
Mrdn |
2y ago |
onOpenChange: (s: boolean) => void |
| 11 |
857e289 |
Mrdn |
2y ago |
createMutation: UseMutationResult<TData, TError, TVariables> |
| 12 |
857e289 |
Mrdn |
2y ago |
updateMutation: UseMutationResult<TData, TError, TVariables> |
| 13 |
857e289 |
Mrdn |
2y ago |
schema: ZodSchema |
| 14 |
857e289 |
Mrdn |
2y ago |
getDefaultValue: () => FieldValues |
| 15 |
2e6c8cb |
Mrdn |
2y ago |
loadFormtter?: (d: FieldValues) => FieldValues |
| 16 |
857e289 |
Mrdn |
2y ago |
} |
| 17 |
857e289 |
Mrdn |
2y ago |
|
| 18 |
857e289 |
Mrdn |
2y ago |
/** useMutationDialog - Dialog mutation hook |
| 19 |
857e289 |
Mrdn |
2y ago |
* |
| 20 |
857e289 |
Mrdn |
2y ago |
* @param entity - Entity value for update, leave empty for creation |
| 21 |
857e289 |
Mrdn |
2y ago |
* @param createMutation - react-query mutation hook for entity creation |
| 22 |
857e289 |
Mrdn |
2y ago |
* @param updateMutation - react-query mutation hook for entity edition |
| 23 |
857e289 |
Mrdn |
2y ago |
* @param entity - Entity value for update, leave empty for creation |
| 24 |
857e289 |
Mrdn |
2y ago |
* @param schema - Entity schema validated by zodResolver |
| 25 |
857e289 |
Mrdn |
2y ago |
* @param getDefaultValue - Default value function return the default value for function |
| 26 |
857e289 |
Mrdn |
2y ago |
* - Must be wrapped in useCallback to avoid infinite useEffect loop |
| 27 |
857e289 |
Mrdn |
2y ago |
* @param onOpenChange - Dialog state callback to change the dialog openness state |
| 28 |
857e289 |
Mrdn |
2y ago |
* |
| 29 |
857e289 |
Mrdn |
2y ago |
* @returns react-hook-form and submit handler |
| 30 |
857e289 |
Mrdn |
2y ago |
* |
| 31 |
857e289 |
Mrdn |
2y ago |
* @template TData - Mutation Type of Schema |
| 32 |
857e289 |
Mrdn |
2y ago |
* @template TError = unknown |
| 33 |
857e289 |
Mrdn |
2y ago |
* @template TVariables = unknown |
| 34 |
857e289 |
Mrdn |
2y ago |
*/ |
| 35 |
857e289 |
Mrdn |
2y ago |
|
| 36 |
857e289 |
Mrdn |
2y ago |
export const useMutationDialog = <TData, TError = unknown, TVariables = unknown>({ |
| 37 |
857e289 |
Mrdn |
2y ago |
entity, |
| 38 |
857e289 |
Mrdn |
2y ago |
onOpenChange, |
| 39 |
857e289 |
Mrdn |
2y ago |
createMutation, |
| 40 |
857e289 |
Mrdn |
2y ago |
updateMutation, |
| 41 |
857e289 |
Mrdn |
2y ago |
schema, |
| 42 |
857e289 |
Mrdn |
2y ago |
getDefaultValue, |
| 43 |
2e6c8cb |
Mrdn |
2y ago |
loadFormtter = (s) => s, |
| 44 |
857e289 |
Mrdn |
2y ago |
}: IMutationDialog<TData, TError, TVariables>) => { |
| 45 |
2e6c8cb |
Mrdn |
2y ago |
|
| 46 |
857e289 |
Mrdn |
2y ago |
const form = useForm({ |
| 47 |
2e6c8cb |
Mrdn |
2y ago |
defaultValues: entity ? loadFormtter(entity) : getDefaultValue(), |
| 48 |
857e289 |
Mrdn |
2y ago |
resolver: zodResolver(schema) |
| 49 |
857e289 |
Mrdn |
2y ago |
}); |
| 50 |
857e289 |
Mrdn |
2y ago |
|
| 51 |
857e289 |
Mrdn |
2y ago |
const submit: SubmitHandler<FieldValues> = async (values) => { |
| 52 |
857e289 |
Mrdn |
2y ago |
if (entity) { |
| 53 |
857e289 |
Mrdn |
2y ago |
updateMutation.mutate(values as TVariables); |
| 54 |
857e289 |
Mrdn |
2y ago |
} else { |
| 55 |
857e289 |
Mrdn |
2y ago |
createMutation.mutate(values as TVariables); |
| 56 |
857e289 |
Mrdn |
2y ago |
} |
| 57 |
857e289 |
Mrdn |
2y ago |
onOpenChange(false); |
| 58 |
857e289 |
Mrdn |
2y ago |
}; |
| 59 |
857e289 |
Mrdn |
2y ago |
|
| 60 |
857e289 |
Mrdn |
2y ago |
useEffect(() => { |
| 61 |
857e289 |
Mrdn |
2y ago |
if (entity) { |
| 62 |
2e6c8cb |
Mrdn |
2y ago |
form.reset(loadFormtter(entity)) |
| 63 |
857e289 |
Mrdn |
2y ago |
} else { |
| 64 |
857e289 |
Mrdn |
2y ago |
form.reset(getDefaultValue()); |
| 65 |
857e289 |
Mrdn |
2y ago |
} |
| 66 |
2e6c8cb |
Mrdn |
2y ago |
// eslint-disable-next-line |
| 67 |
857e289 |
Mrdn |
2y ago |
}, [entity, form, getDefaultValue]); |
| 68 |
857e289 |
Mrdn |
2y ago |
|
| 69 |
857e289 |
Mrdn |
2y ago |
const handleSubmit = form.handleSubmit(submit as SubmitHandler<FieldValues>); |
| 70 |
857e289 |
Mrdn |
2y ago |
|
| 71 |
857e289 |
Mrdn |
2y ago |
return { |
| 72 |
857e289 |
Mrdn |
2y ago |
form, |
| 73 |
857e289 |
Mrdn |
2y ago |
handleSubmit |
| 74 |
857e289 |
Mrdn |
2y ago |
}; |
| 75 |
857e289 |
Mrdn |
2y ago |
}; |