PC端的部分适配
This commit is contained in:
@@ -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();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user