mirror of
https://github.com/status-im/react-navigation.git
synced 2025-02-25 01:28:16 +00:00
* Add toString() with type for each NavigationAction * Add documentation for toString() on NavigationActions
180 lines
4.1 KiB
JavaScript
180 lines
4.1 KiB
JavaScript
/**
|
|
* @flow
|
|
*/
|
|
|
|
import type {
|
|
NavigationAction,
|
|
PossiblyDeprecatedNavigationAction,
|
|
DeprecatedNavigationNavigateAction,
|
|
NavigationInitAction,
|
|
NavigationNavigateAction,
|
|
NavigationBackAction,
|
|
NavigationSetParamsAction,
|
|
NavigationResetAction,
|
|
NavigationUriAction,
|
|
NavigationParams,
|
|
} from './TypeDefinition';
|
|
|
|
const BACK = 'Navigation/BACK';
|
|
const INIT = 'Navigation/INIT';
|
|
const NAVIGATE = 'Navigation/NAVIGATE';
|
|
const RESET = 'Navigation/RESET';
|
|
const SET_PARAMS = 'Navigation/SET_PARAMS';
|
|
const URI = 'Navigation/URI';
|
|
|
|
const createAction = (type: string, fn: any) => {
|
|
fn.toString = () => type;
|
|
return fn;
|
|
};
|
|
|
|
const back = createAction(
|
|
BACK,
|
|
(payload: { key?: ?string } = {}): NavigationBackAction => ({
|
|
type: BACK,
|
|
key: payload.key,
|
|
})
|
|
);
|
|
const init = createAction(
|
|
INIT,
|
|
(payload: { params?: NavigationParams } = {}): NavigationInitAction => {
|
|
const action: NavigationInitAction = {
|
|
type: INIT,
|
|
};
|
|
if (payload.params) {
|
|
action.params = payload.params;
|
|
}
|
|
return action;
|
|
}
|
|
);
|
|
const navigate = createAction(
|
|
NAVIGATE,
|
|
(payload: {
|
|
routeName: string,
|
|
params?: ?NavigationParams,
|
|
action?: ?NavigationNavigateAction,
|
|
}): NavigationNavigateAction => {
|
|
const action: NavigationNavigateAction = {
|
|
type: NAVIGATE,
|
|
routeName: payload.routeName,
|
|
};
|
|
if (payload.params) {
|
|
action.params = payload.params;
|
|
}
|
|
if (payload.action) {
|
|
action.action = payload.action;
|
|
}
|
|
return action;
|
|
}
|
|
);
|
|
const reset = createAction(
|
|
RESET,
|
|
(payload: {
|
|
index: number,
|
|
key?: ?string,
|
|
actions: Array<NavigationNavigateAction>,
|
|
}): NavigationResetAction => ({
|
|
type: RESET,
|
|
index: payload.index,
|
|
key: payload.key,
|
|
actions: payload.actions,
|
|
})
|
|
);
|
|
const setParams = createAction(
|
|
SET_PARAMS,
|
|
(payload: {
|
|
key: string,
|
|
params: NavigationParams,
|
|
}): NavigationSetParamsAction => ({
|
|
type: SET_PARAMS,
|
|
key: payload.key,
|
|
params: payload.params,
|
|
})
|
|
);
|
|
const uri = createAction(
|
|
URI,
|
|
(payload: { uri: string }): NavigationUriAction => ({
|
|
type: URI,
|
|
uri: payload.uri,
|
|
})
|
|
);
|
|
|
|
const mapDeprecatedNavigateAction = (
|
|
action: NavigationNavigateAction | DeprecatedNavigationNavigateAction
|
|
): NavigationNavigateAction => {
|
|
if (action.type === 'Navigate') {
|
|
const payload: Object = {
|
|
routeName: action.routeName,
|
|
params: action.params,
|
|
};
|
|
if (action.action) {
|
|
payload.action = mapDeprecatedNavigateAction(action.action);
|
|
}
|
|
return navigate(payload);
|
|
}
|
|
return action;
|
|
};
|
|
|
|
const mapDeprecatedAction = (
|
|
action: PossiblyDeprecatedNavigationAction
|
|
): NavigationAction => {
|
|
if (action.type === 'Back') {
|
|
return back(action);
|
|
} else if (action.type === 'Init') {
|
|
return init(action);
|
|
} else if (action.type === 'Navigate') {
|
|
return mapDeprecatedNavigateAction(action);
|
|
} else if (action.type === 'Reset') {
|
|
return reset({
|
|
index: action.index,
|
|
key: action.key,
|
|
actions: action.actions.map(mapDeprecatedNavigateAction),
|
|
});
|
|
} else if (action.type === 'SetParams') {
|
|
return setParams(action);
|
|
}
|
|
return action;
|
|
};
|
|
|
|
const mapDeprecatedActionAndWarn = (
|
|
action: PossiblyDeprecatedNavigationAction
|
|
): NavigationAction => {
|
|
const newAction = mapDeprecatedAction(action);
|
|
if (newAction !== action) {
|
|
const oldType = action.type;
|
|
const newType = newAction.type;
|
|
console.warn(
|
|
[
|
|
`The action type '${oldType}' has been renamed to '${newType}'.`,
|
|
`'${oldType}' will continue to work while in beta but will be removed`,
|
|
'in the first major release. Moving forward, you should use the',
|
|
'action constants and action creators exported by this library in',
|
|
"the 'actions' object.",
|
|
'See https://github.com/react-community/react-navigation/pull/120 for',
|
|
'more details.',
|
|
].join(' ')
|
|
);
|
|
}
|
|
return newAction;
|
|
};
|
|
|
|
export default {
|
|
// Action constants
|
|
BACK,
|
|
INIT,
|
|
NAVIGATE,
|
|
RESET,
|
|
SET_PARAMS,
|
|
URI,
|
|
|
|
// Action creators
|
|
back,
|
|
init,
|
|
navigate,
|
|
reset,
|
|
setParams,
|
|
uri,
|
|
|
|
// TODO: Remove once old actions are deprecated
|
|
mapDeprecatedActionAndWarn,
|
|
};
|