CEMROS_hauler_pti_app/rn/app/src/components/layout/AppNavigationProvider.js

87 lines
3.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
Предрейсовые осмотры - мобильное приложение
Провайдер контекста навигации приложения
*/
//---------------------
//Подключение библиотек
//---------------------
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
};