Files
timeline-frontend/src/pages/story/components/TimelineItemDrawer.tsx

174 lines
5.6 KiB
TypeScript
Raw Normal View History

2025-08-08 17:42:07 +08:00
// src/pages/story/components/TimelineItemDrawer.tsx
2025-07-22 22:52:55 +08:00
import TimelineImage from '@/components/TimelineImage';
2025-08-05 19:02:14 +08:00
import { StoryItem } from '@/pages/story/data';
import { queryStoryItemImages } from '@/pages/story/service';
2025-08-08 17:42:07 +08:00
import { DeleteOutlined, EditOutlined } from '@ant-design/icons';
import { useIntl, useRequest } from '@umijs/max';
import { Button, Divider, Drawer, Popconfirm, Space } from 'antd';
2025-07-22 22:52:55 +08:00
import React, { useEffect } from 'react';
interface Props {
storyItem: StoryItem;
open: boolean;
setOpen: React.Dispatch<React.SetStateAction<boolean>>;
2025-08-08 17:42:07 +08:00
handleDelete: () => void;
handOption: (item: StoryItem, option: 'add' | 'edit' | 'addSubItem' | 'editSubItem') => void;
2025-07-22 22:52:55 +08:00
}
2025-08-08 17:42:07 +08:00
const TimelineItemDrawer: React.FC<Props> = (props) => {
const { storyItem, open, setOpen, handleDelete, handOption } = props;
const intl = useIntl();
2025-07-22 22:52:55 +08:00
const { data: imagesList, run } = useRequest(
async (itemId) => {
return await queryStoryItemImages(itemId);
},
{
manual: true,
},
);
2025-08-08 17:42:07 +08:00
2025-07-22 22:52:55 +08:00
useEffect(() => {
if (open) {
2025-08-05 19:02:14 +08:00
run(storyItem.instanceId);
2025-07-22 22:52:55 +08:00
}
}, [open]);
2025-08-08 17:42:07 +08:00
2025-07-22 22:52:55 +08:00
const closeDrawer = () => {
setOpen(false);
};
2025-08-08 17:42:07 +08:00
// 格式化日期显示
const formatDate = (dateString: string) => {
if (!dateString) return '';
const date = new Date(dateString);
return date.toLocaleString('zh-CN', {
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
second: '2-digit',
});
2025-07-22 22:52:55 +08:00
};
2025-08-08 17:42:07 +08:00
2025-07-22 22:52:55 +08:00
return (
<div>
{/* 主时间点详情抽屉 */}
<Drawer
2025-08-08 17:42:07 +08:00
width={800}
2025-07-22 22:52:55 +08:00
placement="right"
onClose={closeDrawer}
2025-07-22 22:52:55 +08:00
open={open}
2025-08-08 17:42:07 +08:00
zIndex={1000}
title={
<div>
<h2 style={{ margin: 0 }}>{storyItem.title}</h2>
<div style={{ fontSize: '14px', color: '#888', marginTop: '4px' }}>
{storyItem.storyItemTime} {storyItem.location ? `${storyItem.location}` : ''}
</div>
</div>
}
2025-07-22 22:52:55 +08:00
footer={
<div style={{ textAlign: 'right' }}>
<Space>
<Button
2025-08-08 17:42:07 +08:00
icon={<EditOutlined />}
onClick={() => {
return handOption(storyItem, 'edit');
}}
2025-07-22 22:52:55 +08:00
>
</Button>
2025-08-08 17:42:07 +08:00
<Popconfirm
title={intl.formatMessage({ id: 'story.deleteConfirm' })}
description={intl.formatMessage({ id: 'story.deleteConfirmDescription' })}
onConfirm={(e) => {
e?.stopPropagation();
handleDelete();
}}
okText={intl.formatMessage({ id: 'story.yes' })}
cancelText={intl.formatMessage({ id: 'story.no' })}
>
<Button
icon={<DeleteOutlined />}
danger
onClick={(e) => e.stopPropagation()}
aria-label={intl.formatMessage({ id: 'story.delete' })}
>
</Button>
</Popconfirm>
2025-07-22 22:52:55 +08:00
<Button onClick={closeDrawer}></Button>
</Space>
</div>
}
>
2025-08-08 17:42:07 +08:00
<div style={{ padding: '0 24px' }}>
<div style={{ marginBottom: '24px' }}>
<h3></h3>
<p style={{ fontSize: '16px', lineHeight: '1.6' }}>{storyItem.description}</p>
</div>
2025-07-22 22:52:55 +08:00
2025-08-08 17:42:07 +08:00
<Divider />
2025-07-22 22:52:55 +08:00
2025-08-08 17:42:07 +08:00
{/* 时刻图库 */}
{imagesList && imagesList.length > 0 && (
<div style={{ marginBottom: '24px' }}>
<h3></h3>
<div
style={{
display: 'grid',
gridTemplateColumns: 'repeat(auto-fill, minmax(150px, 1fr))',
gap: '16px',
marginTop: '16px',
}}
>
{imagesList.map((imageInstanceId, index) => (
<div
key={imageInstanceId + index}
style={{
borderRadius: '8px',
overflow: 'hidden',
boxShadow: '0 2px 8px rgba(0,0,0,0.1)',
aspectRatio: '1/1',
}}
>
<TimelineImage
title={imageInstanceId}
imageInstanceId={imageInstanceId}
style={{ width: '100%', height: '100%', objectFit: 'cover' }}
/>
</div>
))}
</div>
</div>
)}
<Divider />
2025-07-22 22:52:55 +08:00
2025-08-08 17:42:07 +08:00
{/* 创建和更新信息 */}
<div style={{ marginBottom: '24px' }}>
<h3></h3>
<div style={{ display: 'flex', flexWrap: 'wrap', gap: '16px', marginTop: '16px' }}>
<div style={{ flex: '1', minWidth: '200px' }}>
<div style={{ color: '#888', marginBottom: '4px' }}></div>
<div style={{ fontSize: '16px' }}>{formatDate(storyItem.createTime)}</div>
</div>
<div style={{ flex: '1', minWidth: '200px' }}>
<div style={{ color: '#888', marginBottom: '4px' }}></div>
<div style={{ fontSize: '16px' }}>{formatDate(storyItem.updateTime)}</div>
</div>
<div style={{ flex: '1', minWidth: '200px' }}>
<div style={{ color: '#888', marginBottom: '4px' }}></div>
<div style={{ fontSize: '16px' }}></div>
</div>
</div>
</div>
</div>
2025-07-22 22:52:55 +08:00
</Drawer>
</div>
);
};
export default TimelineItemDrawer;