import { useEffect, useMemo, useReducer } from "react"; import { Navigation } from "react-native-navigation"; type Action = | { action: "push"; componentId: string; } | { action: "pop"; componentId: string; }; const reducer = (stack: string[], action: Action): string[] => { switch (action.action) { case "push": { stack.push(action.componentId); break; } case "pop": { const index = stack.indexOf(action.componentId); if (index > -1) stack.splice(index, 1); break; } } return [...stack]; }; export const useIsScreenFocused = (componentId: string): boolean => { const [componentStack, dispatch] = useReducer(reducer, [componentId]); const isFocussed = useMemo( () => componentStack[componentStack.length - 1] === componentId, [componentStack, componentId] ); useEffect(() => { const listener = Navigation.events().registerComponentDidAppearListener( (event) => { if (event.componentType !== "Component") return; dispatch({ action: "push", componentId: event.componentId, }); } ); return () => listener.remove(); }, []); useEffect(() => { const listener = Navigation.events().registerComponentDidDisappearListener( (event) => { if (event.componentType !== "Component") return; dispatch({ action: "pop", componentId: event.componentId, }); } ); return () => listener.remove(); }, []); return isFocussed; };