import '../global.css'; import React, { useEffect } from 'react'; import { Stack } from 'expo-router'; import { StatusBar } from 'expo-status-bar'; import { View } from 'react-native'; import { SafeAreaProvider } from 'react-native-safe-area-context'; // GestureHandlerRootView обязателен для работы gesture-handler'а // на всех страницах: Pan/LongPress/Tap жестах внутри чатов. import { GestureHandlerRootView } from 'react-native-gesture-handler'; import { loadKeyFile, loadSettings } from '@/lib/storage'; import { setNodeUrl } from '@/lib/api'; import { useStore } from '@/lib/store'; export default function RootLayout() { const setKeyFile = useStore(s => s.setKeyFile); const setSettings = useStore(s => s.setSettings); const booted = useStore(s => s.booted); const setBooted = useStore(s => s.setBooted); // Bootstrap: load key + settings from storage синхронно до первого // render'а экранов. Пока `booted=false` мы рендерим чёрный экран — // это убирает "мелькание" welcome'а при старте, когда ключи уже есть // в AsyncStorage, но ещё не успели загрузиться в store. useEffect(() => { (async () => { try { const [kf, settings] = await Promise.all([loadKeyFile(), loadSettings()]); if (kf) setKeyFile(kf); setSettings(settings); setNodeUrl(settings.nodeUrl); } finally { setBooted(true); } })(); }, []); return ( {booted ? ( ) : ( // Пустой чёрный экран пока bootstrap идёт — без flicker'а. )} ); }