feat: add wecom notifier

This commit is contained in:
Fu Diwei
2024-12-22 11:25:08 +08:00
parent a1fec5f6ac
commit 01d30bb742
14 changed files with 235 additions and 39 deletions

View File

@@ -2,7 +2,7 @@ import { forwardRef, useImperativeHandle, useMemo, useState } from "react";
import { useCreation, useDeepCompareEffect } from "ahooks";
import { Form } from "antd";
import { type NotifyChannelsSettingsContent } from "@/domain/settings";
import { NOTIFY_CHANNELS, type NotifyChannelsSettingsContent } from "@/domain/settings";
import NotifyChannelEditFormBarkFields from "./NotifyChannelEditFormBarkFields";
import NotifyChannelEditFormDingTalkFields from "./NotifyChannelEditFormDingTalkFields";
import NotifyChannelEditFormEmailFields from "./NotifyChannelEditFormEmailFields";
@@ -10,13 +10,14 @@ import NotifyChannelEditFormLarkFields from "./NotifyChannelEditFormLarkFields";
import NotifyChannelEditFormServerChanFields from "./NotifyChannelEditFormServerChanFields";
import NotifyChannelEditFormTelegramFields from "./NotifyChannelEditFormTelegramFields";
import NotifyChannelEditFormWebhookFields from "./NotifyChannelEditFormWebhookFields";
import NotifyChannelEditFormWeComFields from "./NotifyChannelEditFormWeComFields";
type NotifyChannelEditFormModelType = NotifyChannelsSettingsContent[keyof NotifyChannelsSettingsContent];
export type NotifyChannelEditFormProps = {
className?: string;
style?: React.CSSProperties;
channel: keyof NotifyChannelsSettingsContent;
channel: string;
disabled?: boolean;
loading?: boolean;
model?: NotifyChannelEditFormModelType;
@@ -39,20 +40,22 @@ const NotifyChannelEditForm = forwardRef<NotifyChannelEditFormInstance, NotifyCh
NOTICE: If you add new child component, please keep ASCII order.
*/
switch (channel) {
case "bark":
case NOTIFY_CHANNELS.BARK:
return <NotifyChannelEditFormBarkFields />;
case "dingtalk":
case NOTIFY_CHANNELS.DINGTALK:
return <NotifyChannelEditFormDingTalkFields />;
case "email":
case NOTIFY_CHANNELS.EMAIL:
return <NotifyChannelEditFormEmailFields />;
case "lark":
case NOTIFY_CHANNELS.LARK:
return <NotifyChannelEditFormLarkFields />;
case "serverchan":
case NOTIFY_CHANNELS.SERVERCHAN:
return <NotifyChannelEditFormServerChanFields />;
case "telegram":
case NOTIFY_CHANNELS.TELEGRAM:
return <NotifyChannelEditFormTelegramFields />;
case "webhook":
case NOTIFY_CHANNELS.WEBHOOK:
return <NotifyChannelEditFormWebhookFields />;
case NOTIFY_CHANNELS.WECOM:
return <NotifyChannelEditFormWeComFields />;
}
}, [channel]);

View File

@@ -0,0 +1,31 @@
import { useTranslation } from "react-i18next";
import { Form, Input } from "antd";
import { createSchemaFieldRule } from "antd-zod";
import { z } from "zod";
const NotifyChannelEditFormWeComFields = () => {
const { t } = useTranslation();
const formSchema = z.object({
webhookUrl: z
.string({ message: t("settings.notification.channel.form.wecom_webhook_url.placeholder") })
.min(1, t("settings.notification.channel.form.wecom_webhook_url.placeholder"))
.url({ message: t("common.errmsg.url_invalid") }),
});
const formRule = createSchemaFieldRule(formSchema);
return (
<>
<Form.Item
name="webhookUrl"
label={t("settings.notification.channel.form.wecom_webhook_url.label")}
rules={[formRule]}
tooltip={<span dangerouslySetInnerHTML={{ __html: t("settings.notification.channel.form.wecom_webhook_url.tooltip") }}></span>}
>
<Input placeholder={t("settings.notification.channel.form.wecom_webhook_url.placeholder")} />
</Form.Item>
</>
);
};
export default NotifyChannelEditFormWeComFields;

View File

@@ -39,19 +39,41 @@ export const defaultNotifyTemplate: NotifyTemplate = {
// #endregion
// #region Settings: NotifyChannels
export const NOTIFY_CHANNEL_BARK = "bark" as const;
export const NOTIFY_CHANNEL_DINGTALK = "dingtalk" as const;
export const NOTIFY_CHANNEL_EMAIL = "email" as const;
export const NOTIFY_CHANNEL_LARK = "lark" as const;
export const NOTIFY_CHANNEL_SERVERCHAN = "serverchan" as const;
export const NOTIFY_CHANNEL_TELEGRAM = "telegram" as const;
export const NOTIFY_CHANNEL_WEBHOOK = "webhook" as const;
export const NOTIFY_CHANNEL_WECOM = "wecom" as const;
export const NOTIFY_CHANNELS = Object.freeze({
BARK: NOTIFY_CHANNEL_BARK,
DINGTALK: NOTIFY_CHANNEL_DINGTALK,
EMAIL: NOTIFY_CHANNEL_EMAIL,
LARK: NOTIFY_CHANNEL_LARK,
SERVERCHAN: NOTIFY_CHANNEL_SERVERCHAN,
TELEGRAM: NOTIFY_CHANNEL_TELEGRAM,
WEBHOOK: NOTIFY_CHANNEL_WEBHOOK,
WECOM: NOTIFY_CHANNEL_WECOM,
} as const);
export type NotifyChannels = (typeof NOTIFY_CHANNELS)[keyof typeof NOTIFY_CHANNELS];
export type NotifyChannelsSettingsContent = {
/*
注意:如果追加新的类型,请保持以 ASCII 排序。
NOTICE: If you add new type, please keep ASCII order.
*/
[key: string]: ({ enabled?: boolean } & Record<string, unknown>) | undefined;
bark?: BarkNotifyChannelConfig;
dingtalk?: DingTalkNotifyChannelConfig;
email?: EmailNotifyChannelConfig;
lark?: LarkNotifyChannelConfig;
serverchan?: ServerChanNotifyChannelConfig;
telegram?: TelegramNotifyChannelConfig;
webhook?: WebhookNotifyChannelConfig;
[NOTIFY_CHANNEL_BARK]?: BarkNotifyChannelConfig;
[NOTIFY_CHANNEL_DINGTALK]?: DingTalkNotifyChannelConfig;
[NOTIFY_CHANNEL_EMAIL]?: EmailNotifyChannelConfig;
[NOTIFY_CHANNEL_LARK]?: LarkNotifyChannelConfig;
[NOTIFY_CHANNEL_SERVERCHAN]?: ServerChanNotifyChannelConfig;
[NOTIFY_CHANNEL_TELEGRAM]?: TelegramNotifyChannelConfig;
[NOTIFY_CHANNEL_WEBHOOK]?: WebhookNotifyChannelConfig;
[NOTIFY_CHANNEL_WECOM]?: WeComNotifyChannelConfig;
};
export type BarkNotifyChannelConfig = {
@@ -98,6 +120,11 @@ export type WebhookNotifyChannelConfig = {
enabled?: boolean;
};
export type WeComNotifyChannelConfig = {
webhookUrl: string;
enabled?: boolean;
};
export type NotifyChannel = {
type: string;
name: string;
@@ -108,6 +135,7 @@ export const notifyChannelsMap: Map<NotifyChannel["type"], NotifyChannel> = new
["email", "common.notifier.email"],
["dingtalk", "common.notifier.dingtalk"],
["lark", "common.notifier.lark"],
["wecom", "common.notifier.wecom"],
["telegram", "common.notifier.telegram"],
["serverchan", "common.notifier.serverchan"],
["bark", "common.notifier.bark"],

View File

@@ -90,5 +90,6 @@
"common.notifier.lark": "Lark",
"common.notifier.serverchan": "ServerChan",
"common.notifier.telegram": "Telegram",
"common.notifier.webhook": "Webhook"
"common.notifier.webhook": "Webhook",
"common.notifier.wecom": "WeCom"
}

View File

@@ -67,10 +67,12 @@
"settings.notification.channel.form.telegram_chat_id.tooltip": "For more information, see <a href=\"https://gist.github.com/nafiesl/4ad622f344cd1dc3bb1ecbe468ff9f8a\" target=\"_blank\">https://gist.github.com/nafiesl/4ad622f344cd1dc3bb1ecbe468ff9f8a</a>",
"settings.notification.channel.form.webhook_url.label": "Webhook URL",
"settings.notification.channel.form.webhook_url.placeholder": "Please enter Webhook URL",
"settings.notification.channel.form.wecom_webhook_url.label": "Webhook URL",
"settings.notification.channel.form.wecom_webhook_url.placeholder": "Please enter Webhook URL",
"settings.notification.channel.form.wecom_webhook_url.tooltip": "For more information, see <a href=\"https://open.work.weixin.qq.com/help2/pc/18401#%E5%85%AD%E3%80%81%E7%BE%A4%E6%9C%BA%E5%99%A8%E4%BA%BAWebhook%E5%9C%B0%E5%9D%80\" target=\"_blank\">https://open.work.weixin.qq.com/help2/pc/18401</a>",
"settings.sslprovider.tab": "Certificate Authority",
"settings.sslprovider.form.provider.label": "ACME Provider",
"settings.sslprovider.provider.errmsg.empty": "Please select a Certificate Authority",
"settings.sslprovider.form.zerossl_eab_kid.label": "EAB KID",
"settings.sslprovider.form.zerossl_eab_kid.placeholder": "Please enter EAB KID",
"settings.sslprovider.form.zerossl_eab_kid.tooltip": "For more information, see <a href=\"https://zerossl.com/documentation/acme/\" target=\"_blank\">https://zerossl.com/documentation/acme/</a>",

View File

@@ -86,9 +86,10 @@
"common.notifier.bark": "Bark",
"common.notifier.dingtalk": "钉钉",
"common.notifier.email": "电子邮件",
"common.notifier.email": "邮件",
"common.notifier.lark": "飞书",
"common.notifier.serverchan": "Server 酱",
"common.notifier.telegram": "Telegram",
"common.notifier.webhook": "Webhook"
"common.notifier.webhook": "Webhook",
"common.notifier.wecom": "企业微信"
}

View File

@@ -53,8 +53,8 @@
"settings.notification.channel.form.email_sender_address.placeholder": "请输入发送邮箱地址",
"settings.notification.channel.form.email_receiver_address.label": "接收邮箱地址",
"settings.notification.channel.form.email_receiver_address.placeholder": "请输入接收邮箱地址",
"settings.notification.channel.form.lark_webhook_url.label": "Webhook 地址",
"settings.notification.channel.form.lark_webhook_url.placeholder": "请输入 Webhook 地址",
"settings.notification.channel.form.lark_webhook_url.label": "机器人 Webhook 地址",
"settings.notification.channel.form.lark_webhook_url.placeholder": "请输入机器人 Webhook 地址",
"settings.notification.channel.form.lark_webhook_url.tooltip": "这是什么?请参阅 <a href=\"https://www.feishu.cn/hc/zh-CN/articles/807992406756\" target=\"_blank\">https://www.feishu.cn/hc/zh-CN/articles/807992406756</a>",
"settings.notification.channel.form.serverchan_url.label": "服务器地址",
"settings.notification.channel.form.serverchan_url.placeholder": "请输入服务器地址(形如: https://sctapi.ftqq.com/*****.send",
@@ -67,10 +67,12 @@
"settings.notification.channel.form.telegram_chat_id.tooltip": "这是什么?请参阅 <a href=\"https://gist.github.com/nafiesl/4ad622f344cd1dc3bb1ecbe468ff9f8a\" target=\"_blank\">https://gist.github.com/nafiesl/4ad622f344cd1dc3bb1ecbe468ff9f8a</a>",
"settings.notification.channel.form.webhook_url.label": "Webhook 回调地址",
"settings.notification.channel.form.webhook_url.placeholder": "请输入 Webhook 回调地址",
"settings.notification.channel.form.wecom_webhook_url.label": "机器人 Webhook 地址",
"settings.notification.channel.form.wecom_webhook_url.placeholder": "请输入机器人 Webhook 地址",
"settings.notification.channel.form.wecom_webhook_url.tooltip": "这是什么?请参阅 <a href=\"https://open.work.weixin.qq.com/help2/pc/18401#%E5%85%AD%E3%80%81%E7%BE%A4%E6%9C%BA%E5%99%A8%E4%BA%BAWebhook%E5%9C%B0%E5%9D%80\" target=\"_blank\">https://open.work.weixin.qq.com/help2/pc/18401</a>",
"settings.sslprovider.tab": "证书颁发机构CA",
"settings.sslprovider.form.provider.label": "ACME 提供商",
"settings.sslprovider.provider.errmsg.empty": "请选择证书分发机构",
"settings.sslprovider.form.zerossl_eab_kid.label": "EAB KID",
"settings.sslprovider.form.zerossl_eab_kid.placeholder": "请输入 EAB KID",
"settings.sslprovider.form.zerossl_eab_kid.tooltip": "这是什么?请参阅 <a href=\"https://zerossl.com/documentation/acme/\" target=\"_blank\">https://zerossl.com/documentation/acme/</a>",

View File

@@ -26,7 +26,7 @@ export const useNotifyChannelStore = create<NotifyChannelState>((set, get) => {
produce(settings, (draft) => {
draft.content ??= {};
draft.content[channel] = { ...draft.content[channel], ...config };
})
}).content
);
},