1 | function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
|
2 |
|
3 | var deepEqual = _interopDefault(require('@rahazad/deep-equal'));
|
4 | var graphReducer = require('@rahazad/graph-reducer');
|
5 | var React = require('react');
|
6 | var React__default = _interopDefault(React);
|
7 |
|
8 | var 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 |
|
22 | var stateManager = {};
|
23 | var 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 React__default.createElement(AppContext.Provider, {
|
60 | value: {
|
61 | state: state,
|
62 | dp: dp,
|
63 | dispatch: dispatch
|
64 | }
|
65 | }, children);
|
66 | });
|
67 |
|
68 | var useStore = function useStore() {
|
69 | return React.useContext(stateManager.AppContext);
|
70 | };
|
71 |
|
72 | var 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 |
|
151 | exports.roudexInitializer = roudexInitializer;
|
152 |
|