Files
mini-programs/src/other_pages/message/index.tsx
张成 5ed8fc87d6 1
2025-09-30 14:46:32 +08:00

137 lines
4.2 KiB
TypeScript

import { useState, useEffect } from "react";
import { View, Text, ScrollView, Image } from "@tarojs/components";
import { Avatar } from "@nutui/nutui-react-taro";
import GuideBar from "@/components/GuideBar";
import { withAuth } from "@/components";
import noticeService from "@/services/noticeService";
import Taro, { useRouter } from "@tarojs/taro";
import "./index.scss";
// 消息类型定义
interface MessageItem {
id: string;
type: "system" | "user" | "like" | "comment" | "follow";
title: string;
content: string;
time: string;
avatar?: string;
isRead: boolean;
hasAction?: boolean;
actionText?: string;
}
const Message = () => {
const [activeTab] = useState<"all" | "like" | "comment" | "follow">("all");
const [messageList, setMessageList] = useState<MessageItem[]>([]);
useEffect(() => {
const getNoticeList = async () => {
try {
const res = await noticeService.getNotificationList({});
if (res.code === 0) {
setMessageList(res.data.list);
}
} catch (e) {
Taro.showToast({
title: "获取列表失败,请重试",
icon: "none",
duration: 2000,
});
} finally {
}
};
getNoticeList();
}, []);
// 过滤消息
const filteredMessages = messageList.filter((message) => {
if (activeTab === "all") return true;
return message.type === activeTab;
});
// 渲染消息项
const renderMessageItem = (message: MessageItem) => {
if (message.type === "system") {
return (
<View className="message-item system-message" key={message.id}>
<View className="message-header">
<Text className="message-title">{message.title}</Text>
<Text className="message-time">{message.time}</Text>
</View>
<View className="message-content">
<Text className="message-text">{message.content}</Text>
</View>
{message.hasAction && (
<View className="message-action">
<View className="action-divider"></View>
<View className="action-button">
<Text className="action-text">{message.actionText}</Text>
<Image
className="action-arrow"
src={require("../../static/message/icon-message-arrow.svg")}
/>
</View>
</View>
)}
</View>
);
}
return (
<View className="message-item user-message" key={message.id}>
<View className="message-avatar">
<Avatar src={message.avatar} size="48px" />
</View>
<View className="message-info">
<View className="message-header">
<Text className="message-title">{message.title}</Text>
<Text className="message-time">{message.time}</Text>
</View>
<View className="message-content">
<Text className="message-text">{message.content}</Text>
{!message.isRead && <View className="unread-indicator"></View>}
</View>
</View>
</View>
);
};
return (
<View className="message-container">
{/* 导航栏 */}
<View className="navbar">
<View className="navbar-content">
<View className="navbar-left">
<Avatar
className="navbar-avatar"
src="https://img.yzcdn.cn/vant/cat.jpeg"
/>
<Text className="navbar-title"></Text>
</View>
</View>
</View>
{/* 消息列表 */}
<ScrollView scrollY className="message-list" scrollWithAnimation enhanced showScrollbar={false} >
{filteredMessages.length > 0 ? (
<View className="message-list-content">
{filteredMessages.map(renderMessageItem)}
</View>
) : (
<View className="empty-state">
<View className="empty-icon">
<View className="empty-message-icon"></View>
</View>
<Text className="empty-text"></Text>
</View>
)}
</ScrollView>
{/* 底部导航 */}
<GuideBar currentPage="message" />
</View>
);
};
export default withAuth(Message);