blob: 5310c796085d4028bc5f3f029c93bd6391bfc995 [file] [log] [blame]
Krishyadbfadaa2025-06-09 20:33:15 +08001import { type } from '@testing-library/user-event/dist/type';
2import React from 'react';
3import { useNavigate } from 'react-router-dom';
4
5const PromotionDetailDialog = ({
6 showDetailDialog,
7 promotionDetail,
8 closeDetailDialog,
9 torrents,
10 fetchTorrentDetail
11}) => {
12 const navigate = useNavigate();
13
14 // 处理API返回的日期数组格式
15 const parseApiDate = (dateArray) => {
16 if (!Array.isArray(dateArray) || dateArray.length < 3) return null;
17
18 // 注意:JavaScript的Date月份是从0开始的,所以需要减1
19 return new Date(
20 dateArray[0], // 年
21 dateArray[1] - 1, // 月 (减1)
22 dateArray[2], // 日
23 dateArray[3] || 0, // 时 (默认0)
24 dateArray[4] || 0, // 分 (默认0)
25 dateArray[5] || 0 // 秒 (默认0)
26 );
27 };
28
29 const formatDateTime = (dateArray) => {
30 if (!dateArray) return '未知';
31
32 try {
33 const date = parseApiDate(dateArray);
34 return date ? date.toLocaleString() : '格式错误';
35 } catch (e) {
36 return '格式错误';
37 }
38 };
39
40 const getUploadBonusDisplay = (promo) => {
41 if (!promo || !promo.discountPercentage) return '无';
42 const bonus = promo.discountPercentage;
43 return bonus > 0 ? `+${bonus}%` : `-${Math.abs(bonus)}%`;
44 };
45
46 const getDownloadDiscountDisplay = (promo) => {
47 if (!promo || !promo.downloadDiscount) return '无';
48 const discount = (1 - promo.downloadDiscount) * 100;
49 return discount > 0 ? `-${discount.toFixed(1)}%` : '无';
50 };
51
52 const redirectToTorrentDetail = (torrentId) => {
53 if (fetchTorrentDetail) {
54 navigate(`/seed/${torrentId}`);
55 }
56 };
57
58 return (
59 showDetailDialog && promotionDetail && (
60 <div className="detail-dialog-overlay">
61 <div className="detail-dialog">
62 <h3 className="detail-dialog-title">{promotionDetail.name}</h3>
63 <button
64 className="close-btn"
65 onClick={closeDetailDialog}
66 >
67 &times;
68 </button>
69
70 <div className="detail-content">
71 {/* <div className="detail-item"> */}
72 {/* <span className="detail-label">促销ID:</span> */}
73 {/* <span className="detail-value">{promotionDetail.id}</span>
74 </div> */}
75 {/* <div className="detail-item">
76 <span className="detail-label">促销名称:</span>
77 <span className="detail-value">{promotionDetail.name}</span>
78 </div> */}
79 <div className="detail-item">
80 <span className="detail-label">开始时间:</span>
81 <span className="detail-value">{formatDateTime(promotionDetail.startTime)}</span>
82 </div>
83 <div className="detail-item">
84 <span className="detail-label">结束时间:</span>
85 <span className="detail-value">{formatDateTime(promotionDetail.endTime)}</span>
86 </div>
87 <div className="detail-item">
88 <span className="detail-label">上传奖励:</span>
89 <span className="detail-value">{getUploadBonusDisplay(promotionDetail)}</span>
90 </div>
91 <div className="detail-item">
92 <span className="detail-label">下载折扣:</span>
93 <span className="detail-value">{getDownloadDiscountDisplay(promotionDetail)}</span>
94 </div>
95 {/* <div className="detail-item">
96 <span className="detail-label">创建时间:</span>
97 <span className="detail-value">{formatDateTime(promotionDetail.createTime)}</span>
98 </div> */}
99 {/* <div className="detail-item">
100 <span className="detail-label">创建者:</span>
101 <span className="detail-value">{promotionDetail.creator || '未知'}</span>
102 </div> */}
103
104 {promotionDetail.description && (
105 <div className="detail-item">
106 <span className="detail-label">描述:</span>
107 <span className="detail-value">{promotionDetail.description}</span>
108 </div>
109 )}
110
111 {/* 适用种子列表 */}
112 <div className="detail-item">
113 <span className="detail-label">适用种子:</span>
114 <div className="detail-value">
115 {promotionDetail.applicableTorrentIds ? (
116 <div className="torrent-list">
117 {/* 解析字符串形式的数组 */}
118 {parseTorrentIds(promotionDetail.applicableTorrentIds).map(torrentId => {
119 const matchedTorrent = torrents.find(t => t.id === torrentId) || {};
120
121 return (
122 <button
123 key={torrentId}
124 className="torrent-link"
125 onClick={() => redirectToTorrentDetail(torrentId)}
126 aria-label={`查看种子${matchedTorrent.name || torrentId}的详情`}
127 >
128 {matchedTorrent.name || `种子${torrentId}`}
129 {/* {matchedTorrent.seeders > 10 && <span className="status-indicator hot">热门</span>}
130 {matchedTorrent.seeders === 0 && <span className="status-indicator cold">冷门</span>} */}
131 </button>
132 );
133 })}
134 </div>
135 ) : (
136 <span className="empty-list">暂无适用种子</span>
137 )}
138 </div>
139 </div>
140 </div>
141
142 <div className="dialog-buttons">
143 <button onClick={closeDetailDialog}>关闭</button>
144 </div>
145 </div>
146 </div>
147 )
148 );
149};
150
151// 解析种子ID字符串为数组
152const parseTorrentIds = (idString) => {
153 if (typeof idString === 'number') {
154 return [idString];
155 }
156
157 if (Array.isArray(idString)) {
158 return idString;
159 }
160
161 let items = typeof idString === 'string' && !idString.startsWith('[') ? idString.split(',') : JSON.parse(idString || '[]');
162
163 return items;
164};
165
166export default PromotionDetailDialog;