From 27264011a11f4b456f7212c3b643a417d8eb75f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=88=90?= Date: Fri, 21 Nov 2025 13:25:32 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=BA=A2=E7=82=B9=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/GuideBar/index.tsx | 25 ++----- .../components/MessagePageContent.tsx | 33 +++----- src/other_pages/message/index.tsx | 33 +++----- src/store/messageStore.ts | 75 +++++++++++++++++++ 4 files changed, 104 insertions(+), 62 deletions(-) create mode 100644 src/store/messageStore.ts diff --git a/src/components/GuideBar/index.tsx b/src/components/GuideBar/index.tsx index 4c6a350..7e4b240 100644 --- a/src/components/GuideBar/index.tsx +++ b/src/components/GuideBar/index.tsx @@ -1,35 +1,24 @@ -import { useState, useEffect } from "react"; +import { useEffect } from "react"; import { View, Text } from "@tarojs/components"; import Taro, { useDidShow } from "@tarojs/taro"; import { redirectTo } from "@/utils/navigation"; -import messageService from "@/services/messageService"; +import { useReddotInfo, useFetchReddotInfo } from "@/store/messageStore"; import "./index.scss"; import PublishMenu from "../PublishMenu"; export type currentPageType = "games" | "message" | "personal"; const GuideBar = (props) => { const { currentPage, guideBarClassName, onPublishMenuVisibleChange, onTabChange } = props; - const [hasReddot, setHasReddot] = useState(false); - - // 获取红点状态 - const checkReddot = async () => { - try { - const res = await messageService.getReddotInfo(); - if (res.code === 0) { - setHasReddot(res.data.has_reddot || false); - } - } catch (e) { - console.error("获取红点状态失败:", e); - } - }; + const reddotInfo = useReddotInfo(); + const fetchReddotInfo = useFetchReddotInfo(); useEffect(() => { - checkReddot(); + fetchReddotInfo(); }, []); // 每次页面显示时刷新红点状态 useDidShow(() => { - checkReddot(); + fetchReddotInfo(); }); const guideItems = [ @@ -91,7 +80,7 @@ const GuideBar = (props) => { key={item.code} > {item.text} - {item.code === "message" && hasReddot && ( + {item.code === "message" && reddotInfo?.has_reddot && ( )} diff --git a/src/main_pages/components/MessagePageContent.tsx b/src/main_pages/components/MessagePageContent.tsx index dbd0563..2af26fa 100644 --- a/src/main_pages/components/MessagePageContent.tsx +++ b/src/main_pages/components/MessagePageContent.tsx @@ -2,11 +2,11 @@ import { useState, useEffect } from "react"; import { View, Text, Image, ScrollView } from "@tarojs/components"; import { EmptyState } from "@/components"; import noticeService from "@/services/noticeService"; -import messageService from "@/services/messageService"; 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 "@/other_pages/message/index.scss"; interface MessageItem { @@ -27,14 +27,16 @@ type MessageCategory = "comment" | "follow"; const MessagePageContent = () => { 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 [commentUnreadCount, setCommentUnreadCount] = useState(0); - const [followUnreadCount, setFollowUnreadCount] = useState(0); + + // 从 store 获取红点信息 + const reddotInfo = useReddotInfo(); + const fetchReddotInfo = useFetchReddotInfo(); const getNoticeList = async () => { if (loading) return; @@ -55,22 +57,9 @@ const MessagePageContent = () => { } }; - // 获取红点信息 - const getReddotInfo = async () => { - try { - const res = await messageService.getReddotInfo(); - if (res.code === 0) { - setCommentUnreadCount(res.data.comment_unread_count || 0); - setFollowUnreadCount(res.data.follow_unread_count || 0); - } - } catch (e) { - console.error("获取红点信息失败:", e); - } - }; - useEffect(() => { getNoticeList(); - getReddotInfo(); + fetchReddotInfo(); }, []); const filteredMessages = messageList; @@ -150,9 +139,9 @@ const MessagePageContent = () => { src={require('@/static/message/comment-icon.svg')} mode="aspectFit" /> - {commentUnreadCount > 0 && ( + {(reddotInfo?.comment_unread_count || 0) > 0 && ( - {commentUnreadCount > 99 ? '99+' : commentUnreadCount} + {(reddotInfo?.comment_unread_count || 0) > 99 ? '99+' : reddotInfo?.comment_unread_count} )} @@ -168,9 +157,9 @@ const MessagePageContent = () => { src={require('@/static/message/follow-icon.svg')} mode="aspectFit" /> - {followUnreadCount > 0 && ( + {(reddotInfo?.follow_unread_count || 0) > 0 && ( - {followUnreadCount > 99 ? '99+' : followUnreadCount} + {(reddotInfo?.follow_unread_count || 0) > 99 ? '99+' : reddotInfo?.follow_unread_count} )} diff --git a/src/other_pages/message/index.tsx b/src/other_pages/message/index.tsx index 527559a..c2a807f 100644 --- a/src/other_pages/message/index.tsx +++ b/src/other_pages/message/index.tsx @@ -3,9 +3,9 @@ import { View, Text, Image, ScrollView } from "@tarojs/components"; import GuideBar from "@/components/GuideBar"; import { withAuth, EmptyState, GeneralNavbar } from "@/components"; import noticeService from "@/services/noticeService"; -import messageService from "@/services/messageService"; import { formatRelativeTime } from "@/utils/timeUtils"; import Taro, { useDidShow } from "@tarojs/taro"; +import { useReddotInfo, useFetchReddotInfo } from "@/store/messageStore"; import "./index.scss"; // 消息类型定义 @@ -31,8 +31,10 @@ const Message = () => { const [loading, setLoading] = useState(false); const [reachedBottom, setReachedBottom] = useState(false); const [refreshing, setRefreshing] = useState(false); - const [commentUnreadCount, setCommentUnreadCount] = useState(0); - const [followUnreadCount, setFollowUnreadCount] = useState(0); + + // 从 store 获取红点信息 + const reddotInfo = useReddotInfo(); + const fetchReddotInfo = useFetchReddotInfo(); // 获取消息列表 const getNoticeList = async () => { @@ -54,27 +56,14 @@ const Message = () => { } }; - // 获取红点信息 - const getReddotInfo = async () => { - try { - const res = await messageService.getReddotInfo(); - if (res.code === 0) { - setCommentUnreadCount(res.data.comment_unread_count || 0); - setFollowUnreadCount(res.data.follow_unread_count || 0); - } - } catch (e) { - console.error("获取红点信息失败:", e); - } - }; - useEffect(() => { getNoticeList(); - getReddotInfo(); + fetchReddotInfo(); }, []); // 每次页面显示时刷新红点信息 useDidShow(() => { - getReddotInfo(); + fetchReddotInfo(); }); // 过滤系统消息 @@ -168,9 +157,9 @@ const Message = () => { src={require('@/static/message/comment-icon.svg')} mode="aspectFit" /> - {commentUnreadCount > 0 && ( + {(reddotInfo?.comment_unread_count || 0) > 0 && ( - {commentUnreadCount > 99 ? '+99' : `+${commentUnreadCount}`} + {(reddotInfo?.comment_unread_count || 0) > 99 ? '+99' : `+${reddotInfo?.comment_unread_count || 0}`} )} @@ -186,9 +175,9 @@ const Message = () => { src={require('@/static/message/follow-icon.svg')} mode="aspectFit" /> - {followUnreadCount > 0 && ( + {(reddotInfo?.follow_unread_count || 0) > 0 && ( - {followUnreadCount > 99 ? '+99' : `+${followUnreadCount}`} + {(reddotInfo?.follow_unread_count || 0) > 99 ? '+99' : `+${reddotInfo?.follow_unread_count || 0}`} )} diff --git a/src/store/messageStore.ts b/src/store/messageStore.ts new file mode 100644 index 0000000..6544bde --- /dev/null +++ b/src/store/messageStore.ts @@ -0,0 +1,75 @@ +import { create } from "zustand"; +import messageService, { ReddotInfo } from "@/services/messageService"; + +interface MessageState { + // 红点信息 + reddotInfo: ReddotInfo | null; + // 是否正在加载 + loading: boolean; +} + +interface MessageActions { + // 获取红点信息 + fetchReddotInfo: () => Promise; + // 重置红点信息 + resetReddotInfo: () => void; + // 更新红点信息的某个字段 + updateReddotInfo: (info: Partial) => void; +} + +// 完整的 Store 类型 +type MessageStore = MessageState & MessageActions; + +// 创建 store +export const useMessageStore = create()((set, get) => ({ + // 初始状态 + reddotInfo: null, + loading: false, + + // 获取红点信息 + fetchReddotInfo: async () => { + const { loading } = get(); + + // 防止重复请求 + if (loading) return; + + set({ loading: true }); + + try { + const res = await messageService.getReddotInfo(); + if (res.code === 0) { + set({ + reddotInfo: res.data, + loading: false + }); + } else { + set({ loading: false }); + } + } catch (e) { + console.error("获取红点信息失败:", e); + set({ loading: false }); + } + }, + + // 重置红点信息 + resetReddotInfo: () => { + set({ + reddotInfo: null + }); + }, + + // 更新红点信息的某个字段 + updateReddotInfo: (info: Partial) => { + const { reddotInfo } = get(); + if (reddotInfo) { + set({ + reddotInfo: { ...reddotInfo, ...info } + }); + } + }, +})); + +// 导出便捷的 hooks +export const useMessageState = () => useMessageStore((state) => state); +export const useReddotInfo = () => useMessageStore((state) => state.reddotInfo); +export const useFetchReddotInfo = () => useMessageStore((state) => state.fetchReddotInfo);