@focuson/redux
Version:
The tools needed to bind to redux, doesn't actually have a version of redux
85 lines (84 loc) • 5.41 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.makeLs = exports.makeFocusOnReduxStore = exports.focusOnMiddleware = exports.FocusOnReducer = exports.isFocusOnMassTxsAction = exports.isFocusOnSetMainAction = void 0;
const lens_1 = require("@focuson/lens");
const common_1 = require("exampleapp/src/common");
const focuson_1 = require("@focuson/focuson");
const utils_1 = require("@focuson/utils");
const pages_1 = require("@focuson/pages");
const toolkit_1 = require("@reduxjs/toolkit");
const redux_1 = require("redux");
const state_1 = require("@focuson/state");
function isFocusOnSetMainAction(f) {
return f.type === 'setMain';
}
exports.isFocusOnSetMainAction = isFocusOnSetMainAction;
function isFocusOnMassTxsAction(f) {
return f.type === 'massTxs';
}
exports.isFocusOnMassTxsAction = isFocusOnMassTxsAction;
const FocusOnReducer = (state, action) => {
var _a;
// @ts-ignore
const debug = (_a = state.debug) === null || _a === void 0 ? void 0 : _a.reduxDebug;
if (isFocusOnSetMainAction(action))
return action.s;
if (isFocusOnMassTxsAction(action)) {
if (debug)
console.log("FocusOnReducer- action is massTxs", action.type, action.txs.map(t => [t[0].description, t[1](t[0].getOption(action.s))]));
let result = (0, lens_1.massTransform)(action.s, ...action.txs);
if (debug)
console.log('finished FocusOnReducer/massTxs', result);
return result;
}
if (debug)
console.log('in reducer. I dont know what action it is', action);
return state;
};
exports.FocusOnReducer = FocusOnReducer;
function traceTransform(trace, s) {
// @ts-ignore
const debug = s.debug;
return (debug === null || debug === void 0 ? void 0 : debug.recordTrace) ? [[(0, focuson_1.traceL)(), old => [...old ? old : [], trace]]] : [];
}
const focusOnMiddleware = (config, context) => (store) => (dispatch) => (action) => __awaiter(void 0, void 0, void 0, function* () {
var _a, _b, _c;
if (!isFocusOnSetMainAction(action))
return dispatch(action);
const deleteRestCommands = [config.restL, () => []];
const { preMutate, postMutate, onError } = config;
const { s, reason } = action;
const debug = ((_a = s.debug) === null || _a === void 0 ? void 0 : _a.restDebug) === true || ((_b = s.debug) === null || _b === void 0 ? void 0 : _b.fetcherDebug) || ((_c = s.debug) === null || _c === void 0 ? void 0 : _c.reduxDebug);
const restCommands = (0, utils_1.safeArray)(config.restL.getOption(s));
(0, utils_1.errorMonad)(s, debug, onError, ['preMutateForPages', (0, pages_1.preMutateForPages)(context)], ['preMutate', preMutate], ['dispatch pre rests', s => dispatch({ type: 'massTxs', s, txs: [...traceTransform(reason, s), deleteRestCommands], comment: 'dispatchPreRests' })] //This updates the gui 'now' pre rest/fetcher goodness. We need to kill the rest commands to stop them being sent twice
);
const stateAfterImmediate = store.getState();
const focusOnDispatcher = (preTxs, rests) => (originalS) => {
dispatch({ type: 'massTxs', txs: [...preTxs, ...rests.flatMap(x => x.txs)], s: originalS, comment: 'fromFocusOnDispatcher' });
console.log('ending focusonDistpatcher', store.getState());
return store.getState();
};
let finalResultFn = (start, restCommands) => (0, utils_1.errorPromiseMonad)(onError)(start, debug, ['dispatchRestAndFetchCommands', (0, focuson_1.dispatchRestAndFetchCommands)(config, context, focusOnDispatcher)(restCommands)], ['postMutate', postMutate]);
const res = yield finalResultFn(stateAfterImmediate, restCommands);
const restsLoaded = config.restCountL.getOption(res);
if (debug)
console.log('restsLoaded were ', restsLoaded, (restsLoaded === null || restsLoaded === void 0 ? void 0 : restsLoaded.loopCount) === 0 ? 'will stop looping' : 'need to loop');
const finalResult = (restsLoaded === null || restsLoaded === void 0 ? void 0 : restsLoaded.loopCount) === 0 ? res : finalResultFn(res, []);
if (debug)
console.log('finalResult is ', finalResult);
return res;
});
exports.focusOnMiddleware = focusOnMiddleware;
const makeFocusOnReduxStore = (config, context) => (0, toolkit_1.legacy_createStore)(exports.FocusOnReducer, undefined, (0, redux_1.applyMiddleware)((0, exports.focusOnMiddleware)(config, context)));
exports.makeFocusOnReduxStore = makeFocusOnReduxStore;
function makeLs(store, desc) { return (0, state_1.lensState)(store.getState(), (s, reason) => store.dispatch({ type: 'setMain', s, reason }), desc, common_1.context); }
exports.makeLs = makeLs;