Files
notesnook/apps/mobile/src/navigation/NavigatorStack.js

117 lines
3.5 KiB
JavaScript
Raw Normal View History

import { NavigationContainer } from '@react-navigation/native';
2020-10-13 17:02:14 +05:00
import * as React from 'react';
import { createNativeStackNavigator } from 'react-native-screens/native-stack';
2020-10-13 17:02:14 +05:00
import Container from '../components/Container';
2021-06-05 21:10:20 +05:00
import { useSelectionStore } from '../provider/stores';
2021-02-19 16:03:18 +05:00
import {
eSendEvent,
eSubscribeEvent,
eUnSubscribeEvent
2021-02-19 16:03:18 +05:00
} from '../services/EventManager';
import Navigation from '../services/Navigation';
2020-11-26 22:19:15 +05:00
import SettingsService from '../services/SettingsService';
import { history } from '../utils';
import { eOpenSideMenu } from '../utils/Events';
import { rootNavigatorRef } from '../utils/Refs';
2020-10-13 17:02:14 +05:00
import Favorites from '../views/Favorites';
import Folders from '../views/Folders';
import Home from '../views/Home';
import Notebook from '../views/Notebook';
import Notes from '../views/Notes';
import { Search } from '../views/Search';
2020-10-13 17:02:14 +05:00
import Settings from '../views/Settings';
import Tags from '../views/Tags';
import Trash from '../views/Trash';
2021-06-03 12:04:55 +05:00
const Stack = createNativeStackNavigator();
2020-10-13 17:02:14 +05:00
2020-11-04 16:52:47 +05:00
const forFade = ({current}) => ({
cardStyle: {
opacity: current.progress,
},
});
2020-11-26 23:30:42 +05:00
const screenOptionsForAnimation = {
2021-04-11 14:04:14 +05:00
animationEnabled: true,
cardStyleInterpolator: forFade,
2020-12-31 19:53:21 +05:00
gestureEnabled: true,
2020-11-26 23:30:42 +05:00
};
2020-11-14 10:04:11 +05:00
export const NavigatorStack = React.memo(
() => {
2021-06-05 01:35:58 +05:00
const [render, setRender] = React.useState(true);
2021-06-05 21:10:20 +05:00
const clearSelection = useSelectionStore(state => state.clearSelection);
2021-02-15 11:00:13 +05:00
const onStateChange = React.useCallback(() => {
2021-04-11 14:04:14 +05:00
if (history.selectionMode) {
2021-06-05 21:10:20 +05:00
clearSelection();
2021-04-11 14:04:14 +05:00
}
2021-02-15 11:00:13 +05:00
eSendEvent('navigate');
});
2020-11-26 22:19:15 +05:00
2021-02-19 16:03:18 +05:00
const updateRender = async () => {
if (!render) {
setRender(true);
2021-03-05 11:50:51 +05:00
Navigation.setHeaderState(
2021-02-27 12:25:30 +05:00
SettingsService.get().homepage,
{
menu: true,
},
{
heading: SettingsService.get().homepage,
id: SettingsService.get().homepage.toLowerCase() + '_navigation',
},
);
2021-02-19 16:03:18 +05:00
}
};
React.useEffect(() => {
eSubscribeEvent(eOpenSideMenu, updateRender);
return () => {
eUnSubscribeEvent(eOpenSideMenu, updateRender);
};
2021-02-24 11:00:45 +05:00
}, [render]);
2021-02-19 16:03:18 +05:00
2020-11-14 10:04:11 +05:00
return (
<Container root={true}>
2020-12-31 19:53:21 +05:00
<NavigationContainer
2021-02-15 11:00:13 +05:00
onStateChange={onStateChange}
2020-12-31 19:53:21 +05:00
independent={true}
ref={rootNavigatorRef}>
2021-02-19 16:03:18 +05:00
{render && (
<Stack.Navigator
initialRouteName={SettingsService.get().homepage}
screenOptions={{
headerShown: false,
gestureEnabled: false,
stackAnimation: 'fade',
2021-02-19 16:03:18 +05:00
}}>
<Stack.Screen name="Notes" component={Home} />
<Stack.Screen name="Notebooks" component={Folders} />
<Stack.Screen name="Favorites" component={Favorites} />
<Stack.Screen name="Trash" component={Trash} />
<Stack.Screen
options={screenOptionsForAnimation}
name="NotesPage"
component={Notes}
/>
<Stack.Screen name="Tags" component={Tags} />
<Stack.Screen
options={screenOptionsForAnimation}
name="Notebook"
component={Notebook}
/>
<Stack.Screen name="Settings" component={Settings} />
<Stack.Screen
options={screenOptionsForAnimation}
name="Search"
component={Search}
/>
</Stack.Navigator>
)}
2020-11-14 10:04:11 +05:00
</NavigationContainer>
</Container>
);
},
() => true,
);