Phecda

feat: add Redux toolchain except saga

/**
* Sample React Native App
* https://github.com/facebook/react-native
*
* Generated with the TypeScript template
* https://github.com/react-native-community/react-native-template-typescript
*
* @format
*/
import React from 'react';
import { Provider as ReduxProvider } from 'react-redux';
import { PersistGate } from 'redux-persist/integration/react';
import { DarkModeProvider } from 'react-native-dark-mode';
import { enableScreens } from 'react-native-screens';
import { enableES5 } from 'immer';
import AppNavigationContainer from './src/screen/AppNavigationContainer';
import { I18NProvider } from './src/i18n';
import { Platform } from 'react-native';
import { store, persistor } from './src/store';
declare var global: { HermesInternal: null | {} };
if (Platform.OS === 'android' && global.HermesInternal) {
... ... @@ -33,11 +26,15 @@ enableScreens();
const App = () => {
return (
<I18NProvider>
<DarkModeProvider>
<AppNavigationContainer />
</DarkModeProvider>
</I18NProvider>
<ReduxProvider store={store}>
<PersistGate persistor={persistor}>
<I18NProvider>
<DarkModeProvider>
<AppNavigationContainer />
</DarkModeProvider>
</I18NProvider>
</PersistGate>
</ReduxProvider>
);
};
... ...
... ... @@ -318,6 +318,8 @@ PODS:
- React
- ReactNativeDarkMode (0.2.2):
- React
- RNCAsyncStorage (1.9.0):
- React
- RNCMaskedView (0.1.7):
- React
- RNDeviceInfo (5.5.4):
... ... @@ -395,6 +397,7 @@ DEPENDENCIES:
- ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`)
- "ReactNativeART (from `../node_modules/@react-native-community/art`)"
- ReactNativeDarkMode (from `../node_modules/react-native-dark-mode`)
- "RNCAsyncStorage (from `../node_modules/@react-native-community/async-storage`)"
- "RNCMaskedView (from `../node_modules/@react-native-community/masked-view`)"
- RNDeviceInfo (from `../node_modules/react-native-device-info`)
- RNGestureHandler (from `../node_modules/react-native-gesture-handler`)
... ... @@ -493,6 +496,8 @@ EXTERNAL SOURCES:
:path: "../node_modules/@react-native-community/art"
ReactNativeDarkMode:
:path: "../node_modules/react-native-dark-mode"
RNCAsyncStorage:
:path: "../node_modules/@react-native-community/async-storage"
RNCMaskedView:
:path: "../node_modules/@react-native-community/masked-view"
RNDeviceInfo:
... ... @@ -564,6 +569,7 @@ SPEC CHECKSUMS:
ReactCommon: 3585806280c51d5c2c0d3aa5a99014c3badb629d
ReactNativeART: 78edc68dd4a1e675338cd0cd113319cf3a65f2ab
ReactNativeDarkMode: 0178ffca3b10f6a7c9f49d6f9810232b328fa949
RNCAsyncStorage: 453cd7c335ec9ba3b877e27d02238956b76f3268
RNCMaskedView: 76c40a1d41c3e2535df09246a2b5487f04de0814
RNDeviceInfo: 6a3d16fce033f6979c4a6a41e62244d183e8c765
RNGestureHandler: 8f09cd560f8d533eb36da5a6c5a843af9f056b38
... ...
... ... @@ -16,6 +16,7 @@
"@huse/previous-value": "^1.0.1",
"@phecdas/react-native-code": "^1.0.0-1",
"@react-native-community/art": "^1.2.0",
"@react-native-community/async-storage": "^1.9.0",
"@react-native-community/masked-view": "^0.1.7",
"@react-native-community/netinfo": "^5.7.1",
"@react-navigation/bottom-tabs": "^5.2.5",
... ... @@ -43,6 +44,11 @@
"react-native-tab-view": "^2.13.0",
"react-native-vector-icons": "^6.6.0",
"react-native-webview": "9.1.1",
"react-redux": "^7.2.0",
"redux": "^4.0.5",
"redux-logger": "^3.0.6",
"redux-persist": "^6.0.0",
"typesafe-actions": "^5.1.0",
"url-parse": "^1.4.7"
},
"devDependencies": {
... ... @@ -53,7 +59,9 @@
"@react-native-community/eslint-config": "^1.0.0",
"@types/jest": "^24.0.24",
"@types/react-native": "^0.62.0",
"@types/react-redux": "^7.1.7",
"@types/react-test-renderer": "16.9.2",
"@types/redux-logger": "^3.0.7",
"@types/url-parse": "^1.4.3",
"@typescript-eslint/eslint-plugin": "^2.27.0",
"@typescript-eslint/parser": "^2.27.0",
... ...
import Types from 'local-types';
import { createStore, applyMiddleware } from 'redux';
import rootReducer from './rootReducer';
import { persistStore, persistReducer, PersistConfig } from 'redux-persist';
import AsyncStorage from '@react-native-community/async-storage';
import logger from 'redux-logger';
const persistConfig: PersistConfig<Types.RootState> = {
storage: AsyncStorage,
key: 'root',
};
const persistedReducer = persistReducer(persistConfig, rootReducer);
export const store = createStore(persistedReducer, applyMiddleware(logger));
export const persistor = persistStore(store);
... ...
import { useSelector, useDispatch } from 'react-redux';
import Types from 'local-types';
import { Dispatch } from 'redux';
type ReduxStateKey = keyof Types.RootState;
export function useReduxState<K extends ReduxStateKey>(
key: K
): Types.RootState[K] {
return useSelector((state: Types.RootState) => state[key]);
}
/**
* 获取 dispatch 对象
*
* @example
* const dispatch = useReduxDispatch();
* dispatch(rootActions.userActions.onUpdateUserInfo({ nickname: 'test' }));
*/
export function useReduxDispatch() {
return useDispatch<Dispatch<Types.RootAction>>();
}
... ...
export * from './configureStore';
import rootActions from './rootActions';
export { rootActions };
import Types from 'local-types';
export type ApplicationState = Types.RootState;
... ...
import * as userActions from './user/action';
export default { userActions };
... ...
import { combineReducers } from 'redux';
import user from './user/reducer';
export default combineReducers({
user,
});
... ...
import { StateType, ActionType } from 'typesafe-actions';
declare module 'local-types' {
export type Store = StateType<typeof import('./configureStore').store>;
export type RootAction = ActionType<typeof import('./rootActions').default>;
export type RootState = StateType<typeof import('./rootReducer').default>;
}
declare module 'typesafe-actions' {
interface Types {
RootAction: ActionType<typeof import('./rootActions').default>;
}
}
... ...
import { createAction } from 'typesafe-actions';
import { UserActionTypes, User } from './types';
export const setToken = createAction(UserActionTypes.SET_TOKEN)<string>();
export const setCurrentUser = createAction(UserActionTypes.SET_CURRENT)<User>();
export const addUser = createAction(UserActionTypes.ADD_USER)<User>();
... ...
import produce from 'immer';
import Types from 'local-types';
import { UserState, UserActionTypes } from './types';
import { Reducer } from 'typesafe-actions';
const initialState: UserState = { list: [] };
const reducer: Reducer<UserState, Types.RootAction> = (
state = initialState,
action
) =>
produce(state, draft => {
switch (action.type) {
case UserActionTypes.ADD_USER:
draft.list.splice(0, 0, action.payload);
break;
case UserActionTypes.SET_CURRENT:
draft.current = action.payload;
break;
case UserActionTypes.SET_TOKEN:
draft.token = action.payload;
}
});
export default reducer;
... ...
export interface User {
name: string;
}
export enum UserActionTypes {
SET_TOKEN = '@@user/SET_TOKEN',
SET_CURRENT = '@@user/SET_CURRENT',
ADD_USER = '@@user/ADD_USER',
}
export interface UserState {
current?: User;
token?: string;
list: User[];
}
... ...
declare module 'local-types';
declare type NVPair<V = string> = { name: string; value: V };
declare type PromiseResult<T extends Promise<any>> = T extends Promise<infer U>
... ...
... ... @@ -624,7 +624,7 @@
core-js-pure "^3.0.0"
regenerator-runtime "^0.13.4"
"@babel/runtime@^7.0.0", "@babel/runtime@^7.6.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7":
"@babel/runtime@^7.0.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7":
version "7.9.2"
resolved "https://registry.npm.taobao.org/@babel/runtime/download/@babel/runtime-7.9.2.tgz#d90df0583a3a252f09aaa619665367bae518db06"
integrity sha1-2Q3wWDo6JS8JqqYZZlNnuuUY2wY=
... ... @@ -1054,6 +1054,13 @@
invariant "^2.2.4"
prop-types "^15.7.2"
"@react-native-community/async-storage@^1.9.0":
version "1.9.0"
resolved "https://registry.npm.taobao.org/@react-native-community/async-storage/download/@react-native-community/async-storage-1.9.0.tgz?cache=0&sync_timestamp=1585815408575&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40react-native-community%2Fasync-storage%2Fdownload%2F%40react-native-community%2Fasync-storage-1.9.0.tgz#af26a8879bd2987970fbbe81a9623851d29a56f1"
integrity sha1-ryaoh5vSmHlw+76BqWI4UdKaVvE=
dependencies:
deep-assign "^3.0.0"
"@react-native-community/cli-debugger-ui@^4.2.1":
version "4.2.1"
resolved "https://registry.npm.taobao.org/@react-native-community/cli-debugger-ui/download/@react-native-community/cli-debugger-ui-4.2.1.tgz?cache=0&sync_timestamp=1582652910092&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40react-native-community%2Fcli-debugger-ui%2Fdownload%2F%40react-native-community%2Fcli-debugger-ui-4.2.1.tgz#da22aa1cf8d04fe1aa2759873916473e81c4450b"
... ... @@ -1300,6 +1307,14 @@
resolved "https://registry.npm.taobao.org/@types/hammerjs/download/@types/hammerjs-2.0.36.tgz#17ce0a235e9ffbcdcdf5095646b374c2bf615a4c"
integrity sha1-F84KI16f+83N9QlWRrN0wr9hWkw=
"@types/hoist-non-react-statics@^3.3.0":
version "3.3.1"
resolved "https://registry.npm.taobao.org/@types/hoist-non-react-statics/download/@types/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f"
integrity sha1-ESSq/lEYy1kZd66xzqrtEHDrA58=
dependencies:
"@types/react" "*"
hoist-non-react-statics "^3.3.0"
"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0":
version "2.0.1"
resolved "https://registry.npm.taobao.org/@types/istanbul-lib-coverage/download/@types/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff"
... ... @@ -1357,6 +1372,16 @@
dependencies:
"@types/react" "*"
"@types/react-redux@^7.1.7":
version "7.1.7"
resolved "https://registry.npm.taobao.org/@types/react-redux/download/@types/react-redux-7.1.7.tgz?cache=0&sync_timestamp=1580865748465&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Freact-redux%2Fdownload%2F%40types%2Freact-redux-7.1.7.tgz#12a0c529aba660696947384a059c5c6e08185c7a"
integrity sha1-EqDFKaumYGlpRzhKBZxcbggYXHo=
dependencies:
"@types/hoist-non-react-statics" "^3.3.0"
"@types/react" "*"
hoist-non-react-statics "^3.3.0"
redux "^4.0.0"
"@types/react-test-renderer@16.9.2":
version "16.9.2"
resolved "https://registry.npm.taobao.org/@types/react-test-renderer/download/@types/react-test-renderer-16.9.2.tgz#e1c408831e8183e5ad748fdece02214a7c2ab6c5"
... ... @@ -1372,6 +1397,13 @@
"@types/prop-types" "*"
csstype "^2.2.0"
"@types/redux-logger@^3.0.7":
version "3.0.7"
resolved "https://registry.npm.taobao.org/@types/redux-logger/download/@types/redux-logger-3.0.7.tgz#163f6f6865c69c21d56f9356dc8d741718ec0db0"
integrity sha1-Fj9vaGXGnCHVb5NW3I10FxjsDbA=
dependencies:
redux "^3.6.0"
"@types/stack-utils@^1.0.1":
version "1.0.1"
resolved "https://registry.npm.taobao.org/@types/stack-utils/download/@types/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e"
... ... @@ -2961,6 +2993,18 @@ dedent@0.7.0, dedent@^0.7.0:
resolved "https://registry.npm.taobao.org/dedent/download/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c"
integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=
deep-assign@^3.0.0:
version "3.0.0"
resolved "https://registry.npm.taobao.org/deep-assign/download/deep-assign-3.0.0.tgz#c8e4c4d401cba25550a2f0f486a2e75bc5f219a2"
integrity sha1-yOTE1AHLolVQovD0hqLnW8XyGaI=
dependencies:
is-obj "^1.0.0"
deep-diff@^0.3.5:
version "0.3.8"
resolved "https://registry.npm.taobao.org/deep-diff/download/deep-diff-0.3.8.tgz#c01de63efb0eec9798801d40c7e0dae25b582c84"
integrity sha1-wB3mPvsO7JeYgB1Ax+Da4ltYLIQ=
deep-is@~0.1.3:
version "0.1.3"
resolved "https://registry.npm.taobao.org/deep-is/download/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
... ... @@ -4314,7 +4358,7 @@ hoist-non-react-statics@^2.3.1:
resolved "https://registry.npm.taobao.org/hoist-non-react-statics/download/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47"
integrity sha1-xZA89AnA39kI84jmGdhrnBF0y0c=
hoist-non-react-statics@^3.1.0:
hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0:
version "3.3.2"
resolved "https://registry.npm.taobao.org/hoist-non-react-statics/download/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45"
integrity sha1-7OCsr3HWLClpwuxZ/v9CpLGoW0U=
... ... @@ -5593,6 +5637,11 @@ locate-path@^5.0.0:
dependencies:
p-locate "^4.1.0"
lodash-es@^4.2.1:
version "4.17.15"
resolved "https://registry.npm.taobao.org/lodash-es/download/lodash-es-4.17.15.tgz#21bd96839354412f23d7a10340e5eac6ee455d78"
integrity sha1-Ib2Wg5NUQS8j16EDQOXqxu5FXXg=
lodash._reinterpolate@^3.0.0:
version "3.0.0"
resolved "https://registry.npm.taobao.org/lodash._reinterpolate/download/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d"
... ... @@ -7018,7 +7067,7 @@ react-devtools-core@^4.0.6:
shell-quote "^1.6.1"
ws "^7"
react-is@^16.12.0, react-is@^16.13.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.8.6:
react-is@^16.12.0, react-is@^16.13.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.8.6, react-is@^16.9.0:
version "16.13.1"
resolved "https://registry.npm.taobao.org/react-is/download/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
integrity sha1-eJcppNw23imZ3BVt1sHZwYzqVqQ=
... ... @@ -7202,6 +7251,17 @@ react-native@0.62.1:
use-subscription "^1.0.0"
whatwg-fetch "^3.0.0"
react-redux@^7.2.0:
version "7.2.0"
resolved "https://registry.npm.taobao.org/react-redux/download/react-redux-7.2.0.tgz?cache=0&sync_timestamp=1581997590604&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freact-redux%2Fdownload%2Freact-redux-7.2.0.tgz#f970f62192b3981642fec46fd0db18a074fe879d"
integrity sha1-+XD2IZKzmBZC/sRv0NsYoHT+h50=
dependencies:
"@babel/runtime" "^7.5.5"
hoist-non-react-statics "^3.3.0"
loose-envify "^1.4.0"
prop-types "^15.7.2"
react-is "^16.9.0"
react-refresh@^0.4.0:
version "0.4.2"
resolved "https://registry.npm.taobao.org/react-refresh/download/react-refresh-0.4.2.tgz#54a277a6caaac2803d88f1d6f13c1dcfbd81e334"
... ... @@ -7320,6 +7380,36 @@ redent@^2.0.0:
indent-string "^3.0.0"
strip-indent "^2.0.0"
redux-logger@^3.0.6:
version "3.0.6"
resolved "https://registry.npm.taobao.org/redux-logger/download/redux-logger-3.0.6.tgz#f7555966f3098f3c88604c449cf0baf5778274bf"
integrity sha1-91VZZvMJjzyIYExEnPC69XeCdL8=
dependencies:
deep-diff "^0.3.5"
redux-persist@^6.0.0:
version "6.0.0"
resolved "https://registry.npm.taobao.org/redux-persist/download/redux-persist-6.0.0.tgz#b4d2972f9859597c130d40d4b146fecdab51b3a8"
integrity sha1-tNKXL5hZWXwTDUDUsUb+zatRs6g=
redux@^3.6.0:
version "3.7.2"
resolved "https://registry.npm.taobao.org/redux/download/redux-3.7.2.tgz#06b73123215901d25d065be342eb026bc1c8537b"
integrity sha1-BrcxIyFZAdJdBlvjQusCa8HIU3s=
dependencies:
lodash "^4.2.1"
lodash-es "^4.2.1"
loose-envify "^1.1.0"
symbol-observable "^1.0.3"
redux@^4.0.0, redux@^4.0.5:
version "4.0.5"
resolved "https://registry.npm.taobao.org/redux/download/redux-4.0.5.tgz#4db5de5816e17891de8a80c424232d06f051d93f"
integrity sha1-TbXeWBbheJHeioDEJCMtBvBR2T8=
dependencies:
loose-envify "^1.4.0"
symbol-observable "^1.2.0"
regenerate-unicode-properties@^8.2.0:
version "8.2.0"
resolved "https://registry.npm.taobao.org/regenerate-unicode-properties/download/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec"
... ... @@ -8327,7 +8417,7 @@ symbol-observable@1.0.1:
resolved "https://registry.npm.taobao.org/symbol-observable/download/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4"
integrity sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=
symbol-observable@^1.1.0:
symbol-observable@^1.0.3, symbol-observable@^1.1.0, symbol-observable@^1.2.0:
version "1.2.0"
resolved "https://registry.npm.taobao.org/symbol-observable/download/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804"
integrity sha1-wiaIrtTqs83C3+rLtWFmBWCgCAQ=
... ... @@ -8550,6 +8640,11 @@ typedarray@^0.0.6:
resolved "https://registry.npm.taobao.org/typedarray/download/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
typesafe-actions@^5.1.0:
version "5.1.0"
resolved "https://registry.npm.taobao.org/typesafe-actions/download/typesafe-actions-5.1.0.tgz#9afe8b1e6a323af1fd59e6a57b11b7dd6623d2f1"
integrity sha1-mv6LHmoyOvH9WealexG33WYj0vE=
typescript@^3.8.3:
version "3.8.3"
resolved "https://registry.npm.taobao.org/typescript/download/typescript-3.8.3.tgz?cache=0&sync_timestamp=1586164975599&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftypescript%2Fdownload%2Ftypescript-3.8.3.tgz#409eb8544ea0335711205869ec458ab109ee1061"
... ...