From 08a3abc6cc8591bf7b55e5c0dca797fe221b0ba3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B9=BE=E4=B9=BE?= <1046762075@qq.com> Date: Fri, 31 Oct 2025 18:50:13 +0800 Subject: [PATCH] fix(mobile): :bug: reposted in Moments, unread notification in Moments --- src-tauri/src/websocket/client.rs | 6 ++++ src/App.vue | 12 +++++++ src/layout/left/components/ActionList.vue | 17 ++++++++- src/mobile/layout/tabBar/index.vue | 20 +++++------ src/mobile/views/chat-room/ChatSetting.vue | 40 ++++++++++++++++++++++ src/mobile/views/community/index.vue | 18 +++++++++- src/plugins/dynamic/index.vue | 15 ++++---- src/services/webSocketRust.ts | 8 +++++ src/services/wsType.ts | 4 ++- src/stores/feed.ts | 30 +++++++++++++++- 10 files changed, 147 insertions(+), 23 deletions(-) diff --git a/src-tauri/src/websocket/client.rs b/src-tauri/src/websocket/client.rs index cddc55c0..ce4142cd 100644 --- a/src-tauri/src/websocket/client.rs +++ b/src-tauri/src/websocket/client.rs @@ -821,6 +821,12 @@ impl WebSocketClient { let _ = app_handle.emit("ws-delete-friend", data); } + // 朋友圈相关 + "feedSendMsg" => { + info!("🎉 Feed message received"); + let _ = app_handle.emit_to("home", "ws-feed-send-msg", data); + } + // 未知消息类型 _ => { warn!("❓ Received unhandled message type: {}", message_type); diff --git a/src/App.vue b/src/App.vue index 03cacea8..3bd509ce 100644 --- a/src/App.vue +++ b/src/App.vue @@ -46,6 +46,7 @@ import { useGroupStore } from '@/stores/group' import { useUserStore } from '@/stores/user' import { useChatStore } from '@/stores/chat' import { useAnnouncementStore } from '@/stores/announcement' +import { useFeedStore } from '@/stores/feed' import type { MarkItemType, RevokedMsgType, UserItem } from '@/services/types.ts' const mobileRtcCallFloatCell = isMobile() @@ -55,6 +56,7 @@ const mobileRtcCallFloatCell = isMobile() const userStore = useUserStore() const contactStore = useContactStore() const announcementStore = useAnnouncementStore() +const feedStore = useFeedStore() const userUid = computed(() => userStore.userInfo!.uid) const groupStore = useGroupStore() const chatStore = useChatStore() @@ -371,6 +373,16 @@ useMitt.on(WsResponseMessageType.USER_STATE_CHANGE, async (data: { uid: string; }) }) +useMitt.on(WsResponseMessageType.FEED_SEND_MSG, (data: { uid: string }) => { + if (data.uid !== userStore.userInfo!.uid) { + feedStore.increaseUnreadCount() + // 同步更新角标 + unreadCountManager.refreshBadge(globalStore.unReadMark) + } else { + console.log('🔔 [App.vue] 是自己发布的,不增加未读数') + } +}) + useMitt.on(WsResponseMessageType.GROUP_SET_ADMIN_SUCCESS, (event) => { console.log('设置群管理员---> ', event) groupStore.updateAdminStatus(event.roomId, event.uids, event.status) diff --git a/src/layout/left/components/ActionList.vue b/src/layout/left/components/ActionList.vue index 312a184d..4ac3e65c 100644 --- a/src/layout/left/components/ActionList.vue +++ b/src/layout/left/components/ActionList.vue @@ -107,7 +107,7 @@ - + @@ -260,6 +260,7 @@ import { useGlobalStore } from '@/stores/global.ts' import { useMenuTopStore } from '@/stores/menuTop.ts' import { usePluginsStore } from '@/stores/plugins.ts' import { useSettingStore } from '@/stores/setting.ts' +import { useFeedStore } from '@/stores/feed.ts' import { itemsBottom, moreList } from '../config.tsx' import { leftHook } from '../hook.ts' import DefinePlugins from './definePlugins/index.vue' @@ -268,9 +269,11 @@ const appWindow = WebviewWindow.getCurrent() const { addListener } = useTauriListener() const globalStore = useGlobalStore() const pluginsStore = usePluginsStore() +const feedStore = useFeedStore() const { showMode } = storeToRefs(useSettingStore()) const { menuTop } = useMenuTopStore() const { plugins } = storeToRefs(pluginsStore) +const { unreadCount: feedUnreadCount } = storeToRefs(feedStore) const unReadMark = computed(() => globalStore.unReadMark) // const headerRef = useTemplateRef('header') // const actionListRef = useTemplateRef('actionList') @@ -341,6 +344,18 @@ const setHomeHeight = () => { invoke('set_height', { height: showMode.value === ShowModeEnum.TEXT ? 505 : 423 }) } +// 监听朋友圈未读数量变化,同步到 dynamic 插件的 badge +watch( + feedUnreadCount, + (newCount) => { + const dynamicPlugin = plugins.value.find((p) => p.url === 'dynamic') + if (dynamicPlugin) { + pluginsStore.updatePlugin({ ...dynamicPlugin, badge: newCount }) + } + }, + { immediate: true } +) + onMounted(async () => { // 初始化窗口高度 setHomeHeight() diff --git a/src/mobile/layout/tabBar/index.vue b/src/mobile/layout/tabBar/index.vue index 14641f70..63cc6a89 100644 --- a/src/mobile/layout/tabBar/index.vue +++ b/src/mobile/layout/tabBar/index.vue @@ -22,7 +22,8 @@ diff --git a/src/mobile/views/community/index.vue b/src/mobile/views/community/index.vue index c1a2a270..4be3e551 100644 --- a/src/mobile/views/community/index.vue +++ b/src/mobile/views/community/index.vue @@ -45,6 +45,8 @@ import { useUserStore } from '@/stores/user' import { AvatarUtils } from '@/utils/AvatarUtils' import { useDebounceFn, useThrottleFn } from '@vueuse/core' import DynamicList from '@/components/common/DynamicList.vue' +import { useMitt } from '@/hooks/useMitt' +import { WsResponseMessageType } from '@/services/wsType' const router = useRouter() const feedStore = useFeedStore() @@ -88,6 +90,8 @@ const onRefresh = () => { Promise.all([apiPromise, delayPromise]) .then(() => { loading.value = false + // 刷新后清空未读数量 + feedStore.clearUnreadCount() console.log('刷新完成') }) .catch((error) => { @@ -133,14 +137,26 @@ const handleItemClick = (feedId: string) => { }) } +// 监听朋友圈消息推送 +const handleFeedSendMsg = (_payload: any) => { + feedStore.increaseUnreadCount() +} + // 初始化数据 onMounted(async () => { // 初始加载动态列表 await feedStore.getFeedList(true) + + // 打开朋友圈时清空未读数量 + feedStore.clearUnreadCount() + + // 注册朋友圈消息监听 + useMitt.on(WsResponseMessageType.FEED_SEND_MSG, handleFeedSendMsg) }) onUnmounted(() => { - // 清理工作 + // 清理事件监听 + useMitt.off(WsResponseMessageType.FEED_SEND_MSG, handleFeedSendMsg) }) diff --git a/src/plugins/dynamic/index.vue b/src/plugins/dynamic/index.vue index 7301166b..62450b07 100644 --- a/src/plugins/dynamic/index.vue +++ b/src/plugins/dynamic/index.vue @@ -261,7 +261,6 @@