diff --git a/src/pages/ExportPage.scss b/src/pages/ExportPage.scss index 80cc66e..c22a09c 100644 --- a/src/pages/ExportPage.scss +++ b/src/pages/ExportPage.scss @@ -1559,6 +1559,38 @@ color: var(--text-tertiary); } + .row-sns-metric-btn { + border: none; + background: transparent; + margin: 0; + padding: 0; + min-height: 14px; + display: inline-flex; + align-items: center; + justify-content: center; + font-size: 12px; + line-height: 1.2; + color: var(--primary); + font-variant-numeric: tabular-nums; + cursor: pointer; + + &:hover { + color: var(--primary-hover); + text-decoration: underline; + text-underline-offset: 2px; + } + + &:focus-visible { + outline: 2px solid color-mix(in srgb, var(--primary) 48%, transparent); + outline-offset: 2px; + border-radius: 4px; + } + + &.loading { + color: var(--text-tertiary); + } + } + .row-message-stats { width: 100%; display: flex; diff --git a/src/pages/ExportPage.tsx b/src/pages/ExportPage.tsx index 5e89b9b..259c7e0 100644 --- a/src/pages/ExportPage.tsx +++ b/src/pages/ExportPage.tsx @@ -2158,16 +2158,7 @@ function ExportPage() { setSessionSnsTimelineStatsLoading(false) }, []) - const openSessionSnsTimeline = useCallback(() => { - const normalizedSessionId = String(sessionDetail?.wxid || '').trim() - if (!isSingleContactSession(normalizedSessionId) || !sessionDetail) return - - const target: SessionSnsTimelineTarget = { - username: normalizedSessionId, - displayName: sessionDetail.displayName || sessionDetail.remark || sessionDetail.nickName || normalizedSessionId, - avatarUrl: sessionDetail.avatarUrl - } - + const openSessionSnsTimelineByTarget = useCallback((target: SessionSnsTimelineTarget) => { setSessionSnsTimelineTarget(target) setSessionSnsTimelinePosts([]) setSessionSnsTimelineHasMore(false) @@ -2175,7 +2166,7 @@ function ExportPage() { setSessionSnsTimelineLoading(false) if (snsUserPostCountsStatus === 'ready') { - const count = Number(snsUserPostCounts[normalizedSessionId] || 0) + const count = Number(snsUserPostCounts[target.username] || 0) setSessionSnsTimelineTotalPosts(Number.isFinite(count) ? Math.max(0, Math.floor(count)) : 0) setSessionSnsTimelineStatsLoading(false) } else { @@ -2188,11 +2179,33 @@ function ExportPage() { }, [ loadSessionSnsTimelinePosts, loadSnsUserPostCounts, - sessionDetail, snsUserPostCounts, snsUserPostCountsStatus ]) + const openSessionSnsTimeline = useCallback(() => { + const normalizedSessionId = String(sessionDetail?.wxid || '').trim() + if (!isSingleContactSession(normalizedSessionId) || !sessionDetail) return + + const target: SessionSnsTimelineTarget = { + username: normalizedSessionId, + displayName: sessionDetail.displayName || sessionDetail.remark || sessionDetail.nickName || normalizedSessionId, + avatarUrl: sessionDetail.avatarUrl + } + + openSessionSnsTimelineByTarget(target) + }, [openSessionSnsTimelineByTarget, sessionDetail]) + + const openContactSnsTimeline = useCallback((contact: ContactInfo) => { + const normalizedSessionId = String(contact?.username || '').trim() + if (!isSingleContactSession(normalizedSessionId)) return + openSessionSnsTimelineByTarget({ + username: normalizedSessionId, + displayName: contact.displayName || contact.remark || contact.nickname || normalizedSessionId, + avatarUrl: contact.avatarUrl + }) + }, [openSessionSnsTimelineByTarget]) + const loadMoreSessionSnsTimeline = useCallback(() => { if (!sessionSnsTimelineTarget || sessionSnsTimelineLoading || sessionSnsTimelineLoadingMore || !sessionSnsTimelineHasMore) return void loadSessionSnsTimelinePosts(sessionSnsTimelineTarget, { reset: false }) @@ -4058,6 +4071,9 @@ function ExportPage() { if (activeTab === 'former_friend') return '曾经的好友' return '公众号' }, [activeTab]) + const shouldShowSnsColumn = useMemo(() => ( + activeTab === 'private' || activeTab === 'former_friend' + ), [activeTab]) const sessionRowByUsername = useMemo(() => { const map = new Map() @@ -5004,6 +5020,10 @@ function ExportPage() { const voiceMetric = metricToDisplay(mediaMetric?.voiceMessages) const imageMetric = metricToDisplay(mediaMetric?.imageMessages) const videoMetric = metricToDisplay(mediaMetric?.videoMessages) + const isSnsCountLoading = snsUserPostCountsStatus === 'loading' || snsUserPostCountsStatus === 'idle' + const snsRawCount = Number(snsUserPostCounts[contact.username] || 0) + const snsCount = Number.isFinite(snsRawCount) ? Math.max(0, Math.floor(snsRawCount)) : 0 + const supportsSnsTimeline = isSingleContactSession(contact.username) const openChatLabel = contact.type === 'friend' ? '打开私聊' : contact.type === 'group' @@ -5086,6 +5106,24 @@ function ExportPage() { : videoMetric.text} + {shouldShowSnsColumn && ( +
+ {supportsSnsTimeline ? ( + + ) : ( + -- + )} +
+ )}