UNPKG

10.1 kBSource Map (JSON)View Raw
1{"version":3,"sources":["useDescriptors.tsx"],"names":["useDescriptors","state","screens","navigation","screenOptions","defaultScreenOptions","onAction","getState","setState","addListener","addKeyedListener","onRouteFocus","router","emitter","options","setOptions","React","useState","onDispatchAction","onOptionsChange","stackRef","useContext","NavigationBuilderContext","context","useMemo","navigations","routes","reduce","acc","route","i","config","name","screen","props","key","optionsList","filter","Boolean","customOptions","curr","Object","assign","mergedOptions","clearOptions","o","_","rest","render"],"mappings":";;;;;;;AAMA;;AAEA;;AAIA;;AACA;;AACA;;AAUA;;AACA;;;;;;;;AAgDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACe,SAASA,cAAT,OAmB6B;AAAA,MAd1C;AACAC,IAAAA,KADA;AAEAC,IAAAA,OAFA;AAGAC,IAAAA,UAHA;AAIAC,IAAAA,aAJA;AAKAC,IAAAA,oBALA;AAMAC,IAAAA,QANA;AAOAC,IAAAA,QAPA;AAQAC,IAAAA,QARA;AASAC,IAAAA,WATA;AAUAC,IAAAA,gBAVA;AAWAC,IAAAA,YAXA;AAYAC,IAAAA,MAZA;AAaAC,IAAAA;AAbA,GAc0C;AAC1C,QAAM,CAACC,OAAD,EAAUC,UAAV,IAAwBC,KAAK,CAACC,QAAN,CAAuC,EAAvC,CAA9B;AACA,QAAM;AAAEC,IAAAA,gBAAF;AAAoBC,IAAAA,eAApB;AAAqCC,IAAAA;AAArC,MAAkDJ,KAAK,CAACK,UAAN,CACtDC,iCADsD,CAAxD;AAIA,QAAMC,OAAO,GAAGP,KAAK,CAACQ,OAAN,CACd,OAAO;AACLrB,IAAAA,UADK;AAELG,IAAAA,QAFK;AAGLG,IAAAA,WAHK;AAILC,IAAAA,gBAJK;AAKLC,IAAAA,YALK;AAMLO,IAAAA,gBANK;AAOLC,IAAAA,eAPK;AAQLC,IAAAA;AARK,GAAP,CADc,EAWd,CACEjB,UADF,EAEEG,QAFF,EAGEG,WAHF,EAIEC,gBAJF,EAKEC,YALF,EAMEO,gBANF,EAOEC,eAPF,EAQEC,QARF,CAXc,CAAhB;AAuBA,QAAMK,WAAW,GAAG,iCAAmD;AACrExB,IAAAA,KADqE;AAErEM,IAAAA,QAFqE;AAGrEJ,IAAAA,UAHqE;AAIrEY,IAAAA,UAJqE;AAKrEH,IAAAA,MALqE;AAMrEC,IAAAA;AANqE,GAAnD,CAApB;AASA,QAAMa,MAAM,GAAG,4BAAczB,KAAK,CAACyB,MAApB,CAAf;AAEA,SAAOA,MAAM,CAACC,MAAP,CAiBL,CAACC,GAAD,EAAMC,KAAN,EAAaC,CAAb,KAAmB;AACnB,UAAMC,MAAM,GAAG7B,OAAO,CAAC2B,KAAK,CAACG,IAAP,CAAtB;AACA,UAAMC,MAAM,GAAGF,MAAM,CAACG,KAAtB;AACA,UAAM/B,UAAU,GAAGsB,WAAW,CAACI,KAAK,CAACM,GAAP,CAA9B;AAEA,UAAMC,WAAW,GAAG,CAClB;AACAhC,IAAAA,aAFkB,EAGlB;AACA,QAAK2B,MAAM,CAACjB,OAAP,GACDiB,MAAM,CAACjB,OAAP,CAAeuB,MAAf,CAAsBC,OAAtB,CADC,GAED,EAFJ,CAJkB,EAOlB;AACAL,IAAAA,MAAM,CAACnB,OARW,EASlB;AACAA,IAAAA,OAAO,CAACe,KAAK,CAACM,GAAP,CAVW,CAApB;AAaA,UAAMI,aAAa,GAAGH,WAAW,CAACT,MAAZ,CACpB,CAACC,GAAD,EAAMY,IAAN,KACEC,MAAM,CAACC,MAAP,CACEd,GADF,EAEE,OAAOY,IAAP,KAAgB,UAAhB,GAA6BA,IAA7B,GAAoCA,IAAI,CAAC;AAAEX,MAAAA,KAAF;AAAS1B,MAAAA;AAAT,KAAD,CAF1C,CAFkB,EAMpB,EANoB,CAAtB;AASA,UAAMwC,aAAa,GAAG,EACpB,IAAI,OAAOtC,oBAAP,KAAgC,UAAhC,GACA;AACAA,MAAAA,oBAAoB,CAAC;AACnBwB,QAAAA,KADmB;AAEnB1B,QAAAA,UAFmB;AAGnBW,QAAAA,OAAO,EAAEyB;AAHU,OAAD,CAFpB,GAOAlC,oBAPJ,CADoB;AASpB,SAAGkC;AATiB,KAAtB;;AAYA,UAAMK,YAAY,GAAG,MACnB7B,UAAU,CAAE8B,CAAD,IAAO;AAChB,UAAIhB,KAAK,CAACM,GAAN,IAAaU,CAAjB,EAAoB;AAClB;AACA,cAAM;AAAE,WAAChB,KAAK,CAACM,GAAP,GAAaW,CAAf;AAAkB,aAAGC;AAArB,YAA8BF,CAApC;AACA,eAAOE,IAAP;AACD;;AAED,aAAOF,CAAP;AACD,KARS,CADZ;;AAWAjB,IAAAA,GAAG,CAACC,KAAK,CAACM,GAAP,CAAH,GAAiB;AACfN,MAAAA,KADe;AAEf;AACA1B,MAAAA,UAHe;;AAIf6C,MAAAA,MAAM,GAAG;AACP,4BACE,oBAAC,iCAAD,CAA0B,QAA1B;AAAmC,UAAA,GAAG,EAAEnB,KAAK,CAACM,GAA9C;AAAmD,UAAA,KAAK,EAAEZ;AAA1D,wBACE,oBAAC,0BAAD,CAAmB,QAAnB;AAA4B,UAAA,KAAK,EAAEpB;AAAnC,wBACE,oBAAC,+BAAD,CAAwB,QAAxB;AAAiC,UAAA,KAAK,EAAE0B;AAAxC,wBACE,oBAAC,kBAAD;AACE,UAAA,UAAU,EAAE1B,UADd;AAEE,UAAA,KAAK,EAAE0B,KAFT;AAGE,UAAA,MAAM,EAAEI,MAHV;AAIE,UAAA,UAAU,EAAEhC,KAAK,CAACyB,MAAN,CAAaI,CAAb,EAAgB7B,KAJ9B;AAKE,UAAA,QAAQ,EAAEM,QALZ;AAME,UAAA,QAAQ,EAAEC,QANZ;AAOE,UAAA,OAAO,EAAEmC,aAPX;AAQE,UAAA,YAAY,EAAEC;AARhB,UADF,CADF,CADF,CADF;AAkBD,OAvBc;;AAwBf9B,MAAAA,OAAO,EAAE6B;AAxBM,KAAjB;AA2BA,WAAOf,GAAP;AACD,GA/FM,EA+FJ,EA/FI,CAAP;AAgGD","sourcesContent":["import type {\n NavigationAction,\n NavigationState,\n ParamListBase,\n Router,\n} from '@react-navigation/routers';\nimport * as React from 'react';\n\nimport NavigationBuilderContext, {\n AddKeyedListener,\n AddListener,\n} from './NavigationBuilderContext';\nimport NavigationContext from './NavigationContext';\nimport NavigationRouteContext from './NavigationRouteContext';\nimport SceneView from './SceneView';\nimport type {\n Descriptor,\n EventMapBase,\n NavigationHelpers,\n NavigationProp,\n RouteConfig,\n RouteProp,\n} from './types';\nimport type { NavigationEventEmitter } from './useEventEmitter';\nimport useNavigationCache from './useNavigationCache';\nimport useRouteCache from './useRouteCache';\n\nexport type ScreenConfigWithParent<\n State extends NavigationState,\n ScreenOptions extends {},\n EventMap extends EventMapBase\n> = {\n keys: (string | undefined)[];\n options: (ScreenOptionsOrCallback<ScreenOptions> | undefined)[] | undefined;\n props: RouteConfig<ParamListBase, string, State, ScreenOptions, EventMap>;\n};\n\ntype ScreenOptionsOrCallback<ScreenOptions extends {}> =\n | ScreenOptions\n | ((props: {\n route: RouteProp<ParamListBase, string>;\n navigation: any;\n }) => ScreenOptions);\n\ntype Options<\n State extends NavigationState,\n ScreenOptions extends {},\n EventMap extends EventMapBase\n> = {\n state: State;\n screens: Record<\n string,\n ScreenConfigWithParent<State, ScreenOptions, EventMap>\n >;\n navigation: NavigationHelpers<ParamListBase>;\n screenOptions?: ScreenOptionsOrCallback<ScreenOptions>;\n defaultScreenOptions?:\n | ScreenOptions\n | ((props: {\n route: RouteProp<ParamListBase>;\n navigation: any;\n options: ScreenOptions;\n }) => ScreenOptions);\n onAction: (action: NavigationAction) => boolean;\n getState: () => State;\n setState: (state: State) => void;\n addListener: AddListener;\n addKeyedListener: AddKeyedListener;\n onRouteFocus: (key: string) => void;\n router: Router<State, NavigationAction>;\n emitter: NavigationEventEmitter<EventMap>;\n};\n\n/**\n * Hook to create descriptor objects for the child routes.\n *\n * A descriptor object provides 3 things:\n * - Helper method to render a screen\n * - Options specified by the screen for the navigator\n * - Navigation object intended for the route\n */\nexport default function useDescriptors<\n State extends NavigationState,\n ActionHelpers extends Record<string, () => void>,\n ScreenOptions extends {},\n EventMap extends EventMapBase\n>({\n state,\n screens,\n navigation,\n screenOptions,\n defaultScreenOptions,\n onAction,\n getState,\n setState,\n addListener,\n addKeyedListener,\n onRouteFocus,\n router,\n emitter,\n}: Options<State, ScreenOptions, EventMap>) {\n const [options, setOptions] = React.useState<Record<string, object>>({});\n const { onDispatchAction, onOptionsChange, stackRef } = React.useContext(\n NavigationBuilderContext\n );\n\n const context = React.useMemo(\n () => ({\n navigation,\n onAction,\n addListener,\n addKeyedListener,\n onRouteFocus,\n onDispatchAction,\n onOptionsChange,\n stackRef,\n }),\n [\n navigation,\n onAction,\n addListener,\n addKeyedListener,\n onRouteFocus,\n onDispatchAction,\n onOptionsChange,\n stackRef,\n ]\n );\n\n const navigations = useNavigationCache<State, ScreenOptions, EventMap>({\n state,\n getState,\n navigation,\n setOptions,\n router,\n emitter,\n });\n\n const routes = useRouteCache(state.routes);\n\n return routes.reduce<\n Record<\n string,\n Descriptor<\n ScreenOptions,\n NavigationProp<\n ParamListBase,\n string,\n string | undefined,\n State,\n ScreenOptions,\n EventMap\n > &\n ActionHelpers,\n RouteProp<ParamListBase>\n >\n >\n >((acc, route, i) => {\n const config = screens[route.name];\n const screen = config.props;\n const navigation = navigations[route.key];\n\n const optionsList = [\n // The default `screenOptions` passed to the navigator\n screenOptions,\n // The `screenOptions` props passed to `Group` elements\n ...((config.options\n ? config.options.filter(Boolean)\n : []) as ScreenOptionsOrCallback<ScreenOptions>[]),\n // The `options` prop passed to `Screen` elements,\n screen.options,\n // The options set via `navigation.setOptions`\n options[route.key],\n ];\n\n const customOptions = optionsList.reduce<ScreenOptions>(\n (acc, curr) =>\n Object.assign(\n acc,\n typeof curr !== 'function' ? curr : curr({ route, navigation })\n ),\n {} as ScreenOptions\n );\n\n const mergedOptions = {\n ...(typeof defaultScreenOptions === 'function'\n ? // @ts-expect-error: ts gives incorrect error here\n defaultScreenOptions({\n route,\n navigation,\n options: customOptions,\n })\n : defaultScreenOptions),\n ...customOptions,\n };\n\n const clearOptions = () =>\n setOptions((o) => {\n if (route.key in o) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { [route.key]: _, ...rest } = o;\n return rest;\n }\n\n return o;\n });\n\n acc[route.key] = {\n route,\n // @ts-expect-error: it's missing action helpers, fix later\n navigation,\n render() {\n return (\n <NavigationBuilderContext.Provider key={route.key} value={context}>\n <NavigationContext.Provider value={navigation}>\n <NavigationRouteContext.Provider value={route}>\n <SceneView\n navigation={navigation}\n route={route}\n screen={screen}\n routeState={state.routes[i].state}\n getState={getState}\n setState={setState}\n options={mergedOptions}\n clearOptions={clearOptions}\n />\n </NavigationRouteContext.Provider>\n </NavigationContext.Provider>\n </NavigationBuilderContext.Provider>\n );\n },\n options: mergedOptions as ScreenOptions,\n };\n\n return acc;\n }, {});\n}\n"]}
\No newline at end of file