mirror of
https://github.com/woodchen-ink/certimate.git
synced 2025-07-18 17:31:55 +08:00
fix(ui): couldn't detect form changed in NotifyChannels
This commit is contained in:
parent
7c1a2d5f91
commit
9e1e0dee1d
@ -1,4 +1,4 @@
|
|||||||
import { useEffect, useRef } from "react";
|
import { useEffect, useRef, useState } from "react";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { useDeepCompareMemo } from "@ant-design/pro-components";
|
import { useDeepCompareMemo } from "@ant-design/pro-components";
|
||||||
import { Button, Collapse, message, notification, Skeleton, Space, Switch, Tooltip, type CollapseProps } from "antd";
|
import { Button, Collapse, message, notification, Skeleton, Space, Switch, Tooltip, type CollapseProps } from "antd";
|
||||||
@ -9,6 +9,55 @@ import { notifyChannelsMap } from "@/domain/settings";
|
|||||||
import { useNotifyChannelStore } from "@/stores/notify";
|
import { useNotifyChannelStore } from "@/stores/notify";
|
||||||
import { getErrMsg } from "@/utils/error";
|
import { getErrMsg } from "@/utils/error";
|
||||||
|
|
||||||
|
type NotifyChannelProps = {
|
||||||
|
className?: string;
|
||||||
|
style?: React.CSSProperties;
|
||||||
|
channel: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
const NotifyChannel = ({ className, style, channel }: NotifyChannelProps) => {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
|
const [messageApi, MessageContextHolder] = message.useMessage();
|
||||||
|
const [notificationApi, NotificationContextHolder] = notification.useNotification();
|
||||||
|
|
||||||
|
const { channels, setChannel } = useNotifyChannelStore();
|
||||||
|
|
||||||
|
const channelConfig = useDeepCompareMemo(() => channels[channel], [channels, channel]);
|
||||||
|
const [channelFormChanged, setChannelFormChanged] = useState(false);
|
||||||
|
const channelFormRef = useRef<NotifyChannelEditFormInstance>(null);
|
||||||
|
|
||||||
|
const handleClickSubmit = async () => {
|
||||||
|
await channelFormRef.current!.validateFields();
|
||||||
|
|
||||||
|
try {
|
||||||
|
setChannel(channel, channelFormRef.current!.getFieldsValue());
|
||||||
|
setChannelFormChanged(false);
|
||||||
|
|
||||||
|
messageApi.success(t("common.text.operation_succeeded"));
|
||||||
|
} catch (err) {
|
||||||
|
notificationApi.error({ message: t("common.text.request_error"), description: getErrMsg(err) });
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className={className} style={style}>
|
||||||
|
{MessageContextHolder}
|
||||||
|
{NotificationContextHolder}
|
||||||
|
|
||||||
|
<NotifyChannelEditForm ref={channelFormRef} channel={channel} model={channelConfig} onModelChange={() => setChannelFormChanged(true)} />
|
||||||
|
|
||||||
|
<Space>
|
||||||
|
<Button type="primary" disabled={!channelFormChanged} onClick={handleClickSubmit}>
|
||||||
|
{t("common.button.save")}
|
||||||
|
</Button>
|
||||||
|
|
||||||
|
{channelConfig != null ? <NotifyTestButton channel={channel} disabled={channelFormChanged} /> : null}
|
||||||
|
</Space>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
type NotifyChannelsSemanticDOM = "collapse" | "form";
|
type NotifyChannelsSemanticDOM = "collapse" | "form";
|
||||||
|
|
||||||
export type NotifyChannelsProps = {
|
export type NotifyChannelsProps = {
|
||||||
@ -21,40 +70,18 @@ export type NotifyChannelsProps = {
|
|||||||
const NotifyChannels = ({ className, classNames, style, styles }: NotifyChannelsProps) => {
|
const NotifyChannels = ({ className, classNames, style, styles }: NotifyChannelsProps) => {
|
||||||
const { t, i18n } = useTranslation();
|
const { t, i18n } = useTranslation();
|
||||||
|
|
||||||
const [messageApi, MessageContextHolder] = message.useMessage();
|
|
||||||
const [notificationApi, NotificationContextHolder] = notification.useNotification();
|
|
||||||
|
|
||||||
const { initialized, channels, setChannel, fetchChannels } = useNotifyChannelStore();
|
const { initialized, channels, setChannel, fetchChannels } = useNotifyChannelStore();
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
fetchChannels();
|
fetchChannels();
|
||||||
}, [fetchChannels]);
|
}, [fetchChannels]);
|
||||||
|
|
||||||
const channelFormRefs = useRef<Array<NotifyChannelEditFormInstance | null>>([]);
|
|
||||||
const channelCollapseItems: CollapseProps["items"] = useDeepCompareMemo(
|
const channelCollapseItems: CollapseProps["items"] = useDeepCompareMemo(
|
||||||
() =>
|
() =>
|
||||||
Array.from(notifyChannelsMap.values()).map((channel, index) => {
|
Array.from(notifyChannelsMap.values()).map((channel) => {
|
||||||
return {
|
return {
|
||||||
key: `channel-${channel.type}`,
|
key: `channel-${channel.type}`,
|
||||||
label: <>{t(channel.name)}</>,
|
label: <>{t(channel.name)}</>,
|
||||||
children: (
|
children: <NotifyChannel className={classNames?.form} style={styles?.form} channel={channel.type} />,
|
||||||
<div className={classNames?.form} style={styles?.form}>
|
|
||||||
<NotifyChannelEditForm ref={(ref) => (channelFormRefs.current[index] = ref)} model={channels[channel.type]} channel={channel.type} />
|
|
||||||
|
|
||||||
<Space>
|
|
||||||
<Button type="primary" onClick={() => handleClickSubmit(channel.type, index)}>
|
|
||||||
{t("common.button.save")}
|
|
||||||
</Button>
|
|
||||||
|
|
||||||
{channels[channel.type] ? (
|
|
||||||
<Tooltip title={t("settings.notification.push_test.tooltip")}>
|
|
||||||
<>
|
|
||||||
<NotifyTestButton channel={channel.type} />
|
|
||||||
</>
|
|
||||||
</Tooltip>
|
|
||||||
) : null}
|
|
||||||
</Space>
|
|
||||||
</div>
|
|
||||||
),
|
|
||||||
extra: (
|
extra: (
|
||||||
<div onClick={(e) => e.stopPropagation()} onMouseDown={(e) => e.stopPropagation()} onMouseUp={(e) => e.stopPropagation()}>
|
<div onClick={(e) => e.stopPropagation()} onMouseDown={(e) => e.stopPropagation()} onMouseUp={(e) => e.stopPropagation()}>
|
||||||
<Switch
|
<Switch
|
||||||
@ -76,28 +103,8 @@ const NotifyChannels = ({ className, classNames, style, styles }: NotifyChannels
|
|||||||
setChannel(channel, { enabled });
|
setChannel(channel, { enabled });
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleClickSubmit = async (channel: string, index: number) => {
|
|
||||||
const form = channelFormRefs.current[index];
|
|
||||||
if (!form) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
await form.validateFields();
|
|
||||||
|
|
||||||
try {
|
|
||||||
setChannel(channel, form.getFieldsValue());
|
|
||||||
|
|
||||||
messageApi.success(t("common.text.operation_succeeded"));
|
|
||||||
} catch (err) {
|
|
||||||
notificationApi.error({ message: t("common.text.request_error"), description: getErrMsg(err) });
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={className} style={style}>
|
<div className={className} style={style}>
|
||||||
{MessageContextHolder}
|
|
||||||
{NotificationContextHolder}
|
|
||||||
|
|
||||||
{!initialized ? (
|
{!initialized ? (
|
||||||
<Skeleton active />
|
<Skeleton active />
|
||||||
) : (
|
) : (
|
||||||
|
@ -27,7 +27,6 @@
|
|||||||
"settings.notification.channel.enabled.on": "On",
|
"settings.notification.channel.enabled.on": "On",
|
||||||
"settings.notification.channel.enabled.off": "Off",
|
"settings.notification.channel.enabled.off": "Off",
|
||||||
"settings.notification.push_test.button": "Send Test Notification",
|
"settings.notification.push_test.button": "Send Test Notification",
|
||||||
"settings.notification.push_test.tooltip": "Note: Please save settings before testing push.",
|
|
||||||
"settings.notification.push_test.pushed": "Sent",
|
"settings.notification.push_test.pushed": "Sent",
|
||||||
"settings.notification.channel.form.bark_server_url.label": "Server URL",
|
"settings.notification.channel.form.bark_server_url.label": "Server URL",
|
||||||
"settings.notification.channel.form.bark_server_url.placeholder": "Please enter server URL",
|
"settings.notification.channel.form.bark_server_url.placeholder": "Please enter server URL",
|
||||||
|
@ -27,7 +27,6 @@
|
|||||||
"settings.notification.channel.enabled.on": "启用",
|
"settings.notification.channel.enabled.on": "启用",
|
||||||
"settings.notification.channel.enabled.off": "未启用",
|
"settings.notification.channel.enabled.off": "未启用",
|
||||||
"settings.notification.push_test.button": "推送测试消息",
|
"settings.notification.push_test.button": "推送测试消息",
|
||||||
"settings.notification.push_test.tooltip": "提示:修改后请先保存设置再测试推送。",
|
|
||||||
"settings.notification.push_test.pushed": "已推送",
|
"settings.notification.push_test.pushed": "已推送",
|
||||||
"settings.notification.channel.form.bark_server_url.label": "服务器地址",
|
"settings.notification.channel.form.bark_server_url.label": "服务器地址",
|
||||||
"settings.notification.channel.form.bark_server_url.placeholder": "请输入服务器地址",
|
"settings.notification.channel.form.bark_server_url.placeholder": "请输入服务器地址",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user