import { useState, useEffect } from "react"; import React from "react"; import { View, Text, Image, ScrollView } from "@tarojs/components"; import { EmptyState } from "@/components"; import SubscribeNotificationTip from "@/components/SubscribeNotificationTip"; import noticeService from "@/services/noticeService"; import { formatRelativeTime } from "@/utils/timeUtils"; import Taro from "@tarojs/taro"; import { useGlobalState } from "@/store/global"; import { navigateTo } from "@/utils/navigation"; import { useReddotInfo, useFetchReddotInfo } from "@/store/messageStore"; import styles from "./MessagePageContent.module.scss"; interface MessageItem { id: string; notification_type: string; title: string; content: string; create_time: string; is_read: number; related_user_avatar?: string; related_user_nickname?: string; activity_image?: string; jump_url?: string; } type MessageCategory = "comment" | "follow"; interface MessagePageContentProps { isActive?: boolean; } const MessagePageContent: React.FC = ({ isActive = true }) => { const { statusNavbarHeightInfo } = useGlobalState() || {}; const { totalHeight = 98 } = statusNavbarHeightInfo || {}; const [activeTab, setActiveTab] = useState(null); const [messageList, setMessageList] = useState([]); const [loading, setLoading] = useState(false); const [reachedBottom, setReachedBottom] = useState(false); const [refreshing, setRefreshing] = useState(false); const [hasLoaded, setHasLoaded] = useState(false); // 记录是否已经加载过数据 // 从 store 获取红点信息 const reddotInfo = useReddotInfo(); const fetchReddotInfo = useFetchReddotInfo(); const getNoticeList = async () => { if (loading) return; setLoading(true); try { const res = await noticeService.getNotificationList({}); if (res.code === 0) { setMessageList(res.data.list || []); } } catch (e) { (Taro as any).showToast({ title: "获取列表失败,请重试", icon: "none", duration: 2000, }); } finally { setLoading(false); } }; // 只有当页面激活且未加载过数据时才加载接口 useEffect(() => { if (isActive && !hasLoaded) { getNoticeList(); fetchReddotInfo(); setHasLoaded(true); } }, [isActive, hasLoaded]); const filteredMessages = messageList; const handleTabClick = (tab: MessageCategory) => { if (tab === "comment") { navigateTo({ url: "/other_pages/comment_reply/index", }); return; } if (tab === "follow") { navigateTo({ url: "/other_pages/new_follow/index", }); return; } setActiveTab(activeTab === tab ? null : tab); }; const handleViewDetail = (message: MessageItem) => { if (!message.jump_url) { console.log("暂无跳转链接"); return; } navigateTo({ url: message.jump_url, }).catch(() => { (Taro as any).showToast({ title: "页面不存在", icon: "none", duration: 2000, }); }); }; const handleScrollToLower = () => { if (!reachedBottom && filteredMessages.length > 0) { setReachedBottom(true); setTimeout(() => { setReachedBottom(false); }, 2000); } }; const handleRefresh = async () => { setRefreshing(true); try { const res = await noticeService.getNotificationList({}); if (res.code === 0) { setMessageList(res.data.list || []); } } catch (e) { (Taro as any).showToast({ title: "刷新失败", icon: "none", duration: 2000, }); } finally { setRefreshing(false); } }; return ( handleTabClick("comment")} > {(reddotInfo?.comment_unread_count || 0) > 0 && ( {`+${(reddotInfo?.comment_unread_count || 0) > 99 ? 99 : reddotInfo?.comment_unread_count}`} )} 评论和回复 handleTabClick("follow")} > {(reddotInfo?.follow_unread_count || 0) > 0 && ( {`+${(reddotInfo?.follow_unread_count || 0) > 99 ? 99 : reddotInfo?.follow_unread_count}`} )} 新增关注 {/* 通知提示框 */} {filteredMessages.length > 0 ? ( {filteredMessages.map((message) => ( handleViewDetail(message)}> {message.title} {formatRelativeTime(message.create_time)} {message.content} 查看详情 ))} {filteredMessages.length > 0 && ( 到底了 )} ) : ( )} ); }; export default MessagePageContent;