@react-navigation/routers 6.0.1 → 6.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -82,17 +82,19 @@ const changeIndex = (state, index, backBehavior, initialRouteName) => {
82
82
  };
83
83
  };
84
84
 
85
- export default function TabRouter({
86
- initialRouteName,
87
- backBehavior = 'firstRoute'
88
- }) {
85
+ export default function TabRouter(_ref) {
86
+ let {
87
+ initialRouteName,
88
+ backBehavior = 'firstRoute'
89
+ } = _ref;
89
90
  const router = { ...BaseRouter,
90
91
  type: 'tab',
91
92
 
92
- getInitialState({
93
- routeNames,
94
- routeParamList
95
- }) {
93
+ getInitialState(_ref2) {
94
+ let {
95
+ routeNames,
96
+ routeParamList
97
+ } = _ref2;
96
98
  const index = initialRouteName !== undefined && routeNames.includes(initialRouteName) ? routeNames.indexOf(initialRouteName) : 0;
97
99
  const routes = routeNames.map(name => ({
98
100
  name,
@@ -111,12 +113,13 @@ export default function TabRouter({
111
113
  };
112
114
  },
113
115
 
114
- getRehydratedState(partialState, {
115
- routeNames,
116
- routeParamList
117
- }) {
116
+ getRehydratedState(partialState, _ref3) {
118
117
  var _state$routes, _state$index, _state$history$filter, _state$history;
119
118
 
119
+ let {
120
+ routeNames,
121
+ routeParamList
122
+ } = _ref3;
120
123
  let state = partialState;
121
124
 
122
125
  if (state.stale === false) {
@@ -146,11 +149,13 @@ export default function TabRouter({
146
149
  }, index, backBehavior, initialRouteName);
147
150
  },
148
151
 
149
- getStateForRouteNamesChange(state, {
150
- routeNames,
151
- routeParamList
152
- }) {
153
- const routes = routeNames.map(name => state.routes.find(r => r.name === name) || {
152
+ getStateForRouteNamesChange(state, _ref4) {
153
+ let {
154
+ routeNames,
155
+ routeParamList,
156
+ routeKeyChanges
157
+ } = _ref4;
158
+ const routes = routeNames.map(name => state.routes.find(r => r.name === name && !routeKeyChanges.includes(r.name)) || {
154
159
  name,
155
160
  key: `${name}-${nanoid()}`,
156
161
  params: routeParamList[name]
@@ -181,9 +186,11 @@ export default function TabRouter({
181
186
  return changeIndex(state, index, backBehavior, initialRouteName);
182
187
  },
183
188
 
184
- getStateForAction(state, action, {
185
- routeParamList
186
- }) {
189
+ getStateForAction(state, action, _ref5) {
190
+ let {
191
+ routeParamList
192
+ } = _ref5;
193
+
187
194
  switch (action.type) {
188
195
  case 'JUMP_TO':
189
196
  case 'NAVIGATE':
@@ -1 +1 @@
1
- {"version":3,"sources":["TabRouter.tsx"],"names":["nanoid","BaseRouter","TYPE_ROUTE","TabActions","jumpTo","name","params","type","payload","getRouteHistory","routes","index","backBehavior","initialRouteName","history","key","initialRouteIndex","i","unshift","findIndex","route","changeIndex","state","currentKey","filter","it","concat","TabRouter","router","getInitialState","routeNames","routeParamList","undefined","includes","indexOf","map","stale","getRehydratedState","partialState","find","r","Math","min","max","length","getStateForRouteNamesChange","getStateForRouteFocus","getStateForAction","action","merge","path","previousKey","slice","shouldActionChangeFocus","actionCreators"],"mappings":"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","sourcesContent":["import { nanoid } from 'nanoid/non-secure';\n\nimport BaseRouter from './BaseRouter';\nimport type {\n CommonNavigationAction,\n DefaultRouterOptions,\n NavigationState,\n ParamListBase,\n PartialState,\n Route,\n Router,\n} from './types';\n\nexport type TabActionType = {\n type: 'JUMP_TO';\n payload: { name: string; params?: object };\n source?: string;\n target?: string;\n};\n\nexport type BackBehavior =\n | 'initialRoute'\n | 'firstRoute'\n | 'history'\n | 'order'\n | 'none';\n\nexport type TabRouterOptions = DefaultRouterOptions & {\n backBehavior?: BackBehavior;\n};\n\nexport type TabNavigationState<ParamList extends ParamListBase> = Omit<\n NavigationState<ParamList>,\n 'history'\n> & {\n /**\n * Type of the router, in this case, it's tab.\n */\n type: 'tab';\n /**\n * List of previously visited route keys.\n */\n history: { type: 'route'; key: string }[];\n};\n\nexport type TabActionHelpers<ParamList extends ParamListBase> = {\n /**\n * Jump to an existing tab.\n *\n * @param name Name of the route for the tab.\n * @param [params] Params object for the route.\n */\n jumpTo<RouteName extends Extract<keyof ParamList, string>>(\n ...args: undefined extends ParamList[RouteName]\n ? [screen: RouteName] | [screen: RouteName, params: ParamList[RouteName]]\n : [screen: RouteName, params: ParamList[RouteName]]\n ): void;\n};\n\nconst TYPE_ROUTE = 'route' as const;\n\nexport const TabActions = {\n jumpTo(name: string, params?: object): TabActionType {\n return { type: 'JUMP_TO', payload: { name, params } };\n },\n};\n\nconst getRouteHistory = (\n routes: Route<string>[],\n index: number,\n backBehavior: BackBehavior,\n initialRouteName: string | undefined\n) => {\n const history = [{ type: TYPE_ROUTE, key: routes[index].key }];\n let initialRouteIndex;\n\n switch (backBehavior) {\n case 'order':\n for (let i = index; i > 0; i--) {\n history.unshift({ type: TYPE_ROUTE, key: routes[i - 1].key });\n }\n break;\n case 'firstRoute':\n if (index !== 0) {\n history.unshift({\n type: TYPE_ROUTE,\n key: routes[0].key,\n });\n }\n break;\n case 'initialRoute':\n initialRouteIndex = routes.findIndex(\n (route) => route.name === initialRouteName\n );\n initialRouteIndex = initialRouteIndex === -1 ? 0 : initialRouteIndex;\n\n if (index !== initialRouteIndex) {\n history.unshift({\n type: TYPE_ROUTE,\n key: routes[initialRouteIndex].key,\n });\n }\n break;\n case 'history':\n // The history will fill up on navigation\n break;\n }\n\n return history;\n};\n\nconst changeIndex = (\n state: TabNavigationState<ParamListBase>,\n index: number,\n backBehavior: BackBehavior,\n initialRouteName: string | undefined\n) => {\n let history;\n\n if (backBehavior === 'history') {\n const currentKey = state.routes[index].key;\n\n history = state.history\n .filter((it) => (it.type === 'route' ? it.key !== currentKey : false))\n .concat({ type: TYPE_ROUTE, key: currentKey });\n } else {\n history = getRouteHistory(\n state.routes,\n index,\n backBehavior,\n initialRouteName\n );\n }\n\n return {\n ...state,\n index,\n history,\n };\n};\n\nexport default function TabRouter({\n initialRouteName,\n backBehavior = 'firstRoute',\n}: TabRouterOptions) {\n const router: Router<\n TabNavigationState<ParamListBase>,\n TabActionType | CommonNavigationAction\n > = {\n ...BaseRouter,\n\n type: 'tab',\n\n getInitialState({ routeNames, routeParamList }) {\n const index =\n initialRouteName !== undefined && routeNames.includes(initialRouteName)\n ? routeNames.indexOf(initialRouteName)\n : 0;\n\n const routes = routeNames.map((name) => ({\n name,\n key: `${name}-${nanoid()}`,\n params: routeParamList[name],\n }));\n\n const history = getRouteHistory(\n routes,\n index,\n backBehavior,\n initialRouteName\n );\n\n return {\n stale: false,\n type: 'tab',\n key: `tab-${nanoid()}`,\n index,\n routeNames,\n history,\n routes,\n };\n },\n\n getRehydratedState(partialState, { routeNames, routeParamList }) {\n let state = partialState;\n\n if (state.stale === false) {\n return state;\n }\n\n const routes = routeNames.map((name) => {\n const route = (\n state as PartialState<TabNavigationState<ParamListBase>>\n ).routes.find((r) => r.name === name);\n\n return {\n ...route,\n name,\n key:\n route && route.name === name && route.key\n ? route.key\n : `${name}-${nanoid()}`,\n params:\n routeParamList[name] !== undefined\n ? {\n ...routeParamList[name],\n ...(route ? route.params : undefined),\n }\n : route\n ? route.params\n : undefined,\n } as Route<string>;\n });\n\n const index = Math.min(\n Math.max(routeNames.indexOf(state.routes[state?.index ?? 0]?.name), 0),\n routes.length - 1\n );\n\n const history =\n state.history?.filter((it) => routes.find((r) => r.key === it.key)) ??\n [];\n\n return changeIndex(\n {\n stale: false,\n type: 'tab',\n key: `tab-${nanoid()}`,\n index,\n routeNames,\n history,\n routes,\n },\n index,\n backBehavior,\n initialRouteName\n );\n },\n\n getStateForRouteNamesChange(state, { routeNames, routeParamList }) {\n const routes = routeNames.map(\n (name) =>\n state.routes.find((r) => r.name === name) || {\n name,\n key: `${name}-${nanoid()}`,\n params: routeParamList[name],\n }\n );\n\n const index = Math.max(\n 0,\n routeNames.indexOf(state.routes[state.index].name)\n );\n\n let history = state.history.filter(\n // Type will always be 'route' for tabs, but could be different in a router extending this (e.g. drawer)\n (it) => it.type !== 'route' || routes.find((r) => r.key === it.key)\n );\n\n if (!history.length) {\n history = getRouteHistory(\n routes,\n index,\n backBehavior,\n initialRouteName\n );\n }\n\n return {\n ...state,\n history,\n routeNames,\n routes,\n index,\n };\n },\n\n getStateForRouteFocus(state, key) {\n const index = state.routes.findIndex((r) => r.key === key);\n\n if (index === -1 || index === state.index) {\n return state;\n }\n\n return changeIndex(state, index, backBehavior, initialRouteName);\n },\n\n getStateForAction(state, action, { routeParamList }) {\n switch (action.type) {\n case 'JUMP_TO':\n case 'NAVIGATE': {\n let index = -1;\n\n if (action.type === 'NAVIGATE' && action.payload.key) {\n index = state.routes.findIndex(\n (route) => route.key === action.payload.key\n );\n } else {\n index = state.routes.findIndex(\n (route) => route.name === action.payload.name\n );\n }\n\n if (index === -1) {\n return null;\n }\n\n return changeIndex(\n {\n ...state,\n routes: state.routes.map((route, i) => {\n if (i !== index) {\n return route;\n }\n\n let params;\n\n if (action.type === 'NAVIGATE' && action.payload.merge) {\n params =\n action.payload.params !== undefined ||\n routeParamList[route.name] !== undefined\n ? {\n ...routeParamList[route.name],\n ...route.params,\n ...action.payload.params,\n }\n : route.params;\n } else {\n params =\n routeParamList[route.name] !== undefined\n ? {\n ...routeParamList[route.name],\n ...action.payload.params,\n }\n : action.payload.params;\n }\n\n const path =\n action.type === 'NAVIGATE' && action.payload.path != null\n ? action.payload.path\n : route.path;\n\n return params !== route.params || path !== route.path\n ? { ...route, path, params }\n : route;\n }),\n },\n index,\n backBehavior,\n initialRouteName\n );\n }\n\n case 'GO_BACK': {\n if (state.history.length === 1) {\n return null;\n }\n\n const previousKey = state.history[state.history.length - 2].key;\n const index = state.routes.findIndex(\n (route) => route.key === previousKey\n );\n\n if (index === -1) {\n return null;\n }\n\n return {\n ...state,\n history: state.history.slice(0, -1),\n index,\n };\n }\n\n default:\n return BaseRouter.getStateForAction(state, action);\n }\n },\n\n shouldActionChangeFocus(action) {\n return action.type === 'NAVIGATE';\n },\n\n actionCreators: TabActions,\n };\n\n return router;\n}\n"]}
1
+ {"version":3,"sources":["TabRouter.tsx"],"names":["nanoid","BaseRouter","TYPE_ROUTE","TabActions","jumpTo","name","params","type","payload","getRouteHistory","routes","index","backBehavior","initialRouteName","history","key","initialRouteIndex","i","unshift","findIndex","route","changeIndex","state","currentKey","filter","it","concat","TabRouter","router","getInitialState","routeNames","routeParamList","undefined","includes","indexOf","map","stale","getRehydratedState","partialState","find","r","Math","min","max","length","getStateForRouteNamesChange","routeKeyChanges","getStateForRouteFocus","getStateForAction","action","merge","path","previousKey","slice","shouldActionChangeFocus","actionCreators"],"mappings":"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","sourcesContent":["import { nanoid } from 'nanoid/non-secure';\n\nimport BaseRouter from './BaseRouter';\nimport type {\n CommonNavigationAction,\n DefaultRouterOptions,\n NavigationState,\n ParamListBase,\n PartialState,\n Route,\n Router,\n} from './types';\n\nexport type TabActionType = {\n type: 'JUMP_TO';\n payload: { name: string; params?: object };\n source?: string;\n target?: string;\n};\n\nexport type BackBehavior =\n | 'initialRoute'\n | 'firstRoute'\n | 'history'\n | 'order'\n | 'none';\n\nexport type TabRouterOptions = DefaultRouterOptions & {\n backBehavior?: BackBehavior;\n};\n\nexport type TabNavigationState<ParamList extends ParamListBase> = Omit<\n NavigationState<ParamList>,\n 'history'\n> & {\n /**\n * Type of the router, in this case, it's tab.\n */\n type: 'tab';\n /**\n * List of previously visited route keys.\n */\n history: { type: 'route'; key: string }[];\n};\n\nexport type TabActionHelpers<ParamList extends ParamListBase> = {\n /**\n * Jump to an existing tab.\n *\n * @param name Name of the route for the tab.\n * @param [params] Params object for the route.\n */\n jumpTo<RouteName extends Extract<keyof ParamList, string>>(\n ...args: undefined extends ParamList[RouteName]\n ? [screen: RouteName] | [screen: RouteName, params: ParamList[RouteName]]\n : [screen: RouteName, params: ParamList[RouteName]]\n ): void;\n};\n\nconst TYPE_ROUTE = 'route' as const;\n\nexport const TabActions = {\n jumpTo(name: string, params?: object): TabActionType {\n return { type: 'JUMP_TO', payload: { name, params } };\n },\n};\n\nconst getRouteHistory = (\n routes: Route<string>[],\n index: number,\n backBehavior: BackBehavior,\n initialRouteName: string | undefined\n) => {\n const history = [{ type: TYPE_ROUTE, key: routes[index].key }];\n let initialRouteIndex;\n\n switch (backBehavior) {\n case 'order':\n for (let i = index; i > 0; i--) {\n history.unshift({ type: TYPE_ROUTE, key: routes[i - 1].key });\n }\n break;\n case 'firstRoute':\n if (index !== 0) {\n history.unshift({\n type: TYPE_ROUTE,\n key: routes[0].key,\n });\n }\n break;\n case 'initialRoute':\n initialRouteIndex = routes.findIndex(\n (route) => route.name === initialRouteName\n );\n initialRouteIndex = initialRouteIndex === -1 ? 0 : initialRouteIndex;\n\n if (index !== initialRouteIndex) {\n history.unshift({\n type: TYPE_ROUTE,\n key: routes[initialRouteIndex].key,\n });\n }\n break;\n case 'history':\n // The history will fill up on navigation\n break;\n }\n\n return history;\n};\n\nconst changeIndex = (\n state: TabNavigationState<ParamListBase>,\n index: number,\n backBehavior: BackBehavior,\n initialRouteName: string | undefined\n) => {\n let history;\n\n if (backBehavior === 'history') {\n const currentKey = state.routes[index].key;\n\n history = state.history\n .filter((it) => (it.type === 'route' ? it.key !== currentKey : false))\n .concat({ type: TYPE_ROUTE, key: currentKey });\n } else {\n history = getRouteHistory(\n state.routes,\n index,\n backBehavior,\n initialRouteName\n );\n }\n\n return {\n ...state,\n index,\n history,\n };\n};\n\nexport default function TabRouter({\n initialRouteName,\n backBehavior = 'firstRoute',\n}: TabRouterOptions) {\n const router: Router<\n TabNavigationState<ParamListBase>,\n TabActionType | CommonNavigationAction\n > = {\n ...BaseRouter,\n\n type: 'tab',\n\n getInitialState({ routeNames, routeParamList }) {\n const index =\n initialRouteName !== undefined && routeNames.includes(initialRouteName)\n ? routeNames.indexOf(initialRouteName)\n : 0;\n\n const routes = routeNames.map((name) => ({\n name,\n key: `${name}-${nanoid()}`,\n params: routeParamList[name],\n }));\n\n const history = getRouteHistory(\n routes,\n index,\n backBehavior,\n initialRouteName\n );\n\n return {\n stale: false,\n type: 'tab',\n key: `tab-${nanoid()}`,\n index,\n routeNames,\n history,\n routes,\n };\n },\n\n getRehydratedState(partialState, { routeNames, routeParamList }) {\n let state = partialState;\n\n if (state.stale === false) {\n return state;\n }\n\n const routes = routeNames.map((name) => {\n const route = (\n state as PartialState<TabNavigationState<ParamListBase>>\n ).routes.find((r) => r.name === name);\n\n return {\n ...route,\n name,\n key:\n route && route.name === name && route.key\n ? route.key\n : `${name}-${nanoid()}`,\n params:\n routeParamList[name] !== undefined\n ? {\n ...routeParamList[name],\n ...(route ? route.params : undefined),\n }\n : route\n ? route.params\n : undefined,\n } as Route<string>;\n });\n\n const index = Math.min(\n Math.max(routeNames.indexOf(state.routes[state?.index ?? 0]?.name), 0),\n routes.length - 1\n );\n\n const history =\n state.history?.filter((it) => routes.find((r) => r.key === it.key)) ??\n [];\n\n return changeIndex(\n {\n stale: false,\n type: 'tab',\n key: `tab-${nanoid()}`,\n index,\n routeNames,\n history,\n routes,\n },\n index,\n backBehavior,\n initialRouteName\n );\n },\n\n getStateForRouteNamesChange(\n state,\n { routeNames, routeParamList, routeKeyChanges }\n ) {\n const routes = routeNames.map(\n (name) =>\n state.routes.find(\n (r) => r.name === name && !routeKeyChanges.includes(r.name)\n ) || {\n name,\n key: `${name}-${nanoid()}`,\n params: routeParamList[name],\n }\n );\n\n const index = Math.max(\n 0,\n routeNames.indexOf(state.routes[state.index].name)\n );\n\n let history = state.history.filter(\n // Type will always be 'route' for tabs, but could be different in a router extending this (e.g. drawer)\n (it) => it.type !== 'route' || routes.find((r) => r.key === it.key)\n );\n\n if (!history.length) {\n history = getRouteHistory(\n routes,\n index,\n backBehavior,\n initialRouteName\n );\n }\n\n return {\n ...state,\n history,\n routeNames,\n routes,\n index,\n };\n },\n\n getStateForRouteFocus(state, key) {\n const index = state.routes.findIndex((r) => r.key === key);\n\n if (index === -1 || index === state.index) {\n return state;\n }\n\n return changeIndex(state, index, backBehavior, initialRouteName);\n },\n\n getStateForAction(state, action, { routeParamList }) {\n switch (action.type) {\n case 'JUMP_TO':\n case 'NAVIGATE': {\n let index = -1;\n\n if (action.type === 'NAVIGATE' && action.payload.key) {\n index = state.routes.findIndex(\n (route) => route.key === action.payload.key\n );\n } else {\n index = state.routes.findIndex(\n (route) => route.name === action.payload.name\n );\n }\n\n if (index === -1) {\n return null;\n }\n\n return changeIndex(\n {\n ...state,\n routes: state.routes.map((route, i) => {\n if (i !== index) {\n return route;\n }\n\n let params;\n\n if (action.type === 'NAVIGATE' && action.payload.merge) {\n params =\n action.payload.params !== undefined ||\n routeParamList[route.name] !== undefined\n ? {\n ...routeParamList[route.name],\n ...route.params,\n ...action.payload.params,\n }\n : route.params;\n } else {\n params =\n routeParamList[route.name] !== undefined\n ? {\n ...routeParamList[route.name],\n ...action.payload.params,\n }\n : action.payload.params;\n }\n\n const path =\n action.type === 'NAVIGATE' && action.payload.path != null\n ? action.payload.path\n : route.path;\n\n return params !== route.params || path !== route.path\n ? { ...route, path, params }\n : route;\n }),\n },\n index,\n backBehavior,\n initialRouteName\n );\n }\n\n case 'GO_BACK': {\n if (state.history.length === 1) {\n return null;\n }\n\n const previousKey = state.history[state.history.length - 2].key;\n const index = state.routes.findIndex(\n (route) => route.key === previousKey\n );\n\n if (index === -1) {\n return null;\n }\n\n return {\n ...state,\n history: state.history.slice(0, -1),\n index,\n };\n }\n\n default:\n return BaseRouter.getStateForAction(state, action);\n }\n },\n\n shouldActionChangeFocus(action) {\n return action.type === 'NAVIGATE';\n },\n\n actionCreators: TabActions,\n };\n\n return router;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["index.tsx"],"names":["CommonActions","default","BaseRouter","DrawerActions","DrawerRouter","StackActions","StackRouter","TabActions","TabRouter"],"mappings":"AAAA,OAAO,KAAKA,aAAZ,MAA+B,iBAA/B;AAEA,SAASA,aAAT;AAEA,SAASC,OAAO,IAAIC,UAApB,QAAsC,cAAtC;AAOA,SAASC,aAAT,EAAwBF,OAAO,IAAIG,YAAnC,QAAuD,gBAAvD;AAOA,SAASC,YAAT,EAAuBJ,OAAO,IAAIK,WAAlC,QAAqD,eAArD;AAOA,SAASC,UAAT,EAAqBN,OAAO,IAAIO,SAAhC,QAAiD,aAAjD;AACA,cAAc,SAAd","sourcesContent":["import * as CommonActions from './CommonActions';\n\nexport { CommonActions };\n\nexport { default as BaseRouter } from './BaseRouter';\nexport type {\n DrawerActionHelpers,\n DrawerActionType,\n DrawerNavigationState,\n DrawerRouterOptions,\n} from './DrawerRouter';\nexport { DrawerActions, default as DrawerRouter } from './DrawerRouter';\nexport type {\n StackActionHelpers,\n StackActionType,\n StackNavigationState,\n StackRouterOptions,\n} from './StackRouter';\nexport { StackActions, default as StackRouter } from './StackRouter';\nexport type {\n TabActionHelpers,\n TabActionType,\n TabNavigationState,\n TabRouterOptions,\n} from './TabRouter';\nexport { TabActions, default as TabRouter } from './TabRouter';\nexport * from './types';\n"]}
1
+ {"version":3,"sources":["index.tsx"],"names":["CommonActions","default","BaseRouter","DrawerActions","DrawerRouter","StackActions","StackRouter","TabActions","TabRouter"],"mappings":"AAAA,OAAO,KAAKA,aAAZ,MAA+B,iBAA/B;AAEA,SAASA,aAAT;AAEA,SAASC,OAAO,IAAIC,UAApB,QAAsC,cAAtC;AAQA,SAASC,aAAT,EAAwBF,OAAO,IAAIG,YAAnC,QAAuD,gBAAvD;AAOA,SAASC,YAAT,EAAuBJ,OAAO,IAAIK,WAAlC,QAAqD,eAArD;AAOA,SAASC,UAAT,EAAqBN,OAAO,IAAIO,SAAhC,QAAiD,aAAjD;AACA,cAAc,SAAd","sourcesContent":["import * as CommonActions from './CommonActions';\n\nexport { CommonActions };\n\nexport { default as BaseRouter } from './BaseRouter';\nexport type {\n DrawerActionHelpers,\n DrawerActionType,\n DrawerNavigationState,\n DrawerRouterOptions,\n DrawerStatus,\n} from './DrawerRouter';\nexport { DrawerActions, default as DrawerRouter } from './DrawerRouter';\nexport type {\n StackActionHelpers,\n StackActionType,\n StackNavigationState,\n StackRouterOptions,\n} from './StackRouter';\nexport { StackActions, default as StackRouter } from './StackRouter';\nexport type {\n TabActionHelpers,\n TabActionType,\n TabNavigationState,\n TabRouterOptions,\n} from './TabRouter';\nexport { TabActions, default as TabRouter } from './TabRouter';\nexport * from './types';\n"]}
@@ -1,18 +1,23 @@
1
1
  import { TabActionHelpers, TabActionType, TabNavigationState, TabRouterOptions } from './TabRouter';
2
2
  import type { CommonNavigationAction, ParamListBase, Router } from './types';
3
+ export declare type DrawerStatus = 'open' | 'closed';
3
4
  export declare type DrawerActionType = TabActionType | {
4
5
  type: 'OPEN_DRAWER' | 'CLOSE_DRAWER' | 'TOGGLE_DRAWER';
5
6
  source?: string;
6
7
  target?: string;
7
8
  };
8
9
  export declare type DrawerRouterOptions = TabRouterOptions & {
9
- defaultStatus?: 'open' | 'closed';
10
+ defaultStatus?: DrawerStatus;
10
11
  };
11
12
  export declare type DrawerNavigationState<ParamList extends ParamListBase> = Omit<TabNavigationState<ParamList>, 'type' | 'history'> & {
12
13
  /**
13
14
  * Type of the router, in this case, it's drawer.
14
15
  */
15
16
  type: 'drawer';
17
+ /**
18
+ * Default status of the drawer.
19
+ */
20
+ default: DrawerStatus;
16
21
  /**
17
22
  * List of previously visited route keys and drawer open status.
18
23
  */
@@ -21,7 +26,7 @@ export declare type DrawerNavigationState<ParamList extends ParamListBase> = Omi
21
26
  key: string;
22
27
  } | {
23
28
  type: 'drawer';
24
- status: 'open';
29
+ status: DrawerStatus;
25
30
  })[];
26
31
  };
27
32
  export declare type DrawerActionHelpers<ParamList extends ParamListBase> = TabActionHelpers<ParamList> & {
@@ -60,8 +60,8 @@ export declare type StackActionHelpers<ParamList extends ParamListBase> = {
60
60
  popToTop(): void;
61
61
  };
62
62
  export declare const StackActions: {
63
- replace(name: string, params?: object | undefined): StackActionType;
64
- push(name: string, params?: object | undefined): StackActionType;
63
+ replace(name: string, params?: object): StackActionType;
64
+ push(name: string, params?: object): StackActionType;
65
65
  pop(count?: number): StackActionType;
66
66
  popToTop(): StackActionType;
67
67
  };
@@ -35,6 +35,6 @@ export declare type TabActionHelpers<ParamList extends ParamListBase> = {
35
35
  jumpTo<RouteName extends Extract<keyof ParamList, string>>(...args: undefined extends ParamList[RouteName] ? [screen: RouteName] | [screen: RouteName, params: ParamList[RouteName]] : [screen: RouteName, params: ParamList[RouteName]]): void;
36
36
  };
37
37
  export declare const TabActions: {
38
- jumpTo(name: string, params?: object | undefined): TabActionType;
38
+ jumpTo(name: string, params?: object): TabActionType;
39
39
  };
40
40
  export default function TabRouter({ initialRouteName, backBehavior, }: TabRouterOptions): Router<TabNavigationState<ParamListBase>, import("./CommonActions").Action | TabActionType>;
@@ -1,7 +1,7 @@
1
1
  import * as CommonActions from './CommonActions';
2
2
  export { CommonActions };
3
3
  export { default as BaseRouter } from './BaseRouter';
4
- export type { DrawerActionHelpers, DrawerActionType, DrawerNavigationState, DrawerRouterOptions, } from './DrawerRouter';
4
+ export type { DrawerActionHelpers, DrawerActionType, DrawerNavigationState, DrawerRouterOptions, DrawerStatus, } from './DrawerRouter';
5
5
  export { DrawerActions, default as DrawerRouter } from './DrawerRouter';
6
6
  export type { StackActionHelpers, StackActionType, StackNavigationState, StackRouterOptions, } from './StackRouter';
7
7
  export { StackActions, default as StackRouter } from './StackRouter';
@@ -138,7 +138,13 @@ export declare type Router<State extends NavigationState, Action extends Navigat
138
138
  * @param options.routeNames New list of route names.
139
139
  * @param options.routeParamsList Object containing params for each route.
140
140
  */
141
- getStateForRouteNamesChange(state: State, options: RouterConfigOptions): State;
141
+ getStateForRouteNamesChange(state: State, options: RouterConfigOptions & {
142
+ /**
143
+ * List of routes whose key has changed even if they still have the same name.
144
+ * This allows to remove screens declaratively.
145
+ */
146
+ routeKeyChanges: string[];
147
+ }): State;
142
148
  /**
143
149
  * Take the current state and key of a route, and return a new state with the route focused
144
150
  *
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@react-navigation/routers",
3
3
  "description": "Routers to help build custom navigators",
4
- "version": "6.0.1",
4
+ "version": "6.1.1",
5
5
  "keywords": [
6
6
  "react",
7
7
  "react-native",
@@ -41,7 +41,7 @@
41
41
  "devDependencies": {
42
42
  "del-cli": "^3.0.1",
43
43
  "react-native-builder-bob": "^0.18.1",
44
- "typescript": "^4.3.2"
44
+ "typescript": "^4.7.4"
45
45
  },
46
46
  "react-native-builder-bob": {
47
47
  "source": "src",
@@ -57,5 +57,5 @@
57
57
  ]
58
58
  ]
59
59
  },
60
- "gitHead": "e299167e105d8113c2e021846fe174e28b929354"
60
+ "gitHead": "f20e54feaa1f8e81d9e72042d18c046af537298e"
61
61
  }
@@ -13,6 +13,7 @@ import type {
13
13
  PartialState,
14
14
  Router,
15
15
  } from './types';
16
+ export type DrawerStatus = 'open' | 'closed';
16
17
 
17
18
  export type DrawerActionType =
18
19
  | TabActionType
@@ -23,7 +24,7 @@ export type DrawerActionType =
23
24
  };
24
25
 
25
26
  export type DrawerRouterOptions = TabRouterOptions & {
26
- defaultStatus?: 'open' | 'closed';
27
+ defaultStatus?: DrawerStatus;
27
28
  };
28
29
 
29
30
  export type DrawerNavigationState<ParamList extends ParamListBase> = Omit<
@@ -34,12 +35,16 @@ export type DrawerNavigationState<ParamList extends ParamListBase> = Omit<
34
35
  * Type of the router, in this case, it's drawer.
35
36
  */
36
37
  type: 'drawer';
38
+ /**
39
+ * Default status of the drawer.
40
+ */
41
+ default: DrawerStatus;
37
42
  /**
38
43
  * List of previously visited route keys and drawer open status.
39
44
  */
40
45
  history: (
41
46
  | { type: 'route'; key: string }
42
- | { type: 'drawer'; status: 'open' }
47
+ | { type: 'drawer'; status: DrawerStatus }
43
48
  )[];
44
49
  };
45
50
 
@@ -74,40 +79,8 @@ export const DrawerActions = {
74
79
  },
75
80
  };
76
81
 
77
- const isDrawerOpen = (
78
- state:
79
- | DrawerNavigationState<ParamListBase>
80
- | PartialState<DrawerNavigationState<ParamListBase>>
81
- ) => Boolean(state.history?.some((it) => it.type === 'drawer'));
82
-
83
- const openDrawer = (
84
- state: DrawerNavigationState<ParamListBase>
85
- ): DrawerNavigationState<ParamListBase> => {
86
- if (isDrawerOpen(state)) {
87
- return state;
88
- }
89
-
90
- return {
91
- ...state,
92
- history: [...state.history, { type: 'drawer', status: 'open' }],
93
- };
94
- };
95
-
96
- const closeDrawer = (
97
- state: DrawerNavigationState<ParamListBase>
98
- ): DrawerNavigationState<ParamListBase> => {
99
- if (!isDrawerOpen(state)) {
100
- return state;
101
- }
102
-
103
- return {
104
- ...state,
105
- history: state.history.filter((it) => it.type !== 'drawer'),
106
- };
107
- };
108
-
109
82
  export default function DrawerRouter({
110
- defaultStatus,
83
+ defaultStatus = 'closed',
111
84
  ...rest
112
85
  }: DrawerRouterOptions): Router<
113
86
  DrawerNavigationState<ParamListBase>,
@@ -118,24 +91,79 @@ export default function DrawerRouter({
118
91
  TabActionType | CommonNavigationAction
119
92
  >;
120
93
 
94
+ const isDrawerInHistory = (
95
+ state:
96
+ | DrawerNavigationState<ParamListBase>
97
+ | PartialState<DrawerNavigationState<ParamListBase>>
98
+ ) => Boolean(state.history?.some((it) => it.type === 'drawer'));
99
+
100
+ const addDrawerToHistory = (
101
+ state: DrawerNavigationState<ParamListBase>
102
+ ): DrawerNavigationState<ParamListBase> => {
103
+ if (isDrawerInHistory(state)) {
104
+ return state;
105
+ }
106
+
107
+ return {
108
+ ...state,
109
+ history: [
110
+ ...state.history,
111
+ {
112
+ type: 'drawer',
113
+ status: defaultStatus === 'open' ? 'closed' : 'open',
114
+ },
115
+ ],
116
+ };
117
+ };
118
+
119
+ const removeDrawerFromHistory = (
120
+ state: DrawerNavigationState<ParamListBase>
121
+ ): DrawerNavigationState<ParamListBase> => {
122
+ if (!isDrawerInHistory(state)) {
123
+ return state;
124
+ }
125
+
126
+ return {
127
+ ...state,
128
+ history: state.history.filter((it) => it.type !== 'drawer'),
129
+ };
130
+ };
131
+
132
+ const openDrawer = (
133
+ state: DrawerNavigationState<ParamListBase>
134
+ ): DrawerNavigationState<ParamListBase> => {
135
+ if (defaultStatus === 'open') {
136
+ return removeDrawerFromHistory(state);
137
+ }
138
+
139
+ return addDrawerToHistory(state);
140
+ };
141
+
142
+ const closeDrawer = (
143
+ state: DrawerNavigationState<ParamListBase>
144
+ ): DrawerNavigationState<ParamListBase> => {
145
+ if (defaultStatus === 'open') {
146
+ return addDrawerToHistory(state);
147
+ }
148
+
149
+ return removeDrawerFromHistory(state);
150
+ };
151
+
121
152
  return {
122
153
  ...router,
123
154
 
124
155
  type: 'drawer',
125
156
 
126
157
  getInitialState({ routeNames, routeParamList, routeGetIdList }) {
127
- let state = router.getInitialState({
158
+ const state = router.getInitialState({
128
159
  routeNames,
129
160
  routeParamList,
130
161
  routeGetIdList,
131
162
  });
132
163
 
133
- if (defaultStatus === 'open') {
134
- state = openDrawer(state);
135
- }
136
-
137
164
  return {
138
165
  ...state,
166
+ default: defaultStatus,
139
167
  stale: false,
140
168
  type: 'drawer',
141
169
  key: `drawer-${nanoid()}`,
@@ -156,12 +184,15 @@ export default function DrawerRouter({
156
184
  routeGetIdList,
157
185
  });
158
186
 
159
- if (isDrawerOpen(partialState)) {
160
- state = openDrawer(state);
187
+ if (isDrawerInHistory(partialState)) {
188
+ // Re-sync the drawer entry in history to correct it if it was wrong
189
+ state = removeDrawerFromHistory(state);
190
+ state = addDrawerToHistory(state);
161
191
  }
162
192
 
163
193
  return {
164
194
  ...state,
195
+ default: defaultStatus,
165
196
  type: 'drawer',
166
197
  key: `drawer-${nanoid()}`,
167
198
  };
@@ -170,10 +201,6 @@ export default function DrawerRouter({
170
201
  getStateForRouteFocus(state, key) {
171
202
  const result = router.getStateForRouteFocus(state, key);
172
203
 
173
- if (defaultStatus === 'open') {
174
- return openDrawer(result);
175
- }
176
-
177
204
  return closeDrawer(result);
178
205
  },
179
206
 
@@ -186,21 +213,26 @@ export default function DrawerRouter({
186
213
  return closeDrawer(state);
187
214
 
188
215
  case 'TOGGLE_DRAWER':
189
- if (isDrawerOpen(state)) {
190
- return closeDrawer(state);
216
+ if (isDrawerInHistory(state)) {
217
+ return removeDrawerFromHistory(state);
191
218
  }
192
219
 
193
- return openDrawer(state);
220
+ return addDrawerToHistory(state);
221
+
222
+ case 'JUMP_TO':
223
+ case 'NAVIGATE': {
224
+ const result = router.getStateForAction(state, action, options);
225
+
226
+ if (result != null && result.index !== state.index) {
227
+ return closeDrawer(result as DrawerNavigationState<ParamListBase>);
228
+ }
229
+
230
+ return result;
231
+ }
194
232
 
195
233
  case 'GO_BACK':
196
- if (defaultStatus === 'open') {
197
- if (!isDrawerOpen(state)) {
198
- return openDrawer(state);
199
- }
200
- } else {
201
- if (isDrawerOpen(state)) {
202
- return closeDrawer(state);
203
- }
234
+ if (isDrawerInHistory(state)) {
235
+ return removeDrawerFromHistory(state);
204
236
  }
205
237
 
206
238
  return router.getStateForAction(state, action, options);
@@ -175,9 +175,14 @@ export default function StackRouter(options: StackRouterOptions) {
175
175
  };
176
176
  },
177
177
 
178
- getStateForRouteNamesChange(state, { routeNames, routeParamList }) {
179
- const routes = state.routes.filter((route) =>
180
- routeNames.includes(route.name)
178
+ getStateForRouteNamesChange(
179
+ state,
180
+ { routeNames, routeParamList, routeKeyChanges }
181
+ ) {
182
+ const routes = state.routes.filter(
183
+ (route) =>
184
+ routeNames.includes(route.name) &&
185
+ !routeKeyChanges.includes(route.name)
181
186
  );
182
187
 
183
188
  if (routes.length === 0) {
package/src/TabRouter.tsx CHANGED
@@ -237,10 +237,15 @@ export default function TabRouter({
237
237
  );
238
238
  },
239
239
 
240
- getStateForRouteNamesChange(state, { routeNames, routeParamList }) {
240
+ getStateForRouteNamesChange(
241
+ state,
242
+ { routeNames, routeParamList, routeKeyChanges }
243
+ ) {
241
244
  const routes = routeNames.map(
242
245
  (name) =>
243
- state.routes.find((r) => r.name === name) || {
246
+ state.routes.find(
247
+ (r) => r.name === name && !routeKeyChanges.includes(r.name)
248
+ ) || {
244
249
  name,
245
250
  key: `${name}-${nanoid()}`,
246
251
  params: routeParamList[name],
package/src/index.tsx CHANGED
@@ -8,6 +8,7 @@ export type {
8
8
  DrawerActionType,
9
9
  DrawerNavigationState,
10
10
  DrawerRouterOptions,
11
+ DrawerStatus,
11
12
  } from './DrawerRouter';
12
13
  export { DrawerActions, default as DrawerRouter } from './DrawerRouter';
13
14
  export type {
package/src/types.tsx CHANGED
@@ -182,7 +182,13 @@ export type Router<
182
182
  */
183
183
  getStateForRouteNamesChange(
184
184
  state: State,
185
- options: RouterConfigOptions
185
+ options: RouterConfigOptions & {
186
+ /**
187
+ * List of routes whose key has changed even if they still have the same name.
188
+ * This allows to remove screens declaratively.
189
+ */
190
+ routeKeyChanges: string[];
191
+ }
186
192
  ): State;
187
193
 
188
194
  /**