import { Button } from 'antd';
import moment from 'moment';
import React, { useRef, useState } from 'react';
import { unstable_batchedUpdates as batch } from 'react-dom';
import { XForm } from '../packages/react/src/index';
const defaultValues = {
id: 1,
activityName: '2020-02-06test1',
ranks: [
{
rankId: 1,
liveType: 2,
rankMemberType: 1,
rankGiftType: 2,
notScoreFreeGift: false,
specifyGifts: [
{ giftId: 1, ratio: 2 },
{ giftId: 2, ratio: 4 },
{ giftId: 3, ratio: 3.5 }
],
topLimit: 99,
specifyUserType: 1,
whiteUserIds: [70534, 49965, 78528]
}
],
timeRange: [moment(1582187791000), moment(1582274192000)]
};
const limitPositiveInts = (value: string | number) => {
const reg = /^([1-9])(\d*).*$/;
if (typeof value === 'string') {
return !isNaN(Number(value)) ? value.replace(reg, '$1$2') : '';
} else if (typeof value === 'number') {
return !isNaN(value) ? String(value).replace(reg, '$1$2') : '';
} else {
return '';
}
};
const limitDecimals = (value: string | number) => {
const reg = /^(\-)*(\d+)\.(\d\d).*$/;
if (typeof value === 'string') {
return !isNaN(Number(value)) ? value.replace(reg, '$1$2.$3') : '';
} else if (typeof value === 'number') {
return !isNaN(value) ? String(value).replace(reg, '$1$2.$3') : '';
} else {
return '';
}
};
const makeSchema = (values: any) => {
return [
...(values
? [
{
key: 'id',
type: 'Input',
status: 'preview',
ui: {
label: '活动Id',
tooltip: '由后台自动生成'
}
}
]
: []),
{
key: 'activityName',
type: 'Input',
ui: {
label: '活动名称',
tooltip: '不能超过30个字符,中英文都算作1个字符',
required: true
},
props: {
placeholder: '请输入活动名称,不能超过30个字符',
maxLength: 30
},
rules: [
{
required: true,
message: '请填写活动名称'
}
]
},
{
key: 'ranks',
type: 'Array',
value: [{}],
ui: {
label: '榜单配置',
tooltip: '最少添加 1 个榜单,最多添加 10 个榜单',
required: true
},
props: {
type: 'Card',
max: 10,
min: 1,
cardTitleKey: 'blackUserIds'
},
children: [
...(values
? [
{
key: 'rankId',
type: 'Input',
status: 'preview',
ui: {
label: '榜单Id',
tooltip: '由后台自动生成'
}
}
]
: []),
{
key: 'liveType',
type: 'Radio',
value: 0,
ui: {
label: '榜单分区',
required: true,
labelCol: { span: 6 },
wrapperCol: { span: 18 }
},
options: [
{ name: '全区', value: 0 },
{ name: '视频', value: 1 },
{ name: '音频', value: 2 }
]
},
{
key: 'rankMemberType',
type: 'Radio',
value: 1,
ui: {
label: '榜单类型',
required: true,
labelCol: { span: 6 },
wrapperCol: { span: 18 }
},
options: [
{ name: '主播榜', value: 1 },
{ name: '用户榜', value: 2 }
]
},
{
key: 'rankGiftType',
type: 'Radio',
value: 1,
ui: {
label: '统计内容',
required: true,
labelCol: { span: 6 },
wrapperCol: { span: 18 }
},
options: [
{ name: '音符榜(统计所有礼物)', value: 1 },
{ name: '道具榜(统计特定礼物)', value: 2 }
]
},
{
key: 'giftIntegralRatio',
type: 'InputNumber',
value: 1,
ui: {
label: '积分计算',
tooltip: '1音符等于多少积分',
required: true,
labelCol: { span: 6 },
wrapperCol: { span: 18 }
},
props: {
placeholder: '>0两位小数',
min: 0.01,
step: 0.01,
formatter: limitDecimals,
parser: limitDecimals
},
listeners: [
{
watch: ['rankGiftType'],
condition: 'rankGiftType.value != 1',
set: {
status: 'hidden'
}
}
],
rules: [
{
required: true,
message: '请填写积分计算'
}
]
},
{
key: 'notScoreFreeGift',
type: 'Switch',
value: false,
ui: {
label: '免费礼物不计入积分',
tooltip: '不勾选此项,免费礼物会按照比例计入积分',
required: true,
labelCol: { span: 6 },
wrapperCol: { span: 18 }
},
listeners: [
{
watch: ['rankGiftType'],
condition: 'rankGiftType.value != 1',
set: {
status: 'hidden'
}
}
]
},
{
key: 'specifyGifts',
type: 'Array',
ui: {
label: '积分计算',
tooltip: '最少添加 1 个礼物,最多添加 10 个礼物',
required: true,
labelCol: { span: 6 },
wrapperCol: { span: 18 }
},
props: {
type: 'Table',
max: 10,
min: 1
},
children: [
{
key: 'giftId',
type: 'InputNumber',
ui: {
label: '礼物Id',
required: true
},
props: {
placeholder: '礼物Id',
min: 1,
step: 1,
formatter: limitPositiveInts,
parser: limitPositiveInts
},
rules: [
{
required: true,
message: '请填写礼物Id'
}
]
},
{
key: 'giftName',
type: 'Input',
status: 'preview',
ui: {
label: '礼物名称'
},
listeners: [
{
watch: ['giftId'],
set: (
_valid: any,
field: any,
form: any
) => {
const id = form.getValue('giftId');
if (!id) {
return;
}
field.setValue(id);
// form.fieldMap['giftId'].setValid({
// valid: false,
// message: '查询不到该id对应的礼物',
// status: 'warning'
// });
}
}
]
},
{
key: 'ratio',
type: 'InputNumber',
value: 1,
ui: {
label: '对应积分',
required: true
},
props: {
placeholder: '>=1整数',
min: 1,
step: 1,
formatter: limitPositiveInts,
parser: limitPositiveInts
},
rules: [
{
required: true,
message: '请填写对应积分'
}
]
}
],
listeners: [
{
watch: ['rankGiftType'],
condition: 'rankGiftType.value != 2',
set: {
status: 'hidden'
}
}
],
rules: [
{
type: 'array',
required: true,
message: '请添加至少一个礼物'
}
]
},
{
key: 'topLimit',
type: 'InputNumber',
value: 200,
ui: {
label: '榜单显示个数',
required: true,
labelCol: { span: 6 },
wrapperCol: { span: 18 }
},
props: {
placeholder: '>=1整数',
min: 1,
step: 1,
formatter: limitPositiveInts,
parser: limitPositiveInts
},
rules: [
{
required: true,
message: '请填写榜单显示个数'
}
]
},
{
key: 'specifyUserType',
type: 'Radio',
value: 1,
ui: {
label: '参与活动UID',
required: true,
labelCol: { span: 6 },
wrapperCol: { span: 18 }
},
options: [
{ name: '全区', value: 1 },
{ name: '黑名单', value: 2 },
{ name: '白名单', value: 3 }
]
},
{
key: 'blackUserIds',
type: 'TextArea',
ui: {
label: '黑名单',
labelCol: { span: 6 },
wrapperCol: { span: 18 }
},
props: {
placeholder: '请输入UID,多个UID请用英文逗号或换行分隔',
autoSize: true
},
listeners: [
{
watch: ['specifyUserType'],
condition: 'specifyUserType.value != 2',
set: {
status: 'hidden'
}
}
],
rules: [
{
required: true,
message: '请填写黑名单'
}
]
},
{
key: 'whiteUserIds',
type: 'TextArea',
ui: {
label: '白名单',
labelCol: { span: 6 },
wrapperCol: { span: 18 }
},
props: {
placeholder: '请输入UID,多个UID请用英文逗号或换行分隔',
autoSize: true
},
listeners: [
{
watch: ['specifyUserType'],
condition: 'specifyUserType.value != 3',
set: {
status: 'hidden'
}
}
],
rules: [
{
required: true,
message: '请填写白名单'
}
]
}
],
rules: [
{
type: 'array',
required: true,
message: '请添加至少一个榜单'
}
]
},
{
key: 'timeRange',
type: 'RangePicker',
ui: {
label: '活动时间范围',
tooltip: '活动开始时间距离上一个活动结束时间必须超过5分钟',
required: true
},
props: {
placeholder: ['请选择上线时间', '请选择下线时间'],
showTime: { format: 'HH:mm:ss' },
disabledDate: (current: any) =>
current && current < moment().subtract(1, 'days')
},
rules: [
{
required: true,
message: '请选择活动时间范围'
}
]
}
];
};
export default function() {
const formRef = useRef(null);
const [schema, setSchema] = useState(makeSchema(null));
const [status, setStatus] = useState('edit');
const [values, setValues] = useState(null);
const onSubmit = () => {
formRef.current.submit().then((data: any) => {
console.log(data);
});
};
const onAdd = () => {
batch(() => {
// formRef.current.reset();
setSchema(makeSchema(null));
setStatus('edit');
setValues(null);
});
};
const onReset = () => {
batch(() => {
setSchema(makeSchema({...defaultValues}));
setStatus('edit');
setValues(defaultValues);
});
};
const onView = () => {
batch(() => {
setSchema(makeSchema({...defaultValues}));
setValues(defaultValues);
setStatus('preview');
});
};
return (
<>