2026-06-16 19:03:26 +08:00
|
|
|
|
import { useEffect, useState } from 'react';
|
|
|
|
|
|
import { ActivityIndicator, View, useWindowDimensions } from 'react-native';
|
2026-03-24 14:21:31 +08:00
|
|
|
|
import { Redirect } from 'expo-router';
|
|
|
|
|
|
|
|
|
|
|
|
import { AppDesktopShell } from '../../src/app-navigation/AppDesktopShell';
|
|
|
|
|
|
import { AppRouteStack } from '../../src/app-navigation/AppRouteStack';
|
refactor: restructure core architecture and responsive system
This commit implements a major architectural refactor to improve modularity, type safety, and maintainability across the codebase.
Key changes include:
- **Responsive System Refactor**: Migrated from a monolithic `useResponsive` hook to a set of specialized, granular hooks (`useBreakpoint`, `useOrientation`, `usePlatform`, etc.) located in `src/presentation/hooks/responsive`. This reduces unnecessary re-renders and improves developer experience.
- **Core Service Restructuring**: Introduced a new directory structure for services, including dedicated folders for `datasources`, `mappers`, and domain-specific types (`message`, `post`).
- **Data Layer Improvements**:
- Centralized JSON parsing logic in `src/database/core/jsonUtils.ts`.
- Cleaned up repository implementations by removing redundant local utility functions.
- Refactored `MessageMapper` to use the new centralized JSON utility.
- **Type System Cleanup**:
- Decomposed the large `src/types/dto.ts` into a modular `src/types/dto/` directory.
- Simplified `src/types/index.ts` and introduced backward-compatible aliases for core entities.
- **Utility Consolidation**:
- Created a centralized `src/utils/formatTime.ts` to replace fragmented date formatting logic across various screens and components.
- Removed deprecated responsive utility files in favor of the new hook-based system.
- **Service Logic Refinement**: Refactored `ApiClient` and `WebSocketService` to use a centralized `showVerificationModal` service, removing duplicated state management for verification prompts.
2026-05-05 19:07:33 +08:00
|
|
|
|
import { BREAKPOINTS } from '../../src/hooks';
|
2026-03-24 14:21:31 +08:00
|
|
|
|
import { messageManager, useAuthStore } from '../../src/stores';
|
2026-06-12 23:42:09 +08:00
|
|
|
|
import { hrefAuthLogin } from '../../src/navigation/hrefs';
|
2026-06-16 19:03:26 +08:00
|
|
|
|
import { useAppColors } from '../../src/theme';
|
2026-03-24 14:21:31 +08:00
|
|
|
|
|
|
|
|
|
|
export default function AppLayoutWeb() {
|
|
|
|
|
|
const { width } = useWindowDimensions();
|
|
|
|
|
|
const isAuthenticated = useAuthStore((s) => s.isAuthenticated);
|
2026-06-16 19:03:26 +08:00
|
|
|
|
const fetchCurrentUser = useAuthStore((s) => s.fetchCurrentUser);
|
2026-03-24 14:21:31 +08:00
|
|
|
|
const useDesktopShell = width >= BREAKPOINTS.desktop;
|
2026-06-16 19:03:26 +08:00
|
|
|
|
const colors = useAppColors();
|
|
|
|
|
|
const [verified, setVerified] = useState(false);
|
|
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
// 冷启动 token 校验:仅鉴权分组 (app) 需要。
|
|
|
|
|
|
// 公开页(/privacy、/terms)和 (auth) 分组在根布局直接渲染,不受此校验影响。
|
|
|
|
|
|
fetchCurrentUser().finally(() => setVerified(true));
|
|
|
|
|
|
}, [fetchCurrentUser]);
|
2026-03-24 14:21:31 +08:00
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
messageManager.initialize();
|
|
|
|
|
|
}, []);
|
|
|
|
|
|
|
2026-06-16 19:03:26 +08:00
|
|
|
|
// 持久化状态显示已登录则立即渲染(后台静默校验)
|
|
|
|
|
|
if (isAuthenticated) {
|
|
|
|
|
|
if (useDesktopShell) {
|
|
|
|
|
|
return <AppDesktopShell />;
|
|
|
|
|
|
}
|
|
|
|
|
|
return <AppRouteStack />;
|
2026-03-24 14:21:31 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-06-16 19:03:26 +08:00
|
|
|
|
// 未登录且校验未完成,显示 loading
|
|
|
|
|
|
if (!verified) {
|
|
|
|
|
|
return (
|
|
|
|
|
|
<View
|
|
|
|
|
|
style={{
|
|
|
|
|
|
flex: 1,
|
|
|
|
|
|
justifyContent: 'center',
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
backgroundColor: colors.background.default,
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
<ActivityIndicator size="large" color={colors.primary.main} />
|
|
|
|
|
|
</View>
|
|
|
|
|
|
);
|
2026-03-24 14:21:31 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-06-16 19:03:26 +08:00
|
|
|
|
// 校验完成仍未登录,跳转登录页
|
|
|
|
|
|
return <Redirect href={hrefAuthLogin()} />;
|
2026-03-24 14:21:31 +08:00
|
|
|
|
}
|