gitscope
https://dev.kronoz.win/r/marzneshin.git
dashboard/src/features/services/dialogs/mutation/index.tsx · v0.3.1
Source
1 3072f60 Mrdn 2y ago import {
2 3072f60 Mrdn 2y ago DialogTitle,
3 3072f60 Mrdn 2y ago DialogContent,
4 3072f60 Mrdn 2y ago Dialog,
5 3072f60 Mrdn 2y ago DialogHeader,
6 3072f60 Mrdn 2y ago Form,
7 3072f60 Mrdn 2y ago Button,
8 3072f60 Mrdn 2y ago } from "@marzneshin/components";
9 03b3dbc Mardin 2y ago import { type FC, useEffect } from "react";
10 3072f60 Mrdn 2y ago import {
11 3072f60 Mrdn 2y ago type ServiceType,
12 3072f60 Mrdn 2y ago useServicesCreationMutation,
13 3072f60 Mrdn 2y ago useServicesUpdateMutation,
14 3072f60 Mrdn 2y ago } from "@marzneshin/features/services";
15 3072f60 Mrdn 2y ago import { useTranslation } from "react-i18next";
16 3072f60 Mrdn 2y ago import { z } from "zod";
17 3072f60 Mrdn 2y ago import { useMutationDialog } from "@marzneshin/hooks";
18 3072f60 Mrdn 2y ago import { NameField, InboundsField } from "./fields";
19 3072f60 Mrdn 2y ago
20 3072f60 Mrdn 2y ago export const ServiceSchema = z.object({
21 3072f60 Mrdn 2y ago id: z.number().optional(),
22 db68a58 Dawsh 2y ago inbound_ids: z.array(z.number()).refine((value) => value.some((item) => item), {
23 3072f60 Mrdn 2y ago message: "You have to select at least one inbound.",
24 3072f60 Mrdn 2y ago }),
25 3072f60 Mrdn 2y ago name: z.string().trim().min(1),
26 3072f60 Mrdn 2y ago });
27 db68a58 Dawsh 2y ago
28 3072f60 Mrdn 2y ago type ServiceCreateType = z.infer<typeof ServiceSchema>;
29 3072f60 Mrdn 2y ago
30 3072f60 Mrdn 2y ago interface MutationDialogProps {
31 3072f60 Mrdn 2y ago entity: ServiceType | null;
32 3072f60 Mrdn 2y ago open: boolean;
33 3072f60 Mrdn 2y ago onOpenChange: (state: boolean) => void;
34 03b3dbc Mardin 2y ago onClose: () => void;
35 3072f60 Mrdn 2y ago }
36 3072f60 Mrdn 2y ago
37 3072f60 Mrdn 2y ago const getDefaultValues = (): ServiceCreateType => ({
38 3072f60 Mrdn 2y ago name: "",
39 db68a58 Dawsh 2y ago inbound_ids: [],
40 3072f60 Mrdn 2y ago });
41 3072f60 Mrdn 2y ago
42 3072f60 Mrdn 2y ago export const MutationDialog: FC<MutationDialogProps> = ({
43 3072f60 Mrdn 2y ago entity,
44 3072f60 Mrdn 2y ago open,
45 3072f60 Mrdn 2y ago onOpenChange,
46 03b3dbc Mardin 2y ago onClose,
47 3072f60 Mrdn 2y ago }) => {
48 3072f60 Mrdn 2y ago const isEditing = entity !== null;
49 3072f60 Mrdn 2y ago const updateMutation = useServicesUpdateMutation();
50 3072f60 Mrdn 2y ago const createMutation = useServicesCreationMutation();
51 3072f60 Mrdn 2y ago const { form, handleSubmit } = useMutationDialog({
52 3072f60 Mrdn 2y ago entity,
53 3072f60 Mrdn 2y ago updateMutation,
54 3072f60 Mrdn 2y ago createMutation,
55 3072f60 Mrdn 2y ago getDefaultValue: getDefaultValues,
56 3072f60 Mrdn 2y ago schema: ServiceSchema,
57 3072f60 Mrdn 2y ago onOpenChange,
58 3072f60 Mrdn 2y ago });
59 3072f60 Mrdn 2y ago const { t } = useTranslation();
60 03b3dbc Mardin 2y ago
61 03b3dbc Mardin 2y ago useEffect(() => {
62 03b3dbc Mardin 2y ago if (!open) onClose();
63 03b3dbc Mardin 2y ago }, [open, onClose]);
64 03b3dbc Mardin 2y ago
65 3072f60 Mrdn 2y ago return (
66 3072f60 Mrdn 2y ago <Dialog open={open} onOpenChange={onOpenChange} defaultOpen={true}>
67 3072f60 Mrdn 2y ago <DialogContent>
68 3072f60 Mrdn 2y ago <DialogHeader>
69 3072f60 Mrdn 2y ago <DialogTitle className="text-primary">
70 3072f60 Mrdn 2y ago {isEditing
71 3072f60 Mrdn 2y ago ? t("page.services.dialogs.edition.title")
72 3072f60 Mrdn 2y ago : t("page.services.dialogs.creation.title")}
73 3072f60 Mrdn 2y ago </DialogTitle>
74 3072f60 Mrdn 2y ago </DialogHeader>
75 3072f60 Mrdn 2y ago <Form {...form}>
76 3072f60 Mrdn 2y ago <form onSubmit={handleSubmit} className="h-full">
77 3072f60 Mrdn 2y ago <NameField />
78 3072f60 Mrdn 2y ago <InboundsField />
79 3072f60 Mrdn 2y ago <Button
80 3072f60 Mrdn 2y ago className="mt-3 w-full font-semibold"
81 3072f60 Mrdn 2y ago type="submit"
82 3072f60 Mrdn 2y ago disabled={form.formState.isSubmitting}
83 3072f60 Mrdn 2y ago >
84 3072f60 Mrdn 2y ago {t("submit")}
85 3072f60 Mrdn 2y ago </Button>
86 3072f60 Mrdn 2y ago </form>
87 3072f60 Mrdn 2y ago </Form>
88 3072f60 Mrdn 2y ago </DialogContent>
89 3072f60 Mrdn 2y ago </Dialog>
90 3072f60 Mrdn 2y ago );
91 3072f60 Mrdn 2y ago };