61 lines
2.3 KiB
JavaScript
61 lines
2.3 KiB
JavaScript
/*
|
|
Предрейсовые осмотры - мобильное приложение
|
|
Корневой layout приложения
|
|
*/
|
|
|
|
//---------------------
|
|
//Подключение библиотек
|
|
//---------------------
|
|
|
|
const React = require('react'); //React и хуки
|
|
const { useColorScheme } = require('react-native'); //Определение темы устройства
|
|
const { SafeAreaProvider } = require('react-native-safe-area-context'); //Провайдер безопасной области
|
|
const AppShell = require('./AppShell'); //Оболочка приложения
|
|
const { useAppNavigationContext } = require('./AppNavigationProvider'); //Контекст навигации
|
|
const { useAppAuthContext } = require('./AppAuthProvider'); //Контекст авторизации
|
|
const { useAppLocalDbContext } = require('./AppLocalDbProvider'); //Контекст локальной БД
|
|
|
|
//-----------
|
|
//Тело модуля
|
|
//-----------
|
|
|
|
//Корневой layout приложения
|
|
function AppRoot() {
|
|
const colorScheme = useColorScheme();
|
|
const isDarkMode = colorScheme === 'dark';
|
|
|
|
const { setInitialScreen, SCREENS } = useAppNavigationContext();
|
|
const { isAuthenticated, isInitialized } = useAppAuthContext();
|
|
const { isDbReady } = useAppLocalDbContext();
|
|
|
|
//Флаг для предотвращения повторной установки начального экрана
|
|
const initialScreenSetRef = React.useRef(false);
|
|
|
|
//Установка начального экрана при готовности
|
|
React.useEffect(() => {
|
|
//Ждём инициализации БД и авторизации
|
|
if (!isDbReady || !isInitialized || initialScreenSetRef.current) {
|
|
return;
|
|
}
|
|
|
|
initialScreenSetRef.current = true;
|
|
|
|
//Если авторизован - показываем главный экран
|
|
if (isAuthenticated) {
|
|
setInitialScreen(SCREENS.MAIN);
|
|
}
|
|
}, [isDbReady, isInitialized, isAuthenticated, setInitialScreen, SCREENS.MAIN]);
|
|
|
|
return (
|
|
<SafeAreaProvider>
|
|
<AppShell isDarkMode={isDarkMode} />
|
|
</SafeAreaProvider>
|
|
);
|
|
}
|
|
|
|
//----------------
|
|
//Интерфейс модуля
|
|
//----------------
|
|
|
|
module.exports = AppRoot;
|