refactor(ProcessPostUseCase, useCursorPagination, useDifferentialPosts): enhance post merging and loading states
All checks were successful
Frontend CI / build-and-push-web (push) Successful in 4m57s
Frontend CI / ota-android (push) Successful in 10m48s
Frontend CI / build-android-apk (push) Successful in 52m58s

- Introduced new methods for merging posts and comments efficiently, improving performance during data updates.
- Updated loading state management in hooks to include initial loading and loading more states for better user feedback.
- Refactored HomeScreen and PostDetailScreen to utilize the new loading states and merging logic, enhancing user experience during data fetching.
- Improved pagination handling in useCursorPagination and useDifferentialPosts to ensure consistent data management across components.
This commit is contained in:
lafay
2026-03-24 01:19:09 +08:00
parent aaf53d1c3b
commit 5c9cb6acea
11 changed files with 475 additions and 101 deletions

View File

@@ -1557,8 +1557,8 @@ class MessageManager {
payload: { conversationId, messages: mergedMessages, source: 'local_history' },
timestamp: Date.now(),
});
// 异步填充 sender 信
this.enrichMessagesWithSenderInfo(conversationId, mergedMessages);
// 性能优化:历史分页仅对新批次做 sender 补全,避免每次扫描全量消
this.enrichMessagesWithSenderInfo(conversationId, formattedMessages);
return formattedMessages;
}
@@ -1593,8 +1593,8 @@ class MessageManager {
payload: { conversationId, messages: mergedMessages, source: 'server_history' },
timestamp: Date.now(),
});
// 异步填充 sender 信息
this.enrichMessagesWithSenderInfo(conversationId, mergedMessages);
// 性能优化:仅对本次服务端批次做 sender 补全
this.enrichMessagesWithSenderInfo(conversationId, serverMessages);
return serverMessages;
}

View File

@@ -103,6 +103,7 @@ export function useMessages(conversationId: string | null): UseMessagesReturn {
const [messages, setMessages] = useState<MessageResponse[]>([]);
const [isLoading, setIsLoading] = useState(false);
const [hasMore, setHasMore] = useState(true);
const loadMoreInFlightRef = useRef(false);
useEffect(() => {
if (!conversationId) {
@@ -156,23 +157,23 @@ export function useMessages(conversationId: string | null): UseMessagesReturn {
}, [conversationId]);
const loadMore = useCallback(async () => {
if (!conversationId || isLoading || !hasMore) return;
if (!conversationId || !hasMore || loadMoreInFlightRef.current) return;
const currentMessages = messageManager.getMessages(conversationId);
if (currentMessages.length === 0) return;
// 获取最早的消息seq
const minSeq = Math.min(...currentMessages.map(m => m.seq));
// 消息数组在 MessageManager 内保持 seq 升序,首项即最早消息
const minSeq = currentMessages[0]?.seq ?? Math.min(...currentMessages.map(m => m.seq));
setIsLoading(true);
loadMoreInFlightRef.current = true;
const loadedMessages = await messageManager.loadMoreMessages(conversationId, minSeq, 20);
setIsLoading(false);
loadMoreInFlightRef.current = false;
// 如果没有加载到新消息,说明没有更多了
if (loadedMessages.length === 0) {
setHasMore(false);
}
}, [conversationId, isLoading, hasMore]);
}, [conversationId, hasMore]);
const refresh = useCallback(async () => {
if (!conversationId) return;