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

@@ -3,8 +3,8 @@
* 断点检测 - 检测当前断点
*/
import { useMemo } from 'react';
import { useWindowDimensions } from './useScreenSize';
import { useMemo, useState, useEffect } from 'react';
import { Dimensions, ScaledSize } from 'react-native';
import { BREAKPOINTS, FINE_BREAKPOINTS } from './types';
import type { BreakpointKey, FineBreakpointKey } from './types';
@@ -74,6 +74,22 @@ export function isBreakpointBetween(
// ==================== Hooks ====================
function useWindowDimensionsLocal(): ScaledSize {
const [dimensions, setDimensions] = useState(() => Dimensions.get('window'));
useEffect(() => {
const subscription = Dimensions.addEventListener('change', ({ window }) => {
setDimensions(window);
});
return () => {
subscription.remove();
};
}, []);
return dimensions;
}
/**
* 断点检测 Hook
* 返回当前的基础断点
@@ -85,7 +101,7 @@ export function isBreakpointBetween(
* // 'mobile' | 'tablet' | 'desktop' | 'wide'
*/
export function useBreakpoint(): BreakpointKey {
const { width } = useWindowDimensions();
const { width } = useWindowDimensionsLocal();
return useMemo(() => {
return getBreakpoint(width);
@@ -103,7 +119,7 @@ export function useBreakpoint(): BreakpointKey {
* // 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl'
*/
export function useFineBreakpoint(): FineBreakpointKey {
const { width } = useWindowDimensions();
const { width } = useWindowDimensionsLocal();
return useMemo(() => {
return getFineBreakpoint(width);
@@ -120,7 +136,7 @@ export function useFineBreakpoint(): FineBreakpointKey {
* const isMediumUp = useBreakpointGTE('md');
*/
export function useBreakpointGTE(target: FineBreakpointKey): boolean {
const { width } = useWindowDimensions();
const { width } = useWindowDimensionsLocal();
return useMemo(() => {
const current = getFineBreakpoint(width);
@@ -138,7 +154,7 @@ export function useBreakpointGTE(target: FineBreakpointKey): boolean {
* const isMobileOnly = useBreakpointLT('lg');
*/
export function useBreakpointLT(target: FineBreakpointKey): boolean {
const { width } = useWindowDimensions();
const { width } = useWindowDimensionsLocal();
return useMemo(() => {
const current = getFineBreakpoint(width);
@@ -160,7 +176,7 @@ export function useBreakpointBetween(
min: FineBreakpointKey,
max: FineBreakpointKey
): boolean {
const { width } = useWindowDimensions();
const { width } = useWindowDimensionsLocal();
return useMemo(() => {
const current = getFineBreakpoint(width);