UNPKG

5.88 kBSource Map (JSON)View Raw
1{"version":3,"names":["React","useNavigation","useFocusEffect","effect","navigation","arguments","undefined","message","console","error","useEffect","isFocused","cleanup","callback","destroy","process","env","NODE_ENV","then","JSON","stringify","unsubscribeFocus","addListener","unsubscribeBlur"],"sources":["useFocusEffect.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport useNavigation from './useNavigation';\n\ntype EffectCallback = () => undefined | void | (() => void);\n\n/**\n * Hook to run an effect in a focused screen, similar to `React.useEffect`.\n * This can be used to perform side-effects such as fetching data or subscribing to events.\n * The passed callback should be wrapped in `React.useCallback` to avoid running the effect too often.\n *\n * @param callback Memoized callback containing the effect, should optionally return a cleanup function.\n */\nexport default function useFocusEffect(effect: EffectCallback) {\n const navigation = useNavigation();\n\n if (arguments[1] !== undefined) {\n const message =\n \"You passed a second argument to 'useFocusEffect', but it only accepts one argument. \" +\n \"If you want to pass a dependency array, you can use 'React.useCallback':\\n\\n\" +\n 'useFocusEffect(\\n' +\n ' React.useCallback(() => {\\n' +\n ' // Your code here\\n' +\n ' }, [depA, depB])\\n' +\n ');\\n\\n' +\n 'See usage guide: https://reactnavigation.org/docs/use-focus-effect';\n\n console.error(message);\n }\n\n React.useEffect(() => {\n let isFocused = false;\n let cleanup: undefined | void | (() => void);\n\n const callback = () => {\n const destroy = effect();\n\n if (destroy === undefined || typeof destroy === 'function') {\n return destroy;\n }\n\n if (process.env.NODE_ENV !== 'production') {\n let message =\n 'An effect function must not return anything besides a function, which is used for clean-up.';\n\n if (destroy === null) {\n message +=\n \" You returned 'null'. If your effect does not require clean-up, return 'undefined' (or nothing).\";\n } else if (typeof (destroy as any).then === 'function') {\n message +=\n \"\\n\\nIt looks like you wrote 'useFocusEffect(async () => ...)' or returned a Promise. \" +\n 'Instead, write the async function inside your effect ' +\n 'and call it immediately:\\n\\n' +\n 'useFocusEffect(\\n' +\n ' React.useCallback(() => {\\n' +\n ' async function fetchData() {\\n' +\n ' // You can await here\\n' +\n ' const response = await MyAPI.getData(someId);\\n' +\n ' // ...\\n' +\n ' }\\n\\n' +\n ' fetchData();\\n' +\n ' }, [someId])\\n' +\n ');\\n\\n' +\n 'See usage guide: https://reactnavigation.org/docs/use-focus-effect';\n } else {\n message += ` You returned '${JSON.stringify(destroy)}'.`;\n }\n\n console.error(message);\n }\n };\n\n // We need to run the effect on intial render/dep changes if the screen is focused\n if (navigation.isFocused()) {\n cleanup = callback();\n isFocused = true;\n }\n\n const unsubscribeFocus = navigation.addListener('focus', () => {\n // If callback was already called for focus, avoid calling it again\n // The focus event may also fire on intial render, so we guard against runing the effect twice\n if (isFocused) {\n return;\n }\n\n if (cleanup !== undefined) {\n cleanup();\n }\n\n cleanup = callback();\n isFocused = true;\n });\n\n const unsubscribeBlur = navigation.addListener('blur', () => {\n if (cleanup !== undefined) {\n cleanup();\n }\n\n cleanup = undefined;\n isFocused = false;\n });\n\n return () => {\n if (cleanup !== undefined) {\n cleanup();\n }\n\n unsubscribeFocus();\n unsubscribeBlur();\n };\n }, [effect, navigation]);\n}\n"],"mappings":"AAAA,OAAO,KAAKA,KAAZ,MAAuB,OAAvB;AAEA,OAAOC,aAAP,MAA0B,iBAA1B;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,SAASC,cAAT,CAAwBC,MAAxB,EAAgD;EAC7D,MAAMC,UAAU,GAAGH,aAAa,EAAhC;;EAEA,IAAII,SAAS,CAAC,CAAD,CAAT,KAAiBC,SAArB,EAAgC;IAC9B,MAAMC,OAAO,GACX,yFACA,8EADA,GAEA,mBAFA,GAGA,+BAHA,GAIA,yBAJA,GAKA,sBALA,GAMA,QANA,GAOA,oEARF;IAUAC,OAAO,CAACC,KAAR,CAAcF,OAAd;EACD;;EAEDP,KAAK,CAACU,SAAN,CAAgB,MAAM;IACpB,IAAIC,SAAS,GAAG,KAAhB;IACA,IAAIC,OAAJ;;IAEA,MAAMC,QAAQ,GAAG,MAAM;MACrB,MAAMC,OAAO,GAAGX,MAAM,EAAtB;;MAEA,IAAIW,OAAO,KAAKR,SAAZ,IAAyB,OAAOQ,OAAP,KAAmB,UAAhD,EAA4D;QAC1D,OAAOA,OAAP;MACD;;MAED,IAAIC,OAAO,CAACC,GAAR,CAAYC,QAAZ,KAAyB,YAA7B,EAA2C;QACzC,IAAIV,OAAO,GACT,6FADF;;QAGA,IAAIO,OAAO,KAAK,IAAhB,EAAsB;UACpBP,OAAO,IACL,kGADF;QAED,CAHD,MAGO,IAAI,OAAQO,OAAD,CAAiBI,IAAxB,KAAiC,UAArC,EAAiD;UACtDX,OAAO,IACL,0FACA,uDADA,GAEA,8BAFA,GAGA,mBAHA,GAIA,+BAJA,GAKA,oCALA,GAMA,+BANA,GAOA,uDAPA,GAQA,gBARA,GASA,WATA,GAUA,oBAVA,GAWA,kBAXA,GAYA,QAZA,GAaA,oEAdF;QAeD,CAhBM,MAgBA;UACLA,OAAO,IAAK,kBAAiBY,IAAI,CAACC,SAAL,CAAeN,OAAf,CAAwB,IAArD;QACD;;QAEDN,OAAO,CAACC,KAAR,CAAcF,OAAd;MACD;IACF,CApCD,CAJoB,CA0CpB;;;IACA,IAAIH,UAAU,CAACO,SAAX,EAAJ,EAA4B;MAC1BC,OAAO,GAAGC,QAAQ,EAAlB;MACAF,SAAS,GAAG,IAAZ;IACD;;IAED,MAAMU,gBAAgB,GAAGjB,UAAU,CAACkB,WAAX,CAAuB,OAAvB,EAAgC,MAAM;MAC7D;MACA;MACA,IAAIX,SAAJ,EAAe;QACb;MACD;;MAED,IAAIC,OAAO,KAAKN,SAAhB,EAA2B;QACzBM,OAAO;MACR;;MAEDA,OAAO,GAAGC,QAAQ,EAAlB;MACAF,SAAS,GAAG,IAAZ;IACD,CAbwB,CAAzB;IAeA,MAAMY,eAAe,GAAGnB,UAAU,CAACkB,WAAX,CAAuB,MAAvB,EAA+B,MAAM;MAC3D,IAAIV,OAAO,KAAKN,SAAhB,EAA2B;QACzBM,OAAO;MACR;;MAEDA,OAAO,GAAGN,SAAV;MACAK,SAAS,GAAG,KAAZ;IACD,CAPuB,CAAxB;IASA,OAAO,MAAM;MACX,IAAIC,OAAO,KAAKN,SAAhB,EAA2B;QACzBM,OAAO;MACR;;MAEDS,gBAAgB;MAChBE,eAAe;IAChB,CAPD;EAQD,CAhFD,EAgFG,CAACpB,MAAD,EAASC,UAAT,CAhFH;AAiFD"}
\No newline at end of file