gitscope
https://dev.kronoz.win/r/marzneshin.git
dashboard/src/modules/hosts/dialogs/mutation/index.tsx · v0.6.5
Source
1 d42c6e6 Mardin 2y ago import { type FC, useEffect } from "react";
2 3b7feef Mrdn 2y ago import {
3 3b7feef Mrdn 2y ago DialogTitle,
4 3b7feef Mrdn 2y ago DialogContent,
5 3b7feef Mrdn 2y ago Dialog,
6 3b7feef Mrdn 2y ago DialogHeader,
7 3b7feef Mrdn 2y ago Form,
8 3b7feef Mrdn 2y ago Button,
9 aa14012 Mrdn 2y ago ScrollArea,
10 7389ad0 Mardin 2y ago } from "@marzneshin/common/components";
11 0b152b5 Mrdn 2y ago import { useForm } from "react-hook-form";
12 0b152b5 Mrdn 2y ago import { zodResolver } from "@hookform/resolvers/zod";
13 0b152b5 Mrdn 2y ago import { useTranslation } from "react-i18next";
14 3b7feef Mrdn 2y ago import {
15 3b7feef Mrdn 2y ago useHostsCreationMutation,
16 0b152b5 Mrdn 2y ago useHostsUpdateMutation,
17 d636f3f Dawsh 2y ago type HostWithProfileType,
18 d636f3f Dawsh 2y ago type HostWithProfileSchemaType
19 d636f3f Dawsh 2y ago } from "@marzneshin/modules/hosts";
20 d636f3f Dawsh 2y ago import { useDialog, type MutationDialogProps } from "@marzneshin/common/hooks";
21 d636f3f Dawsh 2y ago import { ProtocolType } from "@marzneshin/modules/inbounds";
22 d636f3f Dawsh 2y ago import { useProfileStrategy } from "./profiles";
23 3b7feef Mrdn 2y ago
24 d636f3f Dawsh 2y ago interface HostMutationDialogProps extends MutationDialogProps<HostWithProfileType> {
25 03b3dbc Mardin 2y ago inboundId?: number;
26 d636f3f Dawsh 2y ago protocol?: ProtocolType;
27 3b7feef Mrdn 2y ago }
28 3b7feef Mrdn 2y ago
29 d636f3f Dawsh 2y ago const transformFormValue = (values: any) => {
30 d636f3f Dawsh 2y ago if (!(values.alpn && values.fingerprint))
31 d636f3f Dawsh 2y ago return values;
32 ec7410a Mardin 2y ago const port = values.port === "" ? null : values.port;
33 0b152b5 Mrdn 2y ago const alpn = values.alpn === "none" ? "" : values.alpn;
34 0b152b5 Mrdn 2y ago const fingerprint = values.fingerprint === "none" ? "" : values.fingerprint;
35 ec7410a Mardin 2y ago return { ...values, alpn, fingerprint, port };
36 0b152b5 Mrdn 2y ago };
37 3b7feef Mrdn 2y ago
38 d42c6e6 Mardin 2y ago export const HostsMutationDialog: FC<HostMutationDialogProps> = ({
39 3b7feef Mrdn 2y ago entity,
40 d636f3f Dawsh 2y ago inboundId,
41 03b3dbc Mardin 2y ago onClose,
42 d636f3f Dawsh 2y ago protocol,
43 3b7feef Mrdn 2y ago }) => {
44 d42c6e6 Mardin 2y ago const [open, onOpenChange] = useDialog(true);
45 d636f3f Dawsh 2y ago const [Schema, ProfileFields, defaultValue] = useProfileStrategy(protocol)
46 d636f3f Dawsh 2y ago const form = useForm<HostWithProfileSchemaType>({
47 d636f3f Dawsh 2y ago defaultValues: entity ? entity : defaultValue,
48 d636f3f Dawsh 2y ago resolver: zodResolver(Schema),
49 3b7feef Mrdn 2y ago });
50 3b7feef Mrdn 2y ago const updateMutation = useHostsUpdateMutation();
51 3b7feef Mrdn 2y ago const createMutation = useHostsCreationMutation();
52 3b7feef Mrdn 2y ago const { t } = useTranslation();
53 3b7feef Mrdn 2y ago
54 d636f3f Dawsh 2y ago const submit = (values: HostWithProfileSchemaType) => {
55 0b152b5 Mrdn 2y ago const host = transformFormValue(values);
56 7428e12 Mrdn 2y ago if (entity && entity.id !== undefined) {
57 7428e12 Mrdn 2y ago updateMutation.mutate({ hostId: entity.id, host });
58 03b3dbc Mardin 2y ago onOpenChange(false);
59 03b3dbc Mardin 2y ago } else if (inboundId !== undefined) {
60 7428e12 Mrdn 2y ago createMutation.mutate({ inboundId, host });
61 03b3dbc Mardin 2y ago onOpenChange(false);
62 3b7feef Mrdn 2y ago }
63 3b7feef Mrdn 2y ago };
64 3b7feef Mrdn 2y ago
65 03b3dbc Mardin 2y ago useEffect(() => {
66 03b3dbc Mardin 2y ago if (!open) onClose();
67 03b3dbc Mardin 2y ago }, [open, onClose]);
68 03b3dbc Mardin 2y ago
69 3b7feef Mrdn 2y ago useEffect(() => {
70 3b7feef Mrdn 2y ago if (entity) form.reset(entity);
71 d636f3f Dawsh 2y ago else form.reset(defaultValue);
72 d636f3f Dawsh 2y ago }, [entity, form, open, defaultValue]);
73 3b7feef Mrdn 2y ago
74 3b7feef Mrdn 2y ago return (
75 3b7feef Mrdn 2y ago <Dialog open={open} onOpenChange={onOpenChange} defaultOpen={true}>
76 aa14012 Mrdn 2y ago <DialogContent className="min-w-full h-full md:h-auto md:min-w-[32rem]">
77 aa14012 Mrdn 2y ago <ScrollArea className="flex flex-col h-full p-0">
78 aa14012 Mrdn 2y ago <DialogHeader className="mb-3">
79 aa14012 Mrdn 2y ago <DialogTitle className="text-primary">
80 aa14012 Mrdn 2y ago {entity
81 aa14012 Mrdn 2y ago ? t("page.hosts.dialogs.edition.title")
82 aa14012 Mrdn 2y ago : t("page.hosts.dialogs.creation.title")}
83 aa14012 Mrdn 2y ago </DialogTitle>
84 aa14012 Mrdn 2y ago </DialogHeader>
85 aa14012 Mrdn 2y ago <Form {...form}>
86 aa14012 Mrdn 2y ago <form
87 aa14012 Mrdn 2y ago onSubmit={form.handleSubmit(submit)}
88 aa14012 Mrdn 2y ago className="h-full flex flex-col justify-between"
89 3b7feef Mrdn 2y ago >
90 d636f3f Dawsh 2y ago <ProfileFields />
91 aa14012 Mrdn 2y ago <Button
92 aa14012 Mrdn 2y ago className="mt-3 w-full font-semibold"
93 aa14012 Mrdn 2y ago type="submit"
94 aa14012 Mrdn 2y ago disabled={form.formState.isSubmitting}
95 aa14012 Mrdn 2y ago >
96 aa14012 Mrdn 2y ago {t("submit")}
97 aa14012 Mrdn 2y ago </Button>
98 aa14012 Mrdn 2y ago </form>
99 aa14012 Mrdn 2y ago </Form>
100 aa14012 Mrdn 2y ago </ScrollArea>
101 3b7feef Mrdn 2y ago </DialogContent>
102 3b7feef Mrdn 2y ago </Dialog>
103 3b7feef Mrdn 2y ago );
104 3b7feef Mrdn 2y ago };