PC端的部分适配

This commit is contained in:
2026-03-16 17:47:10 +08:00
parent 798dd7c9a0
commit cb2087f779
30 changed files with 4242 additions and 438 deletions

View File

@@ -35,6 +35,7 @@ import { colors, shadows } from '../theme';
import { useAuthStore, useTotalUnreadCount } from '../stores';
import { messageManager } from '../stores';
import { useResponsive } from '../hooks';
import AsyncStorage from '@react-native-async-storage/async-storage';
import type {
RootStackParamList,
MainTabParamList,
@@ -44,6 +45,7 @@ import type {
ProfileStackParamList,
AuthStackParamList,
} from './types';
import { SimpleMobileTabNavigator } from './SimpleMobileTabNavigator';
// ==================== 导入屏幕组件 ====================
import { HomeScreen, PostDetailScreen, SearchScreen } from '../screens/home';
@@ -81,6 +83,9 @@ const SIDEBAR_WIDTH_TABLET = 200;
const SIDEBAR_COLLAPSED_WIDTH = 72;
const MOBILE_TAB_FLOATING_MARGIN = 12;
// ==================== 持久化存储键 ====================
const LAST_ACTIVE_TAB_KEY = 'last_active_tab';
// ==================== 导航项类型 ====================
type TabName = 'HomeTab' | 'MessageTab' | 'ScheduleTab' | 'ProfileTab';
@@ -306,6 +311,18 @@ function Sidebar({
}: SidebarProps) {
const insets = useSafeAreaInsets();
// 调试日志
useEffect(() => {
console.log('[Debug Sidebar]', {
width,
isCollapsed,
activeTab,
unreadCount,
insetsTop: insets.top,
insetsBottom: insets.bottom,
});
}, [width, isCollapsed, activeTab, unreadCount, insets]);
const navItems: NavItem[] = [
{ name: 'HomeTab', label: '首页', icon: 'home', iconOutline: 'home-outline' },
{ name: 'MessageTab', label: '消息', icon: 'message-text', iconOutline: 'message-text-outline', badge: unreadCount },
@@ -461,12 +478,13 @@ interface ResponsiveTabNavigatorProps {
function ResponsiveTabNavigator({ children }: ResponsiveTabNavigatorProps) {
const navigation = useNavigation<NativeStackNavigationProp<RootStackParamList>>();
const route = useRoute<RouteProp<RootStackParamList, 'Main'>>();
const { isMobile, isTablet, isDesktop } = useResponsive();
const { isMobile, isTablet, isDesktop, width, height } = useResponsive();
const insets = useSafeAreaInsets();
const [activeTab, setActiveTab] = useState<TabName>('HomeTab');
const [isCollapsed, setIsCollapsed] = useState(false);
const messageUnreadCount = useTotalUnreadCount();
// 【新架构】MessageManager 自动处理 WebSocket 消息和未读数更新
useEffect(() => {
messageManager.initialize();
@@ -483,54 +501,62 @@ function ResponsiveTabNavigator({ children }: ResponsiveTabNavigatorProps) {
// 计算侧边栏宽度
const sidebarWidth = useCallback(() => {
if (isMobile) return 0; // 移动端不显示侧边栏
if (isCollapsed) return SIDEBAR_COLLAPSED_WIDTH;
if (isDesktop) return SIDEBAR_WIDTH_DESKTOP;
if (isTablet) return SIDEBAR_WIDTH_TABLET;
return 0;
}, [isCollapsed, isDesktop, isTablet]);
// 默认返回桌面宽度,避免返回 0 导致导航栏消失
return SIDEBAR_WIDTH_DESKTOP;
}, [isCollapsed, isDesktop, isTablet, isMobile]);
// 切换 Tab
const handleTabChange = useCallback((tab: TabName) => {
setActiveTab(tab);
if (Platform.OS === 'web') {
// 在大屏幕模式下,通过导航切换 Tab
if (!isMobile) {
let tabTarget: NavigatorScreenParams<MainTabParamList>;
if (tab === 'HomeTab') {
tabTarget = { screen: 'HomeTab', params: { screen: 'Home' } };
} else if (tab === 'MessageTab') {
tabTarget = { screen: 'MessageTab', params: { screen: 'MessageList' } };
} else if (tab === 'ScheduleTab') {
tabTarget = { screen: 'ScheduleTab', params: { screen: 'Schedule' } };
} else {
tabTarget = { screen: 'ProfileTab', params: { screen: 'Profile' } };
}
navigation.navigate('Main', tabTarget);
}
}, [navigation]);
}, [navigation, isMobile]);
// 切换折叠状态
const handleToggleCollapse = useCallback(() => {
setIsCollapsed(prev => !prev);
}, []);
// 渲染当前 Tab 的内容
// 移动端:使用底部 Tab 导航
if (isMobile) {
// 使用简化的移动端导航,避免 React Navigation 状态恢复问题
return <SimpleMobileTabNavigator />;
}
// 渲染当前 Tab 的内容(仅在大屏模式下使用)
// 注意:直接渲染屏幕组件,不使用 Stack Navigators
// 这样可以避免 React Navigation 状态恢复问题
const renderTabContent = () => {
switch (activeTab) {
case 'HomeTab':
return <HomeStackNavigator />;
return <HomeScreen />;
case 'MessageTab':
return <MessageStackNavigator />;
return <MessageListScreen />;
case 'ScheduleTab':
return <ScheduleStackNavigator />;
return <ScheduleScreen />;
case 'ProfileTab':
return <ProfileStackNavigator />;
return <ProfileScreen />;
default:
return <HomeStackNavigator />;
return <HomeScreen />;
}
};
// 移动端:使用底部 Tab 导航
if (isMobile) {
return <MainTabNavigator />;
}
// 平板/桌面端:使用侧边导航
const currentSidebarWidth = sidebarWidth();