|
@@ -0,0 +1,157 @@
|
|
|
+import { Modal, Form, Select, Input } from 'antd'
|
|
|
+import type { PropsType, Action, FormDataType, OptionsItemType } from './types'
|
|
|
+import { forwardRef, useImperativeHandle, useState } from 'react'
|
|
|
+import type { RowDataType } from '../ContentTable/types'
|
|
|
+import { appTypes } from '../../const'
|
|
|
+import styles from './index.module.css'
|
|
|
+
|
|
|
+const { Item, useForm } = Form
|
|
|
+const appTypesOptions:OptionsItemType[] = Object.entries(appTypes).map(([value,label])=>({value: +value,label}))
|
|
|
+const initialValues = {
|
|
|
+ thirdAppType: 0, // 应用类型
|
|
|
+}
|
|
|
+
|
|
|
+const CreateModal = forwardRef(({ onCreate, onUpdate }:PropsType, ref) => {
|
|
|
+ const [isOpen, setIsOpen] = useState(false)
|
|
|
+ const [action, setAction] = useState<Action>()
|
|
|
+ const [form] = useForm()
|
|
|
+ const [editRow, setEditRow] = useState<RowDataType>()
|
|
|
+ const isEdit = action === 'edit'
|
|
|
+ const title = isEdit ? '编辑应用' : '新建应用'
|
|
|
+
|
|
|
+ useImperativeHandle(ref,()=>({
|
|
|
+ open: (editRow?:RowDataType) => {
|
|
|
+ setAction(editRow?'edit':'create')
|
|
|
+ setEditRow(editRow)
|
|
|
+ if (editRow) {
|
|
|
+ const {
|
|
|
+ thirdAppType, // 应用类型
|
|
|
+ unionAppName, // 应用名称
|
|
|
+ thirdMpAppId, // 小程序appid
|
|
|
+ thirdAppDomain // H5链接
|
|
|
+ } = editRow
|
|
|
+ form.setFieldsValue({
|
|
|
+ thirdAppType, // 应用类型
|
|
|
+ unionAppName, // 应用名称
|
|
|
+ thirdMpAppId, // 小程序appid
|
|
|
+ thirdAppDomain // H5链接
|
|
|
+ })
|
|
|
+ }
|
|
|
+ setIsOpen(true)
|
|
|
+ }
|
|
|
+ }))
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ const onOk = async () => {
|
|
|
+ try {
|
|
|
+ const res:FormDataType = await form.validateFields()
|
|
|
+ switch (action) {
|
|
|
+ case 'create':
|
|
|
+ onCreate(res, ()=>{setIsOpen(false)})
|
|
|
+ break
|
|
|
+ case 'edit':
|
|
|
+ onUpdate({...(editRow as RowDataType), ...res},()=>{setIsOpen(false)})
|
|
|
+ }
|
|
|
+ } catch (error) { /* empty */ }
|
|
|
+ }
|
|
|
+
|
|
|
+ const onCancel = () => {
|
|
|
+ setIsOpen(false)
|
|
|
+ }
|
|
|
+
|
|
|
+ const afterOpenChange = (isOpen: boolean) => {
|
|
|
+ if (!isOpen) {
|
|
|
+ form.resetFields()
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return (
|
|
|
+ <Modal
|
|
|
+ className={styles['custom-modal']}
|
|
|
+ centered={true}
|
|
|
+ open={isOpen}
|
|
|
+ title={title}
|
|
|
+ width={500}
|
|
|
+ onCancel={onCancel}
|
|
|
+ onOk={onOk}
|
|
|
+ afterOpenChange={afterOpenChange}
|
|
|
+ >
|
|
|
+ <Form
|
|
|
+ form={form}
|
|
|
+ initialValues={initialValues}
|
|
|
+ labelCol={{ span: 5 }}
|
|
|
+ wrapperCol={{ span: 18, offset: 1}}
|
|
|
+ colon={ false }
|
|
|
+ requiredMark={ false }
|
|
|
+ >
|
|
|
+ { !isEdit && <Item
|
|
|
+ name='thirdAppType'
|
|
|
+ label='应用类型'
|
|
|
+ rules={[{ required: true, message: '请选择应用类型' }]}
|
|
|
+ >
|
|
|
+ <Select
|
|
|
+ placeholder='请选择应用类型'
|
|
|
+ options={appTypesOptions}
|
|
|
+ />
|
|
|
+ </Item>
|
|
|
+ }
|
|
|
+ <Item
|
|
|
+ name='unionAppName'
|
|
|
+ label='应用名称'
|
|
|
+ rules={[{ required: true, message: '请输入应用名称' }]}
|
|
|
+ >
|
|
|
+ <Input placeholder='请输入应用名称' showCount maxLength={ 20 } />
|
|
|
+ </Item>
|
|
|
+ {
|
|
|
+ !isEdit && <>
|
|
|
+ <Item
|
|
|
+ noStyle
|
|
|
+ shouldUpdate={(preV, curV) => preV.thirdAppType !== curV.thirdAppType}
|
|
|
+ >
|
|
|
+ {
|
|
|
+ ({getFieldValue}) => getFieldValue('thirdAppType')===0 && (
|
|
|
+ <Form.Item
|
|
|
+ name='thirdMpAppId'
|
|
|
+ label='小程序appId'
|
|
|
+ rules={[{ required: true, message: '请输入小程序appId' }]}
|
|
|
+ >
|
|
|
+ <Input placeholder='请输入小程序appId' disabled={isEdit} />
|
|
|
+ </Form.Item>
|
|
|
+ )
|
|
|
+ }
|
|
|
+ </Item>
|
|
|
+ <Item
|
|
|
+ noStyle
|
|
|
+ shouldUpdate={(preV, curV) => preV.thirdAppType !== curV.thirdAppType}
|
|
|
+ >
|
|
|
+ {
|
|
|
+ ({getFieldValue}) => getFieldValue('thirdAppType')===1 && (
|
|
|
+ <Form.Item
|
|
|
+ name='thirdAppDomain'
|
|
|
+ label='H5链接'
|
|
|
+ rules={[
|
|
|
+ () => ({
|
|
|
+ validator(_, value) {
|
|
|
+ if (!value) return Promise.reject(new Error('请输入H5链接'))
|
|
|
+ // H5,验证网址格式
|
|
|
+ const pattern = /^(https:\/\/)[^\s]+/
|
|
|
+ if (!pattern.test(value)) return Promise.reject(new Error('请输入https://开头的链接'))
|
|
|
+ return Promise.resolve()
|
|
|
+ },
|
|
|
+ })
|
|
|
+ ]}
|
|
|
+ >
|
|
|
+ <Input placeholder='请输入H5链接' disabled={isEdit} />
|
|
|
+ </Form.Item>
|
|
|
+ )
|
|
|
+ }
|
|
|
+ </Item>
|
|
|
+ </>
|
|
|
+ }
|
|
|
+ </Form>
|
|
|
+ </Modal>
|
|
|
+ )
|
|
|
+})
|
|
|
+
|
|
|
+export default CreateModal
|