206 lines
6.1 KiB
TypeScript
206 lines
6.1 KiB
TypeScript
import { forwardRef, useImperativeHandle, useState, useEffect } from 'react';
|
|
import { Form, Input, Select, Row, Col, Button, Tabs } from 'antd';
|
|
import { useTranslation } from 'react-i18next';
|
|
|
|
import type { ToolItem, TimeToolModalRef } from '../types'
|
|
import RbModal from '@/components/RbModal';
|
|
import { execute } from '@/api/tools';
|
|
const FormItem = Form.Item;
|
|
|
|
const tabKeys = ['currentTime', 'timestampConversion', 'timeFormat']
|
|
const formatList = [
|
|
{ label: 'YYYY-MM-DD HH:mm:ss', value: '%Y-%m-%d %H:%M:%S' },
|
|
{ label: 'YYYYMMDD_HHmmss', value: '%Y%m%d_%H%M%S' },
|
|
{ label: 'YYYY年MM月DD日 HH:mm', value: '%Y年%m月%d日 %H:%M' },
|
|
{ label: 'YYYY-MM-DD HH:mm:ss.SS', value: '%Y-%m-%d %H:%M:%S.%f' },
|
|
{ label: 'DD/MM/YYYY', value: '%d/%m/%Y' },
|
|
{ label: 'MM/DD/YYYY', value: '%m/%d/%Y' },
|
|
]
|
|
interface CurrentTimeObj {
|
|
datetime: string;
|
|
iso_format: string;
|
|
timestamp: string;
|
|
timestamp_ms: string;
|
|
}
|
|
const TimeToolModal = forwardRef<TimeToolModalRef>((_props, ref) => {
|
|
const { t } = useTranslation();
|
|
const [visible, setVisible] = useState(false);
|
|
const [form] = Form.useForm<{ timestamp: string; formatType: string; }>();
|
|
const [data, setData] = useState<ToolItem>({} as ToolItem)
|
|
const [timeFormat, setTimeFormat] = useState<string | undefined>(undefined)
|
|
const [activeTab, setActiveTab] = useState('currentTime');
|
|
const values = Form.useWatch([], form)
|
|
const [currentTime, setCurrentTime] = useState<CurrentTimeObj>({} as CurrentTimeObj)
|
|
const [timestampFormat, setTimestampFormat] = useState<string | null>(null)
|
|
|
|
const formatTabItems = () => {
|
|
return tabKeys.map(key => ({
|
|
key,
|
|
label: t(`tool.${key}`),
|
|
}))
|
|
}
|
|
const handleChangeTab = (key: string) => {
|
|
setActiveTab(key);
|
|
setTimestampFormat(null)
|
|
setTimeFormat(undefined)
|
|
}
|
|
|
|
// 封装取消方法,添加关闭弹窗逻辑
|
|
const handleClose = () => {
|
|
setVisible(false);
|
|
form.resetFields();
|
|
setData({} as ToolItem)
|
|
setActiveTab('currentTime')
|
|
};
|
|
|
|
const handleOpen = (vo: ToolItem) => {
|
|
setData(vo)
|
|
setVisible(true);
|
|
getCurrentTime(vo)
|
|
};
|
|
|
|
const getCurrentTime = (vo: ToolItem) => {
|
|
if (!vo.id) return
|
|
execute({
|
|
tool_id: vo.id,
|
|
parameters: {
|
|
operation: 'now',
|
|
output_format: '%Y-%m-%d %H:%M:%S',
|
|
}
|
|
}).then(res => {
|
|
const response = res as { data: CurrentTimeObj}
|
|
setCurrentTime(response.data)
|
|
})
|
|
}
|
|
|
|
const handleFormat = () => {
|
|
const timestamp = form.getFieldValue('timestamp')
|
|
if (!timestamp || !data.id) return
|
|
execute({
|
|
"tool_id": data.id,
|
|
"parameters": {
|
|
"operation": "timestamp_to_datetime",
|
|
"input_value": timestamp,
|
|
}
|
|
})
|
|
.then(res => {
|
|
const response = res as { data: CurrentTimeObj }
|
|
setTimestampFormat(response.data.datetime)
|
|
})
|
|
}
|
|
const handleChangeFormatType = () => {
|
|
if (!data.id) return
|
|
execute({
|
|
tool_id: data.id,
|
|
parameters: {
|
|
operation: 'now',
|
|
output_format: values.formatType,
|
|
to_timezone: 'UTC'
|
|
}
|
|
}).then(res => {
|
|
const response = res as { data: CurrentTimeObj }
|
|
console.log('timeFormat', response.data.datetime)
|
|
setTimeFormat(response.data.datetime)
|
|
})
|
|
}
|
|
|
|
useEffect(() => {
|
|
if (values?.formatType) {
|
|
handleChangeFormatType()
|
|
}
|
|
}, [values?.formatType])
|
|
|
|
// 暴露给父组件的方法
|
|
useImperativeHandle(ref, () => ({
|
|
handleOpen,
|
|
handleClose
|
|
}));
|
|
|
|
|
|
return (
|
|
<RbModal
|
|
title={data.name}
|
|
open={visible}
|
|
onCancel={handleClose}
|
|
footer={null}
|
|
>
|
|
<Form
|
|
form={form}
|
|
layout="vertical"
|
|
initialValues={{
|
|
formatType: formatList[0].value
|
|
}}
|
|
>
|
|
{/* 当前时间、时间戳转换、时间格式化 */}
|
|
<Tabs
|
|
activeKey={activeTab}
|
|
items={formatTabItems()}
|
|
onChange={handleChangeTab}
|
|
/>
|
|
|
|
{/* 当前时间 */}
|
|
{activeTab === 'currentTime' &&
|
|
<>
|
|
<FormItem label={t('tool.currentTime')} >
|
|
<Input disabled value={currentTime?.datetime} />
|
|
</FormItem>
|
|
<FormItem label={t('tool.utcTime')} >
|
|
<Input disabled value={currentTime?.iso_format} />
|
|
</FormItem>
|
|
<FormItem label={t('tool.secondsTimestamp')} >
|
|
<Input disabled value={currentTime?.timestamp} />
|
|
</FormItem>
|
|
<FormItem label={t('tool.millisecondsTimestamp')} >
|
|
<Input disabled value={currentTime?.timestamp_ms} />
|
|
</FormItem>
|
|
</>
|
|
}
|
|
{/* 时间戳转换 */}
|
|
{activeTab === 'timestampConversion' &&
|
|
<>
|
|
<FormItem label={t('tool.enterTimestamp')} >
|
|
<Row gutter={24}>
|
|
<Col span={16}>
|
|
<FormItem name="timestamp">
|
|
<Input />
|
|
</FormItem>
|
|
</Col>
|
|
<Col span={8}>
|
|
<Button onClick={handleFormat}>{t('tool.conversion')}</Button>
|
|
</Col>
|
|
</Row>
|
|
</FormItem>
|
|
{timestampFormat &&
|
|
<div className="rb:mt-3 rb:bg-[#F0F3F8] rb:px-3 rb:py-2.5 rb:rounded-md">
|
|
{t('tool.conversionResult')}
|
|
<div className="rb:font-medium rb:bg-white rb:px-3 rb:py-2.5 rb:rounded-md rb:mt-2">
|
|
{timestampFormat}
|
|
</div>
|
|
</div>
|
|
}
|
|
</>
|
|
}
|
|
{/* 时间格式化 */}
|
|
{activeTab === 'timeFormat' &&
|
|
<>
|
|
<FormItem label={t('tool.chooseFormatType')} name="formatType">
|
|
<Select
|
|
options={formatList}
|
|
onChange={handleChangeFormatType}
|
|
/>
|
|
</FormItem>
|
|
<div className="rb:mt-3 rb:bg-[#F0F3F8] rb:px-3 rb:py-2.5 rb:rounded-md">
|
|
{t('tool.conversionResult')}
|
|
<div className="rb:font-medium rb:bg-white rb:px-3 rb:py-2.5 rb:rounded-md rb:mt-2">
|
|
{timeFormat}
|
|
</div>
|
|
</div>
|
|
</>
|
|
}
|
|
</Form>
|
|
</RbModal>
|
|
);
|
|
});
|
|
|
|
export default TimeToolModal;
|