gitscope
https://dev.kronoz.win/r/marzneshin.git
dashboard/src/features/users/dialogs/mutation/index.tsx · v0.3.0
Source
1 f64f3dc Mrdn 2y ago import type { FC } from "react";
2 f64f3dc Mrdn 2y ago import { useCallback } from "react";
3 857e289 Mrdn 2y ago import {
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 857e289 Mrdn 2y ago } from "@marzneshin/features/users";
20 f64f3dc Mrdn 2y ago
21 857e289 Mrdn 2y ago import { UserSchema } from "./schema";
22 f64f3dc Mrdn 2y ago import { UsernameField, NoteField, ServicesField } from "./fields";
23 857e289 Mrdn 2y ago import { useMutationDialog } from "@marzneshin/hooks";
24 5875753 Mrdn 2y ago import { DataLimitFields, ExpirationMethodFields } from "./sections";
25 857e289 Mrdn 2y ago
26 857e289 Mrdn 2y ago interface UsersMutationDialogProps {
27 857e289 Mrdn 2y ago entity: UserMutationType | null;
28 857e289 Mrdn 2y ago open: boolean;
29 857e289 Mrdn 2y ago onOpenChange: (state: boolean) => 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 857e289 Mrdn 2y ago }) => {
37 857e289 Mrdn 2y ago const { t } = useTranslation();
38 f64f3dc Mrdn 2y ago const getDefaultValues = useCallback(
39 f64f3dc Mrdn 2y ago (): UserMutationType => ({
40 f64f3dc Mrdn 2y ago services: [],
41 88321ab Mardin 2y ago data_limit: undefined,
42 f64f3dc Mrdn 2y ago expire: null,
43 f64f3dc Mrdn 2y ago username: "",
44 f64f3dc Mrdn 2y ago data_limit_reset_strategy: "no_reset",
45 f64f3dc Mrdn 2y ago status: "active",
46 f64f3dc Mrdn 2y ago note: "",
47 f64f3dc Mrdn 2y ago on_hold_expire_duration: 0,
48 f64f3dc Mrdn 2y ago on_hold_timeout: undefined,
49 f64f3dc Mrdn 2y ago }),
50 f64f3dc Mrdn 2y ago [],
51 f64f3dc Mrdn 2y ago );
52 857e289 Mrdn 2y ago
53 857e289 Mrdn 2y ago const { form, handleSubmit } = useMutationDialog({
54 857e289 Mrdn 2y ago entity,
55 857e289 Mrdn 2y ago onOpenChange,
56 857e289 Mrdn 2y ago createMutation: useUsersCreationMutation(),
57 857e289 Mrdn 2y ago updateMutation: useUsersUpdateMutation(),
58 857e289 Mrdn 2y ago schema: UserSchema,
59 857e289 Mrdn 2y ago getDefaultValue: getDefaultValues,
60 f64f3dc Mrdn 2y ago loadFormtter: (d) => ({
61 f64f3dc Mrdn 2y ago ...d,
62 f64f3dc Mrdn 2y ago data_limit: (d.data_limit ? d.data_limit : 0) / DATA_LIMIT_METRIC,
63 f64f3dc Mrdn 2y ago }),
64 f64f3dc Mrdn 2y ago });
65 857e289 Mrdn 2y ago
66 857e289 Mrdn 2y ago return (
67 857e289 Mrdn 2y ago <Dialog open={open} onOpenChange={onOpenChange} defaultOpen={true}>
68 aa14012 Mrdn 2y ago <DialogContent className="min-w-full h-full md:h-auto md:min-w-[42rem]">
69 f64f3dc Mrdn 2y ago <ScrollArea className="flex flex-col justify-between h-full p-0">
70 f64f3dc Mrdn 2y ago <DialogHeader>
71 f64f3dc Mrdn 2y ago <DialogTitle className="text-primary">
72 f64f3dc Mrdn 2y ago {entity
73 f64f3dc Mrdn 2y ago ? t("page.users.dialogs.edition.title")
74 f64f3dc Mrdn 2y ago : t("page.users.dialogs.creation.title")}
75 f64f3dc Mrdn 2y ago </DialogTitle>
76 f64f3dc Mrdn 2y ago </DialogHeader>
77 f64f3dc Mrdn 2y ago <Form {...form}>
78 f64f3dc Mrdn 2y ago <form onSubmit={handleSubmit} className="">
79 f64f3dc Mrdn 2y ago <div className="flex-col grid-cols-2 gap-2 sm:flex md:grid h-full">
80 f64f3dc Mrdn 2y ago <div>
81 f64f3dc Mrdn 2y ago <UsernameField disabled={!!entity?.username} />
82 f64f3dc Mrdn 2y ago <DataLimitFields />
83 f64f3dc Mrdn 2y ago <ExpirationMethodFields entity={entity} />
84 f64f3dc Mrdn 2y ago <NoteField />
85 f64f3dc Mrdn 2y ago </div>
86 f64f3dc Mrdn 2y ago <VStack>
87 f64f3dc Mrdn 2y ago <ServicesField />
88 f64f3dc Mrdn 2y ago </VStack>
89 857e289 Mrdn 2y ago </div>
90 f64f3dc Mrdn 2y ago <Button
91 f64f3dc Mrdn 2y ago className="mt-3 w-full font-semibold"
92 f64f3dc Mrdn 2y ago type="submit"
93 f64f3dc Mrdn 2y ago disabled={form.formState.isSubmitting}
94 f64f3dc Mrdn 2y ago >
95 f64f3dc Mrdn 2y ago {t("submit")}
96 f64f3dc Mrdn 2y ago </Button>
97 f64f3dc Mrdn 2y ago </form>
98 f64f3dc Mrdn 2y ago </Form>
99 f64f3dc Mrdn 2y ago </ScrollArea>
100 857e289 Mrdn 2y ago </DialogContent>
101 857e289 Mrdn 2y ago </Dialog>
102 857e289 Mrdn 2y ago );
103 857e289 Mrdn 2y ago };