import React, { useEffect } from 'react'; import { NavigationContainer, useNavigation } from '@react-navigation/native'; import { createNativeStackNavigator } from '@react-navigation/native-stack'; import { createBottomTabNavigator } from '@react-navigation/bottom-tabs'; import { Provider as PaperProvider, MD3LightTheme } from 'react-native-paper'; import Icon from 'react-native-vector-icons/MaterialCommunityIcons'; import { setNavigationRef } from '../api/client'; import { useAuthStore } from '../store/authStore'; import { useAppStore } from '../store/appStore'; import { wsManager } from '../utils/ws'; import type { RootStackParamList, MainTabParamList } from '../types'; import LoginScreen from '../screens/LoginScreen'; import DashboardScreen from '../screens/DashboardScreen'; import RoomsScreen from '../screens/RoomsScreen'; import RoomDetailScreen from '../screens/RoomDetailScreen'; import DevicesScreen from '../screens/DevicesScreen'; import DeviceControlScreen from '../screens/DeviceControlScreen'; import AlertsScreen from '../screens/AlertsScreen'; import ThresholdsScreen from '../screens/ThresholdsScreen'; import VideoScreen from '../screens/VideoScreen'; import VideoPlayerScreen from '../screens/VideoPlayerScreen'; import SettingsScreen from '../screens/SettingsScreen'; const Stack = createNativeStackNavigator(); const Tab = createBottomTabNavigator(); const TabIcon: React.FC<{ name: string; activeName: string; color: string; size: number; focused: boolean }> = ({ name, activeName, color, focused }) => ( ); function MainTabs() { const navigation = useNavigation(); return ( ( navigation.navigate('Settings')} /> ), }} > , }} /> , }} /> , }} /> , }} /> , }} /> ); } function AppContent() { const token = useAuthStore((s) => s.token); const restoreSession = useAuthStore((s) => s.restoreSession); const setRealtimeData = useAppStore((s) => s.setRealtimeData); const [isReady, setIsReady] = React.useState(false); useEffect(() => { (async () => { await restoreSession(); setIsReady(true); })(); }, [restoreSession]); // Subscribe to WebSocket telemetry useEffect(() => { const unsub = wsManager.subscribe((data) => { if (data?.type === 'telemetry' || data?.metric) { const telemetry = useAppStore.getState().realtimeData; setRealtimeData([...telemetry, data].slice(-100)); } }); return unsub; }, [setRealtimeData]); if (!isReady) { return null; } return ( { if (ref) { setNavigationRef({ navigate: (screen: string) => { (ref as any).navigate(screen); }, }); } }} > ); } export default function AppNavigator() { const silkTheme = { ...MD3LightTheme, colors: { ...MD3LightTheme.colors, primary: '#7A9E7E', primaryContainer: '#E8F0E9', onPrimary: '#FFFFFF', onPrimaryContainer: '#5C7D60', secondary: '#6B8F71', secondaryContainer: '#F0EDE8', onSecondary: '#FFFFFF', onSecondaryContainer: '#5C7D60', error: '#D4847A', errorContainer: '#F9E8E5', onError: '#FFFFFF', background: '#FAF8F5', onBackground: '#2D2A26', surface: '#FFFFFF', onSurface: '#2D2A26', surfaceVariant: '#F5F0E8', onSurfaceVariant: '#8C8780', outline: '#E8E4DE', outlineVariant: '#F0EDE8', elevation: { ...MD3LightTheme.colors.elevation, level0: 'transparent', level1: '#FFFFFF', level2: '#FFFFFF', }, }, }; return ( ); }