'use client'; import { useState, useMemo } from 'react'; import { motion, AnimatePresence } from 'framer-motion'; import { CloseIcon } from './Icons'; import ConfirmModal from './ConfirmModal'; export default function TransactionHistoryModal({ fund, transactions = [], pendingTransactions = [], onClose, onDeleteTransaction, onDeletePending, onAddHistory }) { const [deleteConfirm, setDeleteConfirm] = useState(null); // { type: 'pending' | 'history', item } // Combine and sort logic if needed, but requirements say "sorted by transaction time". // Pending transactions are usually "future" or "processing", so they go on top. // Completed transactions are sorted by date desc. const sortedTransactions = useMemo(() => { return [...transactions].sort((a, b) => b.timestamp - a.timestamp); }, [transactions]); const handleDeleteClick = (item, type) => { setDeleteConfirm({ type, item }); }; const handleConfirmDelete = () => { if (!deleteConfirm) return; const { type, item } = deleteConfirm; if (type === 'pending') { onDeletePending(item.id); } else { onDeleteTransaction(item.id); } setDeleteConfirm(null); }; return ( e.stopPropagation()} style={{ maxWidth: '480px', maxHeight: '80vh', display: 'flex', flexDirection: 'column' }} >
📜 交易记录
{fund?.name}
#{fund?.code}
{/* Pending Transactions */} {pendingTransactions.length > 0 && (
待处理队列
{pendingTransactions.map((item) => (
{item.type === 'buy' ? '买入' : '卖出'} {item.type === 'buy' && item.isDca && ( 定投 )}
{item.date} {item.isAfter3pm ? '(15:00后)' : ''}
份额/金额 {item.share ? `${Number(item.share).toFixed(2)} 份` : `¥${Number(item.amount).toFixed(2)}`}
等待净值更新...
))}
)} {/* History Transactions */}
历史记录
{sortedTransactions.length === 0 ? (
暂无历史交易记录
) : ( sortedTransactions.map((item) => (
{item.type === 'buy' ? '买入' : '卖出'} {item.type === 'buy' && item.isDca && ( 定投 )}
{item.date}
成交份额 {Number(item.share).toFixed(2)} 份
成交金额 ¥{Number(item.amount).toFixed(2)}
{item.price && (
成交净值 {Number(item.price).toFixed(4)}
)}
)) )}
{deleteConfirm && ( setDeleteConfirm(null)} confirmText="确认删除" /> )}
); }