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
/**
 * @author 韩天尊
 * @time 2024-01-15
 * @version 1.0.0
 * @description 消息详情页面组件
 */
import React, { useState, useEffect } from 'react';
import { useParams, useNavigate } from 'react-router-dom';
import { messageAPI } from '../services/api';
import PageHeader from '../components/PageHeader';
import { format } from 'date-fns';
 
interface Message {
    id: number;
    title: string;
    content: string;
    type: string;
    createTime: string;
    isRead: boolean;
}
 
const MessageDetailPage: React.FC = () => {
    const { id } = useParams<{ id: string }>();
    const navigate = useNavigate();
    const [message, setMessage] = useState<Message | null>(null);
    const [loading, setLoading] = useState(true);
    const [error, setError] = useState<string | null>(null);
 
    // 加载消息详情
    useEffect(() => {
        const loadMessageDetail = async () => {
            if (!id) {
                setError('消息ID不存在');
                setLoading(false);
                return;
            }
 
            try {
                setLoading(true);
                const response = await messageAPI.getDetail(parseInt(id));
                
                if (response.code === 0) {
                    setMessage(response.data);
                } else {
                    setError(response.msg || '加载消息详情失败');
                }
            } catch (error: any) {
                console.error('加载消息详情失败:', error);
                setError(error.message || '加载消息详情失败');
            } finally {
                setLoading(false);
            }
        };
 
        loadMessageDetail();
    }, [id]);
 
    // 获取消息类型文本
    const getMessageTypeText = (type: string) => {
        switch (type) {
            case '1': return '系统消息';
            case '2': return '活动消息';
            default: return '系统消息';
        }
    };
 
    // 格式化时间
    const formatMessageTime = (timeStr?: string) => {
        if (!timeStr) return '时间未知';
        
        try {
            const date = new Date(timeStr);
            return format(date, 'yyyy-MM-dd HH:mm');
        } catch (error) {
            console.error('时间格式化失败:', error);
            return timeStr;
        }
    };
 
    // 标记已读
    const handleMarkAsRead = async () => {
        if (!message || message.isRead) return;
 
        try {
            const response = await messageAPI.markAsRead(message.id);
            
            if (response.code === 0) {
                setMessage(prev => prev ? { ...prev, isRead: true } : null);
                // 可以显示成功提示
                console.log('消息已标记为已读');
            } else {
                console.error('标记已读失败:', response.msg);
            }
        } catch (error: any) {
            console.error('标记已读失败:', error);
        }
    };
 
    // 删除消息
    const handleDeleteMessage = () => {
        // 这里可以添加删除消息的逻辑
        console.log('删除消息功能待实现');
        // 删除成功后返回消息列表页
        navigate('/messages');
    };
 
    if (loading) {
        return (
            <div className="page">
                <PageHeader title="消息详情" showBack={true} />
                <div className="loading-container">
                    <div className="loading-spinner"></div>
                    <p>加载中...</p>
                </div>
            </div>
        );
    }
 
    if (error || !message) {
        return (
            <div className="page">
                <PageHeader title="消息详情" showBack={true} />
                <div className="error-state">
                    <i className="fas fa-exclamation-triangle"></i>
                    <p>{error || '消息不存在'}</p>
                    <button className="btn primary" onClick={() => navigate('/messages')}>
                        返回消息列表
                    </button>
                </div>
            </div>
        );
    }
 
    return (
        <div className="page">
            <PageHeader title="消息详情" showBack={true} />
 
            <div className="message-detail-content">
                {/* 消息标题 */}
                <div className="message-header">
                    <h3 className="message-detail-title">{message.title}</h3>
                    <div className="message-meta">
                        <span className="message-detail-time">{formatMessageTime(message.createTime)}</span>
                        <span className="message-detail-type">{getMessageTypeText(message.type)}</span>
                    </div>
                </div>
 
                {/* 消息内容 */}
                <div className="message-body">
                    <div className="message-detail-content-text">
                        {message.content}
                    </div>
                </div>
 
                {/* 操作按钮 */}
                <div className="message-actions">
                    {!message.isRead && (
                        <button className="action-btn primary" onClick={handleMarkAsRead}>
                            <span>标记已读</span>
                        </button>
                    )}
                    <button className="action-btn secondary" onClick={handleDeleteMessage}>
                        <span>删除消息</span>
                    </button>
                </div>
            </div>
        </div>
    );
};
 
export default MessageDetailPage;