import React, {useCallback, useEffect, useState} from 'react'; import { ActivityIndicator, Platform, TouchableOpacity, View, } from 'react-native'; import * as Animatable from 'react-native-animatable'; import {useSafeArea} from 'react-native-safe-area-context'; import Icon from 'react-native-vector-icons/MaterialCommunityIcons'; import {SIZE} from '../../common/common'; import {useTracked} from '../../provider'; import { eSendEvent, eSubscribeEvent, eUnSubscribeEvent, } from '../../services/eventManager'; import { eCloseLoginDialog, eScrollEvent, eSetModalNavigator, } from '../../services/events'; import NavigationService from '../../services/NavigationService'; import {sideMenuRef} from '../../utils/refs'; import {DDS, w} from '../../utils/utils'; import {moveNoteHideEvent} from '../DialogManager/recievers'; import {HeaderMenu} from './HeaderMenu'; import {HeaderTitle} from './HeaderTitle'; let offsetY = 0; let timeout = null; function useForceUpdate() { const [, setTick] = useState(0); const update = useCallback(() => { setTick((tick) => tick + 1); }, []); return update; } export const Header = ({showSearch, root}) => { const [state, dispatch] = useTracked(); const { colors, syncing, isLoginNavigator, preventDefaultMargins, searchResults, } = state; const [hideHeader, setHideHeader] = useState(false); let headerState = root ? state.headerState : state.indHeaderState; const [isModalNavigator, setIsModalNavigator] = useState(false); const insets = useSafeArea(); const forceUpdate = useForceUpdate(); const onScroll = (y) => { if (searchResults.results.length > 0) return; if (y < 30) { setHideHeader(false); offsetY = y; } if (y > offsetY) { if (y - offsetY < 100) return; clearTimeout(timeout); timeout = null; timeout = setTimeout(() => { setHideHeader(true); }, 300); offsetY = y; } else { if (offsetY - y < 50) return; clearTimeout(timeout); timeout = null; timeout = setTimeout(() => { setHideHeader(false); }, 300); offsetY = y; } }; const _setModalNavigator = (value) => { if (root) return; forceUpdate(); setIsModalNavigator(value); }; useEffect(() => { eSubscribeEvent(eSetModalNavigator, _setModalNavigator); eSubscribeEvent(eScrollEvent, onScroll); return () => { eUnSubscribeEvent(eSetModalNavigator, _setModalNavigator); eUnSubscribeEvent(eScrollEvent, onScroll); }; }, []); return ( {headerState.canGoBack ? ( { headerState = root ? state.headerState : state.indHeaderState; if (headerState.navigation && preventDefaultMargins) { if (headerState.route.name === 'Folders') { moveNoteHideEvent(); } else { headerState.navigation.goBack(); } } else if (headerState.navigation && isModalNavigator) { if (headerState.route.name === 'Login') { eSendEvent(eCloseLoginDialog); } else { headerState.navigation.goBack(); } } else { NavigationService.goBack(); } }} style={{ justifyContent: 'center', alignItems: 'flex-start', height: 40, width: 60, }}> ) : undefined} {headerState.menu && !DDS.isTab ? ( { sideMenuRef.current?.openDrawer(); }} style={{ justifyContent: 'center', alignItems: 'flex-start', height: 40, width: 60, }}> ) : undefined} { setHideHeader(false); eSendEvent('showSearch'); }} style={{ justifyContent: 'center', alignItems: 'flex-end', height: 40, width: 60, paddingRight: 0, }}> ); };