gitscope
← marzneshin / v0.3.0-alpha11 / dashboard/src/features/users/dialogs/mutation/index.tsx
https://dev.kronoz.win/r/marzneshin.git
dashboard/src/features/users/dialogs/mutation/index.tsx · TypeScript
Blame Raw
 1import { FC, useCallback } from "react";
 2import {
 3    DialogTitle,
 4    DialogContent,
 5    Dialog,
 6    DialogHeader,
 7    Form,
 8    Button,
 9} from '@marzneshin/components';
10import { useTranslation } from 'react-i18next';
11import {
12    DATA_LIMIT_METRIC,
13    UserMutationType,
14    useUsersCreationMutation,
15    useUsersUpdateMutation
16} from "@marzneshin/features/users";
17import { UserSchema } from "./schema";
18import {
19    UsernameField,
20    NoteField,
21    ServicesField,
22} from "./fields";
23import { useMutationDialog } from "@marzneshin/hooks";
24import { DataLimitFields, ExpirationMethodFields } from "./sections";
25
26interface UsersMutationDialogProps {
27    entity: UserMutationType | null;
28    open: boolean;
29    onOpenChange: (state: boolean) => void;
30}
31
32export const UsersMutationDialog: FC<UsersMutationDialogProps> = ({
33    entity,
34    open,
35    onOpenChange,
36}) => {
37    const { t } = useTranslation();
38    const getDefaultValues = useCallback((): UserMutationType => ({
39        services: [],
40        data_limit: 1,
41        expire: null,
42        username: '',
43        data_limit_reset_strategy: 'no_reset',
44        status: 'active',
45        note: '',
46        on_hold_expire_duration: 0,
47        on_hold_timeout: undefined,
48    }), []);
49
50    const { form, handleSubmit } = useMutationDialog({
51        entity,
52        onOpenChange,
53        createMutation: useUsersCreationMutation(),
54        updateMutation: useUsersUpdateMutation(),
55        schema: UserSchema,
56        getDefaultValue: getDefaultValues,
57        loadFormtter: (d) => ({ ...d, data_limit: (d.data_limit ? d.data_limit : 0) / DATA_LIMIT_METRIC })
58    })
59
60    return (
61        <Dialog open={open} onOpenChange={onOpenChange} defaultOpen={true}>
62            <DialogContent className="sm:max-w-full md:max-w-[600px]">
63                <DialogHeader>
64                    <DialogTitle className="text-primary">
65                        {entity
66                            ? t('page.users.dialogs.edition.title')
67                            : t('page.users.dialogs.creation.title')}
68                    </DialogTitle>
69                </DialogHeader>
70                <Form {...form}>
71                    <form onSubmit={handleSubmit}>
72                        <div className="flex-col grid-cols-2 gap-2 sm:flex md:grid">
73                            <div>
74                                <UsernameField disabled={(entity && entity.username) ? true : false} />
75                                <DataLimitFields />
76                                <ExpirationMethodFields entity={entity} />
77                                <NoteField />
78                            </div>
79                            <div>
80                                <ServicesField />
81                            </div>
82                        </div>
83                        <Button
84                            className="mt-3 w-full font-semibold"
85                            type="submit"
86                            disabled={form.formState.isSubmitting}
87                        >
88                            {t('submit')}
89                        </Button>
90                    </form>
91                </Form>
92            </DialogContent>
93        </Dialog>
94    );
95};