From 8cb855328d3b770d7f42b31c83ee6ef061f6fc30 Mon Sep 17 00:00:00 2001 From: aits2026 Date: Fri, 6 Mar 2026 11:12:23 +0800 Subject: [PATCH] refactor(export): reuse shared sns timeline dialog --- src/pages/ExportPage.tsx | 175 ++++++++------------------------------- 1 file changed, 33 insertions(+), 142 deletions(-) diff --git a/src/pages/ExportPage.tsx b/src/pages/ExportPage.tsx index aa8e134..c1b504a 100644 --- a/src/pages/ExportPage.tsx +++ b/src/pages/ExportPage.tsx @@ -39,6 +39,7 @@ import { } from '../services/exportBridge' import { useContactTypeCountsStore } from '../stores/contactTypeCountsStore' import { SnsPostItem } from '../components/Sns/SnsPostItem' +import { ContactSnsTimelineDialog } from '../components/Sns/ContactSnsTimelineDialog' import type { SnsPost } from '../types/sns' import './ExportPage.scss' @@ -2241,6 +2242,21 @@ function ExportPage() { setSessionSnsTimelineStatsLoading(false) }, []) + const sessionSnsTimelineInitialTotalPosts = useMemo(() => { + const username = String(sessionSnsTimelineTarget?.username || '').trim() + if (!username) return null + if (!Object.prototype.hasOwnProperty.call(snsUserPostCounts, username)) return null + const count = Number(snsUserPostCounts[username] || 0) + return Number.isFinite(count) ? Math.max(0, Math.floor(count)) : 0 + }, [sessionSnsTimelineTarget, snsUserPostCounts]) + + const sessionSnsTimelineInitialTotalPostsLoading = useMemo(() => { + const username = String(sessionSnsTimelineTarget?.username || '').trim() + if (!username) return false + if (Object.prototype.hasOwnProperty.call(snsUserPostCounts, username)) return false + return snsUserPostCountsStatus === 'loading' || snsUserPostCountsStatus === 'idle' + }, [sessionSnsTimelineTarget, snsUserPostCounts, snsUserPostCountsStatus]) + const openSessionSnsTimelineByTarget = useCallback((target: SessionSnsTimelineTarget) => { sessionSnsRankRequestTokenRef.current += 1 sessionSnsRankLoadingRef.current = false @@ -2255,22 +2271,21 @@ function ExportPage() { setSessionSnsTimelineHasMore(false) setSessionSnsTimelineLoadingMore(false) setSessionSnsTimelineLoading(false) - - if (snsUserPostCountsStatus === 'ready') { + const hasKnownCount = Object.prototype.hasOwnProperty.call(snsUserPostCounts, target.username) + if (hasKnownCount) { const count = Number(snsUserPostCounts[target.username] || 0) - setSessionSnsTimelineTotalPosts(Number.isFinite(count) ? Math.max(0, Math.floor(count)) : 0) + const normalizedCount = Number.isFinite(count) ? Math.max(0, Math.floor(count)) : 0 + setSessionSnsTimelineTotalPosts(normalizedCount) setSessionSnsTimelineStatsLoading(false) - setSessionSnsRankTotalPosts(Number.isFinite(count) ? Math.max(0, Math.floor(count)) : 0) + setSessionSnsRankTotalPosts(normalizedCount) } else { setSessionSnsTimelineTotalPosts(null) - setSessionSnsTimelineStatsLoading(true) + setSessionSnsTimelineStatsLoading(snsUserPostCountsStatus === 'loading' || snsUserPostCountsStatus === 'idle') setSessionSnsRankTotalPosts(null) } - void loadSessionSnsTimelinePosts(target, { reset: true }) void loadSnsUserPostCounts() }, [ - loadSessionSnsTimelinePosts, loadSnsUserPostCounts, snsUserPostCounts, snsUserPostCountsStatus @@ -4973,11 +4988,7 @@ function ExportPage() { useEffect(() => { if (!sessionSnsTimelineTarget) return - if (snsUserPostCountsStatus === 'loading' || snsUserPostCountsStatus === 'idle') { - setSessionSnsTimelineStatsLoading(true) - return - } - if (snsUserPostCountsStatus === 'ready') { + if (Object.prototype.hasOwnProperty.call(snsUserPostCounts, sessionSnsTimelineTarget.username)) { const total = Number(snsUserPostCounts[sessionSnsTimelineTarget.username] || 0) const normalizedTotal = Number.isFinite(total) ? Math.max(0, Math.floor(total)) : 0 setSessionSnsTimelineTotalPosts(normalizedTotal) @@ -4985,6 +4996,10 @@ function ExportPage() { setSessionSnsTimelineStatsLoading(false) return } + if (snsUserPostCountsStatus === 'loading' || snsUserPostCountsStatus === 'idle') { + setSessionSnsTimelineStatsLoading(true) + return + } setSessionSnsTimelineTotalPosts(null) setSessionSnsRankTotalPosts(null) setSessionSnsTimelineStatsLoading(false) @@ -6213,136 +6228,12 @@ function ExportPage() { )} - {sessionSnsTimelineTarget && ( -
-
event.stopPropagation()} - > -
-
-
- {sessionSnsTimelineTarget.avatarUrl ? ( - - ) : ( - {getAvatarLetter(sessionSnsTimelineTarget.displayName || sessionSnsTimelineTarget.username)} - )} -
-
-

{sessionSnsTimelineTarget.displayName}

-
@{sessionSnsTimelineTarget.username}
-
{renderSessionSnsTimelineStats()}
-
-
-
-
- - - {sessionSnsRankMode && ( -
- {sessionSnsRankLoading && ( -
- - - {sessionSnsRankTotalPosts !== null && sessionSnsRankTotalPosts > 0 - ? `统计中,已加载 ${sessionSnsRankLoadedPosts} / ${sessionSnsRankTotalPosts} 条` - : `统计中,已加载 ${sessionSnsRankLoadedPosts} 条`} - -
- )} - {!sessionSnsRankLoading && sessionSnsRankError ? ( -
{sessionSnsRankError}
- ) : !sessionSnsRankLoading && sessionSnsActiveRankings.length === 0 ? ( -
- {sessionSnsRankMode === 'likes' ? '暂无点赞数据' : '暂无评论数据'} -
- ) : ( - sessionSnsActiveRankings.slice(0, SNS_RANK_DISPLAY_LIMIT).map((item, index) => ( -
- {index + 1} - {item.name} - - {item.count.toLocaleString('zh-CN')} - {sessionSnsRankMode === 'likes' ? '次' : '条'} - -
- )) - )} -
- )} -
- -
-
- -
- 在微信桌面客户端中打开这个人的朋友圈浏览,可快速把其朋友圈同步到这里。若你在乎这个人,一定要试试~ -
- -
- {sessionSnsTimelinePosts.length > 0 && ( -
- {sessionSnsTimelinePosts.map((post) => ( - { - if (isVideo) { - void window.electronAPI.window.openVideoPlayerWindow(src) - } else { - void window.electronAPI.window.openImageViewerWindow(src, liveVideoPath || undefined) - } - }} - onDebug={() => {}} - hideAuthorMeta - /> - ))} -
- )} - - {sessionSnsTimelineLoading && ( -
正在加载该联系人的朋友圈...
- )} - - {!sessionSnsTimelineLoading && sessionSnsTimelinePosts.length === 0 && ( -
该联系人暂无朋友圈
- )} - - {!sessionSnsTimelineLoading && sessionSnsTimelineHasMore && ( - - )} -
-
-
- )} +