NavigationActions.js
4.12 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
/**
* @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,
};