gitscope
https://dev.kronoz.win/r/marzneshin.git
dashboard/src/hooks/use-mutation-dialog/index.ts · v0.3.0
Source
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 };