import { PageContainer } from '@ant-design/pro-layout';
import { createForm, onFieldValueChange, onFormInit } from '@formily/core';
import { Card, Col, Input, Row } from 'antd';
import { ISchema } from '@formily/json-schema';
import { useEffect, useMemo, useState } from 'react';
import { createSchemaField, observer } from '@formily/react';
import {
ArrayTable,
Checkbox,
Editable,
Form,
FormButtonGroup,
FormItem,
NumberPicker,
PreviewText,
Radio,
Select,
Space,
Switch,
} from '@formily/antd';
import styles from './index.less';
import { service } from '@/pages/notice/Config';
import { onlyMessage, useAsyncDataSource } from '@/utils/util';
import { useParams } from 'umi';
import { typeList } from '@/pages/notice';
import FUpload from '@/components/Upload';
import WeixinCorp from '@/pages/notice/Config/Detail/doc/WeixinCorp';
import WeixinApp from '@/pages/notice/Config/Detail/doc/WeixinApp';
import DingTalk from '@/pages/notice/Config/Detail/doc/DingTalk';
import DingTalkRebot from '@/pages/notice/Config/Detail/doc/DingTalkRebot';
import AliyunSms from '@/pages/notice/Config/Detail/doc/AliyunSms';
import AliyunVoice from '@/pages/notice/Config/Detail/doc/AliyunVoice';
import Email from '@/pages/notice/Config/Detail/doc/Email';
import { PermissionButton } from '@/components';
import usePermissions from '@/hooks/permission';
import FAutoComplete from '@/components/FAutoComplete';
import Webhook from './doc/Webhook';
import { useModel } from '@@/plugin-model/useModel';
import { typeArray } from '@/components/ProTableCard/CardItems/noticeTemplate';
import RegionIdList from './regionId';
export const docMap = {
weixin: {
corpMessage: ,
officialMessage: ,
},
dingTalk: {
dingTalkMessage: ,
dingTalkRobotWebHook: ,
},
voice: {
aliyun: ,
},
sms: {
aliyunSms: ,
},
email: {
embedded: ,
},
webhook: {
http: ,
},
};
const Detail = observer(() => {
const { id } = useParams<{ id: string }>();
const { initialState } = useModel('@@initialState');
const [typeItem, setTypeItem] = useState('email');
const [providerItem, setProviderItem] = useState('embedded');
const [loading, setLoading] = useState(false);
const form = useMemo(
() =>
createForm({
validateFirst: true,
effects() {
onFormInit(async (form1) => {
if (id === ':id' || !id) {
form1.setValues({
type: 'email',
provider: 'embedded',
});
} else {
const resp = await service.detail(id);
if (resp.status === 200) {
setTypeItem(resp.result.type);
setProviderItem(resp.result.provider);
form1.setValues(resp.result);
}
}
});
onFieldValueChange('type', async (field, f) => {
const value = field.value;
setTypeItem(value);
if (!value) return;
f.setFieldState('provider', (state1) => {
if (id === ':id' || !id) {
state1.value = typeList[value][0].value;
}
state1.dataSource = typeList[value];
});
});
onFieldValueChange('provider', async (field) => {
const _type = field.query('.type').get('value');
if (_type === 'email') {
setProviderItem('embedded');
} else {
setProviderItem(field.value);
}
});
},
}),
[],
);
useEffect(() => {
setTimeout(() => {
if (initialState?.settings?.title) {
document.title = `通知配置 - ${initialState?.settings?.title}`;
} else {
document.title = '通知配置';
}
}, 0);
}, []);
const SchemaField = createSchemaField({
components: {
FormItem,
Input,
Select,
Switch,
Radio,
ArrayTable,
Editable,
PreviewText,
Space,
FUpload,
Checkbox,
NumberPicker,
FAutoComplete,
},
});
const getTypes = async () =>
service.getTypes().then((resp) => {
return resp.result.map((item: NetworkType) => ({
label: item.name,
value: item.id,
}));
});
const schema: ISchema = {
type: 'object',
properties: {
type: {
title: '通知方式',
'x-component': 'Select',
'x-decorator': 'FormItem',
'x-component-props': {
placeholder: '请选择通知方式',
},
'x-disabled': !!id && id !== ':id',
'x-validator': [
{
required: true,
message: '请选择通知方式',
},
],
enum: typeArray.map((item) => {
return { label: item.text, value: item.status };
}),
},
name: {
title: '名称',
required: true,
'x-component': 'Input',
'x-decorator': 'FormItem',
'x-component-props': {
placeholder: '请输入名称',
},
'x-validator': [
{
required: true,
message: '请输入名称',
},
{
max: 64,
message: '最多可输入64个字符',
},
],
},
provider: {
title: '类型',
type: 'string',
'x-decorator': 'FormItem',
'x-component': 'Radio.Group',
'x-component-props': {
optionType: 'button',
},
'x-reactions': {
dependencies: ['type'],
fulfill: {
state: {
visible: '{{!!$deps[0] && $deps[0] !== "email"}}',
},
},
},
'x-validator': [
{
required: true,
message: '请选择类型',
},
],
},
configuration: {
type: 'object',
properties: {
weixin: {
type: 'void',
'x-reactions': {
dependencies: ['type'],
fulfill: {
state: {
visible: '{{$deps[0]==="weixin"}}',
},
},
},
properties: {
corpId: {
title: 'corpId',
'x-component': 'Input',
'x-decorator': 'FormItem',
required: true,
// 企业消息
'x-reactions': {
dependencies: ['provider'],
fulfill: {
state: {
visible: '{{$deps[0]==="corpMessage"}}',
},
},
},
'x-component-props': {
placeholder: '请输入corpId',
},
'x-validator': [
{
max: 64,
message: '最多可输入64个字符',
},
],
},
corpSecret: {
title: 'corpSecret',
'x-component': 'Input',
'x-decorator': 'FormItem',
required: true,
'x-component-props': {
placeholder: '请输入corpSecret',
},
'x-reactions': {
dependencies: ['provider'],
fulfill: {
state: {
visible: '{{$deps[0]==="corpMessage"}}',
},
},
},
'x-validator': [
{
max: 64,
message: '最多可输入64个字符',
},
],
},
appId: {
title: 'appID',
'x-component': 'Input',
required: true,
'x-decorator': 'FormItem',
'x-component-props': {
placeholder: '请输入appId',
},
'x-reactions': {
dependencies: ['provider'],
fulfill: {
state: {
visible: '{{$deps[0]==="officialMessage"}}',
},
},
},
},
secret: {
title: 'AppSecret',
'x-component': 'Input',
required: true,
'x-decorator': 'FormItem',
'x-component-props': {
placeholder: '请输入secret',
},
'x-reactions': {
dependencies: ['provider'],
fulfill: {
state: {
visible: '{{$deps[0]==="officialMessage"}}',
},
},
},
},
},
},
dingTalk: {
type: 'void',
// 'x-visible': id === 'dingTalk',
'x-reactions': {
dependencies: ['type'],
fulfill: {
state: {
visible: '{{$deps[0]==="dingTalk"}}',
},
},
},
properties: {
appKey: {
title: 'AppKey',
'x-component': 'Input',
'x-decorator': 'FormItem',
required: true,
'x-component-props': {
placeholder: '请输入AppKey',
},
'x-reactions': {
dependencies: ['provider'],
fulfill: {
state: {
visible: '{{$deps[0]==="dingTalkMessage"}}',
},
},
},
'x-validator': [
{
max: 64,
message: '最多可输入64个字符',
},
],
},
appSecret: {
title: 'AppSecret',
'x-component': 'Input',
'x-decorator': 'FormItem',
required: true,
'x-component-props': {
placeholder: '请输入AppSecret',
},
'x-validator': [
{
max: 64,
message: '最多可输入64个字符',
},
],
'x-reactions': {
dependencies: ['provider'],
fulfill: {
state: {
visible: '{{$deps[0]==="dingTalkMessage"}}',
},
},
},
},
url: {
title: 'webHook',
'x-component': 'Input',
'x-decorator': 'FormItem',
required: true,
'x-component-props': {
placeholder: '请输入webhook',
},
'x-reactions': {
dependencies: ['provider'],
fulfill: {
state: {
visible: '{{$deps[0]==="dingTalkRobotWebHook"}}',
},
},
},
},
},
},
// 阿里云语音/短信
voiceOrSms: {
type: 'void',
// 'x-visible': id === 'voice' || id === 'sms',
'x-reactions': {
dependencies: ['type'],
fulfill: {
state: {
visible: '{{$deps[0]==="voice" || $deps[0]==="sms"}}',
},
},
},
properties: {
regionId: {
title: 'RegionId',
required: true,
'x-component-props': {
placeholder: '请选择regionId',
},
'x-component': 'Select',
'x-decorator': 'FormItem',
enum: RegionIdList,
},
accessKeyId: {
title: 'AccessKeyId',
required: true,
'x-component-props': {
placeholder: '请输入accessKeyId',
},
'x-component': 'Input',
'x-decorator': 'FormItem',
'x-validator': [
{
max: 64,
message: '最多可输入64个字符',
},
],
},
secret: {
title: 'Secret',
required: true,
'x-component-props': {
placeholder: '请输入secret',
},
'x-component': 'Input',
'x-decorator': 'FormItem',
'x-validator': [
{
max: 64,
message: '最多可输入64个字符',
},
],
},
},
},
email: {
type: 'void',
// 'x-visible': id === 'email',
'x-reactions': {
dependencies: ['type'],
fulfill: {
state: {
visible: '{{$deps[0]==="email"}}',
},
},
},
properties: {
space: {
title: '服务器地址',
type: 'void',
'x-component': 'Space',
'x-decorator': 'FormItem',
'x-decorator-props': {
asterisk: true,
feedbackLayout: 'none',
},
properties: {
host: {
// title: '服务器地址',
required: true,
'x-component-props': {
placeholder: '请输入服务器地址',
style: {
width: '180px',
},
},
'x-component': 'FAutoComplete',
'x-decorator': 'FormItem',
enum: [
{ label: 'smtp.163.com', value: 'smtp.163.com' },
{ label: 'pop.163.com', value: 'pop.163.com' },
{ label: 'smtp.exmail.qq.com', value: 'smtp.exmail.qq.com' },
{ label: 'pop.exmail.qq.com', value: 'pop.exmail.qq.com' },
{ label: 'smtp.qq.com', value: 'smtp.qq.com' },
{ label: 'pop.qq.com', value: 'pop.qq.com' },
{ label: 'smtpdm.aliyun.com', value: 'smtpdm.aliyun.com' },
{ label: 'smtp.126.com', value: 'smtp.126.com' },
{ label: 'pop.126.com', value: 'pop.126.com' },
],
},
port: {
// title: '端口',
required: true,
'x-component-props': {
placeholder: '请输入端口',
},
default: 25,
'x-validator': [
{
min: 1,
max: 65535,
message: '请输入1~65535之间的正整数',
},
],
'x-component': 'NumberPicker',
'x-decorator': 'FormItem',
'x-reactions': {
dependencies: ['.ssl'],
when: '{{$deps[0]}}',
fulfill: {
state: {
value: 465,
},
},
// otherwise: {
// state: {
// value: 25,
// },
// },
},
},
ssl: {
// title: '开启SSL',
type: 'boolean',
'x-component': 'Checkbox',
'x-decorator': 'FormItem',
'x-component-props': {
children: '开启SSL',
style: {
width: '100px',
},
},
// enum: [{label: '开启SSL', value: true}],
},
},
},
sender: {
title: '发件人',
required: true,
'x-component': 'Input',
'x-decorator': 'FormItem',
'x-component-props': {
placeholder: '请输入发件人',
},
'x-validator': [
{
max: 64,
message: '最多可输入64个字符',
},
],
},
username: {
title: '用户名',
required: true,
'x-component': 'Input',
'x-component-props': {
placeholder: '请输入用户名',
},
'x-decorator': 'FormItem',
'x-validator': [
{
max: 64,
message: '最多可输入64个字符',
},
],
},
password: {
title: '密码',
required: true,
'x-component-props': {
placeholder: '请输入密码',
},
'x-component': 'Input',
'x-decorator': 'FormItem',
'x-validator': [
{
max: 64,
message: '最多可输入64个字符',
},
],
},
},
},
webhook: {
// 'x-visible': id === 'webhook',
'x-reactions': {
dependencies: ['type'],
fulfill: {
state: {
visible: '{{$deps[0]==="webhook"}}',
},
},
},
type: 'void',
properties: {
url: {
title: 'Webhook',
required: true,
'x-component-props': {
placeholder: '请输入Webhook',
},
'x-component': 'Input',
'x-decorator': 'FormItem',
},
headers: {
title: '请求头',
type: 'array',
'x-decorator': 'FormItem',
'x-component': 'ArrayTable',
'x-component-props': {
pagination: { pageSize: 9999 },
// scroll: {x: '100%'},
},
items: {
type: 'object',
properties: {
column1: {
type: 'void',
'x-component': 'ArrayTable.Column',
'x-component-props': { width: 200, title: 'KEY' },
properties: {
key: {
type: 'string',
'x-decorator': 'FormItem',
'x-component': 'Input',
required: true,
'x-validator': [
{
max: 64,
message: '最多可输入64个字符',
},
],
},
},
},
column2: {
type: 'void',
'x-component': 'ArrayTable.Column',
'x-component-props': { width: 200, title: 'VALUE' },
properties: {
value: {
type: 'string',
'x-decorator': 'FormItem',
'x-component': 'Input',
required: true,
'x-validator': [
{
max: 64,
message: '最多可输入64个字符',
},
],
},
},
},
column3: {
type: 'void',
'x-component': 'ArrayTable.Column',
'x-component-props': {
title: '操作',
dataIndex: 'operations',
width: 50,
fixed: 'right',
},
properties: {
item: {
type: 'void',
'x-component': 'FormItem',
properties: {
remove: {
type: 'void',
'x-component': 'ArrayTable.Remove',
},
},
},
},
},
},
},
properties: {
add: {
type: 'void',
'x-component': 'ArrayTable.Addition',
title: '添加',
},
},
},
},
},
},
},
description: {
title: '说明',
'x-decorator': 'FormItem',
'x-component': 'Input.TextArea',
'x-component-props': {
rows: 5,
placeholder: '请输入说明',
showCount: true,
maxLength: 200,
},
'x-validator': [
{
max: 200,
message: '最多可输入200个字符',
},
],
},
},
};
const handleSave = async () => {
const data: ConfigItem = await form.submit();
setLoading(true);
let response;
if (data.id) {
response = await service.update(data);
} else {
response = await service.save(data);
}
setLoading(false);
if (response?.status === 200) {
onlyMessage('保存成功');
history.back();
}
};
const { getOtherPermission } = usePermissions('notice');
return (
{docMap?.[typeItem]?.[providerItem]}
);
});
export default Detail;