gitscope
https://dev.kronoz.win/r/marzneshin.git
dashboard/src/hooks/use-mutation-dialog/index.ts · v0.3.0-alpha8
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 857e289 Mrdn 2y ago }
16 857e289 Mrdn 2y ago
17 857e289 Mrdn 2y ago /** useMutationDialog - Dialog mutation hook
18 857e289 Mrdn 2y ago *
19 857e289 Mrdn 2y ago * @param entity - Entity value for update, leave empty for creation
20 857e289 Mrdn 2y ago * @param createMutation - react-query mutation hook for entity creation
21 857e289 Mrdn 2y ago * @param updateMutation - react-query mutation hook for entity edition
22 857e289 Mrdn 2y ago * @param entity - Entity value for update, leave empty for creation
23 857e289 Mrdn 2y ago * @param schema - Entity schema validated by zodResolver
24 857e289 Mrdn 2y ago * @param getDefaultValue - Default value function return the default value for function
25 857e289 Mrdn 2y ago * - Must be wrapped in useCallback to avoid infinite useEffect loop
26 857e289 Mrdn 2y ago * @param onOpenChange - Dialog state callback to change the dialog openness state
27 857e289 Mrdn 2y ago *
28 857e289 Mrdn 2y ago * @returns react-hook-form and submit handler
29 857e289 Mrdn 2y ago *
30 857e289 Mrdn 2y ago * @template TData - Mutation Type of Schema
31 857e289 Mrdn 2y ago * @template TError = unknown
32 857e289 Mrdn 2y ago * @template TVariables = unknown
33 857e289 Mrdn 2y ago */
34 857e289 Mrdn 2y ago
35 857e289 Mrdn 2y ago export const useMutationDialog = <TData, TError = unknown, TVariables = unknown>({
36 857e289 Mrdn 2y ago entity,
37 857e289 Mrdn 2y ago onOpenChange,
38 857e289 Mrdn 2y ago createMutation,
39 857e289 Mrdn 2y ago updateMutation,
40 857e289 Mrdn 2y ago schema,
41 857e289 Mrdn 2y ago getDefaultValue,
42 857e289 Mrdn 2y ago }: IMutationDialog<TData, TError, TVariables>) => {
43 857e289 Mrdn 2y ago const form = useForm({
44 857e289 Mrdn 2y ago defaultValues: entity ? (entity as FieldValues) : (getDefaultValue()),
45 857e289 Mrdn 2y ago resolver: zodResolver(schema)
46 857e289 Mrdn 2y ago });
47 857e289 Mrdn 2y ago
48 857e289 Mrdn 2y ago const submit: SubmitHandler<FieldValues> = async (values) => {
49 857e289 Mrdn 2y ago if (entity) {
50 857e289 Mrdn 2y ago updateMutation.mutate(values as TVariables);
51 857e289 Mrdn 2y ago } else {
52 857e289 Mrdn 2y ago createMutation.mutate(values as TVariables);
53 857e289 Mrdn 2y ago }
54 857e289 Mrdn 2y ago onOpenChange(false);
55 857e289 Mrdn 2y ago };
56 857e289 Mrdn 2y ago
57 857e289 Mrdn 2y ago useEffect(() => {
58 857e289 Mrdn 2y ago if (entity) {
59 857e289 Mrdn 2y ago form.reset(entity)
60 857e289 Mrdn 2y ago } else {
61 857e289 Mrdn 2y ago form.reset(getDefaultValue());
62 857e289 Mrdn 2y ago }
63 857e289 Mrdn 2y ago }, [entity, form, getDefaultValue]);
64 857e289 Mrdn 2y ago
65 857e289 Mrdn 2y ago const handleSubmit = form.handleSubmit(submit as SubmitHandler<FieldValues>);
66 857e289 Mrdn 2y ago
67 857e289 Mrdn 2y ago return {
68 857e289 Mrdn 2y ago form,
69 857e289 Mrdn 2y ago handleSubmit
70 857e289 Mrdn 2y ago };
71 857e289 Mrdn 2y ago };