/
Muip
/
ProBody
Обзор
Документация
Войти
/
Muip
/
ProBody
Код
Запросы
0
Задачи
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
context/mainContext.tsx
56 строк
2 KB
chmerev
new
14 авг 2024, 12:02
14 авг 2024, 12:02
595f266
Код
Авторство
О чём код?
import { useRootNavigation, useRouter, useSegments } from 'expo-router'; import React, { PropsWithChildren, useEffect, useState } from 'react'; import { createContext } from 'react'; import MainStore from './mainStore'; import { observer, useLocalObservable } from 'mobx-react'; import ApiClientAirtable from '../airtable/ApiClientAirtable'; import { User } from '../model/user'; import ApiClient from '../api/ApiClient'; export const MainContext = createContext<MainStore>({} as MainStore); export const MainContextProvider: React.FC<PropsWithChildren<{ api: ApiClient, user: User | null, airTable: ApiClientAirtable }>> = observer((props) => { const segments = useSegments(); const router = useRouter(); const store = useLocalObservable(() => new MainStore(props.api, props.user, props.airTable)); const [isNavigationReady, setNavigationReady] = useState(false); const rootNavigation = useRootNavigation(); const pagesAuthGroup = ['login', 'registration', 'forgot', 'home', 'meditation']; useEffect(() => { const unsubscribe = rootNavigation?.addListener('state', () => { setNavigationReady(true); }); return function cleanup() { if (unsubscribe) { unsubscribe(); } }; }, [rootNavigation]); useEffect(() => { if (!isNavigationReady) { return; } let inAuthGroup = false; segments.forEach((segment) => {{if (pagesAuthGroup.includes(segment)) { inAuthGroup = true; }}}); if (!store.user && !inAuthGroup) { router.push('/home'); } else if (store.user && inAuthGroup) { router.push('/'); } }, [store.user, segments, isNavigationReady]); return (<MainContext.Provider value={store}> {props.children} </MainContext.Provider>) })