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
/**
 * @author 韩天尊
 * @time 2024-01-15
 * @version 1.0.0
 * @description 积分申报页面组件
 */
import React, { useState, useEffect } from 'react';
import { useNavigate } from 'react-router-dom';
import { useAppContext } from '../context/AppContext';
import { DeclarationRecord } from '../types';
import PageHeader from '../components/PageHeader';
import { formatActivityTime } from '../utils/timeFormatter';
 
const PointsDeclarationPage: React.FC = () => {
    const navigate = useNavigate();
    const { state, loadDeclarationRecords } = useAppContext();
    const [activeTab, setActiveTab] = useState('all');
    const [searchText, setSearchText] = useState('');
 
    // 组件挂载时加载申报记录
    useEffect(() => {
        loadDeclarationRecords({ page: 1, size: 20 });
    }, []); // 空依赖数组,只在组件挂载时执行一次
 
    // 根据Tab筛选申报记录
    const filteredRecords = state.declarationRecords.filter(record => {
        if (activeTab === 'all') return true;
        return record.status === activeTab;
    }).filter(record => {
        if (!searchText) return true;
        return (record.title || record.activityName || '').toLowerCase().includes(searchText.toLowerCase());
    });
 
    // 处理Tab切换
    const handleTabChange = (tab: string) => {
        setActiveTab(tab);
    };
 
    // 处理搜索
    const handleSearch = () => {
        // 搜索逻辑已在filteredRecords中实现
    };
 
    // 跳转到申报详情
    const handleDeclarationClick = (record: DeclarationRecord) => {
        // 跳转到申报详情页面
        navigate(`/declaration-detail/${record.id}`);
    };
 
    // 跳转到申报表单
    const handleNewDeclaration = () => {
        navigate('/declaration-form');
    };
 
    // 获取状态显示文本
    const getStatusText = (status: string | number) => {
        const statusMap: { [key: string]: string } = {
            '0': '待审核',
            '1': '审核通过',
            '2': '审核拒绝',
            'approved': '已审核',
            'pending': '审核中',
            'rejected': '已拒绝'
        };
        return statusMap[status.toString()] || status.toString();
    };
 
    return (
        <div className="page points-declaration-page">
            <PageHeader title="积分申报" />
            
            {/* 搜索框 */}
            <div className="declaration-search-bar">
                <div className="search-box declaration-search">
                    <i className="fas fa-search"></i>
                    <input 
                        type="text" 
                        placeholder="请输入申报标题" 
                        value={searchText}
                        onChange={(e) => setSearchText(e.target.value)}
                    />
                    <button className="declaration-search-btn" onClick={handleSearch}>
                        搜索
                    </button>
                </div>
            </div>
 
            {/* 顶部Tab切换 */}
            <div className="declaration-tabs">
                <button 
                    className={`declaration-tab ${activeTab === 'all' ? 'active' : ''}`}
                    onClick={() => handleTabChange('all')}
                >
                    全部
                </button>
                <button 
                    className={`declaration-tab ${activeTab === 'pending' ? 'active' : ''}`}
                    onClick={() => handleTabChange('pending')}
                >
                    审核中
                </button>
                <button 
                    className={`declaration-tab ${activeTab === 'approved' ? 'active' : ''}`}
                    onClick={() => handleTabChange('approved')}
                >
                    已审核
                </button>
            </div>
            
            {/* 申报列表 */}
            <div className="declaration-list">
                {filteredRecords.map((record) => (
                    <div key={record.id} className="declaration-item" onClick={() => handleDeclarationClick(record)}>
                        <div className="declaration-header">
                            <div className="declaration-title">{record.title || record.activityName}</div>
                            <div className={`declaration-status ${record.status}`}>
                                {getStatusText(record.status)}
                            </div>
                        </div>
                        <div className="declaration-info">
                            <div className="declaration-info-row">
                                <i className="fas fa-tag"></i>
                                <span>申报类型:{record.categoryDesc || record.category}</span>
                            </div>
                            <div className="declaration-info-row">
                                <i className="fas fa-clock"></i>
                                <span>时间:{formatActivityTime(record.startTime, record.endTime, record.time)}</span>
                            </div>
                        </div>
                        <div className="declaration-content">{record.content}</div>
                    </div>
                ))}
            </div>
 
            {/* 悬浮自主申报按钮 */}
            <div className="floating-declaration-btn" onClick={handleNewDeclaration}>
                <i className="fas fa-plus"></i>
                <span>自主申报</span>
            </div>
        </div>
    );
};
 
export default PointsDeclarationPage;