UNPKG

4.42 kBSource Map (JSON)View Raw
1{"version":3,"names":["React","NavigationContext","useFocusEvents","state","emitter","navigation","useContext","lastFocusedKeyRef","useRef","currentFocusedKey","routes","index","key","useEffect","addListener","current","emit","type","target","undefined","lastFocusedKey","isFocused"],"sources":["useFocusEvents.tsx"],"sourcesContent":["import type { NavigationState } from '@react-navigation/routers';\nimport * as React from 'react';\n\nimport NavigationContext from './NavigationContext';\nimport type { EventMapCore } from './types';\nimport type { NavigationEventEmitter } from './useEventEmitter';\n\ntype Options<State extends NavigationState> = {\n state: State;\n emitter: NavigationEventEmitter<EventMapCore<State>>;\n};\n\n/**\n * Hook to take care of emitting `focus` and `blur` events.\n */\nexport default function useFocusEvents<State extends NavigationState>({\n state,\n emitter,\n}: Options<State>) {\n const navigation = React.useContext(NavigationContext);\n const lastFocusedKeyRef = React.useRef<string | undefined>();\n\n const currentFocusedKey = state.routes[state.index].key;\n\n // When the parent screen changes its focus state, we also need to change child's focus\n // Coz the child screen can't be focused if the parent screen is out of focus\n React.useEffect(\n () =>\n navigation?.addListener('focus', () => {\n lastFocusedKeyRef.current = currentFocusedKey;\n emitter.emit({ type: 'focus', target: currentFocusedKey });\n }),\n [currentFocusedKey, emitter, navigation]\n );\n\n React.useEffect(\n () =>\n navigation?.addListener('blur', () => {\n lastFocusedKeyRef.current = undefined;\n emitter.emit({ type: 'blur', target: currentFocusedKey });\n }),\n [currentFocusedKey, emitter, navigation]\n );\n\n React.useEffect(() => {\n const lastFocusedKey = lastFocusedKeyRef.current;\n\n lastFocusedKeyRef.current = currentFocusedKey;\n\n // We wouldn't have `lastFocusedKey` on initial mount\n // Fire focus event for the current route on mount if there's no parent navigator\n if (lastFocusedKey === undefined && !navigation) {\n emitter.emit({ type: 'focus', target: currentFocusedKey });\n }\n\n // We should only emit events when the focused key changed and navigator is focused\n // When navigator is not focused, screens inside shouldn't receive focused status either\n if (\n lastFocusedKey === currentFocusedKey ||\n !(navigation ? navigation.isFocused() : true)\n ) {\n return;\n }\n\n if (lastFocusedKey === undefined) {\n // Only fire events after initial mount\n return;\n }\n\n emitter.emit({ type: 'blur', target: lastFocusedKey });\n emitter.emit({ type: 'focus', target: currentFocusedKey });\n }, [currentFocusedKey, emitter, navigation]);\n}\n"],"mappings":"AACA,OAAO,KAAKA,KAAZ,MAAuB,OAAvB;AAEA,OAAOC,iBAAP,MAA8B,qBAA9B;;AASA;AACA;AACA;AACA,eAAe,SAASC,cAAT,OAGI;EAAA,IAHmD;IACpEC,KADoE;IAEpEC;EAFoE,CAGnD;EACjB,MAAMC,UAAU,GAAGL,KAAK,CAACM,UAAN,CAAiBL,iBAAjB,CAAnB;EACA,MAAMM,iBAAiB,GAAGP,KAAK,CAACQ,MAAN,EAA1B;EAEA,MAAMC,iBAAiB,GAAGN,KAAK,CAACO,MAAN,CAAaP,KAAK,CAACQ,KAAnB,EAA0BC,GAApD,CAJiB,CAMjB;EACA;;EACAZ,KAAK,CAACa,SAAN,CACE,MACER,UADF,aACEA,UADF,uBACEA,UAAU,CAAES,WAAZ,CAAwB,OAAxB,EAAiC,MAAM;IACrCP,iBAAiB,CAACQ,OAAlB,GAA4BN,iBAA5B;IACAL,OAAO,CAACY,IAAR,CAAa;MAAEC,IAAI,EAAE,OAAR;MAAiBC,MAAM,EAAET;IAAzB,CAAb;EACD,CAHD,CAFJ,EAME,CAACA,iBAAD,EAAoBL,OAApB,EAA6BC,UAA7B,CANF;EASAL,KAAK,CAACa,SAAN,CACE,MACER,UADF,aACEA,UADF,uBACEA,UAAU,CAAES,WAAZ,CAAwB,MAAxB,EAAgC,MAAM;IACpCP,iBAAiB,CAACQ,OAAlB,GAA4BI,SAA5B;IACAf,OAAO,CAACY,IAAR,CAAa;MAAEC,IAAI,EAAE,MAAR;MAAgBC,MAAM,EAAET;IAAxB,CAAb;EACD,CAHD,CAFJ,EAME,CAACA,iBAAD,EAAoBL,OAApB,EAA6BC,UAA7B,CANF;EASAL,KAAK,CAACa,SAAN,CAAgB,MAAM;IACpB,MAAMO,cAAc,GAAGb,iBAAiB,CAACQ,OAAzC;IAEAR,iBAAiB,CAACQ,OAAlB,GAA4BN,iBAA5B,CAHoB,CAKpB;IACA;;IACA,IAAIW,cAAc,KAAKD,SAAnB,IAAgC,CAACd,UAArC,EAAiD;MAC/CD,OAAO,CAACY,IAAR,CAAa;QAAEC,IAAI,EAAE,OAAR;QAAiBC,MAAM,EAAET;MAAzB,CAAb;IACD,CATmB,CAWpB;IACA;;;IACA,IACEW,cAAc,KAAKX,iBAAnB,IACA,EAAEJ,UAAU,GAAGA,UAAU,CAACgB,SAAX,EAAH,GAA4B,IAAxC,CAFF,EAGE;MACA;IACD;;IAED,IAAID,cAAc,KAAKD,SAAvB,EAAkC;MAChC;MACA;IACD;;IAEDf,OAAO,CAACY,IAAR,CAAa;MAAEC,IAAI,EAAE,MAAR;MAAgBC,MAAM,EAAEE;IAAxB,CAAb;IACAhB,OAAO,CAACY,IAAR,CAAa;MAAEC,IAAI,EAAE,OAAR;MAAiBC,MAAM,EAAET;IAAzB,CAAb;EACD,CA3BD,EA2BG,CAACA,iBAAD,EAAoBL,OAApB,EAA6BC,UAA7B,CA3BH;AA4BD"}
\No newline at end of file