mirror of
https://github.com/usual2970/certimate.git
synced 2025-10-05 05:54:53 +00:00
feat: add wecom notifier
This commit is contained in:
@@ -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]);
|
||||
|
||||
|
@@ -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;
|
@@ -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"],
|
||||
|
@@ -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"
|
||||
}
|
||||
|
@@ -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>",
|
||||
|
@@ -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": "企业微信"
|
||||
}
|
||||
|
@@ -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>",
|
||||
|
@@ -26,7 +26,7 @@ export const useNotifyChannelStore = create<NotifyChannelState>((set, get) => {
|
||||
produce(settings, (draft) => {
|
||||
draft.content ??= {};
|
||||
draft.content[channel] = { ...draft.content[channel], ...config };
|
||||
})
|
||||
}).content
|
||||
);
|
||||
},
|
||||
|
||||
|
Reference in New Issue
Block a user