mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
cf664c65e2
Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/53312 Changelog: [Internal] Reviewed By: jbrown215 Differential Revision: D80400976 fbshipit-source-id: 196af69c0b9621b2a2675b232406639773e04933
145 lines
3.7 KiB
JavaScript
145 lines
3.7 KiB
JavaScript
/**
|
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
* @flow
|
|
* @format
|
|
*/
|
|
|
|
import type {
|
|
ComponentList,
|
|
RNTesterNavigationState,
|
|
} from '../types/RNTesterTypes';
|
|
|
|
export const RNTesterNavigationActionsType = {
|
|
NAVBAR_PRESS: 'NAVBAR_PRESS',
|
|
BACK_BUTTON_PRESS: 'BACK_BUTTON_PRESS',
|
|
MODULE_CARD_PRESS: 'MODULE_CARD_PRESS',
|
|
EXAMPLE_CARD_PRESS: 'EXAMPLE_CARD_PRESS',
|
|
EXAMPLE_OPEN_URL_REQUEST: 'EXAMPLE_OPEN_URL_REQUEST',
|
|
NAVBAR_OPEN_MODULE_PRESS: 'NAVBAR_OPEN_MODULE_PRESS',
|
|
} as const;
|
|
|
|
const getUpdatedRecentlyUsed = ({
|
|
exampleType,
|
|
key,
|
|
recentlyUsed,
|
|
}: {
|
|
exampleType: 'apis' | 'components' | null,
|
|
key: string | null,
|
|
recentlyUsed: ComponentList,
|
|
}) => {
|
|
const updatedRecentlyUsed = recentlyUsed
|
|
? {...recentlyUsed}
|
|
: // $FlowFixMe[missing-empty-array-annot]
|
|
{components: [], apis: []};
|
|
|
|
if (!exampleType || !key) {
|
|
return updatedRecentlyUsed;
|
|
}
|
|
|
|
let existingKeys = updatedRecentlyUsed[exampleType];
|
|
|
|
if (existingKeys.includes(key)) {
|
|
existingKeys = existingKeys.filter(k => k !== key);
|
|
}
|
|
// $FlowFixMe[incompatible-type]
|
|
existingKeys.unshift(key);
|
|
|
|
updatedRecentlyUsed[exampleType] = existingKeys.slice(0, 5);
|
|
|
|
return updatedRecentlyUsed;
|
|
};
|
|
|
|
export const RNTesterNavigationReducer = (
|
|
state: RNTesterNavigationState,
|
|
action: {type: $Keys<typeof RNTesterNavigationActionsType>, data?: any},
|
|
): RNTesterNavigationState => {
|
|
const {
|
|
data: {
|
|
key = null,
|
|
title = null,
|
|
exampleKey = null,
|
|
exampleType = null,
|
|
screen = null,
|
|
} = {},
|
|
} = action;
|
|
|
|
switch (action.type) {
|
|
case RNTesterNavigationActionsType.NAVBAR_PRESS:
|
|
return {
|
|
...state,
|
|
activeModuleKey: null,
|
|
activeModuleTitle: null,
|
|
activeModuleExampleKey: null,
|
|
screen,
|
|
hadDeepLink: false,
|
|
};
|
|
|
|
case RNTesterNavigationActionsType.NAVBAR_OPEN_MODULE_PRESS:
|
|
return {
|
|
...state,
|
|
activeModuleKey: key,
|
|
activeModuleTitle: title,
|
|
activeModuleExampleKey: null,
|
|
screen,
|
|
hadDeepLink: false,
|
|
};
|
|
|
|
case RNTesterNavigationActionsType.MODULE_CARD_PRESS:
|
|
return {
|
|
...state,
|
|
activeModuleKey: key,
|
|
activeModuleTitle: title,
|
|
activeModuleExampleKey: null,
|
|
hadDeepLink: false,
|
|
// $FlowFixMe[incompatible-return]
|
|
recentlyUsed: getUpdatedRecentlyUsed({
|
|
exampleType: exampleType,
|
|
key: key,
|
|
recentlyUsed: state.recentlyUsed,
|
|
}),
|
|
};
|
|
|
|
case RNTesterNavigationActionsType.EXAMPLE_CARD_PRESS:
|
|
return {
|
|
...state,
|
|
hadDeepLink: false,
|
|
activeModuleExampleKey: key,
|
|
};
|
|
|
|
case RNTesterNavigationActionsType.BACK_BUTTON_PRESS:
|
|
// Go back to module or list.
|
|
return {
|
|
...state,
|
|
activeModuleExampleKey: null,
|
|
activeModuleKey:
|
|
!state.hadDeepLink && state.activeModuleExampleKey != null
|
|
? state.activeModuleKey
|
|
: null,
|
|
activeModuleTitle:
|
|
!state.hadDeepLink && state.activeModuleExampleKey != null
|
|
? state.activeModuleTitle
|
|
: null,
|
|
hadDeepLink: false,
|
|
// If there was a deeplink navigation, pressing Back should bring us back to the root.
|
|
screen: state.hadDeepLink ? 'components' : state.screen,
|
|
};
|
|
|
|
case RNTesterNavigationActionsType.EXAMPLE_OPEN_URL_REQUEST:
|
|
return {
|
|
...state,
|
|
activeModuleKey: key,
|
|
activeModuleTitle: title,
|
|
activeModuleExampleKey: exampleKey,
|
|
hadDeepLink: true,
|
|
screen: 'components',
|
|
};
|
|
|
|
default:
|
|
throw new Error(`Invalid action type ${action.type}`);
|
|
}
|
|
};
|