import { PageContainer } from '@ant-design/pro-layout'; import { Button, Card, Checkbox, Col, Form, Input, InputNumber, message, Row, Select, Tooltip, } from 'antd'; import { useEffect, useState } from 'react'; import { service, StreamModel } from '@/pages/media/Stream'; import { useParams } from 'umi'; import { QuestionCircleOutlined } from '@ant-design/icons'; import SipComponent from '@/components/SipComponent'; import { testIP } from '@/utils/util'; interface RTPComponentProps { onChange?: (data: any) => void; value?: { rtpIp?: string; rtpPort?: number; dynamicRtpPort?: boolean; dynamicRtpPortRange?: number[]; }; } const RTPComponent = (props: RTPComponentProps) => { const { value, onChange } = props; const [checked, setChecked] = useState(value?.dynamicRtpPort || false); const [data, setData] = useState(value); useEffect(() => { setData(value); setChecked(!!value?.dynamicRtpPort); }, [value]); return (
{ if (onChange) { const item = { ...data, rtpIp: e.target.value, }; setData(item); onChange(item); } }} /> {!checked ? ( { if (onChange) { const item = { ...data, rtpPort: e, }; setData(item); onChange(item); } }} /> ) : (
{ if (onChange) { const item = { ...data, dynamicRtpPortRange: [e, data?.dynamicRtpPortRange?.[1]], }; setData(item); onChange(item); } }} />{' '} 至{' '} { if (onChange) { const item = { ...data, dynamicRtpPortRange: [data?.dynamicRtpPortRange?.[0], e], }; setData(item); onChange(item); } }} />
)} { setChecked(e.target.checked); if (onChange) { const item = { ...data, dynamicRtpPort: e.target.checked, }; setData(item); onChange(item); } }} > 动态端口
); }; const Detail = () => { const params = useParams<{ id: string }>(); const [form] = Form.useForm(); const [providers, setProviders] = useState([]); useEffect(() => { service.queryProviders().then((resp) => { if (resp.status === 200) { setProviders(resp.result); } }); if (params.id && params.id !== ':id') { service.detail(params.id).then((resp) => { if (resp.status === 200) { StreamModel.current = resp.result; form.setFieldsValue({ name: StreamModel.current?.name, provider: StreamModel.current?.provider, secret: StreamModel.current?.configuration?.secret, api: { apiHost: StreamModel.current.configuration?.apiHost, apiPort: StreamModel.current.configuration?.apiPort, }, rtp: { rtpIp: StreamModel.current.configuration?.rtpIp, rtpPort: StreamModel.current.configuration?.rtpPort, dynamicRtpPort: StreamModel.current.configuration?.dynamicRtpPort || false, dynamicRtpPortRange: StreamModel.current.configuration?.dynamicRtpPortRange || [], }, }); } }); } }, [params.id]); const checkSIP = (_: any, value: { host: string; port: number }) => { if (!value) { return Promise.resolve(); } if (!value || !value.host) { return Promise.reject(new Error('请输入API HOST')); } else if (value?.host && !testIP(value.host)) { return Promise.reject(new Error('请输入正确的IP地址')); } else if (!value?.port) { return Promise.reject(new Error('请输入端口')); } else if ((value?.port && Number(value.port) < 1) || Number(value.port) > 65535) { return Promise.reject(new Error('端口请输入1~65535之间的正整数')); } return Promise.resolve(); }; const testPort = (value: any) => { return (value && Number(value) < 1) || Number(value) > 65535; }; const checkRIP = ( _: any, value: { rtpIp: string; rtpPort: number; dynamicRtpPort: boolean; dynamicRtpPortRange: number[]; }, ) => { if (!value) { return Promise.resolve(); } if (!value || !value.rtpIp) { return Promise.reject(new Error('请输入RTP IP')); } else if (value?.rtpIp && !testIP(value.rtpIp)) { return Promise.reject(new Error('请输入正确的IP地址')); } else if (!value.dynamicRtpPort) { if (value.rtpIp && !testIP(value.rtpIp)) { return Promise.reject(new Error('请输入正确的IP地址')); } if (!value?.rtpPort) { return Promise.reject(new Error('请输入端口')); } if (testPort(value?.rtpPort)) { return Promise.reject(new Error('端口请输入1~65535之间的正整数')); } } else if (value.dynamicRtpPort) { if (value.dynamicRtpPortRange) { if (!value.dynamicRtpPortRange?.[0]) { return Promise.reject(new Error('请输入起始端口')); } else if (testPort(value.dynamicRtpPortRange?.[0])) { return Promise.reject(new Error('端口请输入1~65535之间的正整数')); } if (!value.dynamicRtpPortRange?.[1]) { return Promise.reject(new Error('请输入终止端口')); } else if (testPort(value.dynamicRtpPortRange?.[1])) { return Promise.reject(new Error('端口请输入1~65535之间的正整数')); } if ( value.dynamicRtpPortRange?.[0] && value.dynamicRtpPortRange?.[1] && value.dynamicRtpPortRange?.[0] > value.dynamicRtpPortRange?.[1] ) { return Promise.reject(new Error('终止端口需大于等于起始端')); } } else if (!value.dynamicRtpPortRange) { return Promise.reject(new Error('请输入端口')); } } return Promise.resolve(); }; return (
{ const param = { name: values.name, provider: values.provider, configuration: { secret: values?.secret, apiHost: values.api?.apiHost, apiPort: values.api?.apiPort, rtpIp: values.rtp?.rtpIp, rtpPort: values.rtp?.rtpPort, dynamicRtpPort: values.rtp?.dynamicRtpPort, dynamicRtpPortRange: values.rtp?.dynamicRtpPortRange || [], }, }; let resp = undefined; if (params.id && params.id !== ':id') { resp = await service.update({ ...param, id: params.id }); } else { resp = await service.save(param); } if (resp && resp.status === 200) { message.success('操作成功!'); history.back(); } }} > API Host } name="api" rules={[{ required: true }, { validator: checkSIP }]} > RTP IP } name="rtp" rules={[{ required: true }, { validator: checkRIP }]} >
); }; export default Detail;