gitscope
https://dev.kronoz.win/r/marzneshin.git
dashboard/src/features/users/components/dialogs/mutation/index.tsx · v0.3.2
Source
1 03b3dbc Mardin 2y ago import { type FC, useEffect, useCallback } from "react";
2 857e289 Mrdn 2y ago import {
3 f035f9d Mardin 2y ago Separator,
4 857e289 Mrdn 2y ago DialogTitle,
5 857e289 Mrdn 2y ago DialogContent,
6 857e289 Mrdn 2y ago Dialog,
7 857e289 Mrdn 2y ago DialogHeader,
8 857e289 Mrdn 2y ago Form,
9 857e289 Mrdn 2y ago Button,
10 f64f3dc Mrdn 2y ago ScrollArea,
11 f64f3dc Mrdn 2y ago VStack,
12 f64f3dc Mrdn 2y ago } from "@marzneshin/components";
13 f64f3dc Mrdn 2y ago import { useTranslation } from "react-i18next";
14 f64f3dc Mrdn 2y ago import type { UserMutationType } from "@marzneshin/features/users";
15 857e289 Mrdn 2y ago import {
16 2e6c8cb Mrdn 2y ago DATA_LIMIT_METRIC,
17 857e289 Mrdn 2y ago useUsersCreationMutation,
18 f64f3dc Mrdn 2y ago useUsersUpdateMutation,
19 d377c4c Dawsh 2y ago UserSchema,
20 857e289 Mrdn 2y ago } from "@marzneshin/features/users";
21 f64f3dc Mrdn 2y ago import { UsernameField, NoteField, ServicesField } from "./fields";
22 857e289 Mrdn 2y ago import { useMutationDialog } from "@marzneshin/hooks";
23 5875753 Mrdn 2y ago import { DataLimitFields, ExpirationMethodFields } from "./sections";
24 857e289 Mrdn 2y ago
25 857e289 Mrdn 2y ago interface UsersMutationDialogProps {
26 857e289 Mrdn 2y ago entity: UserMutationType | null;
27 857e289 Mrdn 2y ago open: boolean;
28 857e289 Mrdn 2y ago onOpenChange: (state: boolean) => void;
29 03b3dbc Mardin 2y ago onClose: () => void;
30 857e289 Mrdn 2y ago }
31 857e289 Mrdn 2y ago
32 857e289 Mrdn 2y ago export const UsersMutationDialog: FC<UsersMutationDialogProps> = ({
33 857e289 Mrdn 2y ago entity,
34 857e289 Mrdn 2y ago open,
35 857e289 Mrdn 2y ago onOpenChange,
36 03b3dbc Mardin 2y ago onClose,
37 857e289 Mrdn 2y ago }) => {
38 857e289 Mrdn 2y ago const { t } = useTranslation();
39 f64f3dc Mrdn 2y ago const getDefaultValues = useCallback(
40 f64f3dc Mrdn 2y ago (): UserMutationType => ({
41 db68a58 Dawsh 2y ago service_ids: [],
42 d377c4c Dawsh 2y ago expire_strategy: "fixed_date",
43 f64f3dc Mrdn 2y ago username: "",
44 f64f3dc Mrdn 2y ago data_limit_reset_strategy: "no_reset",
45 f64f3dc Mrdn 2y ago note: "",
46 f64f3dc Mrdn 2y ago }),
47 f64f3dc Mrdn 2y ago [],
48 f64f3dc Mrdn 2y ago );
49 857e289 Mrdn 2y ago
50 857e289 Mrdn 2y ago const { form, handleSubmit } = useMutationDialog({
51 857e289 Mrdn 2y ago entity,
52 857e289 Mrdn 2y ago onOpenChange,
53 857e289 Mrdn 2y ago createMutation: useUsersCreationMutation(),
54 857e289 Mrdn 2y ago updateMutation: useUsersUpdateMutation(),
55 857e289 Mrdn 2y ago schema: UserSchema,
56 857e289 Mrdn 2y ago getDefaultValue: getDefaultValues,
57 f64f3dc Mrdn 2y ago loadFormtter: (d) => ({
58 f64f3dc Mrdn 2y ago ...d,
59 f64f3dc Mrdn 2y ago data_limit: (d.data_limit ? d.data_limit : 0) / DATA_LIMIT_METRIC,
60 f64f3dc Mrdn 2y ago }),
61 f64f3dc Mrdn 2y ago });
62 857e289 Mrdn 2y ago
63 03b3dbc Mardin 2y ago useEffect(() => {
64 03b3dbc Mardin 2y ago if (!open) onClose();
65 03b3dbc Mardin 2y ago }, [open, onClose]);
66 03b3dbc Mardin 2y ago
67 857e289 Mrdn 2y ago return (
68 857e289 Mrdn 2y ago <Dialog open={open} onOpenChange={onOpenChange} defaultOpen={true}>
69 aa14012 Mrdn 2y ago <DialogContent className="min-w-full h-full md:h-auto md:min-w-[42rem]">
70 d377c4c Dawsh 2y ago <ScrollArea className="flex flex-col justify-between h-full ">
71 d377c4c Dawsh 2y ago <DialogHeader className="mb-3">
72 f64f3dc Mrdn 2y ago <DialogTitle className="text-primary">
73 f64f3dc Mrdn 2y ago {entity
74 f64f3dc Mrdn 2y ago ? t("page.users.dialogs.edition.title")
75 f64f3dc Mrdn 2y ago : t("page.users.dialogs.creation.title")}
76 f64f3dc Mrdn 2y ago </DialogTitle>
77 f64f3dc Mrdn 2y ago </DialogHeader>
78 f64f3dc Mrdn 2y ago <Form {...form}>
79 d377c4c Dawsh 2y ago <form onSubmit={handleSubmit} >
80 f64f3dc Mrdn 2y ago <div className="flex-col grid-cols-2 gap-2 sm:flex md:grid h-full">
81 d377c4c Dawsh 2y ago <div className="space-y-3">
82 f64f3dc Mrdn 2y ago <UsernameField disabled={!!entity?.username} />
83 d377c4c Dawsh 2y ago <Separator />
84 f64f3dc Mrdn 2y ago <DataLimitFields />
85 d377c4c Dawsh 2y ago <Separator />
86 f64f3dc Mrdn 2y ago <ExpirationMethodFields entity={entity} />
87 d377c4c Dawsh 2y ago <Separator />
88 f64f3dc Mrdn 2y ago <NoteField />
89 f64f3dc Mrdn 2y ago </div>
90 f64f3dc Mrdn 2y ago <VStack>
91 f64f3dc Mrdn 2y ago <ServicesField />
92 f64f3dc Mrdn 2y ago </VStack>
93 857e289 Mrdn 2y ago </div>
94 f64f3dc Mrdn 2y ago <Button
95 f64f3dc Mrdn 2y ago className="mt-3 w-full font-semibold"
96 f64f3dc Mrdn 2y ago type="submit"
97 f64f3dc Mrdn 2y ago disabled={form.formState.isSubmitting}
98 f64f3dc Mrdn 2y ago >
99 f64f3dc Mrdn 2y ago {t("submit")}
100 f64f3dc Mrdn 2y ago </Button>
101 f64f3dc Mrdn 2y ago </form>
102 f64f3dc Mrdn 2y ago </Form>
103 f64f3dc Mrdn 2y ago </ScrollArea>
104 857e289 Mrdn 2y ago </DialogContent>
105 857e289 Mrdn 2y ago </Dialog>
106 857e289 Mrdn 2y ago );
107 857e289 Mrdn 2y ago };