fix(ui): deep compare when model change in AccessEditForm

This commit is contained in:
Fu Diwei 2024-12-19 21:34:17 +08:00
parent 84a3817b15
commit d143df3f9f
29 changed files with 102 additions and 75 deletions

View File

@ -1,7 +1,6 @@
import { useEffect, useLayoutEffect, useState } from "react"; import { useEffect, useLayoutEffect, useMemo, useState } from "react";
import { RouterProvider } from "react-router-dom"; import { RouterProvider } from "react-router-dom";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { useCreation } from "ahooks";
import { App, ConfigProvider, theme, type ThemeConfig } from "antd"; import { App, ConfigProvider, theme, type ThemeConfig } from "antd";
import { type Locale } from "antd/es/locale"; import { type Locale } from "antd/es/locale";
import AntdLocaleEnUs from "antd/locale/en_US"; import AntdLocaleEnUs from "antd/locale/en_US";
@ -18,7 +17,7 @@ const RootApp = () => {
const { theme: browserTheme } = useBrowserTheme(); const { theme: browserTheme } = useBrowserTheme();
const antdLocalesMap: Record<string, Locale> = useCreation( const antdLocalesMap: Record<string, Locale> = useMemo(
() => ({ () => ({
[localeNames.ZH]: AntdLocaleZhCN, [localeNames.ZH]: AntdLocaleZhCN,
[localeNames.EN]: AntdLocaleEnUs, [localeNames.EN]: AntdLocaleEnUs,
@ -33,7 +32,7 @@ const RootApp = () => {
i18n.on("languageChanged", handleLanguageChanged); i18n.on("languageChanged", handleLanguageChanged);
useLayoutEffect(handleLanguageChanged, [antdLocalesMap, i18n]); useLayoutEffect(handleLanguageChanged, [antdLocalesMap, i18n]);
const antdThemesMap: Record<string, ThemeConfig> = useCreation( const antdThemesMap: Record<string, ThemeConfig> = useMemo(
() => ({ () => ({
["light"]: { algorithm: theme.defaultAlgorithm }, ["light"]: { algorithm: theme.defaultAlgorithm },
["dark"]: { algorithm: theme.darkAlgorithm }, ["dark"]: { algorithm: theme.darkAlgorithm },

View File

@ -1,5 +1,6 @@
import { forwardRef, useEffect, useImperativeHandle, useMemo, useState } from "react"; import { forwardRef, useEffect, useImperativeHandle, useMemo, useState } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { useDeepCompareEffect } from "ahooks";
import { Form, Input } from "antd"; import { Form, Input } from "antd";
import { createSchemaFieldRule } from "antd-zod"; import { createSchemaFieldRule } from "antd-zod";
import { z } from "zod"; import { z } from "zod";
@ -80,7 +81,7 @@ const AccessEditForm = forwardRef<AccessEditFormInstance, AccessEditFormProps>((
const [form] = Form.useForm<z.infer<typeof formSchema>>(); const [form] = Form.useForm<z.infer<typeof formSchema>>();
const [initialValues, setInitialValues] = useState<Partial<z.infer<typeof formSchema>>>(model as Partial<z.infer<typeof formSchema>>); const [initialValues, setInitialValues] = useState<Partial<z.infer<typeof formSchema>>>(model as Partial<z.infer<typeof formSchema>>);
useEffect(() => { useDeepCompareEffect(() => {
setInitialValues(model as Partial<z.infer<typeof formSchema>>); setInitialValues(model as Partial<z.infer<typeof formSchema>>);
}, [model]); }, [model]);
@ -90,7 +91,7 @@ const AccessEditForm = forwardRef<AccessEditFormInstance, AccessEditFormProps>((
}, [model?.configType]); }, [model?.configType]);
const [configFormInst] = Form.useForm(); const [configFormInst] = Form.useForm();
const configForm = useMemo(() => { const configFormComponent = useMemo(() => {
/* /*
ASCII ASCII
NOTICE: If you add new child component, please keep ASCII order. NOTICE: If you add new child component, please keep ASCII order.
@ -182,7 +183,7 @@ const AccessEditForm = forwardRef<AccessEditFormInstance, AccessEditFormProps>((
</Form.Item> </Form.Item>
</Form> </Form>
{configForm} {configFormComponent}
</div> </div>
</Form.Provider> </Form.Provider>
); );

View File

@ -1,5 +1,6 @@
import { useEffect, useState } from "react"; import { useState } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { useDeepCompareEffect } from "ahooks";
import { Form, Input, Select, type FormInstance } from "antd"; import { Form, Input, Select, type FormInstance } from "antd";
import { createSchemaFieldRule } from "antd-zod"; import { createSchemaFieldRule } from "antd-zod";
import { z } from "zod"; import { z } from "zod";
@ -45,7 +46,7 @@ const AccessEditFormACMEHttpReqConfig = ({ form, disabled, loading, model, onMod
const formRule = createSchemaFieldRule(formSchema); const formRule = createSchemaFieldRule(formSchema);
const [initialValues, setInitialValues] = useState<Partial<z.infer<typeof formSchema>>>(model ?? initModel()); const [initialValues, setInitialValues] = useState<Partial<z.infer<typeof formSchema>>>(model ?? initModel());
useEffect(() => { useDeepCompareEffect(() => {
setInitialValues(model ?? initModel()); setInitialValues(model ?? initModel());
}, [model]); }, [model]);

View File

@ -1,5 +1,6 @@
import { useEffect, useState } from "react"; import { useState } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { useDeepCompareEffect } from "ahooks";
import { Form, Input, type FormInstance } from "antd"; import { Form, Input, type FormInstance } from "antd";
import { createSchemaFieldRule } from "antd-zod"; import { createSchemaFieldRule } from "antd-zod";
import { z } from "zod"; import { z } from "zod";
@ -54,7 +55,7 @@ const AccessEditFormAWSConfig = ({ form, disabled, loading, model, onModelChange
const formRule = createSchemaFieldRule(formSchema); const formRule = createSchemaFieldRule(formSchema);
const [initialValues, setInitialValues] = useState<Partial<z.infer<typeof formSchema>>>(model ?? initModel()); const [initialValues, setInitialValues] = useState<Partial<z.infer<typeof formSchema>>>(model ?? initModel());
useEffect(() => { useDeepCompareEffect(() => {
setInitialValues(model ?? initModel()); setInitialValues(model ?? initModel());
}, [model]); }, [model]);

View File

@ -1,5 +1,6 @@
import { useEffect, useState } from "react"; import { useState } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { useDeepCompareEffect } from "ahooks";
import { Form, Input, type FormInstance } from "antd"; import { Form, Input, type FormInstance } from "antd";
import { createSchemaFieldRule } from "antd-zod"; import { createSchemaFieldRule } from "antd-zod";
import { z } from "zod"; import { z } from "zod";
@ -38,7 +39,7 @@ const AccessEditFormAliyunConfig = ({ form, disabled, loading, model, onModelCha
const formRule = createSchemaFieldRule(formSchema); const formRule = createSchemaFieldRule(formSchema);
const [initialValues, setInitialValues] = useState<Partial<z.infer<typeof formSchema>>>(model ?? initModel()); const [initialValues, setInitialValues] = useState<Partial<z.infer<typeof formSchema>>>(model ?? initModel());
useEffect(() => { useDeepCompareEffect(() => {
setInitialValues(model ?? initModel()); setInitialValues(model ?? initModel());
}, [model]); }, [model]);

View File

@ -1,5 +1,6 @@
import { useEffect, useState } from "react"; import { useState } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { useDeepCompareEffect } from "ahooks";
import { Form, Input, type FormInstance } from "antd"; import { Form, Input, type FormInstance } from "antd";
import { createSchemaFieldRule } from "antd-zod"; import { createSchemaFieldRule } from "antd-zod";
import { z } from "zod"; import { z } from "zod";
@ -38,7 +39,7 @@ const AccessEditFormBaiduCloudConfig = ({ form, disabled, loading, model, onMode
const formRule = createSchemaFieldRule(formSchema); const formRule = createSchemaFieldRule(formSchema);
const [initialValues, setInitialValues] = useState<Partial<z.infer<typeof formSchema>>>(model ?? initModel()); const [initialValues, setInitialValues] = useState<Partial<z.infer<typeof formSchema>>>(model ?? initModel());
useEffect(() => { useDeepCompareEffect(() => {
setInitialValues(model ?? initModel()); setInitialValues(model ?? initModel());
}, [model]); }, [model]);

View File

@ -1,5 +1,6 @@
import { useEffect, useState } from "react"; import { useState } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { useDeepCompareEffect } from "ahooks";
import { Form, Input, type FormInstance } from "antd"; import { Form, Input, type FormInstance } from "antd";
import { createSchemaFieldRule } from "antd-zod"; import { createSchemaFieldRule } from "antd-zod";
import { z } from "zod"; import { z } from "zod";
@ -38,7 +39,7 @@ const AccessEditFormBytePlusConfig = ({ form, disabled, loading, model, onModelC
const formRule = createSchemaFieldRule(formSchema); const formRule = createSchemaFieldRule(formSchema);
const [initialValues, setInitialValues] = useState<Partial<z.infer<typeof formSchema>>>(model ?? initModel()); const [initialValues, setInitialValues] = useState<Partial<z.infer<typeof formSchema>>>(model ?? initModel());
useEffect(() => { useDeepCompareEffect(() => {
setInitialValues(model ?? initModel()); setInitialValues(model ?? initModel());
}, [model]); }, [model]);

View File

@ -1,5 +1,6 @@
import { useEffect, useState } from "react"; import { useState } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { useDeepCompareEffect } from "ahooks";
import { Form, Input, type FormInstance } from "antd"; import { Form, Input, type FormInstance } from "antd";
import { createSchemaFieldRule } from "antd-zod"; import { createSchemaFieldRule } from "antd-zod";
import { z } from "zod"; import { z } from "zod";
@ -33,7 +34,7 @@ const AccessEditFormCloudflareConfig = ({ form, disabled, loading, model, onMode
const formRule = createSchemaFieldRule(formSchema); const formRule = createSchemaFieldRule(formSchema);
const [initialValues, setInitialValues] = useState<Partial<z.infer<typeof formSchema>>>(model ?? initModel()); const [initialValues, setInitialValues] = useState<Partial<z.infer<typeof formSchema>>>(model ?? initModel());
useEffect(() => { useDeepCompareEffect(() => {
setInitialValues(model ?? initModel()); setInitialValues(model ?? initModel());
}, [model]); }, [model]);

View File

@ -1,5 +1,6 @@
import { useEffect, useState } from "react"; import { useState } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { useDeepCompareEffect } from "ahooks";
import { Form, Input, type FormInstance } from "antd"; import { Form, Input, type FormInstance } from "antd";
import { createSchemaFieldRule } from "antd-zod"; import { createSchemaFieldRule } from "antd-zod";
import { z } from "zod"; import { z } from "zod";
@ -38,7 +39,7 @@ const AccessEditFormDogeCloudConfig = ({ form, disabled, loading, model, onModel
const formRule = createSchemaFieldRule(formSchema); const formRule = createSchemaFieldRule(formSchema);
const [initialValues, setInitialValues] = useState<Partial<z.infer<typeof formSchema>>>(model ?? initModel()); const [initialValues, setInitialValues] = useState<Partial<z.infer<typeof formSchema>>>(model ?? initModel());
useEffect(() => { useDeepCompareEffect(() => {
setInitialValues(model ?? initModel()); setInitialValues(model ?? initModel());
}, [model]); }, [model]);

View File

@ -1,5 +1,6 @@
import { useEffect, useState } from "react"; import { useState } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { useDeepCompareEffect } from "ahooks";
import { Form, Input, type FormInstance } from "antd"; import { Form, Input, type FormInstance } from "antd";
import { createSchemaFieldRule } from "antd-zod"; import { createSchemaFieldRule } from "antd-zod";
import { z } from "zod"; import { z } from "zod";
@ -38,7 +39,7 @@ const AccessEditFormGoDaddyConfig = ({ form, disabled, loading, model, onModelCh
const formRule = createSchemaFieldRule(formSchema); const formRule = createSchemaFieldRule(formSchema);
const [initialValues, setInitialValues] = useState<Partial<z.infer<typeof formSchema>>>(model ?? initModel()); const [initialValues, setInitialValues] = useState<Partial<z.infer<typeof formSchema>>>(model ?? initModel());
useEffect(() => { useDeepCompareEffect(() => {
setInitialValues(model ?? initModel()); setInitialValues(model ?? initModel());
}, [model]); }, [model]);

View File

@ -1,5 +1,6 @@
import { useEffect, useState } from "react"; import { useState } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { useDeepCompareEffect } from "ahooks";
import { Form, Input, type FormInstance } from "antd"; import { Form, Input, type FormInstance } from "antd";
import { createSchemaFieldRule } from "antd-zod"; import { createSchemaFieldRule } from "antd-zod";
import { z } from "zod"; import { z } from "zod";
@ -47,7 +48,7 @@ const AccessEditFormHuaweiCloudConfig = ({ form, disabled, loading, model, onMod
const formRule = createSchemaFieldRule(formSchema); const formRule = createSchemaFieldRule(formSchema);
const [initialValues, setInitialValues] = useState<Partial<z.infer<typeof formSchema>>>(model ?? initModel()); const [initialValues, setInitialValues] = useState<Partial<z.infer<typeof formSchema>>>(model ?? initModel());
useEffect(() => { useDeepCompareEffect(() => {
setInitialValues(model ?? initModel()); setInitialValues(model ?? initModel());
}, [model]); }, [model]);

View File

@ -1,6 +1,7 @@
import { useEffect, useState } from "react"; import { useState } from "react";
import { flushSync } from "react-dom"; import { flushSync } from "react-dom";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { useDeepCompareEffect } from "ahooks";
import { Button, Form, Input, Upload, type FormInstance, type UploadFile, type UploadProps } from "antd"; import { Button, Form, Input, Upload, type FormInstance, type UploadFile, type UploadProps } from "antd";
import { createSchemaFieldRule } from "antd-zod"; import { createSchemaFieldRule } from "antd-zod";
import { z } from "zod"; import { z } from "zod";
@ -36,7 +37,7 @@ const AccessEditFormKubernetesConfig = ({ form, disabled, loading, model, onMode
const formRule = createSchemaFieldRule(formSchema); const formRule = createSchemaFieldRule(formSchema);
const [initialValues, setInitialValues] = useState<Partial<z.infer<typeof formSchema>>>(model ?? initModel()); const [initialValues, setInitialValues] = useState<Partial<z.infer<typeof formSchema>>>(model ?? initModel());
useEffect(() => { useDeepCompareEffect(() => {
setInitialValues(model ?? initModel()); setInitialValues(model ?? initModel());
setKubeFileList(model?.kubeConfig?.trim() ? [{ uid: "-1", name: "kubeconfig", status: "done" }] : []); setKubeFileList(model?.kubeConfig?.trim() ? [{ uid: "-1", name: "kubeconfig", status: "done" }] : []);
}, [model]); }, [model]);

View File

@ -1,4 +1,5 @@
import { useEffect, useState } from "react"; import { useState } from "react";
import { useDeepCompareEffect } from "ahooks";
import { Form, type FormInstance } from "antd"; import { Form, type FormInstance } from "antd";
import { type LocalAccessConfig } from "@/domain/access"; import { type LocalAccessConfig } from "@/domain/access";
@ -19,7 +20,7 @@ const initModel = () => {
const AccessEditFormLocalConfig = ({ form, disabled, loading, model }: AccessEditFormLocalConfigProps) => { const AccessEditFormLocalConfig = ({ form, disabled, loading, model }: AccessEditFormLocalConfigProps) => {
const [initialValues, setInitialValues] = useState(model ?? initModel()); const [initialValues, setInitialValues] = useState(model ?? initModel());
useEffect(() => { useDeepCompareEffect(() => {
setInitialValues(model ?? initModel()); setInitialValues(model ?? initModel());
}, [model]); }, [model]);

View File

@ -1,5 +1,6 @@
import { useEffect, useState } from "react"; import { useState } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { useDeepCompareEffect } from "ahooks";
import { Form, Input, type FormInstance } from "antd"; import { Form, Input, type FormInstance } from "antd";
import { createSchemaFieldRule } from "antd-zod"; import { createSchemaFieldRule } from "antd-zod";
import { z } from "zod"; import { z } from "zod";
@ -33,7 +34,7 @@ const AccessEditFormNameSiloConfig = ({ form, disabled, loading, model, onModelC
const formRule = createSchemaFieldRule(formSchema); const formRule = createSchemaFieldRule(formSchema);
const [initialValues, setInitialValues] = useState<Partial<z.infer<typeof formSchema>>>(model ?? initModel()); const [initialValues, setInitialValues] = useState<Partial<z.infer<typeof formSchema>>>(model ?? initModel());
useEffect(() => { useDeepCompareEffect(() => {
setInitialValues(model ?? initModel()); setInitialValues(model ?? initModel());
}, [model]); }, [model]);

View File

@ -1,5 +1,6 @@
import { useEffect, useState } from "react"; import { useState } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { useDeepCompareEffect } from "ahooks";
import { Form, Input, type FormInstance } from "antd"; import { Form, Input, type FormInstance } from "antd";
import { createSchemaFieldRule } from "antd-zod"; import { createSchemaFieldRule } from "antd-zod";
import { z } from "zod"; import { z } from "zod";
@ -34,7 +35,7 @@ const AccessEditFormPowerDNSConfig = ({ form, disabled, loading, model, onModelC
const formRule = createSchemaFieldRule(formSchema); const formRule = createSchemaFieldRule(formSchema);
const [initialValues, setInitialValues] = useState<Partial<z.infer<typeof formSchema>>>(model ?? initModel()); const [initialValues, setInitialValues] = useState<Partial<z.infer<typeof formSchema>>>(model ?? initModel());
useEffect(() => { useDeepCompareEffect(() => {
setInitialValues(model ?? initModel()); setInitialValues(model ?? initModel());
}, [model]); }, [model]);

View File

@ -1,5 +1,6 @@
import { useEffect, useState } from "react"; import { useState } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { useDeepCompareEffect } from "ahooks";
import { Form, Input, type FormInstance } from "antd"; import { Form, Input, type FormInstance } from "antd";
import { createSchemaFieldRule } from "antd-zod"; import { createSchemaFieldRule } from "antd-zod";
import { z } from "zod"; import { z } from "zod";
@ -38,7 +39,7 @@ const AccessEditFormQiniuConfig = ({ form, disabled, loading, model, onModelChan
const formRule = createSchemaFieldRule(formSchema); const formRule = createSchemaFieldRule(formSchema);
const [initialValues, setInitialValues] = useState<Partial<z.infer<typeof formSchema>>>(model ?? initModel()); const [initialValues, setInitialValues] = useState<Partial<z.infer<typeof formSchema>>>(model ?? initModel());
useEffect(() => { useDeepCompareEffect(() => {
setInitialValues(model ?? initModel()); setInitialValues(model ?? initModel());
}, [model]); }, [model]);

View File

@ -1,6 +1,7 @@
import { useEffect, useState } from "react"; import { useState } from "react";
import { flushSync } from "react-dom"; import { flushSync } from "react-dom";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { useDeepCompareEffect } from "ahooks";
import { Button, Form, Input, InputNumber, Upload, type FormInstance, type UploadFile, type UploadProps } from "antd"; import { Button, Form, Input, InputNumber, Upload, type FormInstance, type UploadFile, type UploadProps } from "antd";
import { createSchemaFieldRule } from "antd-zod"; import { createSchemaFieldRule } from "antd-zod";
import { z } from "zod"; import { z } from "zod";
@ -72,7 +73,7 @@ const AccessEditFormSSHConfig = ({ form, disabled, loading, model, onModelChange
const formRule = createSchemaFieldRule(formSchema); const formRule = createSchemaFieldRule(formSchema);
const [initialValues, setInitialValues] = useState<Partial<z.infer<typeof formSchema>>>(model ?? initModel()); const [initialValues, setInitialValues] = useState<Partial<z.infer<typeof formSchema>>>(model ?? initModel());
useEffect(() => { useDeepCompareEffect(() => {
setInitialValues(model ?? initModel()); setInitialValues(model ?? initModel());
setKeyFileList(model?.key?.trim() ? [{ uid: "-1", name: "sshkey", status: "done" }] : []); setKeyFileList(model?.key?.trim() ? [{ uid: "-1", name: "sshkey", status: "done" }] : []);
}, [model]); }, [model]);

View File

@ -1,5 +1,6 @@
import { useEffect, useState } from "react"; import { useState } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { useDeepCompareEffect } from "ahooks";
import { Form, Input, type FormInstance } from "antd"; import { Form, Input, type FormInstance } from "antd";
import { createSchemaFieldRule } from "antd-zod"; import { createSchemaFieldRule } from "antd-zod";
import { z } from "zod"; import { z } from "zod";
@ -38,7 +39,7 @@ const AccessEditFormTencentCloudConfig = ({ form, disabled, loading, model, onMo
const formRule = createSchemaFieldRule(formSchema); const formRule = createSchemaFieldRule(formSchema);
const [initialValues, setInitialValues] = useState<Partial<z.infer<typeof formSchema>>>(model ?? initModel()); const [initialValues, setInitialValues] = useState<Partial<z.infer<typeof formSchema>>>(model ?? initModel());
useEffect(() => { useDeepCompareEffect(() => {
setInitialValues(model ?? initModel()); setInitialValues(model ?? initModel());
}, [model]); }, [model]);

View File

@ -1,5 +1,6 @@
import { useEffect, useState } from "react"; import { useState } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { useDeepCompareEffect } from "ahooks";
import { Form, Input, type FormInstance } from "antd"; import { Form, Input, type FormInstance } from "antd";
import { createSchemaFieldRule } from "antd-zod"; import { createSchemaFieldRule } from "antd-zod";
import { z } from "zod"; import { z } from "zod";
@ -38,7 +39,7 @@ const AccessEditFormVolcEngineConfig = ({ form, disabled, loading, model, onMode
const formRule = createSchemaFieldRule(formSchema); const formRule = createSchemaFieldRule(formSchema);
const [initialValues, setInitialValues] = useState<Partial<z.infer<typeof formSchema>>>(model ?? initModel()); const [initialValues, setInitialValues] = useState<Partial<z.infer<typeof formSchema>>>(model ?? initModel());
useEffect(() => { useDeepCompareEffect(() => {
setInitialValues(model ?? initModel()); setInitialValues(model ?? initModel());
}, [model]); }, [model]);

View File

@ -24,7 +24,10 @@ const AccessEditFormWebhookConfig = ({ form, disabled, loading, model, onModelCh
const { t } = useTranslation(); const { t } = useTranslation();
const formSchema = z.object({ const formSchema = z.object({
url: z.string().url(t("common.errmsg.url_invalid")), url: z
.string()
.min(1, { message: t("access.form.webhook_url.placeholder") })
.url({ message: t("common.errmsg.url_invalid") }),
}); });
const formRule = createSchemaFieldRule(formSchema); const formRule = createSchemaFieldRule(formSchema);

View File

@ -6,12 +6,12 @@ import { Modal, notification } from "antd";
import { type AccessModel } from "@/domain/access"; import { type AccessModel } from "@/domain/access";
import { useAccessStore } from "@/stores/access"; import { useAccessStore } from "@/stores/access";
import { getErrMsg } from "@/utils/error"; import { getErrMsg } from "@/utils/error";
import AccessEditForm, { type AccessEditFormInstance } from "./AccessEditForm"; import AccessEditForm, { type AccessEditFormInstance, type AccessEditFormProps } from "./AccessEditForm";
export type AccessEditModalProps = { export type AccessEditModalProps = {
data?: Partial<MaybeModelRecord<AccessModel>>; data?: AccessEditFormProps["model"];
loading?: boolean; loading?: boolean;
mode: "add" | "edit" | "copy"; mode: AccessEditFormProps["mode"];
open?: boolean; open?: boolean;
trigger?: React.ReactElement; trigger?: React.ReactElement;
onOpenChange?: (open: boolean) => void; onOpenChange?: (open: boolean) => void;
@ -57,7 +57,7 @@ const AccessEditModal = ({ data, loading, mode, trigger, ...props }: AccessEditM
} }
try { try {
if (mode === "add" || mode === "copy") { if (mode === "add") {
if (data?.id) { if (data?.id) {
throw "Invalid props: `data`"; throw "Invalid props: `data`";
} }
@ -73,7 +73,7 @@ const AccessEditModal = ({ data, loading, mode, trigger, ...props }: AccessEditM
setOpen(false); setOpen(false);
} catch (err) { } catch (err) {
notificationApi.error({ message: t("common.text.request_error"), description: <>{getErrMsg(err)}</> }); notificationApi.error({ message: t("common.text.request_error"), description: getErrMsg(err) });
throw err; throw err;
} finally { } finally {

View File

@ -41,15 +41,24 @@ export const ACCESS_PROVIDER_TYPES = Object.freeze({
WEBHOOK: ACCESS_PROVIDER_TYPE_WEBHOOK, WEBHOOK: ACCESS_PROVIDER_TYPE_WEBHOOK,
} as const); } as const);
export const ACCESS_PROVIDER_USAGE_ALL = "all" as const;
export const ACCESS_PROVIDER_USAGE_APPLY = "apply" as const;
export const ACCESS_PROVIDER_USAGE_DEPLOY = "deploy" as const;
export const ACCESS_PROVIDER_USAGES = Object.freeze({
ALL: ACCESS_PROVIDER_USAGE_ALL,
APPLY: ACCESS_PROVIDER_USAGE_APPLY,
DEPLOY: ACCESS_PROVIDER_USAGE_DEPLOY,
} as const);
// #region AccessModel
export interface AccessModel extends BaseModel { export interface AccessModel extends BaseModel {
name: string; name: string;
configType: string; configType: string;
usage: AccessUsages; usage: AccessUsages;
config: /* config: /*
ASCII ASCII
NOTICE: If you add new type, please keep ASCII order. NOTICE: If you add new type, please keep ASCII order.
*/ */ Record<string, unknown> &
Record<string, unknown> &
( (
| ACMEHttpReqAccessConfig | ACMEHttpReqAccessConfig
| AliyunAccessConfig | AliyunAccessConfig
@ -71,7 +80,9 @@ export interface AccessModel extends BaseModel {
| WebhookAccessConfig | WebhookAccessConfig
); );
} }
// #endregion
// #region AccessConfig
export type ACMEHttpReqAccessConfig = { export type ACMEHttpReqAccessConfig = {
endpoint: string; endpoint: string;
mode?: string; mode?: string;
@ -163,19 +174,12 @@ export type VolcEngineAccessConfig = {
export type WebhookAccessConfig = { export type WebhookAccessConfig = {
url: string; url: string;
}; };
// #endregion
export const ACCESS_PROVIDER_USAGE_ALL = "all" as const; // #region AccessProvider
export const ACCESS_PROVIDER_USAGE_APPLY = "apply" as const; export type AccessUsages = (typeof ACCESS_PROVIDER_USAGES)[keyof typeof ACCESS_PROVIDER_USAGES];
export const ACCESS_PROVIDER_USAGE_DEPLOY = "deploy" as const;
export const ACCESS_PROVIDER_USAGES = Object.freeze({
ALL: ACCESS_PROVIDER_USAGE_ALL,
APPLY: ACCESS_PROVIDER_USAGE_APPLY,
DEPLOY: ACCESS_PROVIDER_USAGE_DEPLOY,
} as const);
type AccessUsages = (typeof ACCESS_PROVIDER_USAGES)[keyof typeof ACCESS_PROVIDER_USAGES]; export type AccessProvider = {
type AccessProvider = {
type: string; type: string;
name: string; name: string;
icon: string; icon: string;
@ -208,3 +212,4 @@ export const accessProvidersMap: Map<AccessProvider["type"], AccessProvider> = n
[ACCESS_PROVIDER_TYPE_ACMEHTTPREQ, "common.provider.acmehttpreq", "/imgs/providers/acmehttpreq.svg", "apply"], [ACCESS_PROVIDER_TYPE_ACMEHTTPREQ, "common.provider.acmehttpreq", "/imgs/providers/acmehttpreq.svg", "apply"],
].map(([type, name, icon, usage]) => [type, { type, name, icon, usage: usage as AccessUsages }]) ].map(([type, name, icon, usage]) => [type, { type, name, icon, usage: usage as AccessUsages }])
); );
// #endregion

View File

@ -118,8 +118,8 @@
"access.form.volcengine_secret_access_key.label": "火山引擎 Secret Access Key", "access.form.volcengine_secret_access_key.label": "火山引擎 Secret Access Key",
"access.form.volcengine_secret_access_key.placeholder": "请输入火山引擎 Secret Access Key", "access.form.volcengine_secret_access_key.placeholder": "请输入火山引擎 Secret Access Key",
"access.form.volcengine_secret_access_key.tooltip": "这是什么?请参阅 <a href=\"https://www.volcengine.com/docs/6291/216571\" target=\"_blank\">https://www.volcengine.com/docs/6291/216571</a>", "access.form.volcengine_secret_access_key.tooltip": "这是什么?请参阅 <a href=\"https://www.volcengine.com/docs/6291/216571\" target=\"_blank\">https://www.volcengine.com/docs/6291/216571</a>",
"access.form.webhook_url.label": "Webhook URL", "access.form.webhook_url.label": "Webhook 回调地址",
"access.form.webhook_url.placeholder": "请输入 Webhook URL", "access.form.webhook_url.placeholder": "请输入 Webhook 回调地址",
"access.form.ssh_host.label": "服务器地址", "access.form.ssh_host.label": "服务器地址",
"access.form.ssh_host.placeholder": "请输入服务器地址", "access.form.ssh_host.placeholder": "请输入服务器地址",
"access.form.ssh_port.label": "服务器端口", "access.form.ssh_port.label": "服务器端口",

View File

@ -182,7 +182,7 @@ const SiderMenu = memo(({ onSelect }: { onSelect?: (key: string) => void }) => {
const ThemeToggleButton = memo(({ size }: { size?: ButtonProps["size"] }) => { const ThemeToggleButton = memo(({ size }: { size?: ButtonProps["size"] }) => {
const { t } = useTranslation(); const { t } = useTranslation();
const { theme, setThemeMode } = useBrowserTheme(); const { theme, themeMode, setThemeMode } = useBrowserTheme();
const items: Required<MenuProps>["items"] = [ const items: Required<MenuProps>["items"] = [
["light", t("common.theme.light")], ["light", t("common.theme.light")],
@ -194,7 +194,9 @@ const ThemeToggleButton = memo(({ size }: { size?: ButtonProps["size"] }) => {
label: label, label: label,
onClick: () => { onClick: () => {
setThemeMode(key as Parameters<typeof setThemeMode>[0]); setThemeMode(key as Parameters<typeof setThemeMode>[0]);
window.location.reload(); if (key !== themeMode) {
window.location.reload();
}
}, },
}; };
}); });

View File

@ -83,7 +83,7 @@ const AccessList = () => {
<AccessEditModal <AccessEditModal
data={{ ...record, id: undefined, name: `${record.name}-copy` }} data={{ ...record, id: undefined, name: `${record.name}-copy` }}
mode="copy" mode="add"
trigger={ trigger={
<Tooltip title={t("access.action.copy")}> <Tooltip title={t("access.action.copy")}>
<Button type="link" icon={<CopyIcon size={16} />} /> <Button type="link" icon={<CopyIcon size={16} />} />
@ -119,7 +119,7 @@ const AccessList = () => {
} }
console.error(err); console.error(err);
notificationApi.error({ message: t("common.text.request_error"), description: <>{getErrMsg(err)}</> }); notificationApi.error({ message: t("common.text.request_error"), description: getErrMsg(err) });
}); });
}, []); }, []);
@ -152,7 +152,7 @@ const AccessList = () => {
await deleteAccess(data); await deleteAccess(data);
} catch (err) { } catch (err) {
console.error(err); console.error(err);
notificationApi.error({ message: t("common.text.request_error"), description: <>{getErrMsg(err)}</> }); notificationApi.error({ message: t("common.text.request_error"), description: getErrMsg(err) });
} }
}, },
}); });

View File

@ -198,7 +198,7 @@ const CertificateList = () => {
} }
console.error(err); console.error(err);
notificationApi.error({ message: t("common.text.request_error"), description: <>{getErrMsg(err)}</> }); notificationApi.error({ message: t("common.text.request_error"), description: getErrMsg(err) });
}, },
} }
); );

View File

@ -49,7 +49,7 @@ const Dashboard = () => {
} }
console.error(err); console.error(err);
notificationApi.error({ message: t("common.text.request_error"), description: <>{getErrMsg(err)}</> }); notificationApi.error({ message: t("common.text.request_error"), description: getErrMsg(err) });
}, },
} }
); );

View File

@ -30,7 +30,7 @@ const Login = () => {
await getPocketBase().admins.authWithPassword(fields.username, fields.password); await getPocketBase().admins.authWithPassword(fields.username, fields.password);
navigage("/"); navigage("/");
} catch (err) { } catch (err) {
notificationApi.error({ message: t("common.text.request_error"), description: <>{getErrMsg(err)}</> }); notificationApi.error({ message: t("common.text.request_error"), description: getErrMsg(err) });
} finally { } finally {
setFormPending(false); setFormPending(false);
} }

View File

@ -230,7 +230,7 @@ const WorkflowList = () => {
} }
console.error(err); console.error(err);
notificationApi.error({ message: t("common.text.request_error"), description: <>{getErrMsg(err)}</> }); notificationApi.error({ message: t("common.text.request_error"), description: getErrMsg(err) });
}, },
} }
); );
@ -253,7 +253,7 @@ const WorkflowList = () => {
} }
} catch (err) { } catch (err) {
console.error(err); console.error(err);
notificationApi.error({ message: t("common.text.request_error"), description: <>{getErrMsg(err)}</> }); notificationApi.error({ message: t("common.text.request_error"), description: getErrMsg(err) });
} }
}; };
@ -269,7 +269,7 @@ const WorkflowList = () => {
} }
} catch (err) { } catch (err) {
console.error(err); console.error(err);
notificationApi.error({ message: t("common.text.request_error"), description: <>{getErrMsg(err)}</> }); notificationApi.error({ message: t("common.text.request_error"), description: getErrMsg(err) });
} }
}, },
}); });