87 lines
3.1 KiB
JavaScript
87 lines
3.1 KiB
JavaScript
/*
|
||
Предрейсовые осмотры - мобильное приложение
|
||
Провайдер контекста навигации приложения
|
||
*/
|
||
|
||
//---------------------
|
||
//Подключение библиотек
|
||
//---------------------
|
||
|
||
const React = require('react'); //React и хуки
|
||
const useAppNavigation = require('../../hooks/useAppNavigation'); //Хук навигации
|
||
const useHardwareBackPress = require('../../hooks/useHardwareBackPress'); //Хук кнопки "Назад"
|
||
|
||
//-----------
|
||
//Тело модуля
|
||
//-----------
|
||
|
||
//Контекст навигации приложения
|
||
const AppNavigationContext = React.createContext(null);
|
||
|
||
//Провайдер навигации приложения
|
||
function AppNavigationProvider({ children }) {
|
||
const navigationApi = useAppNavigation();
|
||
|
||
//Деструктурируем для использования в useCallback
|
||
const { canGoBack, goBack } = navigationApi;
|
||
|
||
//Обработчик аппаратной кнопки "Назад" (Android)
|
||
const handleHardwareBackPress = React.useCallback(() => {
|
||
//Если можно вернуться назад - возвращаемся
|
||
if (canGoBack) {
|
||
goBack();
|
||
return true; //Предотвращаем закрытие приложения
|
||
}
|
||
|
||
//Если нельзя - позволяем системе обработать (закрыть приложение)
|
||
return false;
|
||
}, [canGoBack, goBack]);
|
||
|
||
//Подключаем обработчик кнопки "Назад"
|
||
useHardwareBackPress(handleHardwareBackPress);
|
||
|
||
//Мемоизация значения контекста с перечислением отдельных свойств
|
||
const value = React.useMemo(
|
||
() => ({
|
||
SCREENS: navigationApi.SCREENS,
|
||
currentScreen: navigationApi.currentScreen,
|
||
screenParams: navigationApi.screenParams,
|
||
navigate: navigationApi.navigate,
|
||
goBack: navigationApi.goBack,
|
||
reset: navigationApi.reset,
|
||
setInitialScreen: navigationApi.setInitialScreen,
|
||
canGoBack: navigationApi.canGoBack
|
||
}),
|
||
[
|
||
navigationApi.SCREENS,
|
||
navigationApi.currentScreen,
|
||
navigationApi.screenParams,
|
||
navigationApi.navigate,
|
||
navigationApi.goBack,
|
||
navigationApi.reset,
|
||
navigationApi.setInitialScreen,
|
||
navigationApi.canGoBack
|
||
]
|
||
);
|
||
|
||
return <AppNavigationContext.Provider value={value}>{children}</AppNavigationContext.Provider>;
|
||
}
|
||
|
||
//Хук доступа к контексту навигации приложения
|
||
function useAppNavigationContext() {
|
||
const ctx = React.useContext(AppNavigationContext);
|
||
if (!ctx) {
|
||
throw new Error('useAppNavigationContext должен использоваться внутри AppNavigationProvider');
|
||
}
|
||
return ctx;
|
||
}
|
||
|
||
//----------------
|
||
//Интерфейс модуля
|
||
//----------------
|
||
|
||
module.exports = {
|
||
AppNavigationProvider,
|
||
useAppNavigationContext
|
||
};
|