Repository URL to install this package:
|
Version:
1.2.0 ▾
|
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.dataFactory = dataFactory;
exports.default = void 0;
var _react = _interopRequireDefault(require("react"));
var _mobxReact = require("xmobx/mobx-react");
var _reactJobs = require("../SSR/react-jobs");
var _identifier = require("../identifier");
var _router = require("../router");
var _oneState = require("./oneState");
var _deps = require("./deps");
var _jsxFileName = "observable-container/oneConnect.js";
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
// @TODO
// import { ContainerBase } from 'modules/chain-able/container-builder'
// class OneConnect extends ContainerBase {}
// -------------------- ONE CONNECT FACTORY ------------
// declare class ProvidedInjectedReactComponent extends Provider, Inject, React.Component { }
// declare function handleStoreAndDataFromApi(store: typeof OmniStoreType, dataFromApi: Serializable): any
// declare function fetchApiDataFunction(routerEntries: typeof RouterEntries): Promise<Serializable>
// @TODO need to pass in unique sometime with chain extension
// if (arguments.length)
function dataFactory(dataToStoreHandler, functionToCallApis, handleProps = _deps.tapProps) {
const addServerSideRendering = (0, _reactJobs.withJob)({
work: functionToCallApis,
shouldWorkAgain: _router.isUniqueRouteChange
});
/**
* @param {React.Component} Target component to decorate
* @return {React.Component} decorated & injected & observer
*/
return function (Target) {
var _class;
// @NOTE IMPORTANT, MUST MAKE TARGET COMPONENT ITSELF AN OBSERVER
const ViewComponent = (0, _mobxReact.observer)(Target); // annoying we still need this <<< remove this, is only used in state/user
// @inject('store')
let Decorated = (0, _mobxReact.observer)(_class = class Decorated extends _react.default.Component {
componentWillMount() {
const _handleProps = handleProps(this.props, false),
store = _handleProps.store,
omniStore = _handleProps.omniStore,
jobResult = _handleProps.jobResult;
return dataToStoreHandler(store, jobResult);
}
componentWillReceiveProps(nextProps) {
if (nextProps.jobResult.identifier !== this.props.jobResult.identifier) {
const store = this.props.store || _oneState.omniContainer.store;
console.dev('Reacted with componentWillRecieveProps');
return dataToStoreHandler(store, nextProps.jobResult);
}
return false;
}
componentWillReact() {
const _handleProps2 = handleProps(this.props, false),
store = _handleProps2.store,
jobResult = _handleProps2.jobResult;
console.dev('Reacted with componentWillReact');
return dataToStoreHandler(store, jobResult);
}
render() {
return _react.default.createElement(ViewComponent, _extends({}, handleProps(this.props), {
__source: {
fileName: _jsxFileName,
lineNumber: 79
},
__self: this
}));
}
}) || _class; // @TODO take this back out again
// Decorated.prototype.componentWillReceiveProps = componentWillReceiveProps
// @see examples/end-to-end state example
// Decorated.displayName = wrapDisplayName(Target, 'OneConnect')
Decorated.displayName = '1Connect(' + (0, _identifier.toComponentName)(Target) + ')';
Decorated.originalWrappedComponent = Target;
return addServerSideRendering(Decorated);
};
}
var _default = dataFactory;
exports.default = _default;