UNPKG

5.64 kBJavaScriptView Raw
1function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
2
3var deepEqual = _interopDefault(require('@rahazad/deep-equal'));
4var graphReducer = require('@rahazad/graph-reducer');
5var React = require('react');
6var React__default = _interopDefault(React);
7
8var defaultLogger = function defaultLogger(state, action, newState) {
9 var _newState;
10
11 if (newState === void 0) {
12 newState = null;
13 }
14
15 console.group('%c%s %c%s %c%s %s', 'font-weight:normal;color:#888', 'action', 'color:#222', action.type, 'font-weight:normal;color:#888', '@', new Date().toLocaleTimeString());
16 console.log('%c%s\t%o', 'font-weight:bold;color:#9E9E9E', 'prev-state', state);
17 console.log('%c%s\t', 'font-weight:bold;color:#03A9E4', 'action', action);
18 console.log('%c%s\t%o', 'font-weight:bold;color:#4CAF50', 'new-state', newState === state ? 'PREV-STATE' : (_newState = newState) != null ? _newState : 'NO-TRANSFORM');
19 console.groupEnd();
20};
21
22var stateManager = {};
23var StoreProvider = React__default.memo(function (_ref) {
24 var children = _ref.children;
25 var rootReducer = stateManager.rootReducer,
26 defaultInitialState = stateManager.defaultInitialState,
27 initializer = stateManager.initializer,
28 payloadCreators = stateManager.payloadCreators,
29 AppContext = stateManager.AppContext;
30
31 var _useReducer = React.useReducer(rootReducer, defaultInitialState, initializer),
32 state = _useReducer[0],
33 dispatch = _useReducer[1];
34
35 var popStateListener = function popStateListener(_ref2) {
36 var state = _ref2.state;
37 return dispatch({
38 type: 'POP-',
39 state: state
40 });
41 };
42
43 React.useEffect(function () {
44 window.addEventListener('popstate', popStateListener);
45 return function () {
46 return window.removeEventListener('popstate', popStateListener);
47 };
48 }, []);
49 var dp = Object.fromEntries(Object.entries(payloadCreators).map(function (_ref3) {
50 var type = _ref3[0],
51 payloadCreator = _ref3[1];
52 return [type, function () {
53 return dispatch({
54 type: type,
55 payload: payloadCreator.apply(void 0, arguments)
56 });
57 }];
58 }));
59 return /*#__PURE__*/React__default.createElement(AppContext.Provider, {
60 value: {
61 state: state,
62 dp: dp,
63 dispatch: dispatch
64 }
65 }, children);
66});
67
68var useStore = function useStore() {
69 return React.useContext(stateManager.AppContext);
70};
71
72var roudexInitializer = function roudexInitializer(initialState, payloadCreators, createPayloadFromUrl, createPathFromState, _temp) {
73 var _ref4 = _temp === void 0 ? {} : _temp,
74 _ref4$logger = _ref4.logger,
75 logger = _ref4$logger === void 0 ? process.env.NODE_ENV === 'production' ? null : defaultLogger : _ref4$logger;
76
77 if ('_serial' in initialState) throw new Error('The `_serial` property in `initialState` is managed automatically.\n' + ("You shouldn't provide it.\ninitialState:\n" + initialState));
78 stateManager.defaultInitialState = initialState;
79 initialState._serial = 0;
80 stateManager.AppContext = React__default.createContext({
81 state: {},
82 dp: {},
83 dispatch: null
84 });
85 stateManager.payloadCreators = payloadCreators;
86
87 stateManager.rootReducer = function (state, action) {
88 if (action.state) {
89 if (action.payload) console.warn('The action provides both `payload` and `state`!\n' + 'Provided `payload` will be ignored.\naction:\n', action);
90 var _newState = action.state;
91 action.type += _newState._serial > state._serial ? 'FWD' : 'BACK';
92 logger === null || logger === void 0 ? void 0 : logger(state, action, _newState);
93 return _newState;
94 }
95
96 if (action.url) {
97 if (action.payload) console.warn('The action provides both `payload` and `url`!\n' + 'Provided `payload` will be ignored and overridden.\naction:\n', action);
98 action.payload = createPayloadFromUrl(action.url);
99 }
100
101 var payload = action.payload;
102
103 if (!payload) {
104 console.warn('No payload detected (directly or indirectly)!', {
105 action: action
106 });
107 return state;
108 }
109
110 var _graphReducer = graphReducer.graphReducer(state, payload),
111 noTransform = _graphReducer.noTransform,
112 newState = _graphReducer.newState;
113
114 var url0 = window.location.href;
115 var newUrl = new URL(url0).origin + createPathFromState(newState);
116
117 if (noTransform) {
118 if (newUrl === url0 && deepEqual(window.history.state, state)) logger === null || logger === void 0 ? void 0 : logger(state, action);else {
119 logger === null || logger === void 0 ? void 0 : logger(state, action, state);
120 window.history.replaceState(state, '', newUrl);
121 }
122 return state;
123 }
124
125 newState._serial++;
126 logger === null || logger === void 0 ? void 0 : logger(state, action, newState);
127 var replaceOrPushState = action.url || newUrl === url0 ? 'replaceState' : 'pushState';
128 window.history[replaceOrPushState](newState, '', newUrl);
129 return newState;
130 };
131
132 stateManager.initializer = function (defaultInitialState) {
133 var _window$history$state;
134
135 return stateManager.rootReducer((_window$history$state = window.history.state) != null ? _window$history$state : defaultInitialState, {
136 type: 'INIT',
137 url: window.location.href
138 });
139 };
140
141 var rootReducer = stateManager.rootReducer,
142 defaultInitialState = stateManager.defaultInitialState;
143 return {
144 StoreProvider: StoreProvider,
145 useStore: useStore,
146 rootReducer: rootReducer,
147 defaultInitialState: defaultInitialState
148 };
149};
150
151exports.roudexInitializer = roudexInitializer;
152//# sourceMappingURL=index.js.map