zhouxiantao
8 days ago 03193b2a27a2c23e10f3a2f298de9c1142116780
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
/**
 * @author 韩天尊
 * @time 2024-01-15
 * @version 1.0.0
 * @description 积分查询详情页面组件
 */
import React, { useState } from 'react';
import { useNavigate } from 'react-router-dom';
import { useAppContext } from '../context/AppContext';
import PageHeader from '../components/PageHeader';
 
const PointsQueryDetailPage: React.FC = () => {
    const navigate = useNavigate();
    const { state } = useAppContext();
    const [activeTab, setActiveTab] = useState<'declarations' | 'redemptions'>('declarations');
 
    const handleTabChange = (tab: 'declarations' | 'redemptions') => {
        setActiveTab(tab);
    };
 
    const handlePointsRedemption = () => {
        navigate('/points-redemption');
    };
 
    const handlePointsDeclaration = () => {
        navigate('/points-declaration');
    };
 
    const handleShowPointsRules = () => {
        // 显示积分规则
        alert('积分规则:\n1. 参与社区活动:30-100分\n2. 志愿服务:20-80分\n3. 文明行为:10-50分\n4. 特殊贡献:100-500分');
    };
 
    const handleDeclarationClick = (recordId: number) => {
        // 跳转到申报详情页面
        const record = state.declarationRecords.find(d => d.id === recordId);
        if (record) {
            // 找到对应的活动
            const activity = state.activities.find(a => a.title === record.title);
            if (activity) {
                navigate(`/activity-detail/${activity.id}`);
            } else {
                alert('未找到对应活动');
            }
        }
    };
 
    const handleRedemptionClick = (recordId: number) => {
        // 跳转到核销详情页面
        navigate(`/redemption-detail/${recordId}`);
    };
 
    return (
        <div className="page">
            <PageHeader title="我的积分" showBack={true} />
            
            {/* 积分总览卡片 */}
            <div className="points-overview">
                <div className="overview-card">
                    <div className="overview-header">
                        <i className="fas fa-coins"></i>
                        <span>积分总览</span>
                    </div>
                    <div className="overview-content">
                        <div className="overview-item">
                            <div className="overview-label">可用积分</div>
                            <div className="overview-value">{state.user?.points || 0}</div>
                            <div className="overview-icon">
                                <i className="fas fa-wallet"></i>
                            </div>
                        </div>
                        <div className="overview-item">
                            <div className="overview-label">已核销积分</div>
                            <div className="overview-value">{state.user?.redeemedPoints || 0}</div>
                            <div className="overview-icon">
                                <i className="fas fa-exchange-alt"></i>
                            </div>
                        </div>
                        <div className="overview-item">
                            <div className="overview-label">累计积分</div>
                            <div className="overview-value">{state.user?.totalPoints || 0}</div>
                            <div className="overview-icon">
                                <i className="fas fa-chart-line"></i>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
 
            {/* 快捷操作 */}
            <div className="points-actions">
                <button className="action-card" onClick={handlePointsRedemption}>
                    <i className="fas fa-qrcode"></i>
                    <span>积分核销</span>
                </button>
                <button className="action-card" onClick={handlePointsDeclaration}>
                    <i className="fas fa-plus-circle"></i>
                    <span>积分申报</span>
                </button>
                <button className="action-card" onClick={handleShowPointsRules}>
                    <i className="fas fa-info-circle"></i>
                    <span>积分规则</span>
                </button>
            </div>
 
            {/* 积分记录 */}
            <div className="points-records">
                <div className="records-header">
                    <h3>积分记录</h3>
                </div>
 
                {/* Tab切换 */}
                <div className="tab-section">
                    <button 
                        className={`tab-btn ${activeTab === 'declarations' ? 'active' : ''}`}
                        onClick={() => handleTabChange('declarations')}
                    >
                        积分申报
                    </button>
                    <button 
                        className={`tab-btn ${activeTab === 'redemptions' ? 'active' : ''}`}
                        onClick={() => handleTabChange('redemptions')}
                    >
                        核销历史
                    </button>
                </div>
 
                {/* 列表内容 */}
                <div className="list-content">
                    <div id="declarations-tab" className={`list-tab ${activeTab === 'declarations' ? 'active' : ''}`}>
                        <div id="declarations-list">
                            {state.declarationRecords.map(record => (
                                <div 
                                    key={record.id} 
                                    className="declaration-card"
                                    onClick={() => handleDeclarationClick(record.id)}
                                >
                                    <div className="declaration-header">
                                        <div className="declaration-title">{record.title}</div>
                                        <div className={`declaration-status ${record.status}`}>
                                            {record.status === 'pending' ? '审核中' : 
                                             record.status === 'approved' ? '已通过' : '不通过'}
                                        </div>
                                    </div>
                                    <div className="declaration-info">
                                        <div className="declaration-info-row">
                                            <i className="fas fa-tag"></i>
                                            <span>申报类型:{record.category || record.type || '未知'}</span>
                                        </div>
                                        <div className="declaration-info-row">
                                            <i className="fas fa-clock"></i>
                                            <span>时间:{record.time}</span>
                                        </div>
                                    </div>
                                    <div className="declaration-content">{record.content}</div>
                                    <div className="declaration-footer">
                                        <div className="points-info">
                                            <i className="fas fa-coins"></i>
                                            <span>+{record.points} 积分</span>
                                        </div>
                                        <div className="declaration-arrow">
                                            <i className="fas fa-chevron-right"></i>
                                        </div>
                                    </div>
                                </div>
                            ))}
                        </div>
                    </div>
                    <div id="redemptions-tab" className={`list-tab ${activeTab === 'redemptions' ? 'active' : ''}`}>
                        <div id="redemptions-list">
                            <div 
                                className="redemption-card"
                                onClick={() => handleRedemptionClick(1)}
                            >
                                <div className="redemption-header">
                                    <div className="redemption-title">积分核销</div>
                                    <div className="redemption-status completed">已完成</div>
                                </div>
                                <div className="redemption-info">
                                    <div className="redemption-info-row">
                                        <i className="fas fa-clock"></i>
                                        <span>核销时间:2024-01-10 15:30</span>
                                    </div>
                                    <div className="redemption-info-row">
                                        <i className="fas fa-store"></i>
                                        <span>核销地点:社区服务中心</span>
                                    </div>
                                </div>
                                <div className="redemption-content">兑换了鸡蛋</div>
                                <div className="redemption-footer">
                                    <div className="points-info">
                                        <i className="fas fa-coins"></i>
                                        <span>-100 积分</span>
                                    </div>
                                    <div className="redemption-arrow">
                                        <i className="fas fa-chevron-right"></i>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    );
};
 
export default PointsQueryDetailPage;