Files
MemoryBear/web/src/views/ToolManagement/components/TimeToolModal.tsx
2025-12-26 16:01:13 +08:00

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;