├── .babelrc ├── .editorconfig ├── .eslintignore ├── .eslintrc ├── .gitignore ├── .npmignore ├── .travis.yml ├── LICENSE ├── README.md ├── dist ├── CloudCode │ ├── actions.js │ ├── actionsClass.js │ ├── cloudCodeActions.js │ ├── index.js │ ├── prop-types.js │ ├── reducerHandler.js │ ├── saga.js │ ├── selectors.js │ └── store.js ├── Collection │ ├── actions.js │ ├── collectionActions.js │ ├── index.js │ ├── prop-types.js │ ├── reducerHandler.js │ ├── saga.js │ ├── selectors.js │ ├── store.js │ └── workers │ │ ├── deleteDoc.js │ │ ├── fetchCollection.js │ │ ├── postDoc.js │ │ ├── putDoc.js │ │ └── refreshCollection.js ├── Document │ ├── Document.js │ ├── actions.js │ ├── documentActions.js │ ├── index.js │ ├── prop-types.js │ ├── reducerHandler.js │ ├── saga.js │ ├── selectors.js │ ├── store.js │ └── workers │ │ ├── deleteDoc.js │ │ ├── fetchDoc.js │ │ ├── postDoc.js │ │ └── putDoc.js ├── InitialState.js ├── Loader │ ├── index.js │ ├── prop-types.js │ ├── selectors.js │ └── store.js ├── actions.js ├── helpers │ └── index.js ├── index.js ├── reducer.js ├── saga.js ├── selectors.js ├── server │ ├── ErrorHandle.js │ ├── Logger.js │ ├── api.js │ ├── httpWrapper.js │ ├── index.js │ └── util │ │ └── uploadFiles.js └── types.js ├── logo.svg ├── package.json └── src ├── CloudCode ├── actions.js ├── cloudCodeActions.js ├── index.js ├── prop-types.js ├── reducerHandler.js ├── saga.js ├── selectors.js └── store.js ├── Collection ├── actions.js ├── collectionActions.js ├── index.js ├── prop-types.js ├── reducerHandler.js ├── saga.js ├── selectors.js ├── store.js └── workers │ ├── deleteDoc.js │ ├── fetchCollection.js │ ├── postDoc.js │ ├── putDoc.js │ └── refreshCollection.js ├── Document ├── Document.js ├── actions.js ├── documentActions.js ├── index.js ├── prop-types.js ├── reducerHandler.js ├── saga.js ├── selectors.js ├── store.js └── workers │ ├── deleteDoc.js │ ├── fetchDoc.js │ ├── postDoc.js │ └── putDoc.js ├── InitialState.js ├── Loader ├── index.js ├── prop-types.js ├── selectors.js └── store.js ├── actions.js ├── helpers └── index.js ├── index.js ├── reducer.js ├── saga.js ├── selectors.js ├── server ├── ErrorHandle.js ├── Logger.js ├── api.js ├── httpWrapper.js ├── index.js └── util │ └── uploadFiles.js └── types.js /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["es2015", "react"], 3 | "plugins": ["transform-regenerator"] 4 | } -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig helps developers define and maintain 2 | # consistent coding styles between different editors and IDEs. 3 | 4 | root = true 5 | 6 | [*] 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | indent_style = space 12 | indent_size = 2 13 | 14 | [*.md] 15 | trim_trailing_whitespace = false 16 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | test 2 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "parser": "babel-eslint", 3 | "extends": "airbnb", 4 | "env": { 5 | "mocha": true 6 | }, 7 | "rules": { 8 | "comma-dangle": ["error", "only-multiline"] 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | 6 | # Runtime data 7 | pids 8 | *.pid 9 | *.seed 10 | 11 | # Directory for instrumented libs generated by jscoverage/JSCover 12 | lib-cov 13 | 14 | # Coverage directory used by tools like istanbul 15 | coverage 16 | 17 | # nyc test coverage 18 | .nyc_output 19 | 20 | # Compiled binary addons (http://nodejs.org/api/addons.html) 21 | build/Release 22 | 23 | # Dependency directories 24 | node_modules 25 | jspm_packages 26 | 27 | # Optional npm cache directory 28 | .npm 29 | 30 | # Optional REPL history 31 | .node_repl_history 32 | 33 | # Editors 34 | .idea 35 | 36 | # Lib 37 | lib 38 | 39 | # npm package lock 40 | package-lock.json 41 | yarn.lock 42 | 43 | others 44 | .DS_Store -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | *.log 2 | npm-debug.log* 3 | 4 | # Coverage directory used by tools like istanbul 5 | coverage 6 | .nyc_output 7 | 8 | # Dependency directories 9 | node_modules 10 | 11 | # Lib 12 | lib 13 | 14 | # npm package lock 15 | package-lock.json 16 | yarn.lock 17 | 18 | # project files 19 | src 20 | test 21 | examples 22 | CHANGELOG.md 23 | .travis.yml 24 | .editorconfig 25 | .eslintignore 26 | .eslintrc 27 | .babelrc 28 | .gitignore 29 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - '8' 4 | - '6' 5 | script: 6 | - npm run test 7 | - npm run build 8 | branches: 9 | only: 10 | - master 11 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2018 Dineshkumar Pandiyan 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /dist/CloudCode/actions.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | if (typeof define === "function" && define.amd) { 3 | define(['exports', '../types'], factory); 4 | } else if (typeof exports !== "undefined") { 5 | factory(exports, require('../types')); 6 | } else { 7 | var mod = { 8 | exports: {} 9 | }; 10 | factory(mod.exports, global.types); 11 | global.actions = mod.exports; 12 | } 13 | })(this, function (exports, _types) { 14 | 'use strict'; 15 | 16 | Object.defineProperty(exports, "__esModule", { 17 | value: true 18 | }); 19 | exports.cleanCloudCode = exports.cleanData = exports.setOnStore = exports.fetchData = undefined; 20 | 21 | var _types2 = _interopRequireDefault(_types); 22 | 23 | function _interopRequireDefault(obj) { 24 | return obj && obj.__esModule ? obj : { 25 | default: obj 26 | }; 27 | } 28 | 29 | var FETCH_CLOUD_CODE = _types2.default.FETCH_CLOUD_CODE, 30 | SET_CLOUD_CODE = _types2.default.SET_CLOUD_CODE, 31 | CLEAN_CLOUD_CODE = _types2.default.CLEAN_CLOUD_CODE, 32 | CLEAN_ALL_CLOUD_CODE = _types2.default.CLEAN_ALL_CLOUD_CODE; 33 | 34 | 35 | /** 36 | * fetchData 37 | * get data from parse server cloud code by function and find the data 38 | * on redux store by targetName 39 | * @param {object} payload {functionName, targetName, params, digToData, dataHandler, dispatchId} 40 | */ 41 | var fetchData = exports.fetchData = function fetchData(payload) { 42 | return { 43 | type: FETCH_CLOUD_CODE, 44 | payload: payload 45 | }; 46 | }; 47 | 48 | /** 49 | * setOnStore 50 | * set and update data on store.parse.clodeCodes by targetName 51 | * @param {object} payload {targetName, status, data, info, error, dispatchId} 52 | */ 53 | var setOnStore = exports.setOnStore = function setOnStore(payload) { 54 | return { 55 | type: SET_CLOUD_CODE, 56 | payload: payload 57 | }; 58 | }; 59 | 60 | /** 61 | * cleanData 62 | * clean data from store by target name 63 | * @param {object} payload 64 | * @param {string} payload.targetName 65 | */ 66 | var cleanData = exports.cleanData = function cleanData(payload) { 67 | return { 68 | type: CLEAN_CLOUD_CODE, 69 | payload: payload 70 | }; 71 | }; 72 | 73 | /** 74 | * cleanCloudCode 75 | * clean all data inside cloudCode 76 | */ 77 | var cleanCloudCode = exports.cleanCloudCode = function cleanCloudCode() { 78 | return { 79 | type: CLEAN_ALL_CLOUD_CODE 80 | }; 81 | }; 82 | }); -------------------------------------------------------------------------------- /dist/CloudCode/actionsClass.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | if (typeof define === "function" && define.amd) { 3 | define(["exports"], factory); 4 | } else if (typeof exports !== "undefined") { 5 | factory(exports); 6 | } else { 7 | var mod = { 8 | exports: {} 9 | }; 10 | factory(mod.exports); 11 | global.actionsClass = mod.exports; 12 | } 13 | })(this, function (exports) { 14 | "use strict"; 15 | 16 | (function (global, factory) { 17 | if (typeof define === "function" && define.amd) { 18 | define([], factory); 19 | } else if (typeof exports !== "undefined") { 20 | factory(); 21 | } else { 22 | var mod = { 23 | exports: {} 24 | }; 25 | factory(); 26 | global.actionsClass = mod.exports; 27 | } 28 | })(undefined, function () { 29 | "use strict"; 30 | }); 31 | }); -------------------------------------------------------------------------------- /dist/CloudCode/cloudCodeActions.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | if (typeof define === "function" && define.amd) { 3 | define(['exports', './actions', '../index'], factory); 4 | } else if (typeof exports !== "undefined") { 5 | factory(exports, require('./actions'), require('../index')); 6 | } else { 7 | var mod = { 8 | exports: {} 9 | }; 10 | factory(mod.exports, global.actions, global.index); 11 | global.cloudCodeActions = mod.exports; 12 | } 13 | })(this, function (exports, _actions, _index) { 14 | 'use strict'; 15 | 16 | Object.defineProperty(exports, "__esModule", { 17 | value: true 18 | }); 19 | exports.cleanCloudsCode = exports.cleanData = exports.fetchData = undefined; 20 | 21 | var actions = _interopRequireWildcard(_actions); 22 | 23 | function _interopRequireWildcard(obj) { 24 | if (obj && obj.__esModule) { 25 | return obj; 26 | } else { 27 | var newObj = {}; 28 | 29 | if (obj != null) { 30 | for (var key in obj) { 31 | if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; 32 | } 33 | } 34 | 35 | newObj.default = obj; 36 | return newObj; 37 | } 38 | } 39 | 40 | /** functionName, targetName, params, digToData 41 | * Dispatch action to post cloud code function 42 | * @param {object} payload 43 | * @param {string} payload.functionName functionName in the parse clouds 44 | * @param {string} payload.targetName key to store response inside redux store 45 | * if targetName empty then we use functionName as targetName 46 | * @param {object} payload.params request params 47 | * @param {string} payload.digToData string that help us find your data, default is data.result 48 | * @param {object} payload.logger pass to your Logger relevant info 49 | * @param {function} payload.dataHandler pass function that manipulate data before set to store 50 | * @param {function} payload.dispatchId optional, you can pass some unique key to help you follow specific query status 51 | * 52 | */ 53 | var fetchData = exports.fetchData = function fetchData(payload) { 54 | (0, _index.dispatch)(actions.fetchData(payload)); 55 | }; 56 | /** 57 | * Dispatch action to clean cloud code by targetName 58 | * @param {object} payload 59 | * @param {string} payload.targetName 60 | * @param {object} payload.logger pass to your Logger relevant info 61 | * 62 | */ 63 | var cleanData = exports.cleanData = function cleanData(payload) { 64 | (0, _index.dispatch)(actions.cleanData(payload)); 65 | }; 66 | /** 67 | * Dispatch action to clean all cloud code 68 | * 69 | */ 70 | var cleanCloudsCode = exports.cleanCloudsCode = function cleanCloudsCode() { 71 | (0, _index.dispatch)(actions.cleanCloudCode()); 72 | }; 73 | }); -------------------------------------------------------------------------------- /dist/CloudCode/prop-types.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | if (typeof define === "function" && define.amd) { 3 | define(['exports', 'prop-types'], factory); 4 | } else if (typeof exports !== "undefined") { 5 | factory(exports, require('prop-types')); 6 | } else { 7 | var mod = { 8 | exports: {} 9 | }; 10 | factory(mod.exports, global.propTypes); 11 | global.propTypes = mod.exports; 12 | } 13 | })(this, function (exports, _propTypes) { 14 | 'use strict'; 15 | 16 | Object.defineProperty(exports, "__esModule", { 17 | value: true 18 | }); 19 | exports.defaultProps = exports.propTypes = undefined; 20 | 21 | var _propTypes2 = _interopRequireDefault(_propTypes); 22 | 23 | function _interopRequireDefault(obj) { 24 | return obj && obj.__esModule ? obj : { 25 | default: obj 26 | }; 27 | } 28 | 29 | var propTypes = exports.propTypes = { 30 | /** 31 | * Cloud Function name 32 | * look at: http://docs.parseplatform.org/rest/guide/#cloud-code 33 | */ 34 | functionName: _propTypes2.default.string.isRequired, 35 | /** 36 | * targetName 37 | * place to set server response - store.cloudCodes[targetName] 38 | * optional- if empty then target is functionName 39 | */ 40 | targetName: _propTypes2.default.string, 41 | /** 42 | * params 43 | * object with parameters that pass on fetch 44 | * example {objectId:'59D454c'} 45 | */ 46 | params: _propTypes2.default.object, 47 | /** 48 | * onFetchEnd 49 | * call back after fetch end 50 | * onFetchEnd(error, {data, queryStatus}) 51 | */ 52 | onFetchEnd: _propTypes2.default.func, 53 | /** 54 | * leaveClean 55 | * we remove data from store on componentWillUnmount 56 | * default is true 57 | */ 58 | leaveClean: _propTypes2.default.bool, 59 | /** 60 | * localFirst 61 | * fetch data from server only if we can found your data on local store 62 | */ 63 | localFirst: _propTypes2.default.bool, 64 | /** 65 | * localOnly 66 | * never fetch data from store 67 | */ 68 | localOnly: _propTypes2.default.bool, // get data only from local store 69 | /** 70 | * digToData 71 | * the location of the data on server response 72 | * default is 'data.result' 73 | */ 74 | digToData: _propTypes2.default.string, 75 | /** 76 | * render props - pass function that get props and return component. 77 | * (error, props) => 78 | * props = { 79 | * data, 80 | queryStatus, 81 | isLoading, 82 | info, 83 | refreshData 84 | } 85 | */ 86 | render: _propTypes2.default.func, 87 | /** 88 | * dataHandler 89 | * pass function that manipulate data before set to store 90 | */ 91 | dataHandler: _propTypes2.default.func 92 | }; 93 | 94 | var defaultProps = exports.defaultProps = { 95 | digToData: 'data.result', 96 | leaveClean: true, 97 | onFetchEnd: function onFetchEnd() {}, 98 | fetchPropsKey: 'fetchProps' 99 | }; 100 | }); -------------------------------------------------------------------------------- /dist/CloudCode/reducerHandler.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | if (typeof define === "function" && define.amd) { 3 | define(['exports', '../types', 'lodash/isObject', 'immutable'], factory); 4 | } else if (typeof exports !== "undefined") { 5 | factory(exports, require('../types'), require('lodash/isObject'), require('immutable')); 6 | } else { 7 | var mod = { 8 | exports: {} 9 | }; 10 | factory(mod.exports, global.types, global.isObject, global.immutable); 11 | global.reducerHandler = mod.exports; 12 | } 13 | })(this, function (exports, _types, _isObject, _require) { 14 | 'use strict'; 15 | 16 | Object.defineProperty(exports, "__esModule", { 17 | value: true 18 | }); 19 | exports.default = reducerHandler; 20 | 21 | var _types2 = _interopRequireDefault(_types); 22 | 23 | var _isObject2 = _interopRequireDefault(_isObject); 24 | 25 | function _interopRequireDefault(obj) { 26 | return obj && obj.__esModule ? obj : { 27 | default: obj 28 | }; 29 | } 30 | 31 | var Map = _require.Map, 32 | fromJS = _require.fromJS; 33 | 34 | 35 | // This is not a reducer, return null if it is not a relevant action. 36 | 37 | function reducerHandler(state, action) { 38 | var payload = action.payload; 39 | 40 | var _ref = payload || {}, 41 | targetName = _ref.targetName, 42 | status = _ref.status, 43 | data = _ref.data, 44 | info = _ref.info, 45 | error = _ref.error, 46 | loading = _ref.loading, 47 | dispatchId = _ref.dispatchId; 48 | 49 | switch (action.type) { 50 | // Cloud code 51 | case _types2.default.SET_CLOUD_CODE: 52 | { 53 | var nextState = state; 54 | if (!nextState.cloudCodes.get(targetName)) { 55 | nextState = nextState.setIn(['cloudCodes', targetName], Map()); 56 | } 57 | if ('status' in payload) { 58 | nextState = nextState.setIn(['cloudCodes', targetName, 'status'], status); 59 | } 60 | if ('data' in payload) { 61 | var _data = void 0; // Cloud code can return a dynamic value, not only arr/obj 62 | if ((0, _isObject2.default)(data)) { 63 | _data = data; 64 | } else { 65 | _data = { value: data }; 66 | } 67 | nextState = nextState.setIn(['cloudCodes', targetName, 'data'], fromJS(data)); 68 | } 69 | if ('info' in payload) { 70 | nextState = nextState.setIn(['cloudCodes', targetName, 'info'], info); 71 | } 72 | if ('error' in payload) { 73 | nextState = nextState.setIn(['cloudCodes', targetName, 'error'], error); 74 | } 75 | if ('loading' in payload) { 76 | nextState = nextState.setIn(['cloudCodes', targetName, 'loading'], loading); 77 | } 78 | if ('dispatchId' in payload) { 79 | nextState = nextState.setIn(['cloudCodes', targetName, 'dispatchId'], dispatchId); 80 | } 81 | return nextState; 82 | } 83 | case _types2.default.CLEAN_CLOUD_CODE: 84 | { 85 | var clouds = state.cloudCodes.delete(targetName); 86 | return state.set('cloudCodes', clouds); 87 | } 88 | case _types2.default.CLEAN_ALL_CLOUD_CODE: 89 | { 90 | return state.set('cloudCodes', Map()); 91 | } 92 | default: 93 | return null; 94 | } 95 | } 96 | }); -------------------------------------------------------------------------------- /dist/CloudCode/saga.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | if (typeof define === "function" && define.amd) { 3 | define(['exports', 'regenerator-runtime', 'redux-saga/effects', '../server/httpWrapper', '../types', '../server/api', '../helpers', './actions', '../server/Logger'], factory); 4 | } else if (typeof exports !== "undefined") { 5 | factory(exports, require('regenerator-runtime'), require('redux-saga/effects'), require('../server/httpWrapper'), require('../types'), require('../server/api'), require('../helpers'), require('./actions'), require('../server/Logger')); 6 | } else { 7 | var mod = { 8 | exports: {} 9 | }; 10 | factory(mod.exports, global.regeneratorRuntime, global.effects, global.httpWrapper, global.types, global.api, global.helpers, global.actions, global.Logger); 11 | global.saga = mod.exports; 12 | } 13 | })(this, function (exports, _regeneratorRuntime, _effects, _httpWrapper, _types, _api, _helpers, _actions, _Logger) { 14 | 'use strict'; 15 | 16 | Object.defineProperty(exports, "__esModule", { 17 | value: true 18 | }); 19 | exports.default = fetchCloudCode; 20 | 21 | var _regeneratorRuntime2 = _interopRequireDefault(_regeneratorRuntime); 22 | 23 | var _httpWrapper2 = _interopRequireDefault(_httpWrapper); 24 | 25 | var _types2 = _interopRequireDefault(_types); 26 | 27 | var _api2 = _interopRequireDefault(_api); 28 | 29 | var _Logger2 = _interopRequireDefault(_Logger); 30 | 31 | function _interopRequireDefault(obj) { 32 | return obj && obj.__esModule ? obj : { 33 | default: obj 34 | }; 35 | } 36 | 37 | var _marked = _regeneratorRuntime2.default.mark(fetchCloudCode); 38 | 39 | var START = _types2.default.FETCH_START; 40 | var FAILED = _types2.default.FETCH_FAILED; 41 | var FAILED_NETWORK = _types2.default.FETCH_FAILED_NETWORK; 42 | var FINISHED = _types2.default.FETCH_FINISHED; 43 | 44 | function fetchCloudCode(action) { 45 | var _action$payload, functionName, targetName, params, digToData, dataHandler, dispatchId, _digToData, target, _dispatchId, res, errType, _data, data; 46 | 47 | return _regeneratorRuntime2.default.wrap(function fetchCloudCode$(_context) { 48 | while (1) { 49 | switch (_context.prev = _context.next) { 50 | case 0: 51 | _action$payload = action.payload, functionName = _action$payload.functionName, targetName = _action$payload.targetName, params = _action$payload.params, digToData = _action$payload.digToData, dataHandler = _action$payload.dataHandler, dispatchId = _action$payload.dispatchId; 52 | _digToData = digToData || 'data.result'; 53 | target = targetName || functionName; 54 | _dispatchId = dispatchId || ''; 55 | _context.next = 6; 56 | return (0, _effects.put)((0, _actions.setOnStore)({ targetName: target, status: START, error: null, loading: true, dispatchId: _dispatchId })); 57 | 58 | case 6: 59 | _context.next = 8; 60 | return (0, _httpWrapper2.default)(_api2.default.getCloudFunction, functionName, params); 61 | 62 | case 8: 63 | res = _context.sent; 64 | 65 | if (!(res.error || (0, _helpers.dig)(res, 'response.data.error'))) { 66 | _context.next = 17; 67 | break; 68 | } 69 | 70 | errType = res.message === 'Network Error' ? FAILED_NETWORK : FAILED; 71 | _context.next = 13; 72 | return (0, _effects.put)((0, _actions.setOnStore)({ targetName: target, status: errType, error: res, loading: false, dispatchId: _dispatchId })); 73 | 74 | case 13: 75 | console.error('getCloudFunction err: ', functionName, res.error); 76 | _Logger2.default.onError('CLOUD_CODE', action, errType, res); 77 | _context.next = 22; 78 | break; 79 | 80 | case 17: 81 | _data = (0, _helpers.dig)(res, _digToData); 82 | data = dataHandler ? dataHandler(_data) : _data; 83 | _context.next = 21; 84 | return (0, _effects.put)((0, _actions.setOnStore)({ 85 | targetName: target, 86 | status: FINISHED, 87 | error: null, 88 | data: data, 89 | info: { 90 | params: params, 91 | timestamp: Date.now() 92 | }, 93 | loading: false, 94 | dispatchId: _dispatchId 95 | })); 96 | 97 | case 21: 98 | _Logger2.default.onSuccess('CLOUD_CODE', action, FINISHED, res); 99 | 100 | case 22: 101 | case 'end': 102 | return _context.stop(); 103 | } 104 | } 105 | }, _marked, this); 106 | } 107 | /* eslint no-unused-vars: "off" */ 108 | }); -------------------------------------------------------------------------------- /dist/CloudCode/selectors.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | if (typeof define === "function" && define.amd) { 3 | define(['exports', 'reselect', 'immutable', '../helpers'], factory); 4 | } else if (typeof exports !== "undefined") { 5 | factory(exports, require('reselect'), require('immutable'), require('../helpers')); 6 | } else { 7 | var mod = { 8 | exports: {} 9 | }; 10 | factory(mod.exports, global.reselect, global.immutable, global.helpers); 11 | global.selectors = mod.exports; 12 | } 13 | })(this, function (exports, _reselect, _immutable, _helpers) { 14 | 'use strict'; 15 | 16 | Object.defineProperty(exports, "__esModule", { 17 | value: true 18 | }); 19 | exports.getError = exports.getInfo = exports.getLoading = exports.getDispatchId = exports.getStatus = exports.getData = exports.getCloudCode = exports.getCloudCodes = undefined; 20 | 21 | 22 | var MAP = (0, _immutable.Map)(); 23 | 24 | var getTargetName = function getTargetName(state, targetName) { 25 | return targetName; 26 | }; 27 | 28 | // --- Cloud codes ---/ 29 | var getCloudCodes = exports.getCloudCodes = function getCloudCodes(state) { 30 | return state.parse.cloudCodes; 31 | }; 32 | // -- Get specific collections 33 | var getImmutableCloudCodes = (0, _reselect.createSelector)([getCloudCodes, getTargetName], function (cloudCodes, targetName) { 34 | return cloudCodes.get(targetName) || MAP; 35 | }); 36 | var getCloudCode = exports.getCloudCode = (0, _reselect.createSelector)(getImmutableCloudCodes, function (dataImmutable) { 37 | return dataImmutable.toJS(); 38 | }); 39 | var getData = exports.getData = (0, _reselect.createSelector)(getImmutableCloudCodes, function (dataImmutable) { 40 | return dataImmutable.get('data') && dataImmutable.get('data').toJS(); 41 | }); 42 | var getStatus = exports.getStatus = (0, _reselect.createSelector)(getImmutableCloudCodes, function (dataImmutable) { 43 | return dataImmutable.get('status'); 44 | }); 45 | var getDispatchId = exports.getDispatchId = (0, _reselect.createSelector)(getImmutableCloudCodes, function (dataImmutable) { 46 | return dataImmutable.get('dispatchId'); 47 | }); 48 | var getLoading = exports.getLoading = (0, _reselect.createSelector)(getImmutableCloudCodes, function (dataImmutable) { 49 | return (0, _helpers.isLoading)(dataImmutable.get('status')); 50 | }); 51 | var getInfo = exports.getInfo = (0, _reselect.createSelector)(getImmutableCloudCodes, function (dataImmutable) { 52 | return dataImmutable.get('info'); 53 | }); 54 | var getError = exports.getError = (0, _reselect.createSelector)(getImmutableCloudCodes, function (dataImmutable) { 55 | return dataImmutable.get('error'); 56 | }); 57 | }); -------------------------------------------------------------------------------- /dist/CloudCode/store.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | if (typeof define === "function" && define.amd) { 3 | define(['exports', 'react-redux', 'redux', './actions', './selectors'], factory); 4 | } else if (typeof exports !== "undefined") { 5 | factory(exports, require('react-redux'), require('redux'), require('./actions'), require('./selectors')); 6 | } else { 7 | var mod = { 8 | exports: {} 9 | }; 10 | factory(mod.exports, global.reactRedux, global.redux, global.actions, global.selectors); 11 | global.store = mod.exports; 12 | } 13 | })(this, function (exports, _reactRedux, _redux, _actions, _selectors) { 14 | 'use strict'; 15 | 16 | Object.defineProperty(exports, "__esModule", { 17 | value: true 18 | }); 19 | 20 | 21 | function mapStateToProps(state, props) { 22 | var keyForData = props.targetName || props.functionName; 23 | return { 24 | fetchData: (0, _selectors.getData)(state, keyForData), 25 | fetchStatus: (0, _selectors.getStatus)(state, keyForData), 26 | fetchInfo: (0, _selectors.getInfo)(state, keyForData), 27 | fetchError: (0, _selectors.getError)(state, keyForData), 28 | fetchDispatchId: (0, _selectors.getDispatchId)(state, keyForData) 29 | }; 30 | } 31 | 32 | function mapDispatchToProps(dispatch) { 33 | return { 34 | fetchActions: (0, _redux.bindActionCreators)({ fetchData: _actions.fetchData, cleanData: _actions.cleanData }, dispatch) 35 | }; 36 | } 37 | 38 | exports.default = function (comp) { 39 | return (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(comp); 40 | }; 41 | }); -------------------------------------------------------------------------------- /dist/Collection/actions.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | if (typeof define === "function" && define.amd) { 3 | define(['exports', '../types'], factory); 4 | } else if (typeof exports !== "undefined") { 5 | factory(exports, require('../types')); 6 | } else { 7 | var mod = { 8 | exports: {} 9 | }; 10 | factory(mod.exports, global.types); 11 | global.actions = mod.exports; 12 | } 13 | })(this, function (exports, _types) { 14 | 'use strict'; 15 | 16 | Object.defineProperty(exports, "__esModule", { 17 | value: true 18 | }); 19 | exports.cleanCollections = exports.cleanData = exports.postDoc = exports.putDoc = exports.deleteDoc = exports.setOnStore = exports.refreshCollection = exports.fetchData = undefined; 20 | 21 | var _types2 = _interopRequireDefault(_types); 22 | 23 | function _interopRequireDefault(obj) { 24 | return obj && obj.__esModule ? obj : { 25 | default: obj 26 | }; 27 | } 28 | 29 | var FETCH_COLLECTION = _types2.default.FETCH_COLLECTION, 30 | REFRESH_COLLECTION = _types2.default.REFRESH_COLLECTION, 31 | SET_COLLECTION = _types2.default.SET_COLLECTION, 32 | CLEAN_COLLECTION = _types2.default.CLEAN_COLLECTION, 33 | CLEAN_ALL_COLLECTIONS = _types2.default.CLEAN_ALL_COLLECTIONS, 34 | DELETE_COLLECTION_DOC = _types2.default.DELETE_COLLECTION_DOC, 35 | PUT_COLLECTION_DOC = _types2.default.PUT_COLLECTION_DOC, 36 | POST_COLLECTION_DOC = _types2.default.POST_COLLECTION_DOC; 37 | 38 | 39 | /** 40 | * fetchData 41 | * @param {obj} {schemaName, targetName, query, perPage, page, include, keys, enableCount, dataHandler, dispatchId, boomerang} 42 | */ 43 | var fetchData = exports.fetchData = function fetchData(payload) { 44 | return { 45 | type: FETCH_COLLECTION, 46 | payload: payload 47 | }; 48 | }; 49 | /** 50 | * refreshCollection 51 | * @param {obj} {payload.targetName} 52 | * @param {obj} {payload.dispatchId} 53 | */ 54 | var refreshCollection = exports.refreshCollection = function refreshCollection(payload) { 55 | return { 56 | type: REFRESH_COLLECTION, 57 | payload: payload 58 | }; 59 | }; 60 | 61 | /** 62 | * setOnStore 63 | * @param {*} payload {targetName, status, data, info, error, dispatchId, boomerang} 64 | */ 65 | var setOnStore = exports.setOnStore = function setOnStore(payload) { 66 | return { 67 | type: SET_COLLECTION, 68 | payload: payload 69 | }; 70 | }; 71 | 72 | /** 73 | * deleteDocument 74 | * @param {*} payload {schemaName, targetName, objectId, autoRefresh, dispatchId, boomerang} 75 | */ 76 | var deleteDoc = exports.deleteDoc = function deleteDoc(payload) { 77 | return { 78 | type: DELETE_COLLECTION_DOC, 79 | payload: payload 80 | }; 81 | }; 82 | 83 | /** 84 | * putDoc 85 | * @param {*} payload {schemaName, targetName, objectId, data, autoRefresh, filesIncluded, fileValueHandler, dispatchId, boomerang} 86 | */ 87 | var putDoc = exports.putDoc = function putDoc(payload) { 88 | return { 89 | type: PUT_COLLECTION_DOC, 90 | payload: payload 91 | }; 92 | }; 93 | 94 | /** 95 | * potDoc 96 | * @param {*} payload {schemaName, targetName, data, autoRefresh, filesIncluded, fileValueHandler, dispatchId, boomerang} 97 | */ 98 | var postDoc = exports.postDoc = function postDoc(payload) { 99 | return { 100 | type: POST_COLLECTION_DOC, 101 | payload: payload 102 | }; 103 | }; 104 | 105 | /** 106 | * cleanCollection 107 | * @param {*} payload {targetName} 108 | */ 109 | var cleanData = exports.cleanData = function cleanData(payload) { 110 | return { 111 | type: CLEAN_COLLECTION, 112 | payload: payload 113 | }; 114 | }; 115 | 116 | var cleanCollections = exports.cleanCollections = function cleanCollections() { 117 | return { 118 | type: CLEAN_ALL_COLLECTIONS 119 | }; 120 | }; 121 | }); -------------------------------------------------------------------------------- /dist/Collection/prop-types.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | if (typeof define === "function" && define.amd) { 3 | define(['exports', 'prop-types'], factory); 4 | } else if (typeof exports !== "undefined") { 5 | factory(exports, require('prop-types')); 6 | } else { 7 | var mod = { 8 | exports: {} 9 | }; 10 | factory(mod.exports, global.propTypes); 11 | global.propTypes = mod.exports; 12 | } 13 | })(this, function (exports, _propTypes) { 14 | 'use strict'; 15 | 16 | Object.defineProperty(exports, "__esModule", { 17 | value: true 18 | }); 19 | exports.propTypes = exports.defaultProps = undefined; 20 | 21 | var _propTypes2 = _interopRequireDefault(_propTypes); 22 | 23 | function _interopRequireDefault(obj) { 24 | return obj && obj.__esModule ? obj : { 25 | default: obj 26 | }; 27 | } 28 | 29 | var defaultProps = exports.defaultProps = { 30 | order: '-createdAt', 31 | autoRefresh: true, 32 | onFetchEnd: function onFetchEnd() {}, 33 | onPostEnd: function onPostEnd() {}, 34 | onPutEnd: function onPutEnd() {}, 35 | onDeleteEnd: function onDeleteEnd() {}, 36 | fetchPropsKey: 'fetchProps' 37 | }; 38 | 39 | var propTypes = exports.propTypes = { 40 | schemaName: _propTypes2.default.string.isRequired, 41 | /** 42 | * targetName 43 | * place to set server response - store.collections[targetName] 44 | * optional- if empty then target is schemaName 45 | */ 46 | targetName: _propTypes2.default.string, 47 | /** 48 | * query 49 | * object with parameters that pass on fetch 50 | * example {title:'59D454c'} 51 | */ 52 | query: _propTypes2.default.object, 53 | /** 54 | * limit 55 | * Limit the number of objects returned by the query 56 | */ 57 | limit: _propTypes2.default.number, 58 | /** 59 | * skip 60 | * Use with limit to paginate through results 61 | */ 62 | skip: _propTypes2.default.number, 63 | /** 64 | * enableCount 65 | * return the amount of results in data base 66 | */ 67 | enableCount: _propTypes2.default.bool, 68 | /** 69 | * keys 70 | * example: 'title,body' 71 | * Restrict the fields returned by the query 72 | */ 73 | keys: _propTypes2.default.string, 74 | /** 75 | * include 76 | * example: 'post,categories' 77 | * Use on Pointer columns to return the full object 78 | */ 79 | include: _propTypes2.default.string, 80 | /** 81 | * order 82 | * default is '-createdAt' 83 | * Specify a field to sort by 84 | */ 85 | order: _propTypes2.default.string, 86 | /** 87 | * onFetchEnd 88 | * call back after fetch end 89 | * onFetchEnd(error, {data, queryStatus}) 90 | */ 91 | onFetchEnd: _propTypes2.default.func, 92 | /** 93 | * onPostEnd 94 | * call back after fetch end 95 | * onPostEnd(error, {data, queryStatus}) 96 | */ 97 | onPostEnd: _propTypes2.default.func, 98 | /** 99 | * onPutEnd 100 | * call back after fetch end 101 | * onPutEnd(error, {data, queryStatus}) 102 | */ 103 | onPutEnd: _propTypes2.default.func, 104 | /** 105 | * onDeleteEnd 106 | * call back after fetch end 107 | * onDeleteEnd(error, {data, queryStatus}) 108 | */ 109 | onDeleteEnd: _propTypes2.default.func, 110 | /** 111 | * leaveClean 112 | * we remove data from store on componentWillUnmount 113 | * default is true 114 | */ 115 | leaveClean: _propTypes2.default.bool, 116 | /** 117 | * localFirst 118 | * fetch data from server only if we can found your data on local store 119 | */ 120 | localFirst: _propTypes2.default.bool, 121 | /** 122 | * localOnly 123 | * never fetch data from store 124 | */ 125 | localOnly: _propTypes2.default.bool, 126 | /** 127 | * autoRefresh 128 | * default true 129 | * Get data after each create/update/delete doc 130 | */ 131 | autoRefresh: _propTypes2.default.bool, 132 | /** 133 | * render props - pass function that get props and return component. 134 | * (error, props) => 135 | * props = { 136 | * data, 137 | isLoading, 138 | queryStatus, 139 | info, 140 | refreshData, 141 | deleteDocument, 142 | putDocument, 143 | postDocument 144 | } 145 | */ 146 | render: _propTypes2.default.func, 147 | /** 148 | * dataHandler 149 | * pass function that manipulate data before set to store 150 | */ 151 | dataHandler: _propTypes2.default.func 152 | }; 153 | }); -------------------------------------------------------------------------------- /dist/Collection/reducerHandler.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | if (typeof define === "function" && define.amd) { 3 | define(['exports', '../types', 'immutable'], factory); 4 | } else if (typeof exports !== "undefined") { 5 | factory(exports, require('../types'), require('immutable')); 6 | } else { 7 | var mod = { 8 | exports: {} 9 | }; 10 | factory(mod.exports, global.types, global.immutable); 11 | global.reducerHandler = mod.exports; 12 | } 13 | })(this, function (exports, _types, _require) { 14 | 'use strict'; 15 | 16 | Object.defineProperty(exports, "__esModule", { 17 | value: true 18 | }); 19 | exports.default = reducerHandler; 20 | 21 | var _types2 = _interopRequireDefault(_types); 22 | 23 | function _interopRequireDefault(obj) { 24 | return obj && obj.__esModule ? obj : { 25 | default: obj 26 | }; 27 | } 28 | 29 | var Map = _require.Map, 30 | List = _require.List; 31 | var SET_COLLECTION = _types2.default.SET_COLLECTION, 32 | CLEAN_COLLECTION = _types2.default.CLEAN_COLLECTION, 33 | CLEAN_ALL_COLLECTIONS = _types2.default.CLEAN_ALL_COLLECTIONS; 34 | 35 | // This is not a reducer, return null if it is not a relevant action. 36 | 37 | function reducerHandler(state, action) { 38 | var payload = action.payload; 39 | 40 | var _ref = payload || {}, 41 | targetName = _ref.targetName, 42 | status = _ref.status, 43 | data = _ref.data, 44 | info = _ref.info, 45 | error = _ref.error, 46 | loading = _ref.loading, 47 | dispatchId = _ref.dispatchId, 48 | boomerang = _ref.boomerang; 49 | 50 | switch (action.type) { 51 | case SET_COLLECTION: 52 | { 53 | var collection = state.collections.get(targetName); 54 | var nextState = state; 55 | if (!collection) { 56 | nextState = nextState.setIn(['collections', targetName], Map()); 57 | } 58 | if ('status' in payload) { 59 | nextState = nextState.setIn(['collections', targetName, 'status'], status); 60 | } 61 | if ('data' in payload) { 62 | nextState = nextState.setIn(['collections', targetName, 'data'], List(data)); 63 | } 64 | if ('info' in payload) { 65 | nextState = nextState.setIn(['collections', targetName, 'info'], info); 66 | } 67 | if ('error' in payload) { 68 | nextState = nextState.setIn(['collections', targetName, 'error'], error); 69 | } 70 | if ('loading' in payload) { 71 | nextState = nextState.setIn(['collections', targetName, 'loading'], loading); 72 | } 73 | if ('dispatchId' in payload) { 74 | nextState = nextState.setIn(['collections', targetName, 'dispatchId'], dispatchId); 75 | } 76 | if (boomerang) { 77 | nextState = nextState.setIn(['documents', targetName, 'boomerang'], boomerang); 78 | } 79 | return nextState; 80 | } 81 | case CLEAN_COLLECTION: 82 | { 83 | var collections = state.collections.delete(targetName); 84 | return state.set('collections', collections); 85 | } 86 | case CLEAN_ALL_COLLECTIONS: 87 | { 88 | return state.set('collections', Map()); 89 | } 90 | default: 91 | return null; 92 | } 93 | } 94 | }); -------------------------------------------------------------------------------- /dist/Collection/saga.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | if (typeof define === "function" && define.amd) { 3 | define(['exports', './workers/fetchCollection', './workers/refreshCollection', './workers/deleteDoc', './workers/putDoc', './workers/postDoc'], factory); 4 | } else if (typeof exports !== "undefined") { 5 | factory(exports, require('./workers/fetchCollection'), require('./workers/refreshCollection'), require('./workers/deleteDoc'), require('./workers/putDoc'), require('./workers/postDoc')); 6 | } else { 7 | var mod = { 8 | exports: {} 9 | }; 10 | factory(mod.exports, global.fetchCollection, global.refreshCollection, global.deleteDoc, global.putDoc, global.postDoc); 11 | global.saga = mod.exports; 12 | } 13 | })(this, function (exports, _fetchCollection, _refreshCollection, _deleteDoc, _putDoc, _postDoc) { 14 | 'use strict'; 15 | 16 | Object.defineProperty(exports, "__esModule", { 17 | value: true 18 | }); 19 | exports.refreshCollection = exports.postDoc = exports.putDoc = exports.deleteDoc = exports.fetchCollection = undefined; 20 | 21 | var _fetchCollection2 = _interopRequireDefault(_fetchCollection); 22 | 23 | var _refreshCollection2 = _interopRequireDefault(_refreshCollection); 24 | 25 | var _deleteDoc2 = _interopRequireDefault(_deleteDoc); 26 | 27 | var _putDoc2 = _interopRequireDefault(_putDoc); 28 | 29 | var _postDoc2 = _interopRequireDefault(_postDoc); 30 | 31 | function _interopRequireDefault(obj) { 32 | return obj && obj.__esModule ? obj : { 33 | default: obj 34 | }; 35 | } 36 | 37 | exports.fetchCollection = _fetchCollection2.default; 38 | exports.deleteDoc = _deleteDoc2.default; 39 | exports.putDoc = _putDoc2.default; 40 | exports.postDoc = _postDoc2.default; 41 | exports.refreshCollection = _refreshCollection2.default; 42 | }); -------------------------------------------------------------------------------- /dist/Collection/selectors.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | if (typeof define === "function" && define.amd) { 3 | define(['exports', 'reselect', '../helpers', 'immutable'], factory); 4 | } else if (typeof exports !== "undefined") { 5 | factory(exports, require('reselect'), require('../helpers'), require('immutable')); 6 | } else { 7 | var mod = { 8 | exports: {} 9 | }; 10 | factory(mod.exports, global.reselect, global.helpers, global.immutable); 11 | global.selectors = mod.exports; 12 | } 13 | })(this, function (exports, _reselect, _helpers, _immutable) { 14 | 'use strict'; 15 | 16 | Object.defineProperty(exports, "__esModule", { 17 | value: true 18 | }); 19 | exports.getError = exports.getCount = exports.getInfo = exports.getLoading = exports.getBoomerang = exports.getDispatchId = exports.getStatus = exports.getData = exports.getCollection = exports.getCollections = undefined; 20 | 21 | 22 | var MAP = (0, _immutable.Map)(); 23 | 24 | var getTargetName = function getTargetName(state, targetName) { 25 | return targetName; 26 | }; 27 | 28 | var getCollections = exports.getCollections = function getCollections(state) { 29 | return state.parse.collections; 30 | }; 31 | 32 | var getImmutableCollection = (0, _reselect.createSelector)([getCollections, getTargetName], function (collections, targetName) { 33 | return collections.get(targetName) || MAP; 34 | }); 35 | 36 | var getCollection = exports.getCollection = (0, _reselect.createSelector)(getImmutableCollection, function (dataImmutable) { 37 | return dataImmutable.toJS(); 38 | }); 39 | var getData = exports.getData = (0, _reselect.createSelector)(getImmutableCollection, function (dataImmutable) { 40 | return dataImmutable.get('data') && dataImmutable.get('data').toJS(); 41 | }); 42 | 43 | var getStatus = exports.getStatus = (0, _reselect.createSelector)(getImmutableCollection, function (dataImmutable) { 44 | return dataImmutable.get('status'); 45 | }); 46 | var getDispatchId = exports.getDispatchId = (0, _reselect.createSelector)(getImmutableCollection, function (dataImmutable) { 47 | return dataImmutable.get('dispatchId'); 48 | }); 49 | var getBoomerang = exports.getBoomerang = (0, _reselect.createSelector)(getImmutableCollection, function (dataImmutable) { 50 | return dataImmutable.get('boomerang'); 51 | }); 52 | var getLoading = exports.getLoading = (0, _reselect.createSelector)(getImmutableCollection, function (dataImmutable) { 53 | return (0, _helpers.isLoading)(dataImmutable.get('status')); 54 | }); 55 | 56 | var getInfo = exports.getInfo = (0, _reselect.createSelector)(getImmutableCollection, function (dataImmutable) { 57 | return dataImmutable.get('info'); 58 | }); 59 | var getCount = exports.getCount = (0, _reselect.createSelector)(getImmutableCollection, function (dataImmutable) { 60 | var info = dataImmutable.get('info') || {}; 61 | return info.count; 62 | }); 63 | 64 | var getError = exports.getError = (0, _reselect.createSelector)(getImmutableCollection, function (dataImmutable) { 65 | return dataImmutable.get('error'); 66 | }); 67 | }); -------------------------------------------------------------------------------- /dist/Collection/store.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | if (typeof define === "function" && define.amd) { 3 | define(['exports', 'react-redux', 'redux', './actions', './selectors'], factory); 4 | } else if (typeof exports !== "undefined") { 5 | factory(exports, require('react-redux'), require('redux'), require('./actions'), require('./selectors')); 6 | } else { 7 | var mod = { 8 | exports: {} 9 | }; 10 | factory(mod.exports, global.reactRedux, global.redux, global.actions, global.selectors); 11 | global.store = mod.exports; 12 | } 13 | })(this, function (exports, _reactRedux, _redux, _actions, _selectors) { 14 | 'use strict'; 15 | 16 | Object.defineProperty(exports, "__esModule", { 17 | value: true 18 | }); 19 | 20 | 21 | function mapStateToProps(state, props) { 22 | var keyForData = props.targetName || props.schemaName; 23 | return { 24 | fetchData: (0, _selectors.getData)(state, keyForData), 25 | fetchStatus: (0, _selectors.getStatus)(state, keyForData), 26 | fetchInfo: (0, _selectors.getInfo)(state, keyForData), 27 | fetchError: (0, _selectors.getError)(state, keyForData), 28 | fetchCount: (0, _selectors.getCount)(state, keyForData), 29 | fetchDispatchId: (0, _selectors.getDispatchId)(state, keyForData), 30 | fetchBoomerang: (0, _selectors.getBoomerang)(state, keyForData) 31 | }; 32 | } 33 | 34 | function mapDispatchToProps(dispatch) { 35 | return { 36 | fetchActions: (0, _redux.bindActionCreators)({ 37 | fetchData: _actions.fetchData, 38 | deleteDoc: _actions.deleteDoc, 39 | putDoc: _actions.putDoc, 40 | postDoc: _actions.postDoc, 41 | cleanData: _actions.cleanData 42 | }, dispatch) 43 | }; 44 | } 45 | 46 | exports.default = function (comp) { 47 | return (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(comp); 48 | }; 49 | }); -------------------------------------------------------------------------------- /dist/Collection/workers/deleteDoc.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | if (typeof define === "function" && define.amd) { 3 | define(['exports', 'regenerator-runtime', 'redux-saga/effects', '../../server/httpWrapper', '../../types', '../../server/api', '../../server/Logger', '../actions'], factory); 4 | } else if (typeof exports !== "undefined") { 5 | factory(exports, require('regenerator-runtime'), require('redux-saga/effects'), require('../../server/httpWrapper'), require('../../types'), require('../../server/api'), require('../../server/Logger'), require('../actions')); 6 | } else { 7 | var mod = { 8 | exports: {} 9 | }; 10 | factory(mod.exports, global.regeneratorRuntime, global.effects, global.httpWrapper, global.types, global.api, global.Logger, global.actions); 11 | global.deleteDoc = mod.exports; 12 | } 13 | })(this, function (exports, _regeneratorRuntime, _effects, _httpWrapper, _types, _api, _Logger, _actions) { 14 | 'use strict'; 15 | 16 | Object.defineProperty(exports, "__esModule", { 17 | value: true 18 | }); 19 | exports.default = deleteDoc; 20 | 21 | var _regeneratorRuntime2 = _interopRequireDefault(_regeneratorRuntime); 22 | 23 | var _httpWrapper2 = _interopRequireDefault(_httpWrapper); 24 | 25 | var _types2 = _interopRequireDefault(_types); 26 | 27 | var _api2 = _interopRequireDefault(_api); 28 | 29 | var _Logger2 = _interopRequireDefault(_Logger); 30 | 31 | function _interopRequireDefault(obj) { 32 | return obj && obj.__esModule ? obj : { 33 | default: obj 34 | }; 35 | } 36 | 37 | var _marked = _regeneratorRuntime2.default.mark(deleteDoc); 38 | 39 | var START = _types2.default.DELETE_START; 40 | var FAILED = _types2.default.DELETE_FAILED; 41 | var FAILED_NETWORK = _types2.default.DELETE_FAILED_NETWORK; 42 | var FINISHED = _types2.default.DELETE_FINISHED; 43 | 44 | function deleteDoc(action) { 45 | var _action$payload, targetName, schemaName, objectId, autoRefresh, dispatchId, boomerang, _dispatchId, target, res, errType; 46 | 47 | return _regeneratorRuntime2.default.wrap(function deleteDoc$(_context) { 48 | while (1) { 49 | switch (_context.prev = _context.next) { 50 | case 0: 51 | _action$payload = action.payload, targetName = _action$payload.targetName, schemaName = _action$payload.schemaName, objectId = _action$payload.objectId, autoRefresh = _action$payload.autoRefresh, dispatchId = _action$payload.dispatchId, boomerang = _action$payload.boomerang; 52 | _dispatchId = dispatchId || ''; 53 | target = targetName || schemaName; 54 | _context.next = 5; 55 | return (0, _effects.put)((0, _actions.setOnStore)({ targetName: target, status: START, error: null, loading: true, dispatchId: _dispatchId, boomerang: boomerang })); 56 | 57 | case 5: 58 | return _context.delegateYield((0, _httpWrapper2.default)(_api2.default.deleteObject, schemaName, objectId), 't0', 6); 59 | 60 | case 6: 61 | res = _context.t0; 62 | 63 | if (!res.error) { 64 | _context.next = 15; 65 | break; 66 | } 67 | 68 | errType = res.message === 'Network Error' ? FAILED_NETWORK : FAILED; 69 | 70 | console.error('deleteDoc err', schemaName, objectId, res.err); 71 | _context.next = 12; 72 | return (0, _effects.put)((0, _actions.setOnStore)({ targetName: target, status: errType, error: res, loading: false, dispatchId: _dispatchId, boomerang: boomerang })); 73 | 74 | case 12: 75 | _Logger2.default.onError('DELETE', action, errType, res); 76 | _context.next = 21; 77 | break; 78 | 79 | case 15: 80 | _context.next = 17; 81 | return (0, _effects.put)((0, _actions.setOnStore)({ targetName: target, status: FINISHED, error: null, loading: false, dispatchId: _dispatchId, boomerang: boomerang, info: { deleteDocId: objectId } })); 82 | 83 | case 17: 84 | _Logger2.default.onSuccess('DELETE', action, FINISHED, res); 85 | 86 | if (!autoRefresh) { 87 | _context.next = 21; 88 | break; 89 | } 90 | 91 | _context.next = 21; 92 | return (0, _effects.put)((0, _actions.refreshCollection)({ targetName: target })); 93 | 94 | case 21: 95 | case 'end': 96 | return _context.stop(); 97 | } 98 | } 99 | }, _marked, this); 100 | } 101 | /* eslint no-unused-vars: "off" */ 102 | }); -------------------------------------------------------------------------------- /dist/Collection/workers/fetchCollection.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | if (typeof define === "function" && define.amd) { 3 | define(['exports', 'regenerator-runtime', 'redux-saga/effects', '../../server/httpWrapper', '../../types', '../../server/api', '../actions', '../../helpers', '../../server/Logger'], factory); 4 | } else if (typeof exports !== "undefined") { 5 | factory(exports, require('regenerator-runtime'), require('redux-saga/effects'), require('../../server/httpWrapper'), require('../../types'), require('../../server/api'), require('../actions'), require('../../helpers'), require('../../server/Logger')); 6 | } else { 7 | var mod = { 8 | exports: {} 9 | }; 10 | factory(mod.exports, global.regeneratorRuntime, global.effects, global.httpWrapper, global.types, global.api, global.actions, global.helpers, global.Logger); 11 | global.fetchCollection = mod.exports; 12 | } 13 | })(this, function (exports, _regeneratorRuntime, _effects, _httpWrapper, _types, _api, _actions, _helpers, _Logger) { 14 | 'use strict'; 15 | 16 | Object.defineProperty(exports, "__esModule", { 17 | value: true 18 | }); 19 | exports.default = fetchCollection; 20 | 21 | var _regeneratorRuntime2 = _interopRequireDefault(_regeneratorRuntime); 22 | 23 | var _httpWrapper2 = _interopRequireDefault(_httpWrapper); 24 | 25 | var _types2 = _interopRequireDefault(_types); 26 | 27 | var _api2 = _interopRequireDefault(_api); 28 | 29 | var _Logger2 = _interopRequireDefault(_Logger); 30 | 31 | function _interopRequireDefault(obj) { 32 | return obj && obj.__esModule ? obj : { 33 | default: obj 34 | }; 35 | } 36 | 37 | var _marked = _regeneratorRuntime2.default.mark(fetchCollection); 38 | 39 | var START = _types2.default.FETCH_START; 40 | var FAILED = _types2.default.FETCH_FAILED; 41 | var FAILED_NETWORK = _types2.default.FETCH_FAILED_NETWORK; 42 | var FINISHED = _types2.default.FETCH_FINISHED; 43 | 44 | function fetchCollection(action) { 45 | var _action$payload, targetName, schemaName, query, skip, page, enableCount, keys, include, order, limit, dataHandler, dispatchId, boomerang, target, _dispatchId, res, errType, _data, data, info; 46 | 47 | return _regeneratorRuntime2.default.wrap(function fetchCollection$(_context) { 48 | while (1) { 49 | switch (_context.prev = _context.next) { 50 | case 0: 51 | _action$payload = action.payload, targetName = _action$payload.targetName, schemaName = _action$payload.schemaName, query = _action$payload.query, skip = _action$payload.skip, page = _action$payload.page, enableCount = _action$payload.enableCount, keys = _action$payload.keys, include = _action$payload.include, order = _action$payload.order, limit = _action$payload.limit, dataHandler = _action$payload.dataHandler, dispatchId = _action$payload.dispatchId, boomerang = _action$payload.boomerang; 52 | target = targetName || schemaName; 53 | _dispatchId = dispatchId || ''; 54 | _context.next = 5; 55 | return (0, _effects.put)((0, _actions.setOnStore)({ targetName: target, status: START, error: null, loading: true, dispatchId: _dispatchId, boomerang: boomerang })); 56 | 57 | case 5: 58 | return _context.delegateYield((0, _httpWrapper2.default)(_api2.default.query, schemaName, query, limit, skip, enableCount, keys, include, order), 't0', 6); 59 | 60 | case 6: 61 | res = _context.t0; 62 | 63 | if (!res.error) { 64 | _context.next = 15; 65 | break; 66 | } 67 | 68 | errType = res.message === 'Network Error' ? FAILED_NETWORK : FAILED; 69 | 70 | console.error('fetchCollection err: ', schemaName, res.error); 71 | _context.next = 12; 72 | return (0, _effects.put)((0, _actions.setOnStore)({ targetName: target, status: errType, error: res, loading: false, dispatchId: _dispatchId, boomerang: boomerang })); 73 | 74 | case 12: 75 | _Logger2.default.onError('GET', action, errType, res); 76 | _context.next = 21; 77 | break; 78 | 79 | case 15: 80 | _data = (0, _helpers.dig)(res, 'data.results'); 81 | data = dataHandler ? dataHandler(_data) : _data; 82 | info = { 83 | schemaName: schemaName, 84 | query: query, 85 | skip: skip, 86 | page: page, 87 | enableCount: enableCount, 88 | keys: keys, 89 | include: include, 90 | order: order, 91 | limit: limit, 92 | count: res.data.count, 93 | timestamp: Date.now() 94 | }; 95 | _context.next = 20; 96 | return (0, _effects.put)((0, _actions.setOnStore)({ 97 | targetName: target, 98 | status: FINISHED, 99 | error: null, 100 | data: data, 101 | info: info, 102 | loading: false, 103 | dispatchId: _dispatchId, 104 | boomerang: boomerang 105 | })); 106 | 107 | case 20: 108 | _Logger2.default.onSuccess('GET', action, FINISHED, res); 109 | 110 | case 21: 111 | case 'end': 112 | return _context.stop(); 113 | } 114 | } 115 | }, _marked, this); 116 | } 117 | /* eslint no-unused-vars: "off" */ 118 | }); -------------------------------------------------------------------------------- /dist/Collection/workers/postDoc.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | if (typeof define === "function" && define.amd) { 3 | define(['exports', 'regenerator-runtime', 'redux-saga/effects', '../../types', '../../server', '../actions', '../../helpers'], factory); 4 | } else if (typeof exports !== "undefined") { 5 | factory(exports, require('regenerator-runtime'), require('redux-saga/effects'), require('../../types'), require('../../server'), require('../actions'), require('../../helpers')); 6 | } else { 7 | var mod = { 8 | exports: {} 9 | }; 10 | factory(mod.exports, global.regeneratorRuntime, global.effects, global.types, global.server, global.actions, global.helpers); 11 | global.postDoc = mod.exports; 12 | } 13 | })(this, function (exports, _regeneratorRuntime, _effects, _types, _server, _actions, _helpers) { 14 | 'use strict'; 15 | 16 | Object.defineProperty(exports, "__esModule", { 17 | value: true 18 | }); 19 | exports.default = postDoc; 20 | 21 | var _regeneratorRuntime2 = _interopRequireDefault(_regeneratorRuntime); 22 | 23 | var _types2 = _interopRequireDefault(_types); 24 | 25 | function _interopRequireDefault(obj) { 26 | return obj && obj.__esModule ? obj : { 27 | default: obj 28 | }; 29 | } 30 | 31 | var _marked = _regeneratorRuntime2.default.mark(postDoc); 32 | 33 | var START = _types2.default.POST_START; 34 | var FAILED = _types2.default.POST_FAILED; 35 | var FAILED_NETWORK = _types2.default.POST_FAILED_NETWORK; 36 | var FINISHED = _types2.default.POST_FINISHED; 37 | 38 | function postDoc(action) { 39 | var _action$payload, schemaName, data, targetName, autoRefresh, filesIncluded, fileValueHandler, dispatchId, boomerang, _dispatchId, target, dataToSend, dataFileError, res, errType; 40 | 41 | return _regeneratorRuntime2.default.wrap(function postDoc$(_context) { 42 | while (1) { 43 | switch (_context.prev = _context.next) { 44 | case 0: 45 | _action$payload = action.payload, schemaName = _action$payload.schemaName, data = _action$payload.data, targetName = _action$payload.targetName, autoRefresh = _action$payload.autoRefresh, filesIncluded = _action$payload.filesIncluded, fileValueHandler = _action$payload.fileValueHandler, dispatchId = _action$payload.dispatchId, boomerang = _action$payload.boomerang; 46 | _dispatchId = dispatchId || ''; 47 | target = targetName || schemaName; 48 | _context.next = 5; 49 | return (0, _effects.put)((0, _actions.setOnStore)({ targetName: target, status: START, error: null, loading: true, dispatchId: _dispatchId, boomerang: boomerang })); 50 | 51 | case 5: 52 | dataToSend = void 0, dataFileError = void 0, res = null; 53 | _context.prev = 6; 54 | 55 | if (!filesIncluded) { 56 | _context.next = 12; 57 | break; 58 | } 59 | 60 | return _context.delegateYield((0, _server.uploadFilesFromData)(data, fileValueHandler), 't1', 9); 61 | 62 | case 9: 63 | _context.t0 = _context.t1; 64 | _context.next = 13; 65 | break; 66 | 67 | case 12: 68 | _context.t0 = data; 69 | 70 | case 13: 71 | dataToSend = _context.t0; 72 | 73 | dataToSend = (0, _helpers.removeImutableKeys)(data); 74 | _context.next = 22; 75 | break; 76 | 77 | case 17: 78 | _context.prev = 17; 79 | _context.t2 = _context['catch'](6); 80 | 81 | res = _context.t2; 82 | res.error = true; 83 | dataFileError = true; 84 | 85 | case 22: 86 | if (dataFileError) { 87 | _context.next = 25; 88 | break; 89 | } 90 | 91 | return _context.delegateYield((0, _server.httpRequest)(_server.api.createObject, schemaName, dataToSend), 't3', 24); 92 | 93 | case 24: 94 | res = _context.t3; 95 | 96 | case 25: 97 | if (!res.error) { 98 | _context.next = 33; 99 | break; 100 | } 101 | 102 | errType = res.message === 'Network Error' ? FAILED_NETWORK : FAILED; 103 | 104 | console.error('postDoc err', schemaName, res.err); 105 | _server.Logger.onError('POST', action, errType, res); 106 | _context.next = 31; 107 | return (0, _effects.put)((0, _actions.setOnStore)({ targetName: target, status: errType, error: res, loading: false, dispatchId: _dispatchId, boomerang: boomerang })); 108 | 109 | case 31: 110 | _context.next = 39; 111 | break; 112 | 113 | case 33: 114 | _context.next = 35; 115 | return (0, _effects.put)((0, _actions.setOnStore)({ targetName: target, status: FINISHED, error: null, loading: false, dispatchId: _dispatchId, boomerang: boomerang })); 116 | 117 | case 35: 118 | _server.Logger.onSuccess('POST', action, FINISHED, res); 119 | 120 | if (!autoRefresh) { 121 | _context.next = 39; 122 | break; 123 | } 124 | 125 | _context.next = 39; 126 | return (0, _effects.put)((0, _actions.refreshCollection)({ targetName: target })); 127 | 128 | case 39: 129 | case 'end': 130 | return _context.stop(); 131 | } 132 | } 133 | }, _marked, this, [[6, 17]]); 134 | } 135 | /* eslint no-unused-vars: "off" */ 136 | }); -------------------------------------------------------------------------------- /dist/Collection/workers/putDoc.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | if (typeof define === "function" && define.amd) { 3 | define(['exports', 'regenerator-runtime', 'redux-saga/effects', '../../types', '../../server', '../actions', '../../helpers'], factory); 4 | } else if (typeof exports !== "undefined") { 5 | factory(exports, require('regenerator-runtime'), require('redux-saga/effects'), require('../../types'), require('../../server'), require('../actions'), require('../../helpers')); 6 | } else { 7 | var mod = { 8 | exports: {} 9 | }; 10 | factory(mod.exports, global.regeneratorRuntime, global.effects, global.types, global.server, global.actions, global.helpers); 11 | global.putDoc = mod.exports; 12 | } 13 | })(this, function (exports, _regeneratorRuntime, _effects, _types, _server, _actions, _helpers) { 14 | 'use strict'; 15 | 16 | Object.defineProperty(exports, "__esModule", { 17 | value: true 18 | }); 19 | exports.default = putDoc; 20 | 21 | var _regeneratorRuntime2 = _interopRequireDefault(_regeneratorRuntime); 22 | 23 | var _types2 = _interopRequireDefault(_types); 24 | 25 | function _interopRequireDefault(obj) { 26 | return obj && obj.__esModule ? obj : { 27 | default: obj 28 | }; 29 | } 30 | 31 | var _marked = _regeneratorRuntime2.default.mark(putDoc); 32 | 33 | var START = _types2.default.PUT_START; 34 | var FAILED = _types2.default.PUT_FAILED; 35 | var FAILED_NETWORK = _types2.default.PUT_FAILED_NETWORK; 36 | var FINISHED = _types2.default.PUT_FINISHED; 37 | 38 | function putDoc(action) { 39 | var _action$payload, targetName, schemaName, objectId, data, autoRefresh, filesIncluded, fileValueHandler, dispatchId, boomerang, target, _dispatchId, dataToSend, dataFileError, res, errType; 40 | 41 | return _regeneratorRuntime2.default.wrap(function putDoc$(_context) { 42 | while (1) { 43 | switch (_context.prev = _context.next) { 44 | case 0: 45 | _action$payload = action.payload, targetName = _action$payload.targetName, schemaName = _action$payload.schemaName, objectId = _action$payload.objectId, data = _action$payload.data, autoRefresh = _action$payload.autoRefresh, filesIncluded = _action$payload.filesIncluded, fileValueHandler = _action$payload.fileValueHandler, dispatchId = _action$payload.dispatchId, boomerang = _action$payload.boomerang; 46 | target = targetName || schemaName; 47 | _dispatchId = dispatchId || ''; 48 | _context.next = 5; 49 | return (0, _effects.put)((0, _actions.setOnStore)({ targetName: target, status: START, error: null, loading: true, dispatchId: _dispatchId, boomerang: boomerang })); 50 | 51 | case 5: 52 | dataToSend = void 0, dataFileError = void 0, res = null; 53 | _context.prev = 6; 54 | 55 | if (!filesIncluded) { 56 | _context.next = 12; 57 | break; 58 | } 59 | 60 | return _context.delegateYield((0, _server.uploadFilesFromData)(data, fileValueHandler), 't1', 9); 61 | 62 | case 9: 63 | _context.t0 = _context.t1; 64 | _context.next = 13; 65 | break; 66 | 67 | case 12: 68 | _context.t0 = data; 69 | 70 | case 13: 71 | dataToSend = _context.t0; 72 | 73 | dataToSend = (0, _helpers.removeImutableKeys)(data); 74 | _context.next = 22; 75 | break; 76 | 77 | case 17: 78 | _context.prev = 17; 79 | _context.t2 = _context['catch'](6); 80 | 81 | res = _context.t2; 82 | res.error = true; 83 | dataFileError = true; 84 | 85 | case 22: 86 | if (dataFileError) { 87 | _context.next = 25; 88 | break; 89 | } 90 | 91 | return _context.delegateYield((0, _server.httpRequest)(_server.api.updateObject, schemaName, objectId, dataToSend), 't3', 24); 92 | 93 | case 24: 94 | res = _context.t3; 95 | 96 | case 25: 97 | if (!res.error) { 98 | _context.next = 33; 99 | break; 100 | } 101 | 102 | errType = res.message === 'Network Error' ? FAILED_NETWORK : FAILED; 103 | 104 | console.error('putDoc err', schemaName, objectId, res.err); 105 | _context.next = 30; 106 | return (0, _effects.put)((0, _actions.setOnStore)({ targetName: target, status: errType, error: res, loading: false, dispatchId: _dispatchId, boomerang: boomerang })); 107 | 108 | case 30: 109 | _server.Logger.onError('PUT', action, errType, res); 110 | _context.next = 39; 111 | break; 112 | 113 | case 33: 114 | _context.next = 35; 115 | return (0, _effects.put)((0, _actions.setOnStore)({ targetName: target, status: FINISHED, error: null, loading: false, dispatchId: _dispatchId, boomerang: boomerang })); 116 | 117 | case 35: 118 | _server.Logger.onSuccess('PUT', action, FINISHED, res); 119 | 120 | if (!autoRefresh) { 121 | _context.next = 39; 122 | break; 123 | } 124 | 125 | _context.next = 39; 126 | return (0, _effects.put)((0, _actions.refreshCollection)({ targetName: target })); 127 | 128 | case 39: 129 | case 'end': 130 | return _context.stop(); 131 | } 132 | } 133 | }, _marked, this, [[6, 17]]); 134 | } 135 | /* eslint no-unused-vars: "off" */ 136 | }); -------------------------------------------------------------------------------- /dist/Collection/workers/refreshCollection.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | if (typeof define === "function" && define.amd) { 3 | define(['exports', 'regenerator-runtime', 'redux-saga/effects', '../../types', '../actions', '../selectors'], factory); 4 | } else if (typeof exports !== "undefined") { 5 | factory(exports, require('regenerator-runtime'), require('redux-saga/effects'), require('../../types'), require('../actions'), require('../selectors')); 6 | } else { 7 | var mod = { 8 | exports: {} 9 | }; 10 | factory(mod.exports, global.regeneratorRuntime, global.effects, global.types, global.actions, global.selectors); 11 | global.refreshCollection = mod.exports; 12 | } 13 | })(this, function (exports, _regeneratorRuntime, _effects, _types, _actions, _selectors) { 14 | 'use strict'; 15 | 16 | Object.defineProperty(exports, "__esModule", { 17 | value: true 18 | }); 19 | exports.default = refreshCollection; 20 | 21 | var _regeneratorRuntime2 = _interopRequireDefault(_regeneratorRuntime); 22 | 23 | var _types2 = _interopRequireDefault(_types); 24 | 25 | function _interopRequireDefault(obj) { 26 | return obj && obj.__esModule ? obj : { 27 | default: obj 28 | }; 29 | } 30 | 31 | var _marked = _regeneratorRuntime2.default.mark(refreshCollection); 32 | 33 | var START = _types2.default.FETCH_START; 34 | var FAILED = _types2.default.FETCH_FAILED; 35 | var FAILED_NETWORK = _types2.default.FETCH_FAILED_NETWORK; 36 | var FINISHED = _types2.default.FETCH_FINISHED; 37 | 38 | function refreshCollection(action) { 39 | var _action$payload, targetName, dispatchId, _dispatchId, info; 40 | 41 | return _regeneratorRuntime2.default.wrap(function refreshCollection$(_context) { 42 | while (1) { 43 | switch (_context.prev = _context.next) { 44 | case 0: 45 | _action$payload = action.payload, targetName = _action$payload.targetName, dispatchId = _action$payload.dispatchId; 46 | _dispatchId = dispatchId || ''; 47 | _context.next = 4; 48 | return (0, _effects.select)(function (state) { 49 | return (0, _selectors.getInfo)(state, targetName); 50 | }); 51 | 52 | case 4: 53 | info = _context.sent; 54 | 55 | if (!(info && info.schemaName)) { 56 | _context.next = 8; 57 | break; 58 | } 59 | 60 | _context.next = 8; 61 | return (0, _effects.put)((0, _actions.fetchData)(Object.assign({}, info, { targetName: targetName, dispatchId: _dispatchId }))); 62 | 63 | case 8: 64 | case 'end': 65 | return _context.stop(); 66 | } 67 | } 68 | }, _marked, this); 69 | } 70 | /* eslint no-unused-vars: "off" */ 71 | }); -------------------------------------------------------------------------------- /dist/Document/actions.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | if (typeof define === "function" && define.amd) { 3 | define(['exports', '../types'], factory); 4 | } else if (typeof exports !== "undefined") { 5 | factory(exports, require('../types')); 6 | } else { 7 | var mod = { 8 | exports: {} 9 | }; 10 | factory(mod.exports, global.types); 11 | global.actions = mod.exports; 12 | } 13 | })(this, function (exports, _types) { 14 | 'use strict'; 15 | 16 | Object.defineProperty(exports, "__esModule", { 17 | value: true 18 | }); 19 | exports.cleanDocuments = exports.clearDocuments = exports.cleanData = exports.deleteDoc = exports.postDoc = exports.putDoc = exports.updateFields = exports.updateField = exports.setOnStore = exports.fetchData = undefined; 20 | 21 | var _types2 = _interopRequireDefault(_types); 22 | 23 | function _interopRequireDefault(obj) { 24 | return obj && obj.__esModule ? obj : { 25 | default: obj 26 | }; 27 | } 28 | 29 | var FETCH_DOCUMENT = _types2.default.FETCH_DOCUMENT, 30 | SET_DOCUMENT = _types2.default.SET_DOCUMENT, 31 | PUT_DOCUMENT = _types2.default.PUT_DOCUMENT, 32 | POST_DOCUMENT = _types2.default.POST_DOCUMENT, 33 | DELETE_DOCUMENT = _types2.default.DELETE_DOCUMENT, 34 | CLEAN_DOCUMENT = _types2.default.CLEAN_DOCUMENT, 35 | CLEAN_ALL_DOCUMENTS = _types2.default.CLEAN_ALL_DOCUMENTS, 36 | UPDATE_DOC_FIELD = _types2.default.UPDATE_DOC_FIELD, 37 | UPDATE_DOC_FIELDS = _types2.default.UPDATE_DOC_FIELDS; 38 | 39 | 40 | /** 41 | * fetchData 42 | * @param {object} payload {targetName, schemaName, objectId, include, keys} 43 | * @param {string} payload.targetName 44 | * @param {string} payload.schemaName 45 | * @param {string} payload.objectId 46 | * @param {string} payload.include 47 | * @param {string} payload.keys, 48 | * @param {function} payload.dataHandler, 49 | * @param {function} payload.dispatchId optional, you can pass some unique key to help you follow specific query status 50 | * @param {function} payload.boomerang optional, you can pass some data that help you manage your things with this async query 51 | * 52 | */ 53 | var fetchData = exports.fetchData = function fetchData(payload) { 54 | return { 55 | type: FETCH_DOCUMENT, 56 | payload: payload 57 | }; 58 | }; 59 | /** 60 | * setOnStore 61 | * @param {*} payload {targetName, status, data, info, error} 62 | * @param {*} data 63 | */ 64 | var setOnStore = exports.setOnStore = function setOnStore(payload) { 65 | return { 66 | type: SET_DOCUMENT, 67 | payload: payload 68 | }; 69 | }; 70 | 71 | /** 72 | * updateField 73 | * @param {*} payload {targetName, key, value} 74 | */ 75 | var updateField = exports.updateField = function updateField(payload) { 76 | return { 77 | type: UPDATE_DOC_FIELD, 78 | payload: payload 79 | }; 80 | }; 81 | 82 | /** 83 | * updateFields 84 | * @param {*} payload {targetName, key, value} 85 | */ 86 | var updateFields = exports.updateFields = function updateFields(payload) { 87 | return { 88 | type: UPDATE_DOC_FIELDS, 89 | payload: payload 90 | }; 91 | }; 92 | 93 | /** 94 | * putDoc 95 | * @param {*} payload {targetName, schemaName, objectId, data, filesIncluded, fileValueHandler, dispatchId, boomerang} 96 | */ 97 | var putDoc = exports.putDoc = function putDoc(payload) { 98 | return { 99 | type: PUT_DOCUMENT, 100 | payload: payload 101 | }; 102 | }; 103 | /** 104 | * postDoc 105 | * @param {*} payload {targetName, schemaName, data, filesIncluded, fileValueHandler, dispatchId, boomerang} 106 | */ 107 | var postDoc = exports.postDoc = function postDoc(payload) { 108 | return { 109 | type: POST_DOCUMENT, 110 | payload: payload 111 | }; 112 | }; 113 | /** 114 | * deleteDoc 115 | * @param {*} payload {targetName, schemaName,objectId, dispatchId, boomerang} 116 | */ 117 | var deleteDoc = exports.deleteDoc = function deleteDoc(payload) { 118 | return { 119 | type: DELETE_DOCUMENT, 120 | payload: payload 121 | }; 122 | }; 123 | 124 | /** 125 | * cleanData 126 | * @param {*} payload {targetName} 127 | */ 128 | var cleanData = exports.cleanData = function cleanData(payload) { 129 | return { 130 | type: CLEAN_DOCUMENT, 131 | payload: payload 132 | }; 133 | }; 134 | var clearDocuments = exports.clearDocuments = function clearDocuments() { 135 | return { 136 | type: CLEAN_ALL_DOCUMENTS 137 | }; 138 | }; 139 | var cleanDocuments = exports.cleanDocuments = function cleanDocuments() { 140 | return { 141 | type: CLEAN_ALL_DOCUMENTS 142 | }; 143 | }; 144 | }); -------------------------------------------------------------------------------- /dist/Document/index.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | if (typeof define === "function" && define.amd) { 3 | define(['exports', 'react', 'prop-types', '../helpers', './Document'], factory); 4 | } else if (typeof exports !== "undefined") { 5 | factory(exports, require('react'), require('prop-types'), require('../helpers'), require('./Document')); 6 | } else { 7 | var mod = { 8 | exports: {} 9 | }; 10 | factory(mod.exports, global.react, global.propTypes, global.helpers, global.Document); 11 | global.index = mod.exports; 12 | } 13 | })(this, function (exports, _react, _propTypes, _helpers, _Document) { 14 | 'use strict'; 15 | 16 | Object.defineProperty(exports, "__esModule", { 17 | value: true 18 | }); 19 | 20 | var _react2 = _interopRequireDefault(_react); 21 | 22 | var _propTypes2 = _interopRequireDefault(_propTypes); 23 | 24 | var _Document2 = _interopRequireDefault(_Document); 25 | 26 | function _interopRequireDefault(obj) { 27 | return obj && obj.__esModule ? obj : { 28 | default: obj 29 | }; 30 | } 31 | 32 | var _extends = Object.assign || function (target) { 33 | for (var i = 1; i < arguments.length; i++) { 34 | var source = arguments[i]; 35 | 36 | for (var key in source) { 37 | if (Object.prototype.hasOwnProperty.call(source, key)) { 38 | target[key] = source[key]; 39 | } 40 | } 41 | } 42 | 43 | return target; 44 | }; 45 | 46 | function _classCallCheck(instance, Constructor) { 47 | if (!(instance instanceof Constructor)) { 48 | throw new TypeError("Cannot call a class as a function"); 49 | } 50 | } 51 | 52 | var _createClass = function () { 53 | function defineProperties(target, props) { 54 | for (var i = 0; i < props.length; i++) { 55 | var descriptor = props[i]; 56 | descriptor.enumerable = descriptor.enumerable || false; 57 | descriptor.configurable = true; 58 | if ("value" in descriptor) descriptor.writable = true; 59 | Object.defineProperty(target, descriptor.key, descriptor); 60 | } 61 | } 62 | 63 | return function (Constructor, protoProps, staticProps) { 64 | if (protoProps) defineProperties(Constructor.prototype, protoProps); 65 | if (staticProps) defineProperties(Constructor, staticProps); 66 | return Constructor; 67 | }; 68 | }(); 69 | 70 | function _possibleConstructorReturn(self, call) { 71 | if (!self) { 72 | throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); 73 | } 74 | 75 | return call && (typeof call === "object" || typeof call === "function") ? call : self; 76 | } 77 | 78 | function _inherits(subClass, superClass) { 79 | if (typeof superClass !== "function" && superClass !== null) { 80 | throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); 81 | } 82 | 83 | subClass.prototype = Object.create(superClass && superClass.prototype, { 84 | constructor: { 85 | value: subClass, 86 | enumerable: false, 87 | writable: true, 88 | configurable: true 89 | } 90 | }); 91 | if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; 92 | } 93 | 94 | var FetchDocumentWithUniqueId = function (_React$PureComponent) { 95 | _inherits(FetchDocumentWithUniqueId, _React$PureComponent); 96 | 97 | function FetchDocumentWithUniqueId(props) { 98 | _classCallCheck(this, FetchDocumentWithUniqueId); 99 | 100 | var _this = _possibleConstructorReturn(this, (FetchDocumentWithUniqueId.__proto__ || Object.getPrototypeOf(FetchDocumentWithUniqueId)).call(this, props)); 101 | 102 | _this.uniqueId = _this.props.uniqueId || (0, _helpers.createUniqueId)(); 103 | return _this; 104 | } 105 | 106 | _createClass(FetchDocumentWithUniqueId, [{ 107 | key: 'render', 108 | value: function render() { 109 | return _react2.default.createElement(_Document2.default, _extends({}, this.props, { uniqueId: 'LOCAL: ' + this.uniqueId })); 110 | } 111 | }]); 112 | 113 | return FetchDocumentWithUniqueId; 114 | }(_react2.default.PureComponent); 115 | 116 | exports.default = FetchDocumentWithUniqueId; 117 | 118 | 119 | FetchDocumentWithUniqueId.propTypes = { 120 | uniqueId: _propTypes2.default.string 121 | }; 122 | }); -------------------------------------------------------------------------------- /dist/Document/prop-types.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | if (typeof define === "function" && define.amd) { 3 | define(['exports', 'prop-types'], factory); 4 | } else if (typeof exports !== "undefined") { 5 | factory(exports, require('prop-types')); 6 | } else { 7 | var mod = { 8 | exports: {} 9 | }; 10 | factory(mod.exports, global.propTypes); 11 | global.propTypes = mod.exports; 12 | } 13 | })(this, function (exports, _propTypes) { 14 | 'use strict'; 15 | 16 | Object.defineProperty(exports, "__esModule", { 17 | value: true 18 | }); 19 | exports.propTypes = exports.defaultProps = undefined; 20 | 21 | var _propTypes2 = _interopRequireDefault(_propTypes); 22 | 23 | function _interopRequireDefault(obj) { 24 | return obj && obj.__esModule ? obj : { 25 | default: obj 26 | }; 27 | } 28 | 29 | var defaultProps = exports.defaultProps = { 30 | order: '-createdAt', 31 | autoRefresh: false, 32 | onFetchEnd: function onFetchEnd() {}, 33 | onPostEnd: function onPostEnd() {}, 34 | onPutEnd: function onPutEnd() {}, 35 | onDeleteEnd: function onDeleteEnd() {}, 36 | fetchPropsKey: 'fetchProps' 37 | }; 38 | 39 | var propTypes = exports.propTypes = { 40 | schemaName: _propTypes2.default.string.isRequired, 41 | /** 42 | * targetName 43 | * place to set server response - store.documents[targetName] 44 | * if empty then target is objectId but if 45 | * objectId is empty then we create uniqueId for you 46 | */ 47 | targetName: _propTypes2.default.string, 48 | /** 49 | * objectId 50 | * optional - if empty then we didn't run fetch Data 51 | */ 52 | objectId: _propTypes2.default.string, 53 | /** 54 | * keys 55 | * example: 'title,body' 56 | * Restrict the fields returned by the query 57 | */ 58 | keys: _propTypes2.default.string, 59 | /** 60 | * include 61 | * example: 'post,categories' 62 | * Use on Pointer columns to return the full object 63 | */ 64 | include: _propTypes2.default.string, 65 | /** 66 | * onFetchEnd 67 | * call back after fetch end 68 | * onFetchEnd(error, {data, queryStatus}) 69 | */ 70 | onFetchEnd: _propTypes2.default.func, 71 | /** 72 | * onPostEnd 73 | * call back after fetch end 74 | * onPostEnd(error, {data, queryStatus}) 75 | */ 76 | onPostEnd: _propTypes2.default.func, 77 | /** 78 | * onPutEnd 79 | * call back after fetch end 80 | * onPutEnd(error, {data, queryStatus}) 81 | */ 82 | onPutEnd: _propTypes2.default.func, 83 | /** 84 | * onDeleteEnd 85 | * call back after fetch end 86 | * onDeleteEnd(error, {data, queryStatus}) 87 | */ 88 | onDeleteEnd: _propTypes2.default.func, 89 | /** 90 | * leaveClean 91 | * we remove data from store on componentWillUnmount 92 | * default is true 93 | */ 94 | leaveClean: _propTypes2.default.bool, 95 | /** 96 | * localFirst 97 | * fetch data from server only if we can found your data on local store 98 | */ 99 | localFirst: _propTypes2.default.bool, 100 | /** 101 | * localOnly 102 | * never fetch data from store 103 | */ 104 | localOnly: _propTypes2.default.bool, 105 | /** 106 | * autoRefresh 107 | * default false 108 | * Get data after each create/update/delete doc 109 | */ 110 | autoRefresh: _propTypes2.default.bool, 111 | /** 112 | * render - pass function that get props and return component. 113 | * Exmple of use: 114 | * 119 | */ 120 | render: _propTypes2.default.func, 121 | /** 122 | * example: 123 | * 128 | * all the props from FetchDocument will wrap inside props.fetch 129 | */ 130 | component: _propTypes2.default.any, 131 | /** 132 | * dataHandler 133 | * pass function that manipulate data before set to store 134 | */ 135 | dataHandler: _propTypes2.default.func 136 | /* 137 | * What you going to get Fetch: 138 | * First argument - error - the error from serve. 139 | * Second argument - { 140 | * data : {...}, // The data from server response 141 | isLoading: bollean, // True when loading 142 | status : string, // look at the status list 143 | info: {...}, // extra helpful data of the request 144 | refresh, // function that refresh the data from server 145 | deleteDoc, // function 146 | put, // update your document 147 | post, // create new document 148 | ...this.props // all you other props that you want to pass 149 | } 150 | */ 151 | }; 152 | }); -------------------------------------------------------------------------------- /dist/Document/reducerHandler.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | if (typeof define === "function" && define.amd) { 3 | define(['exports', '../types', 'immutable'], factory); 4 | } else if (typeof exports !== "undefined") { 5 | factory(exports, require('../types'), require('immutable')); 6 | } else { 7 | var mod = { 8 | exports: {} 9 | }; 10 | factory(mod.exports, global.types, global.immutable); 11 | global.reducerHandler = mod.exports; 12 | } 13 | })(this, function (exports, _types, _require) { 14 | 'use strict'; 15 | 16 | Object.defineProperty(exports, "__esModule", { 17 | value: true 18 | }); 19 | exports.default = reducerHandler; 20 | 21 | var _types2 = _interopRequireDefault(_types); 22 | 23 | function _interopRequireDefault(obj) { 24 | return obj && obj.__esModule ? obj : { 25 | default: obj 26 | }; 27 | } 28 | 29 | var Map = _require.Map; 30 | var SET_DOCUMENT = _types2.default.SET_DOCUMENT, 31 | CLEAN_DOCUMENT = _types2.default.CLEAN_DOCUMENT, 32 | CLEAN_ALL_DOCUMENTS = _types2.default.CLEAN_ALL_DOCUMENTS, 33 | UPDATE_DOC_FIELD = _types2.default.UPDATE_DOC_FIELD, 34 | UPDATE_DOC_FIELDS = _types2.default.UPDATE_DOC_FIELDS; 35 | 36 | // This is not a reducer, return null if it is not a relevant action. 37 | 38 | function reducerHandler(state, action) { 39 | var payload = action.payload; 40 | 41 | var _ref = payload || {}, 42 | targetName = _ref.targetName, 43 | status = _ref.status, 44 | data = _ref.data, 45 | info = _ref.info, 46 | error = _ref.error, 47 | key = _ref.key, 48 | value = _ref.value, 49 | loading = _ref.loading, 50 | dispatchId = _ref.dispatchId, 51 | boomerang = _ref.boomerang; 52 | 53 | switch (action.type) { 54 | case SET_DOCUMENT: 55 | { 56 | var documents = state.documents.get(targetName); 57 | var nextState = state; 58 | if (!documents) { 59 | nextState = nextState.setIn(['documents', targetName], Map()); 60 | } 61 | if ('status' in payload) { 62 | nextState = nextState.setIn(['documents', targetName, 'status'], status); 63 | } 64 | if ('data' in payload) { 65 | nextState = nextState.setIn(['documents', targetName, 'data'], Map(data)); 66 | } 67 | if ('info' in payload) { 68 | nextState = nextState.setIn(['documents', targetName, 'info'], info); 69 | } 70 | if ('error' in payload) { 71 | nextState = nextState.setIn(['documents', targetName, 'error'], error); 72 | } 73 | if ('loading' in payload) { 74 | nextState = nextState.setIn(['documents', targetName, 'loading'], loading); 75 | } 76 | if ('dispatchId' in payload) { 77 | nextState = nextState.setIn(['documents', targetName, 'dispatchId'], dispatchId); 78 | } 79 | if (boomerang) { 80 | nextState = nextState.setIn(['documents', targetName, 'boomerang'], boomerang); 81 | } 82 | return nextState; 83 | } 84 | case UPDATE_DOC_FIELD: 85 | { 86 | var _documents = state.documents.get(targetName); 87 | var _nextState = state; 88 | if (!_documents) { 89 | _nextState = _nextState.setIn(['documents', targetName], Map()); 90 | } 91 | _nextState = _nextState.setIn(['documents', targetName, 'data', key], value); 92 | return _nextState; 93 | } 94 | case UPDATE_DOC_FIELDS: 95 | { 96 | var _documents2 = state.documents.get(targetName); 97 | var _nextState2 = state; 98 | if (!_documents2) { 99 | _nextState2 = _nextState2.setIn(['documents', targetName], Map({ data: Map(data) })); 100 | } else { 101 | _nextState2 = _nextState2.mergeIn(['documents', targetName, 'data'], data); 102 | } 103 | return _nextState2; 104 | } 105 | case CLEAN_DOCUMENT: 106 | { 107 | var _documents3 = state.documents.delete(targetName); 108 | return state.set('documents', _documents3); 109 | } 110 | case CLEAN_ALL_DOCUMENTS: 111 | { 112 | return state.set('documents', Map()); 113 | } 114 | default: 115 | return null; 116 | } 117 | } 118 | }); -------------------------------------------------------------------------------- /dist/Document/saga.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | if (typeof define === "function" && define.amd) { 3 | define(['exports', './workers/fetchDoc', './workers/putDoc', './workers/deleteDoc', './workers/postDoc'], factory); 4 | } else if (typeof exports !== "undefined") { 5 | factory(exports, require('./workers/fetchDoc'), require('./workers/putDoc'), require('./workers/deleteDoc'), require('./workers/postDoc')); 6 | } else { 7 | var mod = { 8 | exports: {} 9 | }; 10 | factory(mod.exports, global.fetchDoc, global.putDoc, global.deleteDoc, global.postDoc); 11 | global.saga = mod.exports; 12 | } 13 | })(this, function (exports, _fetchDoc, _putDoc, _deleteDoc, _postDoc) { 14 | 'use strict'; 15 | 16 | Object.defineProperty(exports, "__esModule", { 17 | value: true 18 | }); 19 | exports.postDoc = exports.deleteDoc = exports.putDoc = exports.fetchDoc = undefined; 20 | 21 | var _fetchDoc2 = _interopRequireDefault(_fetchDoc); 22 | 23 | var _putDoc2 = _interopRequireDefault(_putDoc); 24 | 25 | var _deleteDoc2 = _interopRequireDefault(_deleteDoc); 26 | 27 | var _postDoc2 = _interopRequireDefault(_postDoc); 28 | 29 | function _interopRequireDefault(obj) { 30 | return obj && obj.__esModule ? obj : { 31 | default: obj 32 | }; 33 | } 34 | 35 | exports.fetchDoc = _fetchDoc2.default; 36 | exports.putDoc = _putDoc2.default; 37 | exports.deleteDoc = _deleteDoc2.default; 38 | exports.postDoc = _postDoc2.default; 39 | }); -------------------------------------------------------------------------------- /dist/Document/selectors.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | if (typeof define === "function" && define.amd) { 3 | define(['exports', 'reselect', 'immutable', '../helpers'], factory); 4 | } else if (typeof exports !== "undefined") { 5 | factory(exports, require('reselect'), require('immutable'), require('../helpers')); 6 | } else { 7 | var mod = { 8 | exports: {} 9 | }; 10 | factory(mod.exports, global.reselect, global.immutable, global.helpers); 11 | global.selectors = mod.exports; 12 | } 13 | })(this, function (exports, _reselect, _immutable, _helpers) { 14 | 'use strict'; 15 | 16 | Object.defineProperty(exports, "__esModule", { 17 | value: true 18 | }); 19 | exports.getError = exports.getInfo = exports.getLoading = exports.getBoomerang = exports.getDispatchId = exports.getStatus = exports.getData = exports.getDocument = exports.getDocuments = undefined; 20 | 21 | var MAP = (0, _immutable.Map)(); 22 | 23 | var getTargetName = function getTargetName(state, targetName) { 24 | return targetName; 25 | }; 26 | 27 | var getDocuments = exports.getDocuments = function getDocuments(state) { 28 | return state.parse.documents; 29 | }; 30 | 31 | var getImmutableDoc = (0, _reselect.createSelector)([getDocuments, getTargetName], function (documents, targetName) { 32 | return documents.get(targetName) || MAP; 33 | }); 34 | 35 | var getDocument = exports.getDocument = (0, _reselect.createSelector)(getImmutableDoc, function (dataImmutable) { 36 | return dataImmutable.toJS(); 37 | }); 38 | var getData = exports.getData = (0, _reselect.createSelector)(getImmutableDoc, function (dataImmutable) { 39 | return dataImmutable.get('data') && dataImmutable.get('data').toJS(); 40 | }); 41 | 42 | var getStatus = exports.getStatus = (0, _reselect.createSelector)(getImmutableDoc, function (dataImmutable) { 43 | return dataImmutable.get('status'); 44 | }); 45 | var getDispatchId = exports.getDispatchId = (0, _reselect.createSelector)(getImmutableDoc, function (dataImmutable) { 46 | return dataImmutable.get('dispatchId'); 47 | }); 48 | var getBoomerang = exports.getBoomerang = (0, _reselect.createSelector)(getImmutableDoc, function (dataImmutable) { 49 | return dataImmutable.get('boomerang'); 50 | }); 51 | var getLoading = exports.getLoading = (0, _reselect.createSelector)(getImmutableDoc, function (dataImmutable) { 52 | return (0, _helpers.isLoading)(dataImmutable.get('status')); 53 | }); 54 | 55 | var getInfo = exports.getInfo = (0, _reselect.createSelector)(getImmutableDoc, function (dataImmutable) { 56 | return dataImmutable.get('info'); 57 | }); 58 | 59 | var getError = exports.getError = (0, _reselect.createSelector)(getImmutableDoc, function (dataImmutable) { 60 | return dataImmutable.get('error'); 61 | }); 62 | }); -------------------------------------------------------------------------------- /dist/Document/store.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | if (typeof define === "function" && define.amd) { 3 | define(['exports', 'react-redux', 'redux', './selectors', './actions'], factory); 4 | } else if (typeof exports !== "undefined") { 5 | factory(exports, require('react-redux'), require('redux'), require('./selectors'), require('./actions')); 6 | } else { 7 | var mod = { 8 | exports: {} 9 | }; 10 | factory(mod.exports, global.reactRedux, global.redux, global.selectors, global.actions); 11 | global.store = mod.exports; 12 | } 13 | })(this, function (exports, _reactRedux, _redux, _selectors, _actions) { 14 | 'use strict'; 15 | 16 | Object.defineProperty(exports, "__esModule", { 17 | value: true 18 | }); 19 | 20 | 21 | function mapStateToProps(state, props) { 22 | var targetName = props.targetName, 23 | objectId = props.objectId, 24 | uniqueId = props.uniqueId; 25 | 26 | var target = targetName || objectId || uniqueId; 27 | return { 28 | fetchData: (0, _selectors.getData)(state, target), 29 | fetchStatus: (0, _selectors.getStatus)(state, target), 30 | fetchInfo: (0, _selectors.getInfo)(state, target), 31 | fetchError: (0, _selectors.getError)(state, target), 32 | fetchDispatchId: (0, _selectors.getDispatchId)(state, target), 33 | fetchBoomerang: (0, _selectors.getBoomerang)(state, target) 34 | 35 | }; 36 | } 37 | 38 | function mapDispatchToProps(dispatch) { 39 | return { 40 | fetchActions: (0, _redux.bindActionCreators)({ 41 | fetchData: _actions.fetchData, 42 | deleteDoc: _actions.deleteDoc, 43 | putDoc: _actions.putDoc, 44 | postDoc: _actions.postDoc, 45 | cleanData: _actions.cleanData, 46 | updateField: _actions.updateField, 47 | updateFields: _actions.updateFields 48 | }, dispatch) 49 | }; 50 | } 51 | 52 | exports.default = function (comp) { 53 | return (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(comp); 54 | }; 55 | }); -------------------------------------------------------------------------------- /dist/Document/workers/deleteDoc.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | if (typeof define === "function" && define.amd) { 3 | define(['exports', 'regenerator-runtime', 'redux-saga/effects', '../../server/httpWrapper', '../../types', '../../server/api', '../../server/Logger', '../actions'], factory); 4 | } else if (typeof exports !== "undefined") { 5 | factory(exports, require('regenerator-runtime'), require('redux-saga/effects'), require('../../server/httpWrapper'), require('../../types'), require('../../server/api'), require('../../server/Logger'), require('../actions')); 6 | } else { 7 | var mod = { 8 | exports: {} 9 | }; 10 | factory(mod.exports, global.regeneratorRuntime, global.effects, global.httpWrapper, global.types, global.api, global.Logger, global.actions); 11 | global.deleteDoc = mod.exports; 12 | } 13 | })(this, function (exports, _regeneratorRuntime, _effects, _httpWrapper, _types, _api, _Logger, _actions) { 14 | 'use strict'; 15 | 16 | Object.defineProperty(exports, "__esModule", { 17 | value: true 18 | }); 19 | exports.default = deleteDoc; 20 | 21 | var _regeneratorRuntime2 = _interopRequireDefault(_regeneratorRuntime); 22 | 23 | var _httpWrapper2 = _interopRequireDefault(_httpWrapper); 24 | 25 | var _types2 = _interopRequireDefault(_types); 26 | 27 | var _api2 = _interopRequireDefault(_api); 28 | 29 | var _Logger2 = _interopRequireDefault(_Logger); 30 | 31 | function _interopRequireDefault(obj) { 32 | return obj && obj.__esModule ? obj : { 33 | default: obj 34 | }; 35 | } 36 | 37 | var _marked = _regeneratorRuntime2.default.mark(deleteDoc); 38 | 39 | var START = _types2.default.DELETE_START; 40 | var FAILED = _types2.default.DELETE_FAILED; 41 | var FAILED_NETWORK = _types2.default.DELETE_FAILED_NETWORK; 42 | var FINISHED = _types2.default.DELETE_FINISHED; 43 | 44 | function deleteDoc(action) { 45 | var _action$payload, targetName, schemaName, objectId, dispatchId, boomerang, target, _dispatchId, res, errType, info; 46 | 47 | return _regeneratorRuntime2.default.wrap(function deleteDoc$(_context) { 48 | while (1) { 49 | switch (_context.prev = _context.next) { 50 | case 0: 51 | _action$payload = action.payload, targetName = _action$payload.targetName, schemaName = _action$payload.schemaName, objectId = _action$payload.objectId, dispatchId = _action$payload.dispatchId, boomerang = _action$payload.boomerang; 52 | target = targetName || objectId; 53 | _dispatchId = dispatchId || ''; 54 | _context.next = 5; 55 | return (0, _effects.put)((0, _actions.setOnStore)({ targetName: target, status: START, error: null, loading: true, dispatchId: _dispatchId, boomerang: boomerang })); 56 | 57 | case 5: 58 | return _context.delegateYield((0, _httpWrapper2.default)(_api2.default.deleteObject, schemaName, objectId), 't0', 6); 59 | 60 | case 6: 61 | res = _context.t0; 62 | 63 | if (!res.error) { 64 | _context.next = 15; 65 | break; 66 | } 67 | 68 | errType = res.message === 'Network Error' ? FAILED_NETWORK : FAILED; 69 | 70 | console.error('deleteDoc err', objectId, res.error); 71 | _context.next = 12; 72 | return (0, _effects.put)((0, _actions.setOnStore)({ targetName: target, status: errType, error: res, loading: false, dispatchId: _dispatchId, boomerang: boomerang })); 73 | 74 | case 12: 75 | _Logger2.default.onError('DELETE', action, errType, res); 76 | _context.next = 19; 77 | break; 78 | 79 | case 15: 80 | info = { 81 | timestamp: Date.now(), 82 | schemaName: schemaName, 83 | deleteDocId: objectId 84 | }; 85 | _context.next = 18; 86 | return (0, _effects.put)((0, _actions.setOnStore)({ 87 | targetName: target, 88 | status: FINISHED, 89 | info: info, 90 | error: null, 91 | loading: false, 92 | dispatchId: _dispatchId, 93 | boomerang: boomerang 94 | })); 95 | 96 | case 18: 97 | _Logger2.default.onSuccess('DELETE', action, FINISHED, res); 98 | 99 | case 19: 100 | case 'end': 101 | return _context.stop(); 102 | } 103 | } 104 | }, _marked, this); 105 | } 106 | /* eslint no-unused-vars: "off" */ 107 | }); -------------------------------------------------------------------------------- /dist/Document/workers/fetchDoc.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | if (typeof define === "function" && define.amd) { 3 | define(['exports', 'regenerator-runtime', 'redux-saga/effects', '../../server/httpWrapper', '../../types', '../../server/api', '../actions', '../../server/Logger'], factory); 4 | } else if (typeof exports !== "undefined") { 5 | factory(exports, require('regenerator-runtime'), require('redux-saga/effects'), require('../../server/httpWrapper'), require('../../types'), require('../../server/api'), require('../actions'), require('../../server/Logger')); 6 | } else { 7 | var mod = { 8 | exports: {} 9 | }; 10 | factory(mod.exports, global.regeneratorRuntime, global.effects, global.httpWrapper, global.types, global.api, global.actions, global.Logger); 11 | global.fetchDoc = mod.exports; 12 | } 13 | })(this, function (exports, _regeneratorRuntime, _effects, _httpWrapper, _types, _api, _actions, _Logger) { 14 | 'use strict'; 15 | 16 | Object.defineProperty(exports, "__esModule", { 17 | value: true 18 | }); 19 | exports.default = fetchDoc; 20 | 21 | var _regeneratorRuntime2 = _interopRequireDefault(_regeneratorRuntime); 22 | 23 | var _httpWrapper2 = _interopRequireDefault(_httpWrapper); 24 | 25 | var _types2 = _interopRequireDefault(_types); 26 | 27 | var _api2 = _interopRequireDefault(_api); 28 | 29 | var _Logger2 = _interopRequireDefault(_Logger); 30 | 31 | function _interopRequireDefault(obj) { 32 | return obj && obj.__esModule ? obj : { 33 | default: obj 34 | }; 35 | } 36 | 37 | var _marked = _regeneratorRuntime2.default.mark(fetchDoc); 38 | 39 | var START = _types2.default.FETCH_START; 40 | var FAILED = _types2.default.FETCH_FAILED; 41 | var FAILED_NETWORK = _types2.default.FETCH_FAILED_NETWORK; 42 | var FINISHED = _types2.default.FETCH_FINISHED; 43 | 44 | function fetchDoc(action) { 45 | var _action$payload, targetName, schemaName, objectId, include, keys, dataHandler, dispatchId, boomerang, target, _dispatchId, res, errType, info, _data, data; 46 | 47 | return _regeneratorRuntime2.default.wrap(function fetchDoc$(_context) { 48 | while (1) { 49 | switch (_context.prev = _context.next) { 50 | case 0: 51 | _action$payload = action.payload, targetName = _action$payload.targetName, schemaName = _action$payload.schemaName, objectId = _action$payload.objectId, include = _action$payload.include, keys = _action$payload.keys, dataHandler = _action$payload.dataHandler, dispatchId = _action$payload.dispatchId, boomerang = _action$payload.boomerang; 52 | target = targetName || objectId; 53 | _dispatchId = dispatchId || ''; 54 | _context.next = 5; 55 | return (0, _effects.put)((0, _actions.setOnStore)({ targetName: target, status: START, error: null, loading: true, dispatchId: _dispatchId, boomerang: boomerang })); 56 | 57 | case 5: 58 | return _context.delegateYield((0, _httpWrapper2.default)(_api2.default.getObjectById, schemaName, objectId, keys, include), 't0', 6); 59 | 60 | case 6: 61 | res = _context.t0; 62 | 63 | if (!res.error) { 64 | _context.next = 15; 65 | break; 66 | } 67 | 68 | errType = res.message === 'Network Error' ? FAILED_NETWORK : FAILED; 69 | 70 | console.error('get document err', objectId, res.error); 71 | _context.next = 12; 72 | return (0, _effects.put)((0, _actions.setOnStore)({ targetName: target, status: errType, error: res, loading: false, dispatchId: _dispatchId, boomerang: boomerang })); 73 | 74 | case 12: 75 | _Logger2.default.onError('GET', action, errType, res); 76 | _context.next = 21; 77 | break; 78 | 79 | case 15: 80 | info = { 81 | timestamp: Date.now(), 82 | keys: keys, 83 | include: include, 84 | schemaName: schemaName 85 | }; 86 | _data = res.data; 87 | data = dataHandler ? dataHandler(_data) : _data; 88 | _context.next = 20; 89 | return (0, _effects.put)((0, _actions.setOnStore)({ 90 | targetName: target, 91 | status: FINISHED, 92 | data: data, 93 | info: info, 94 | error: null, 95 | loading: false, 96 | dispatchId: _dispatchId, 97 | boomerang: boomerang 98 | })); 99 | 100 | case 20: 101 | _Logger2.default.onSuccess('GET', action, FINISHED, res); 102 | 103 | case 21: 104 | case 'end': 105 | return _context.stop(); 106 | } 107 | } 108 | }, _marked, this); 109 | } 110 | /* eslint no-unused-vars: "off" */ 111 | }); -------------------------------------------------------------------------------- /dist/Document/workers/postDoc.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | if (typeof define === "function" && define.amd) { 3 | define(['exports', 'regenerator-runtime', 'redux-saga/effects', '../../types', '../../server', '../actions', '../../helpers'], factory); 4 | } else if (typeof exports !== "undefined") { 5 | factory(exports, require('regenerator-runtime'), require('redux-saga/effects'), require('../../types'), require('../../server'), require('../actions'), require('../../helpers')); 6 | } else { 7 | var mod = { 8 | exports: {} 9 | }; 10 | factory(mod.exports, global.regeneratorRuntime, global.effects, global.types, global.server, global.actions, global.helpers); 11 | global.postDoc = mod.exports; 12 | } 13 | })(this, function (exports, _regeneratorRuntime, _effects, _types, _server, _actions, _helpers) { 14 | 'use strict'; 15 | 16 | Object.defineProperty(exports, "__esModule", { 17 | value: true 18 | }); 19 | exports.default = postDoc; 20 | 21 | var _regeneratorRuntime2 = _interopRequireDefault(_regeneratorRuntime); 22 | 23 | var _types2 = _interopRequireDefault(_types); 24 | 25 | function _interopRequireDefault(obj) { 26 | return obj && obj.__esModule ? obj : { 27 | default: obj 28 | }; 29 | } 30 | 31 | var _marked = _regeneratorRuntime2.default.mark(postDoc); 32 | 33 | var START = _types2.default.POST_START; 34 | var FAILED = _types2.default.POST_FAILED; 35 | var FAILED_NETWORK = _types2.default.POST_FAILED_NETWORK; 36 | var FINISHED = _types2.default.POST_FINISHED; 37 | 38 | function postDoc(action) { 39 | var _action$payload, targetName, schemaName, data, filesIncluded, fileValueHandler, dispatchId, boomerang, _dispatchId, dataToSend, dataFileError, res, errType, info; 40 | 41 | return _regeneratorRuntime2.default.wrap(function postDoc$(_context) { 42 | while (1) { 43 | switch (_context.prev = _context.next) { 44 | case 0: 45 | _action$payload = action.payload, targetName = _action$payload.targetName, schemaName = _action$payload.schemaName, data = _action$payload.data, filesIncluded = _action$payload.filesIncluded, fileValueHandler = _action$payload.fileValueHandler, dispatchId = _action$payload.dispatchId, boomerang = _action$payload.boomerang; 46 | _dispatchId = dispatchId || ''; 47 | _context.next = 4; 48 | return (0, _effects.put)((0, _actions.setOnStore)({ targetName: targetName, status: START, error: null, loading: true, dispatchId: _dispatchId, boomerang: boomerang })); 49 | 50 | case 4: 51 | dataToSend = void 0, dataFileError = void 0, res = null; 52 | _context.prev = 5; 53 | 54 | if (!filesIncluded) { 55 | _context.next = 11; 56 | break; 57 | } 58 | 59 | return _context.delegateYield((0, _server.uploadFilesFromData)(data, fileValueHandler), 't1', 8); 60 | 61 | case 8: 62 | _context.t0 = _context.t1; 63 | _context.next = 12; 64 | break; 65 | 66 | case 11: 67 | _context.t0 = data; 68 | 69 | case 12: 70 | dataToSend = _context.t0; 71 | 72 | dataToSend = (0, _helpers.removeImutableKeys)(data); 73 | _context.next = 21; 74 | break; 75 | 76 | case 16: 77 | _context.prev = 16; 78 | _context.t2 = _context['catch'](5); 79 | 80 | res = _context.t2; 81 | res.error = true; 82 | dataFileError = true; 83 | 84 | case 21: 85 | if (dataFileError) { 86 | _context.next = 24; 87 | break; 88 | } 89 | 90 | return _context.delegateYield((0, _server.httpRequest)(_server.api.createObject, schemaName, dataToSend), 't3', 23); 91 | 92 | case 23: 93 | res = _context.t3; 94 | 95 | case 24: 96 | if (!res.error) { 97 | _context.next = 32; 98 | break; 99 | } 100 | 101 | errType = res.message === 'Network Error' ? FAILED_NETWORK : FAILED; 102 | 103 | console.error('deleteDoc err', targetName, res.error); 104 | _context.next = 29; 105 | return (0, _effects.put)((0, _actions.setOnStore)({ targetName: targetName, status: errType, error: res, loading: false, dispatchId: _dispatchId, boomerang: boomerang })); 106 | 107 | case 29: 108 | _server.Logger.onError('POST', action, errType, res); 109 | _context.next = 36; 110 | break; 111 | 112 | case 32: 113 | info = { 114 | timestamp: Date.now(), 115 | schemaName: schemaName, 116 | objectId: res.data.objectId, 117 | data: data, 118 | resData: (0, _helpers.dig)(res, 'data.results[0]') 119 | }; 120 | _context.next = 35; 121 | return (0, _effects.put)((0, _actions.setOnStore)({ 122 | targetName: targetName, 123 | status: FINISHED, 124 | info: info, 125 | error: null, 126 | loading: false, 127 | dispatchId: _dispatchId, 128 | boomerang: boomerang 129 | })); 130 | 131 | case 35: 132 | _server.Logger.onSuccess('POST', action, FINISHED, res); 133 | 134 | case 36: 135 | case 'end': 136 | return _context.stop(); 137 | } 138 | } 139 | }, _marked, this, [[5, 16]]); 140 | } 141 | /* eslint no-unused-vars: "off" */ 142 | }); -------------------------------------------------------------------------------- /dist/InitialState.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | if (typeof define === "function" && define.amd) { 3 | define(['exports', 'immutable'], factory); 4 | } else if (typeof exports !== "undefined") { 5 | factory(exports, require('immutable')); 6 | } else { 7 | var mod = { 8 | exports: {} 9 | }; 10 | factory(mod.exports, global.immutable); 11 | global.InitialState = mod.exports; 12 | } 13 | })(this, function (exports, _require) { 14 | 'use strict'; 15 | 16 | Object.defineProperty(exports, "__esModule", { 17 | value: true 18 | }); 19 | var Record = _require.Record, 20 | Map = _require.Map; 21 | 22 | 23 | var InitialState = Record({ 24 | collections: Map(), 25 | cloudCodes: Map(), 26 | documents: Map() 27 | }); 28 | 29 | exports.default = InitialState; 30 | }); -------------------------------------------------------------------------------- /dist/Loader/index.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | if (typeof define === "function" && define.amd) { 3 | define(['exports', 'react', './prop-types', './store'], factory); 4 | } else if (typeof exports !== "undefined") { 5 | factory(exports, require('react'), require('./prop-types'), require('./store')); 6 | } else { 7 | var mod = { 8 | exports: {} 9 | }; 10 | factory(mod.exports, global.react, global.propTypes, global.store); 11 | global.index = mod.exports; 12 | } 13 | })(this, function (exports, _react, _propTypes, _store) { 14 | 'use strict'; 15 | 16 | Object.defineProperty(exports, "__esModule", { 17 | value: true 18 | }); 19 | 20 | var _react2 = _interopRequireDefault(_react); 21 | 22 | var _store2 = _interopRequireDefault(_store); 23 | 24 | function _interopRequireDefault(obj) { 25 | return obj && obj.__esModule ? obj : { 26 | default: obj 27 | }; 28 | } 29 | 30 | function _classCallCheck(instance, Constructor) { 31 | if (!(instance instanceof Constructor)) { 32 | throw new TypeError("Cannot call a class as a function"); 33 | } 34 | } 35 | 36 | var _createClass = function () { 37 | function defineProperties(target, props) { 38 | for (var i = 0; i < props.length; i++) { 39 | var descriptor = props[i]; 40 | descriptor.enumerable = descriptor.enumerable || false; 41 | descriptor.configurable = true; 42 | if ("value" in descriptor) descriptor.writable = true; 43 | Object.defineProperty(target, descriptor.key, descriptor); 44 | } 45 | } 46 | 47 | return function (Constructor, protoProps, staticProps) { 48 | if (protoProps) defineProperties(Constructor.prototype, protoProps); 49 | if (staticProps) defineProperties(Constructor, staticProps); 50 | return Constructor; 51 | }; 52 | }(); 53 | 54 | function _possibleConstructorReturn(self, call) { 55 | if (!self) { 56 | throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); 57 | } 58 | 59 | return call && (typeof call === "object" || typeof call === "function") ? call : self; 60 | } 61 | 62 | function _inherits(subClass, superClass) { 63 | if (typeof superClass !== "function" && superClass !== null) { 64 | throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); 65 | } 66 | 67 | subClass.prototype = Object.create(superClass && superClass.prototype, { 68 | constructor: { 69 | value: subClass, 70 | enumerable: false, 71 | writable: true, 72 | configurable: true 73 | } 74 | }); 75 | if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; 76 | } 77 | 78 | var ShowLoader = function (_React$Component) { 79 | _inherits(ShowLoader, _React$Component); 80 | 81 | function ShowLoader() { 82 | _classCallCheck(this, ShowLoader); 83 | 84 | return _possibleConstructorReturn(this, (ShowLoader.__proto__ || Object.getPrototypeOf(ShowLoader)).apply(this, arguments)); 85 | } 86 | 87 | _createClass(ShowLoader, [{ 88 | key: 'render', 89 | value: function render() { 90 | var _props = this.props, 91 | showLoader = _props.showLoader, 92 | component = _props.component; 93 | 94 | if (component) { 95 | return (0, _react.createElement)(component, { showLoader: showLoader }); 96 | } 97 | return this.props.render(showLoader); 98 | } 99 | }]); 100 | 101 | return ShowLoader; 102 | }(_react2.default.Component); 103 | 104 | exports.default = (0, _store2.default)(ShowLoader); 105 | 106 | 107 | ShowLoader.propTypes = _propTypes.propTypes; 108 | 109 | ShowLoader.defaultProps = _propTypes.defaultProps; 110 | }); -------------------------------------------------------------------------------- /dist/Loader/prop-types.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | if (typeof define === "function" && define.amd) { 3 | define(['exports', 'prop-types'], factory); 4 | } else if (typeof exports !== "undefined") { 5 | factory(exports, require('prop-types')); 6 | } else { 7 | var mod = { 8 | exports: {} 9 | }; 10 | factory(mod.exports, global.propTypes); 11 | global.propTypes = mod.exports; 12 | } 13 | })(this, function (exports, _propTypes) { 14 | 'use strict'; 15 | 16 | Object.defineProperty(exports, "__esModule", { 17 | value: true 18 | }); 19 | exports.propTypes = exports.defaultProps = undefined; 20 | 21 | var _propTypes2 = _interopRequireDefault(_propTypes); 22 | 23 | function _interopRequireDefault(obj) { 24 | return obj && obj.__esModule ? obj : { 25 | default: obj 26 | }; 27 | } 28 | 29 | var defaultProps = exports.defaultProps = {}; 30 | 31 | var propTypes = exports.propTypes = { 32 | render: _propTypes2.default.func.isRequired, 33 | /** 34 | * render: 35 | * 38 | * all the props from FetchDocument will wrap inside props.fetch 39 | */ 40 | component: _propTypes2.default.element 41 | /* 42 | * What you going to get Fetch: 43 | * showLoader : boolean 44 | */ 45 | }; 46 | }); -------------------------------------------------------------------------------- /dist/Loader/selectors.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | if (typeof define === "function" && define.amd) { 3 | define(['exports', 'reselect', 'immutable', 'lodash/some'], factory); 4 | } else if (typeof exports !== "undefined") { 5 | factory(exports, require('reselect'), require('immutable'), require('lodash/some')); 6 | } else { 7 | var mod = { 8 | exports: {} 9 | }; 10 | factory(mod.exports, global.reselect, global.immutable, global.some); 11 | global.selectors = mod.exports; 12 | } 13 | })(this, function (exports, _reselect, _immutable, _some) { 14 | 'use strict'; 15 | 16 | Object.defineProperty(exports, "__esModule", { 17 | value: true 18 | }); 19 | exports.showLoader = undefined; 20 | 21 | var _some2 = _interopRequireDefault(_some); 22 | 23 | function _interopRequireDefault(obj) { 24 | return obj && obj.__esModule ? obj : { 25 | default: obj 26 | }; 27 | } 28 | 29 | var loading = { 'loading': true }; 30 | 31 | var getState = function getState(state) { 32 | return state.parse; 33 | }; 34 | // -- Get specific collections 35 | var showLoader = exports.showLoader = (0, _reselect.createSelector)(getState, function (state) { 36 | var status = false; 37 | if (state && state.collections) { 38 | var toCheck = state.collections.toJS(); 39 | status = (0, _some2.default)(toCheck, loading); 40 | if (!status) { 41 | status = (0, _some2.default)(state.cloudCodes.toJS(), loading); 42 | } 43 | if (!status) { 44 | status = (0, _some2.default)(state.documents.toJS(), loading); 45 | } 46 | } 47 | return status; 48 | }); 49 | }); -------------------------------------------------------------------------------- /dist/Loader/store.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | if (typeof define === "function" && define.amd) { 3 | define(['exports', 'react-redux', './selectors'], factory); 4 | } else if (typeof exports !== "undefined") { 5 | factory(exports, require('react-redux'), require('./selectors')); 6 | } else { 7 | var mod = { 8 | exports: {} 9 | }; 10 | factory(mod.exports, global.reactRedux, global.selectors); 11 | global.store = mod.exports; 12 | } 13 | })(this, function (exports, _reactRedux, _selectors) { 14 | 'use strict'; 15 | 16 | Object.defineProperty(exports, "__esModule", { 17 | value: true 18 | }); 19 | 20 | 21 | function mapStateToProps(state, props) { 22 | return { 23 | showLoader: (0, _selectors.showLoader)(state) 24 | }; 25 | } 26 | 27 | exports.default = function (comp) { 28 | return (0, _reactRedux.connect)(mapStateToProps, null)(comp); 29 | }; 30 | }); -------------------------------------------------------------------------------- /dist/actions.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | if (typeof define === "function" && define.amd) { 3 | define(['exports', './CloudCode/actions', './Collection/actions', './Document/actions'], factory); 4 | } else if (typeof exports !== "undefined") { 5 | factory(exports, require('./CloudCode/actions'), require('./Collection/actions'), require('./Document/actions')); 6 | } else { 7 | var mod = { 8 | exports: {} 9 | }; 10 | factory(mod.exports, global.actions, global.actions, global.actions); 11 | global.actions = mod.exports; 12 | } 13 | })(this, function (exports, _actions, _actions2, _actions3) { 14 | 'use strict'; 15 | 16 | Object.defineProperty(exports, "__esModule", { 17 | value: true 18 | }); 19 | exports.DocumentActions = exports.CollectionActions = exports.CloudCodeActions = undefined; 20 | 21 | var CloudCodeActions = _interopRequireWildcard(_actions); 22 | 23 | var CollectionActions = _interopRequireWildcard(_actions2); 24 | 25 | var DocumentActions = _interopRequireWildcard(_actions3); 26 | 27 | function _interopRequireWildcard(obj) { 28 | if (obj && obj.__esModule) { 29 | return obj; 30 | } else { 31 | var newObj = {}; 32 | 33 | if (obj != null) { 34 | for (var key in obj) { 35 | if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; 36 | } 37 | } 38 | 39 | newObj.default = obj; 40 | return newObj; 41 | } 42 | } 43 | 44 | exports.CloudCodeActions = CloudCodeActions; 45 | exports.CollectionActions = CollectionActions; 46 | exports.DocumentActions = DocumentActions; 47 | }); -------------------------------------------------------------------------------- /dist/reducer.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | if (typeof define === "function" && define.amd) { 3 | define(['exports', './InitialState', './CloudCode/reducerHandler', './Collection/reducerHandler', './Document/reducerHandler', './index'], factory); 4 | } else if (typeof exports !== "undefined") { 5 | factory(exports, require('./InitialState'), require('./CloudCode/reducerHandler'), require('./Collection/reducerHandler'), require('./Document/reducerHandler'), require('./index')); 6 | } else { 7 | var mod = { 8 | exports: {} 9 | }; 10 | factory(mod.exports, global.InitialState, global.reducerHandler, global.reducerHandler, global.reducerHandler, global.index); 11 | global.reducer = mod.exports; 12 | } 13 | })(this, function (exports, _InitialState, _reducerHandler, _reducerHandler3, _reducerHandler5, _index) { 14 | 'use strict'; 15 | 16 | Object.defineProperty(exports, "__esModule", { 17 | value: true 18 | }); 19 | exports.setClearStateActionType = exports.cleanAllState = undefined; 20 | exports.default = parseReducer; 21 | 22 | var _InitialState2 = _interopRequireDefault(_InitialState); 23 | 24 | var _reducerHandler2 = _interopRequireDefault(_reducerHandler); 25 | 26 | var _reducerHandler4 = _interopRequireDefault(_reducerHandler3); 27 | 28 | var _reducerHandler6 = _interopRequireDefault(_reducerHandler5); 29 | 30 | function _interopRequireDefault(obj) { 31 | return obj && obj.__esModule ? obj : { 32 | default: obj 33 | }; 34 | } 35 | 36 | var initialState = new _InitialState2.default(); 37 | var CLEAN_ALL_PARSE_STATE = 'CLEAN_ALL_PARSE_STATE'; 38 | 39 | var clearStateActionType = null; 40 | 41 | var cleanAllState = exports.cleanAllState = function cleanAllState(payload) { 42 | if (_index.dispatch) { 43 | (0, _index.dispatch)({ type: 'CLEAN_ALL_PARSE_STATE' }); 44 | } else { 45 | console.warn('react-parse, missing dispatch, please use setReactParseDispatch'); 46 | } 47 | }; 48 | 49 | var setClearStateActionType = exports.setClearStateActionType = function setClearStateActionType(type) { 50 | clearStateActionType = type; 51 | }; 52 | 53 | function parseReducer() { 54 | var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState; 55 | var action = arguments[1]; 56 | 57 | if (!(state instanceof _InitialState2.default)) { 58 | return initialState.merge(state); 59 | } 60 | if (clearStateActionType && action.type === clearStateActionType || action.type === CLEAN_ALL_PARSE_STATE) { 61 | return initialState; 62 | } 63 | var nextState = null; 64 | nextState = (0, _reducerHandler2.default)(state, action); 65 | if (nextState) return nextState; 66 | nextState = (0, _reducerHandler4.default)(state, action); 67 | if (nextState) return nextState; 68 | nextState = (0, _reducerHandler6.default)(state, action); 69 | if (nextState) return nextState; 70 | return state; 71 | } 72 | }); -------------------------------------------------------------------------------- /dist/saga.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | if (typeof define === "function" && define.amd) { 3 | define(['exports', 'regenerator-runtime', 'redux-saga/effects', './types', './Collection/saga', './Document/saga', './CloudCode/saga'], factory); 4 | } else if (typeof exports !== "undefined") { 5 | factory(exports, require('regenerator-runtime'), require('redux-saga/effects'), require('./types'), require('./Collection/saga'), require('./Document/saga'), require('./CloudCode/saga')); 6 | } else { 7 | var mod = { 8 | exports: {} 9 | }; 10 | factory(mod.exports, global.regeneratorRuntime, global.effects, global.types, global.saga, global.saga, global.saga); 11 | global.saga = mod.exports; 12 | } 13 | })(this, function (exports, _regeneratorRuntime, _effects, _types, _saga, _saga2, _saga3) { 14 | 'use strict'; 15 | 16 | Object.defineProperty(exports, "__esModule", { 17 | value: true 18 | }); 19 | exports.default = parseWatcher; 20 | 21 | var _regeneratorRuntime2 = _interopRequireDefault(_regeneratorRuntime); 22 | 23 | var _types2 = _interopRequireDefault(_types); 24 | 25 | var Collection = _interopRequireWildcard(_saga); 26 | 27 | var Document = _interopRequireWildcard(_saga2); 28 | 29 | var _saga4 = _interopRequireDefault(_saga3); 30 | 31 | function _interopRequireWildcard(obj) { 32 | if (obj && obj.__esModule) { 33 | return obj; 34 | } else { 35 | var newObj = {}; 36 | 37 | if (obj != null) { 38 | for (var key in obj) { 39 | if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; 40 | } 41 | } 42 | 43 | newObj.default = obj; 44 | return newObj; 45 | } 46 | } 47 | 48 | function _interopRequireDefault(obj) { 49 | return obj && obj.__esModule ? obj : { 50 | default: obj 51 | }; 52 | } 53 | 54 | var _marked = _regeneratorRuntime2.default.mark(parseWatcher); 55 | 56 | var FETCH_CLOUD_CODE = _types2.default.FETCH_CLOUD_CODE, 57 | FETCH_COLLECTION = _types2.default.FETCH_COLLECTION, 58 | REFRESH_COLLECTION = _types2.default.REFRESH_COLLECTION, 59 | DELETE_COLLECTION_DOC = _types2.default.DELETE_COLLECTION_DOC, 60 | PUT_COLLECTION_DOC = _types2.default.PUT_COLLECTION_DOC, 61 | POST_COLLECTION_DOC = _types2.default.POST_COLLECTION_DOC, 62 | FETCH_DOCUMENT = _types2.default.FETCH_DOCUMENT, 63 | PUT_DOCUMENT = _types2.default.PUT_DOCUMENT, 64 | DELETE_DOCUMENT = _types2.default.DELETE_DOCUMENT, 65 | POST_DOCUMENT = _types2.default.POST_DOCUMENT; 66 | 67 | // Collections 68 | 69 | // all market watchers 70 | function parseWatcher() { 71 | return _regeneratorRuntime2.default.wrap(function parseWatcher$(_context) { 72 | while (1) { 73 | switch (_context.prev = _context.next) { 74 | case 0: 75 | _context.next = 2; 76 | return (0, _effects.takeEvery)(FETCH_COLLECTION, Collection.fetchCollection); 77 | 78 | case 2: 79 | _context.next = 4; 80 | return (0, _effects.takeEvery)(REFRESH_COLLECTION, Collection.refreshCollection); 81 | 82 | case 4: 83 | _context.next = 6; 84 | return (0, _effects.takeEvery)(DELETE_COLLECTION_DOC, Collection.deleteDoc); 85 | 86 | case 6: 87 | _context.next = 8; 88 | return (0, _effects.takeEvery)(PUT_COLLECTION_DOC, Collection.putDoc); 89 | 90 | case 8: 91 | _context.next = 10; 92 | return (0, _effects.takeEvery)(POST_COLLECTION_DOC, Collection.postDoc); 93 | 94 | case 10: 95 | _context.next = 12; 96 | return (0, _effects.takeEvery)(FETCH_DOCUMENT, Document.fetchDoc); 97 | 98 | case 12: 99 | _context.next = 14; 100 | return (0, _effects.takeEvery)(PUT_DOCUMENT, Document.putDoc); 101 | 102 | case 14: 103 | _context.next = 16; 104 | return (0, _effects.takeEvery)(DELETE_DOCUMENT, Document.deleteDoc); 105 | 106 | case 16: 107 | _context.next = 18; 108 | return (0, _effects.takeEvery)(POST_DOCUMENT, Document.postDoc); 109 | 110 | case 18: 111 | _context.next = 20; 112 | return (0, _effects.takeEvery)(FETCH_CLOUD_CODE, _saga4.default); 113 | 114 | case 20: 115 | case 'end': 116 | return _context.stop(); 117 | } 118 | } 119 | }, _marked, this); 120 | } 121 | /* eslint no-unused-vars: "off" */ 122 | }); -------------------------------------------------------------------------------- /dist/selectors.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | if (typeof define === "function" && define.amd) { 3 | define(['exports', './CloudCode/selectors', './Collection/selectors', './Document/selectors'], factory); 4 | } else if (typeof exports !== "undefined") { 5 | factory(exports, require('./CloudCode/selectors'), require('./Collection/selectors'), require('./Document/selectors')); 6 | } else { 7 | var mod = { 8 | exports: {} 9 | }; 10 | factory(mod.exports, global.selectors, global.selectors, global.selectors); 11 | global.selectors = mod.exports; 12 | } 13 | })(this, function (exports, _selectors, _selectors2, _selectors3) { 14 | 'use strict'; 15 | 16 | Object.defineProperty(exports, "__esModule", { 17 | value: true 18 | }); 19 | exports.documentSelectors = exports.collectionSelectors = exports.cloudCodeSelectors = undefined; 20 | 21 | var cloudCodeSelectors = _interopRequireWildcard(_selectors); 22 | 23 | var collectionSelectors = _interopRequireWildcard(_selectors2); 24 | 25 | var documentSelectors = _interopRequireWildcard(_selectors3); 26 | 27 | function _interopRequireWildcard(obj) { 28 | if (obj && obj.__esModule) { 29 | return obj; 30 | } else { 31 | var newObj = {}; 32 | 33 | if (obj != null) { 34 | for (var key in obj) { 35 | if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; 36 | } 37 | } 38 | 39 | newObj.default = obj; 40 | return newObj; 41 | } 42 | } 43 | 44 | exports.cloudCodeSelectors = cloudCodeSelectors; 45 | exports.collectionSelectors = collectionSelectors; 46 | exports.documentSelectors = documentSelectors; 47 | }); -------------------------------------------------------------------------------- /dist/server/ErrorHandle.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | if (typeof define === "function" && define.amd) { 3 | define(['exports', './api'], factory); 4 | } else if (typeof exports !== "undefined") { 5 | factory(exports, require('./api')); 6 | } else { 7 | var mod = { 8 | exports: {} 9 | }; 10 | factory(mod.exports, global.api); 11 | global.ErrorHandle = mod.exports; 12 | } 13 | })(this, function (exports, _api) { 14 | 'use strict'; 15 | 16 | Object.defineProperty(exports, "__esModule", { 17 | value: true 18 | }); 19 | exports.default = errorHandle; 20 | function errorHandle(error, params) { 21 | if (_api.handleError) { 22 | (0, _api.handleError)(error, params); 23 | } 24 | }; 25 | }); -------------------------------------------------------------------------------- /dist/server/Logger.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | if (typeof define === "function" && define.amd) { 3 | define(["exports"], factory); 4 | } else if (typeof exports !== "undefined") { 5 | factory(exports); 6 | } else { 7 | var mod = { 8 | exports: {} 9 | }; 10 | factory(mod.exports); 11 | global.Logger = mod.exports; 12 | } 13 | })(this, function (exports) { 14 | "use strict"; 15 | 16 | Object.defineProperty(exports, "__esModule", { 17 | value: true 18 | }); 19 | var _onSuccess = void 0; 20 | var _onError = void 0; 21 | /** 22 | * setLoggerHandlers 23 | * @param {*} payload object 24 | * @param {Function} payload.onSuccess 25 | * @param {Function} payload.onError 26 | */ 27 | var setLoggerHandlers = exports.setLoggerHandlers = function setLoggerHandlers(payload) { 28 | if (payload && payload.onSuccess) { 29 | _onSuccess = payload.onSuccess; 30 | } 31 | if (payload && payload.onError) { 32 | _onError = payload.onError; 33 | } 34 | }; 35 | 36 | var onSuccess = function onSuccess(type, action, status, res) { 37 | if (_onSuccess) { 38 | _onSuccess(action, status); 39 | } 40 | if (action.payload.onSuccess) { 41 | action.payload.onSuccess({ type: type, action: action, status: status, res: res }); 42 | } 43 | }; 44 | var onError = function onError(type, action, status, res) { 45 | if (_onError) { 46 | _onError(action, status); 47 | } 48 | if (action.payload.onError) { 49 | action.onError({ type: type, action: action, status: status, res: res }); 50 | } 51 | }; 52 | 53 | var Logger = { 54 | onSuccess: onSuccess, 55 | onError: onError 56 | }; 57 | exports.default = Logger; 58 | }); -------------------------------------------------------------------------------- /dist/server/httpWrapper.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | if (typeof define === "function" && define.amd) { 3 | define(['exports', 'redux-saga/effects', './ErrorHandle', 'regenerator-runtime'], factory); 4 | } else if (typeof exports !== "undefined") { 5 | factory(exports, require('redux-saga/effects'), require('./ErrorHandle'), require('regenerator-runtime')); 6 | } else { 7 | var mod = { 8 | exports: {} 9 | }; 10 | factory(mod.exports, global.effects, global.ErrorHandle, global.regeneratorRuntime); 11 | global.httpWrapper = mod.exports; 12 | } 13 | })(this, function (exports, _effects, _ErrorHandle, regeneratorRuntime) { 14 | 'use strict'; 15 | 16 | Object.defineProperty(exports, "__esModule", { 17 | value: true 18 | }); 19 | exports.default = httpRequest; 20 | 21 | var _ErrorHandle2 = _interopRequireDefault(_ErrorHandle); 22 | 23 | function _interopRequireDefault(obj) { 24 | return obj && obj.__esModule ? obj : { 25 | default: obj 26 | }; 27 | } 28 | 29 | var _marked = regeneratorRuntime.mark(httpRequest), 30 | _marked2 = regeneratorRuntime.mark(makeRequest); 31 | 32 | function httpRequest() { 33 | var res, 34 | _args = arguments; 35 | return regeneratorRuntime.wrap(function httpRequest$(_context) { 36 | while (1) { 37 | switch (_context.prev = _context.next) { 38 | case 0: 39 | _context.prev = 0; 40 | _context.next = 3; 41 | return makeRequest.apply(undefined, _args); 42 | 43 | case 3: 44 | res = _context.sent; 45 | return _context.abrupt('return', res); 46 | 47 | case 7: 48 | _context.prev = 7; 49 | _context.t0 = _context['catch'](0); 50 | 51 | _context.t0.error = true; 52 | _context.next = 12; 53 | return (0, _ErrorHandle2.default)(_context.t0); 54 | 55 | case 12: 56 | return _context.abrupt('return', _context.t0); 57 | 58 | case 13: 59 | case 'end': 60 | return _context.stop(); 61 | } 62 | } 63 | }, _marked, this, [[0, 7]]); 64 | } 65 | 66 | function makeRequest() { 67 | var _args2 = arguments; 68 | return regeneratorRuntime.wrap(function makeRequest$(_context2) { 69 | while (1) { 70 | switch (_context2.prev = _context2.next) { 71 | case 0: 72 | _context2.next = 2; 73 | return _effects.call.apply(undefined, _args2); 74 | 75 | case 2: 76 | return _context2.abrupt('return', _context2.sent); 77 | 78 | case 3: 79 | case 'end': 80 | return _context2.stop(); 81 | } 82 | } 83 | }, _marked2, this); 84 | }; 85 | 86 | /* eslint no-unused-vars: "off" */ 87 | }); -------------------------------------------------------------------------------- /dist/server/index.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | if (typeof define === "function" && define.amd) { 3 | define(['exports', './api', './httpWrapper', './Logger', './util/uploadFiles'], factory); 4 | } else if (typeof exports !== "undefined") { 5 | factory(exports, require('./api'), require('./httpWrapper'), require('./Logger'), require('./util/uploadFiles')); 6 | } else { 7 | var mod = { 8 | exports: {} 9 | }; 10 | factory(mod.exports, global.api, global.httpWrapper, global.Logger, global.uploadFiles); 11 | global.index = mod.exports; 12 | } 13 | })(this, function (exports, _api, _httpWrapper, _Logger, _uploadFiles) { 14 | 'use strict'; 15 | 16 | Object.defineProperty(exports, "__esModule", { 17 | value: true 18 | }); 19 | exports.uploadFilesFromData = exports.httpRequest = exports.Logger = exports.api = undefined; 20 | 21 | var _api2 = _interopRequireDefault(_api); 22 | 23 | var _httpWrapper2 = _interopRequireDefault(_httpWrapper); 24 | 25 | var _Logger2 = _interopRequireDefault(_Logger); 26 | 27 | var _uploadFiles2 = _interopRequireDefault(_uploadFiles); 28 | 29 | function _interopRequireDefault(obj) { 30 | return obj && obj.__esModule ? obj : { 31 | default: obj 32 | }; 33 | } 34 | 35 | exports.api = _api2.default; 36 | exports.Logger = _Logger2.default; 37 | exports.httpRequest = _httpWrapper2.default; 38 | exports.uploadFilesFromData = _uploadFiles2.default; 39 | }); -------------------------------------------------------------------------------- /dist/server/util/uploadFiles.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | if (typeof define === "function" && define.amd) { 3 | define(['exports', 'regenerator-runtime', '../api', 'redux-saga/effects'], factory); 4 | } else if (typeof exports !== "undefined") { 5 | factory(exports, require('regenerator-runtime'), require('../api'), require('redux-saga/effects')); 6 | } else { 7 | var mod = { 8 | exports: {} 9 | }; 10 | factory(mod.exports, global.regeneratorRuntime, global.api, global.effects); 11 | global.uploadFiles = mod.exports; 12 | } 13 | })(this, function (exports, _regeneratorRuntime, _api, _effects) { 14 | 'use strict'; 15 | 16 | Object.defineProperty(exports, "__esModule", { 17 | value: true 18 | }); 19 | exports.setRNFetchBlob = undefined; 20 | exports.default = uploadFilesFromData; 21 | 22 | var _regeneratorRuntime2 = _interopRequireDefault(_regeneratorRuntime); 23 | 24 | var _api2 = _interopRequireDefault(_api); 25 | 26 | function _interopRequireDefault(obj) { 27 | return obj && obj.__esModule ? obj : { 28 | default: obj 29 | }; 30 | } 31 | 32 | var _marked = _regeneratorRuntime2.default.mark(uploadFilesFromData); 33 | 34 | var RNFetchBlob = null; 35 | 36 | var setRNFetchBlob = exports.setRNFetchBlob = function setRNFetchBlob(res) { 37 | RNFetchBlob = res; 38 | }; 39 | var browserFileUnloader = _regeneratorRuntime2.default.mark(function _callee(file) { 40 | return _regeneratorRuntime2.default.wrap(function _callee$(_context) { 41 | while (1) { 42 | switch (_context.prev = _context.next) { 43 | case 0: 44 | _context.next = 2; 45 | return (0, _effects.call)(_api2.default.uploadFile, file); 46 | 47 | case 2: 48 | return _context.abrupt('return', _context.sent); 49 | 50 | case 3: 51 | case 'end': 52 | return _context.stop(); 53 | } 54 | } 55 | }, _callee, this); 56 | }); 57 | var nativeFileUnloader = _regeneratorRuntime2.default.mark(function _callee2(file) { 58 | return _regeneratorRuntime2.default.wrap(function _callee2$(_context2) { 59 | while (1) { 60 | switch (_context2.prev = _context2.next) { 61 | case 0: 62 | if (RNFetchBlob) { 63 | _context2.next = 4; 64 | break; 65 | } 66 | 67 | throw 'react parse need instance of RNFetchBlob, please install rn-fetch-blo and use setRNFetchBlob from react-parse'; 68 | 69 | case 4: 70 | _context2.next = 6; 71 | return (0, _effects.call)(_api2.default.uploadFileFromReactNativeStorage, RNFetchBlob, file); 72 | 73 | case 6: 74 | return _context2.abrupt('return', _context2.sent); 75 | 76 | case 7: 77 | case 'end': 78 | return _context2.stop(); 79 | } 80 | } 81 | }, _callee2, this); 82 | }); 83 | 84 | function uploadFilesFromData(data, fileValueHandler) { 85 | var isReactNative, k, fileRes; 86 | return _regeneratorRuntime2.default.wrap(function uploadFilesFromData$(_context3) { 87 | while (1) { 88 | switch (_context3.prev = _context3.next) { 89 | case 0: 90 | if (data) { 91 | _context3.next = 2; 92 | break; 93 | } 94 | 95 | return _context3.abrupt('return'); 96 | 97 | case 2: 98 | isReactNative = typeof navigator != 'undefined' && navigator.product == 'ReactNative'; 99 | _context3.t0 = _regeneratorRuntime2.default.keys(data); 100 | 101 | case 4: 102 | if ((_context3.t1 = _context3.t0()).done) { 103 | _context3.next = 26; 104 | break; 105 | } 106 | 107 | k = _context3.t1.value; 108 | 109 | if (!(data[k] instanceof File)) { 110 | _context3.next = 24; 111 | break; 112 | } 113 | 114 | fileRes = void 0; 115 | _context3.prev = 8; 116 | 117 | if (!isReactNative) { 118 | _context3.next = 15; 119 | break; 120 | } 121 | 122 | _context3.next = 12; 123 | return nativeFileUnloader(data[k]); 124 | 125 | case 12: 126 | fileRes = _context3.sent; 127 | _context3.next = 18; 128 | break; 129 | 130 | case 15: 131 | _context3.next = 17; 132 | return browserFileUnloader(data[k]); 133 | 134 | case 17: 135 | fileRes = _context3.sent; 136 | 137 | case 18: 138 | _context3.next = 23; 139 | break; 140 | 141 | case 20: 142 | _context3.prev = 20; 143 | _context3.t2 = _context3['catch'](8); 144 | throw _context3.t2; 145 | 146 | case 23: 147 | data[k] = fileValueHandler ? fileValueHandler(fileRes) : { 148 | name: isReactNative ? fileRes.name : fileRes.data.name, 149 | url: isReactNative ? fileRes.url : fileRes.data.url, 150 | __type: 'File' 151 | }; 152 | 153 | case 24: 154 | _context3.next = 4; 155 | break; 156 | 157 | case 26: 158 | return _context3.abrupt('return', data); 159 | 160 | case 27: 161 | case 'end': 162 | return _context3.stop(); 163 | } 164 | } 165 | }, _marked, this, [[8, 20]]); 166 | } 167 | }); -------------------------------------------------------------------------------- /dist/types.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | if (typeof define === "function" && define.amd) { 3 | define(['exports'], factory); 4 | } else if (typeof exports !== "undefined") { 5 | factory(exports); 6 | } else { 7 | var mod = { 8 | exports: {} 9 | }; 10 | factory(mod.exports); 11 | global.types = mod.exports; 12 | } 13 | })(this, function (exports) { 14 | 'use strict'; 15 | 16 | Object.defineProperty(exports, "__esModule", { 17 | value: true 18 | }); 19 | exports.default = { 20 | // FETCH 21 | FETCH_START: 'FETCH_START', 22 | FETCH_FAILED: 'FETCH_FAILED', 23 | FETCH_FAILED_NETWORK: 'FETCH_FAILED_NETWORK', 24 | FETCH_FINISHED: 'FETCH_FINISHED', 25 | // POST 26 | POST_START: 'POST_START', 27 | POST_FAILED: 'POST_FAILED', 28 | POST_FAILED_NETWORK: 'POST_FAILED_NETWORK', 29 | POST_FINISHED: 'POST_FINISHED', 30 | // DELETE 31 | DELETE_START: 'DELETE_START', 32 | DELETE_FAILED: 'DELETE_FAILED', 33 | DELETE_FAILED_NETWORK: 'DELETE_FAILED_NETWORK', 34 | DELETE_FINISHED: 'DELETE_FINISHED', 35 | // PUT 36 | PUT_START: 'PUT_START', 37 | PUT_FAILED: 'PUT_FAILED', 38 | PUT_FAILED_NETWORK: 'PUT_FAILED_NETWORK', 39 | PUT_FINISHED: 'PUT_FINISHED', 40 | // Cloud Code 41 | FETCH_CLOUD_CODE: 'FETCH_CLOUD_CODE', 42 | SET_CLOUD_CODE: 'SET_CLOUD_CODE', 43 | CLEAN_CLOUD_CODE: 'CLEAN_CLOUD_CODE', 44 | CLEAN_ALL_CLOUD_CODE: 'CLEAN_ALL_CLOUD_CODE', 45 | // Collection 46 | FETCH_COLLECTION: 'FETCH_COLLECTION', 47 | REFRESH_COLLECTION: 'REFRESH_COLLECTION', 48 | SET_COLLECTION: 'SET_COLLECTION', 49 | CLEAN_COLLECTION: 'CLEAN_COLLECTION', 50 | CLEAN_ALL_COLLECTIONS: 'CLEAN_ALL_COLLECTIONS', 51 | DELETE_COLLECTION_DOC: 'DELETE_COLLECTION_DOC', 52 | PUT_COLLECTION_DOC: 'PUT_COLLECTION_DOC', 53 | POST_COLLECTION_DOC: 'POST_COLLECTION_DOC', 54 | // Document 55 | FETCH_DOCUMENT: 'FETCH_DOCUMENT', 56 | SET_DOCUMENT: 'SET_DOCUMENT', 57 | PUT_DOCUMENT: 'PUT_DOCUMENT', 58 | DELETE_DOCUMENT: 'DELETE_DOCUMENT', 59 | POST_DOCUMENT: 'POST_DOCUMENT', 60 | CLEAN_DOCUMENT: 'CLEAN_DOCUMENT', 61 | CLEAN_ALL_DOCUMENTS: 'CLEAN_ALL_DOCUMENTS', 62 | UPDATE_DOC_FIELD: 'UPDATE_DOC_FIELD', 63 | UPDATE_DOC_FIELDS: 'UPDATE_DOC_FIELDS' 64 | }; 65 | }); -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-parse", 3 | "version": "1.9.2", 4 | "description": "react components with redux and saga ready to use for easy and fast fetch data from and parse server", 5 | "main": "dist/index.js", 6 | "repository": { 7 | "type": "git", 8 | "url": "git+https://github.com/doronnahum/react-parse.git" 9 | }, 10 | "author": "doron nahum", 11 | "license": "MIT", 12 | "bugs": { 13 | "url": "https://github.com/doronnahum/react-parse/issues" 14 | }, 15 | "homepage": "https://github.com/doronnahum/react-parse#readme", 16 | "keywords": [ 17 | "react-component", 18 | "react", 19 | "react-native", 20 | "saga", 21 | "redux", 22 | "parse-server" 23 | ], 24 | "options": { 25 | "mocha": "--require scripts/mocha_runner src/**/__tests__/**/*.js" 26 | }, 27 | "scripts": { 28 | "prepublishOnly": "npm run build", 29 | "build": "babel --plugins transform-es2015-modules-umd src --ignore __tests__ --out-dir ./dist", 30 | "lint": "eslint ./src", 31 | "lintfix": "eslint ./src --fix", 32 | "testonly": "mocha $npm_package_options_mocha", 33 | "test": "npm run lint && npm run testonly", 34 | "test-watch": "npm run testonly -- --watch --watch-extensions js" 35 | }, 36 | "devDependencies": { 37 | "babel-cli": "^6.6.4", 38 | "babel-core": "^6.7.4", 39 | "babel-eslint": "^6.0.2", 40 | "babel-plugin-transform-es2015-modules-umd": "^6.24.1", 41 | "babel-plugin-transform-regenerator": "^6.26.0", 42 | "babel-preset-react": "^6.5.0", 43 | "babel-preset-stage-0": "^6.0.15", 44 | "babel-preset-stage-2": "^6.5.0", 45 | "chai": "^3.5.0", 46 | "enzyme": "^2.2.0", 47 | "eslint": "^2.7.0", 48 | "eslint-plugin-babel": "^3.1.0", 49 | "eslint-plugin-react": "^4.2.3", 50 | "jsdom": "^8.1.0", 51 | "mocha": "^2.4.5", 52 | "nodemon": "^1.9.1", 53 | "react": "^16.2.0", 54 | "react-addons-test-utils": "^15.0.0", 55 | "react-dom": "^15.0.0", 56 | "sinon": "^1.17.3" 57 | }, 58 | "peerDependencies": { 59 | "react": "~0.14.8 || ^15.0.0", 60 | "react-dom": "~0.14.8 || ^15.0.0" 61 | }, 62 | "dependencies": { 63 | "babel-polyfill": "^6.7.4", 64 | "axios": "^0.16.2", 65 | "babel-preset-env": "^1.6.1", 66 | "babel-preset-es2015": "^6.24.1", 67 | "babel-regenerator-runtime": "^6.5.0", 68 | "babel-runtime": "^6.6.1", 69 | "immutable": "^3.8.1", 70 | "lodash": "^4.17.4", 71 | "prop-types": "^15.5.10", 72 | "react": "16.0.0-alpha.6", 73 | "react-redux": "^5.0.6", 74 | "redux": "^3.6.0", 75 | "redux-saga": "^0.15.4", 76 | "regenerator-runtime": "^0.11.1", 77 | "reselect": "^3.0.1" 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /src/CloudCode/actions.js: -------------------------------------------------------------------------------- 1 | import types from '../types'; 2 | 3 | const { 4 | FETCH_CLOUD_CODE, 5 | SET_CLOUD_CODE, 6 | CLEAN_CLOUD_CODE, 7 | CLEAN_ALL_CLOUD_CODE 8 | } = types; 9 | 10 | /** 11 | * fetchData 12 | * get data from parse server cloud code by function and find the data 13 | * on redux store by targetName 14 | * @param {object} payload {functionName, targetName, params, digToData, dataHandler, dispatchId} 15 | */ 16 | export const fetchData = payload => ({ 17 | type: FETCH_CLOUD_CODE, 18 | payload 19 | }); 20 | 21 | /** 22 | * setOnStore 23 | * set and update data on store.parse.clodeCodes by targetName 24 | * @param {object} payload {targetName, status, data, info, error, dispatchId} 25 | */ 26 | export const setOnStore = payload => ({ 27 | type: SET_CLOUD_CODE, 28 | payload 29 | }); 30 | 31 | /** 32 | * cleanData 33 | * clean data from store by target name 34 | * @param {object} payload 35 | * @param {string} payload.targetName 36 | */ 37 | export const cleanData = payload => ({ 38 | type: CLEAN_CLOUD_CODE, 39 | payload 40 | }); 41 | 42 | /** 43 | * cleanCloudCode 44 | * clean all data inside cloudCode 45 | */ 46 | export const cleanCloudCode = () => ({ 47 | type: CLEAN_ALL_CLOUD_CODE 48 | }); 49 | -------------------------------------------------------------------------------- /src/CloudCode/cloudCodeActions.js: -------------------------------------------------------------------------------- 1 | import * as actions from './actions'; 2 | import {dispatch} from '../index' 3 | 4 | /** functionName, targetName, params, digToData 5 | * Dispatch action to post cloud code function 6 | * @param {object} payload 7 | * @param {string} payload.functionName functionName in the parse clouds 8 | * @param {string} payload.targetName key to store response inside redux store 9 | * if targetName empty then we use functionName as targetName 10 | * @param {object} payload.params request params 11 | * @param {string} payload.digToData string that help us find your data, default is data.result 12 | * @param {object} payload.logger pass to your Logger relevant info 13 | * @param {function} payload.dataHandler pass function that manipulate data before set to store 14 | * @param {function} payload.dispatchId optional, you can pass some unique key to help you follow specific query status 15 | * 16 | */ 17 | export const fetchData = (payload) => { 18 | dispatch(actions.fetchData(payload)) 19 | } 20 | /** 21 | * Dispatch action to clean cloud code by targetName 22 | * @param {object} payload 23 | * @param {string} payload.targetName 24 | * @param {object} payload.logger pass to your Logger relevant info 25 | * 26 | */ 27 | export const cleanData = (payload) => { 28 | dispatch(actions.cleanData(payload)) 29 | } 30 | /** 31 | * Dispatch action to clean all cloud code 32 | * 33 | */ 34 | export const cleanCloudsCode = () => { 35 | dispatch(actions.cleanCloudCode()) 36 | } 37 | -------------------------------------------------------------------------------- /src/CloudCode/index.js: -------------------------------------------------------------------------------- 1 | import React, { createElement } from 'react'; 2 | import { 3 | isCloudCodePropsChanged, 4 | isTargetChanged, 5 | isFetchFinish, 6 | isLoading, 7 | removeLocalKeys 8 | } from '../helpers'; 9 | import { propTypes, defaultProps } from './prop-types'; 10 | import connect from './store'; 11 | 12 | class FetchCloudCode extends React.Component { 13 | constructor(props) { 14 | super(props); 15 | this.fetchData = this.fetchData.bind(this); 16 | this.onRefresh = this.onRefresh.bind(this); 17 | } 18 | componentWillMount() { 19 | const { localFirst, functionName, fetchData, fetchStatus } = this.props; 20 | if (!functionName) return; 21 | if (!localFirst || (localFirst && !fetchData && !isLoading(fetchStatus))) { 22 | this.fetchData(); 23 | } 24 | } 25 | 26 | componentWillReceiveProps(nextProps) { 27 | const { fetchStatus, fetchData, fetchError } = nextProps; 28 | if (isCloudCodePropsChanged(this.props, nextProps)) { 29 | if (isTargetChanged(this.props, nextProps)) { 30 | this.cleanData(); 31 | } 32 | this.fetchData(nextProps); 33 | } else if (isFetchFinish(this.props, nextProps)) { 34 | this.props.onFetchEnd({error: fetchError, status: fetchStatus, data: fetchData }); 35 | } 36 | } 37 | 38 | componentWillUnmount() { 39 | if (this.props.leaveClean) { 40 | this.cleanData(); 41 | } 42 | } 43 | 44 | onRefresh() { 45 | this.fetchData(this.props, false); 46 | } 47 | 48 | fetchData(props = this.props, localOnly = this.props.localOnly, dispatchId) { 49 | const { functionName, targetName, params, digToData, dataHandler } = props; 50 | if (localOnly || !props.functionName) return; 51 | props.fetchActions.fetchData({ 52 | functionName, 53 | targetName, 54 | params, 55 | digToData, 56 | dataHandler, 57 | dispatchId 58 | }); 59 | } 60 | 61 | cleanData() { 62 | const targetName = this.props.targetName || this.props.functionName; 63 | this.props.fetchActions.cleanData({ targetName }); 64 | } 65 | 66 | render() { 67 | const { fetchData, fetchStatus, fetchInfo, fetchDispatchId, fetchError, component, fetchPropsKey } = this.props; 68 | let props = removeLocalKeys(this.props); 69 | let propsToPass = Object.assign(props, { 70 | [fetchPropsKey]: { 71 | data: fetchData, 72 | error: fetchError, 73 | status: fetchStatus, 74 | info: fetchInfo, 75 | dispatchId: fetchDispatchId, 76 | isLoading: isLoading(fetchStatus), 77 | refresh: this.onRefresh, 78 | } 79 | }) 80 | if(component){ 81 | return createElement(component, propsToPass) 82 | } 83 | return this.props.render(propsToPass); 84 | } 85 | } 86 | 87 | export default connect(FetchCloudCode); 88 | 89 | FetchCloudCode.propTypes = propTypes; 90 | 91 | FetchCloudCode.defaultProps = defaultProps; 92 | -------------------------------------------------------------------------------- /src/CloudCode/prop-types.js: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | 3 | export const propTypes = { 4 | /** 5 | * Cloud Function name 6 | * look at: http://docs.parseplatform.org/rest/guide/#cloud-code 7 | */ 8 | functionName: PropTypes.string.isRequired, 9 | /** 10 | * targetName 11 | * place to set server response - store.cloudCodes[targetName] 12 | * optional- if empty then target is functionName 13 | */ 14 | targetName: PropTypes.string, 15 | /** 16 | * params 17 | * object with parameters that pass on fetch 18 | * example {objectId:'59D454c'} 19 | */ 20 | params: PropTypes.object, 21 | /** 22 | * onFetchEnd 23 | * call back after fetch end 24 | * onFetchEnd(error, {data, queryStatus}) 25 | */ 26 | onFetchEnd: PropTypes.func, 27 | /** 28 | * leaveClean 29 | * we remove data from store on componentWillUnmount 30 | * default is true 31 | */ 32 | leaveClean: PropTypes.bool, 33 | /** 34 | * localFirst 35 | * fetch data from server only if we can found your data on local store 36 | */ 37 | localFirst: PropTypes.bool, 38 | /** 39 | * localOnly 40 | * never fetch data from store 41 | */ 42 | localOnly: PropTypes.bool, // get data only from local store 43 | /** 44 | * digToData 45 | * the location of the data on server response 46 | * default is 'data.result' 47 | */ 48 | digToData: PropTypes.string, 49 | /** 50 | * render props - pass function that get props and return component. 51 | * (error, props) => 52 | * props = { 53 | * data, 54 | queryStatus, 55 | isLoading, 56 | info, 57 | refreshData 58 | } 59 | */ 60 | render: PropTypes.func, 61 | /** 62 | * dataHandler 63 | * pass function that manipulate data before set to store 64 | */ 65 | dataHandler: PropTypes.func 66 | }; 67 | 68 | export const defaultProps = { 69 | digToData: 'data.result', 70 | leaveClean: true, 71 | onFetchEnd: () => {}, 72 | fetchPropsKey: 'fetchProps' 73 | }; 74 | -------------------------------------------------------------------------------- /src/CloudCode/reducerHandler.js: -------------------------------------------------------------------------------- 1 | import types from '../types'; 2 | 3 | const { Map, fromJS } = require('immutable'); 4 | import isObject from 'lodash/isObject'; 5 | 6 | // This is not a reducer, return null if it is not a relevant action. 7 | 8 | export default function reducerHandler(state, action) { 9 | const { payload } = action; 10 | const { targetName, status, data, info, error, loading, dispatchId } = payload || {}; 11 | switch (action.type) { 12 | // Cloud code 13 | case types.SET_CLOUD_CODE: { 14 | let nextState = state; 15 | if (!nextState.cloudCodes.get(targetName)) { 16 | nextState = nextState.setIn(['cloudCodes', targetName], Map()); 17 | } 18 | if ('status' in payload) { 19 | nextState = nextState.setIn( 20 | ['cloudCodes', targetName, 'status'], 21 | status 22 | ); 23 | } 24 | if ('data' in payload) { 25 | let _data // Cloud code can return a dynamic value, not only arr/obj 26 | if(isObject(data)){ 27 | _data = data 28 | }else{ 29 | _data = {value: data} 30 | } 31 | nextState = nextState.setIn(['cloudCodes', targetName, 'data'], fromJS(data)); 32 | } 33 | if ('info' in payload) { 34 | nextState = nextState.setIn(['cloudCodes', targetName, 'info'], info); 35 | } 36 | if ('error' in payload) { 37 | nextState = nextState.setIn(['cloudCodes', targetName, 'error'], error); 38 | } 39 | if ('loading' in payload) { 40 | nextState = nextState.setIn(['cloudCodes', targetName, 'loading'], loading); 41 | } 42 | if ('dispatchId' in payload) { 43 | nextState = nextState.setIn(['cloudCodes', targetName, 'dispatchId'], dispatchId); 44 | } 45 | return nextState; 46 | } 47 | case types.CLEAN_CLOUD_CODE: { 48 | const clouds = state.cloudCodes.delete(targetName); 49 | return state.set('cloudCodes', clouds); 50 | } 51 | case types.CLEAN_ALL_CLOUD_CODE: { 52 | return state.set('cloudCodes', Map()); 53 | } 54 | default: 55 | return null; 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /src/CloudCode/saga.js: -------------------------------------------------------------------------------- 1 | import regeneratorRuntime from 'regenerator-runtime'; 2 | import { put } from 'redux-saga/effects'; 3 | import httpRequest from '../server/httpWrapper'; 4 | import types from '../types'; 5 | import Api from '../server/api'; 6 | import { dig } from '../helpers'; 7 | import { setOnStore } from './actions'; 8 | import Logger from '../server/Logger'; 9 | 10 | const START = types.FETCH_START; 11 | const FAILED = types.FETCH_FAILED; 12 | const FAILED_NETWORK = types.FETCH_FAILED_NETWORK; 13 | const FINISHED = types.FETCH_FINISHED; 14 | 15 | export default function* fetchCloudCode(action) { 16 | const { functionName, targetName, params, digToData, dataHandler, dispatchId } = action.payload; 17 | const _digToData = digToData || 'data.result' 18 | const target = targetName || functionName; 19 | const _dispatchId = dispatchId || ''; 20 | yield put(setOnStore({ targetName: target, status: START, error: null, loading: true, dispatchId: _dispatchId })); 21 | const res = yield httpRequest(Api.getCloudFunction, functionName, params); 22 | if (res.error || dig(res, 'response.data.error')) { 23 | const errType = res.message === 'Network Error' ? FAILED_NETWORK : FAILED; 24 | yield put(setOnStore({ targetName: target, status: errType, error: res, loading: false, dispatchId: _dispatchId })); 25 | console.error('getCloudFunction err: ', functionName, res.error); 26 | Logger.onError('CLOUD_CODE', action, errType, res); 27 | } else { 28 | const _data = dig(res, _digToData); 29 | const data = dataHandler ? dataHandler(_data) : _data 30 | yield put( 31 | setOnStore({ 32 | targetName: target, 33 | status: FINISHED, 34 | error: null, 35 | data, 36 | info: { 37 | params, 38 | timestamp: Date.now() 39 | }, 40 | loading: false, 41 | dispatchId: _dispatchId 42 | }) 43 | ); 44 | Logger.onSuccess('CLOUD_CODE', action, FINISHED, res); 45 | } 46 | } 47 | /* eslint no-unused-vars: "off" */ 48 | -------------------------------------------------------------------------------- /src/CloudCode/selectors.js: -------------------------------------------------------------------------------- 1 | import { createSelector } from 'reselect'; 2 | import { Map } from 'immutable'; 3 | import { 4 | isLoading, 5 | } from '../helpers'; 6 | 7 | const MAP = Map(); 8 | 9 | const getTargetName = (state, targetName) => targetName; 10 | 11 | // --- Cloud codes ---/ 12 | export const getCloudCodes = state => state.parse.cloudCodes; 13 | // -- Get specific collections 14 | const getImmutableCloudCodes = createSelector( 15 | [getCloudCodes, getTargetName], 16 | (cloudCodes, targetName) => cloudCodes.get(targetName) || MAP 17 | ); 18 | export const getCloudCode = createSelector( 19 | getImmutableCloudCodes, 20 | dataImmutable => dataImmutable.toJS() 21 | ); 22 | export const getData = createSelector( 23 | getImmutableCloudCodes, 24 | dataImmutable => dataImmutable.get('data') && dataImmutable.get('data').toJS() 25 | ); 26 | export const getStatus = createSelector(getImmutableCloudCodes, dataImmutable => 27 | dataImmutable.get('status') 28 | ); 29 | export const getDispatchId = createSelector(getImmutableCloudCodes, dataImmutable => 30 | dataImmutable.get('dispatchId') 31 | ); 32 | export const getLoading = createSelector(getImmutableCloudCodes, dataImmutable => 33 | isLoading(dataImmutable.get('status')) 34 | ); 35 | export const getInfo = createSelector(getImmutableCloudCodes, dataImmutable => 36 | dataImmutable.get('info') 37 | ); 38 | export const getError = createSelector(getImmutableCloudCodes, dataImmutable => 39 | dataImmutable.get('error') 40 | ); 41 | -------------------------------------------------------------------------------- /src/CloudCode/store.js: -------------------------------------------------------------------------------- 1 | import { connect } from 'react-redux'; 2 | import { bindActionCreators } from 'redux'; 3 | import { fetchData, cleanData } from './actions'; 4 | import { getData, getStatus, getInfo, getError, getDispatchId } from './selectors'; 5 | 6 | function mapStateToProps(state, props) { 7 | const keyForData = props.targetName || props.functionName; 8 | return { 9 | fetchData: getData(state, keyForData), 10 | fetchStatus: getStatus(state, keyForData), 11 | fetchInfo: getInfo(state, keyForData), 12 | fetchError: getError(state, keyForData), 13 | fetchDispatchId: getDispatchId(state, keyForData) 14 | }; 15 | } 16 | 17 | function mapDispatchToProps(dispatch) { 18 | return { 19 | fetchActions: bindActionCreators({ fetchData, cleanData }, dispatch) 20 | }; 21 | } 22 | 23 | export default comp => connect(mapStateToProps, mapDispatchToProps)(comp); -------------------------------------------------------------------------------- /src/Collection/actions.js: -------------------------------------------------------------------------------- 1 | import types from '../types'; 2 | 3 | const { 4 | FETCH_COLLECTION, 5 | REFRESH_COLLECTION, 6 | SET_COLLECTION, 7 | CLEAN_COLLECTION, 8 | CLEAN_ALL_COLLECTIONS, 9 | DELETE_COLLECTION_DOC, 10 | PUT_COLLECTION_DOC, 11 | POST_COLLECTION_DOC, 12 | } = types; 13 | 14 | /** 15 | * fetchData 16 | * @param {obj} {schemaName, targetName, query, perPage, page, include, keys, enableCount, dataHandler, dispatchId, boomerang} 17 | */ 18 | export const fetchData = payload => ({ 19 | type: FETCH_COLLECTION, 20 | payload 21 | }); 22 | /** 23 | * refreshCollection 24 | * @param {obj} {payload.targetName} 25 | * @param {obj} {payload.dispatchId} 26 | */ 27 | export const refreshCollection = payload => ({ 28 | type: REFRESH_COLLECTION, 29 | payload 30 | }); 31 | 32 | /** 33 | * setOnStore 34 | * @param {*} payload {targetName, status, data, info, error, dispatchId, boomerang} 35 | */ 36 | export const setOnStore = payload => ({ 37 | type: SET_COLLECTION, 38 | payload 39 | }); 40 | 41 | /** 42 | * deleteDocument 43 | * @param {*} payload {schemaName, targetName, objectId, autoRefresh, dispatchId, boomerang} 44 | */ 45 | export const deleteDoc = payload => ({ 46 | type: DELETE_COLLECTION_DOC, 47 | payload 48 | }); 49 | 50 | /** 51 | * putDoc 52 | * @param {*} payload {schemaName, targetName, objectId, data, autoRefresh, filesIncluded, fileValueHandler, dispatchId, boomerang} 53 | */ 54 | export const putDoc = payload => ({ 55 | type: PUT_COLLECTION_DOC, 56 | payload 57 | }); 58 | 59 | /** 60 | * potDoc 61 | * @param {*} payload {schemaName, targetName, data, autoRefresh, filesIncluded, fileValueHandler, dispatchId, boomerang} 62 | */ 63 | export const postDoc = payload => ({ 64 | type: POST_COLLECTION_DOC, 65 | payload 66 | }); 67 | 68 | /** 69 | * cleanCollection 70 | * @param {*} payload {targetName} 71 | */ 72 | export const cleanData = payload => ({ 73 | type: CLEAN_COLLECTION, 74 | payload 75 | }); 76 | 77 | export const cleanCollections = () => ({ 78 | type: CLEAN_ALL_COLLECTIONS, 79 | }); 80 | -------------------------------------------------------------------------------- /src/Collection/collectionActions.js: -------------------------------------------------------------------------------- 1 | import * as actions from './actions'; 2 | import {dispatch} from '../index' 3 | 4 | 5 | /** 6 | * Dispatch action to get collection data from parse server 7 | * @param {object} payload 8 | * @param {string} payload.schemaName db schemaName 9 | * @param {string} payload.targetName key to store response inside redux store 10 | * if targetName empty then we use schemaName as targetName 11 | * @param {object} payload.query http://docs.parseplatform.org/rest/guide/#queries 12 | * @param {number} payload.perPage number of documents to include in each query 13 | * @param {string} payload.page number of pages to skip 14 | * @param {string} payload.include pointer to include 15 | * @param {string} payload.keys keys to include 16 | * @param {boolean} payload.enableCount set true to get count objects in the collection 17 | * @param {object} payload.logger pass to your Logger relevant info 18 | * @param {function} payload.dataHandler pass function that manipulate data before set to store 19 | * @param {function} payload.dispatchId optional, you can pass some unique key to help you follow specific query status 20 | * @param {function} payload.boomerang optional, you can pass some data that help you manage your things with this async query 21 | */ 22 | export const fetchData = (payload) => { 23 | dispatch(actions.fetchData(payload)) 24 | } 25 | 26 | /** 27 | * Dispatch action to clean all redux.parse.collections 28 | */ 29 | export const cleanCollections = ()=> { 30 | dispatch(actions.cleanCollections()) 31 | } 32 | 33 | /** 34 | * Dispatch action to delete document from collection 35 | * @param {object} payload 36 | * @param {string} payload.schemaName db schemaName 37 | * @param {string} payload.targetName key to store response inside redux store 38 | * @param {string} payload.objectId document id 39 | * @param {boolean} payload.autoRefresh set to to refresh collection data 40 | * @param {object} payload.logger pass to your Logger relevant info 41 | */ 42 | export const deleteDoc = (payload)=> { 43 | dispatch(actions.deleteDoc(payload)) 44 | } 45 | 46 | /** 47 | * Dispatch action to create a new document in collection 48 | * @param {object} payload 49 | * @param {string} payload.schemaName db schemaName 50 | * @param {string} payload.targetName key to store response inside redux store 51 | * @param {object} payload.data new doucment data 52 | * @param {boolean} payload.autoRefresh set to to refresh collection data 53 | * @param {object} payload.logger pass to your Logger relevant info 54 | * @param {boolean} payload.filesIncluded set true if your data include file to upload 55 | * @param {function} payload.fileValueHandler pass function that will get the new file URL if you didn't want to save it as File object 56 | * @param {function} payload.dispatchId optional, you can pass some unique key to help you follow specific query status 57 | */ 58 | export const postDoc = (payload)=> { 59 | dispatch(actions.postDoc(payload)) 60 | } 61 | 62 | /** 63 | * Dispatch action to create a new document in collection 64 | * @param {object} payload 65 | * @param {string} payload.schemaName db schemaName 66 | * @param {string} payload.targetName key to store response inside redux store 67 | * @param {string} payload.objectId document id 68 | * @param {object} payload.data data to update in the doucment 69 | * @param {boolean} payload.autoRefresh set to to refresh collection data 70 | * @param {object} payload.logger pass to your Logger relevant info 71 | * @param {boolean} payload.filesIncluded set true if your data include file to upload 72 | * @param {function} payload.fileValueHandler pass function that will get the new file URL if you didn't want to save it as File object 73 | * @param {function} payload.dispatchId optional, you can pass some unique key to help you follow specific query status 74 | * @param {function} payload.boomerang optional, you can pass some data that help you manage your things with this async query 75 | */ 76 | export const putDoc = (payload)=> { 77 | dispatch(actions.putDoc(payload)) 78 | } 79 | 80 | /** 81 | * Dispatch action to refresh collection data by targetName 82 | * this will keep the same parameters like the last fetchData 83 | * @param {object} payload 84 | * @param {string} payload.targetName 85 | */ 86 | export const refreshCollection = (payload)=> { 87 | dispatch(actions.refreshCollection(payload)) 88 | } 89 | 90 | /** 91 | * Dispatch action to clean collection by targetName 92 | * @param {object} payload 93 | * @param {string} payload.targetName 94 | * 95 | */ 96 | export const cleanData = (payload)=> { 97 | dispatch(actions.cleanData(payload)) 98 | } -------------------------------------------------------------------------------- /src/Collection/prop-types.js: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | 3 | export const defaultProps = { 4 | order: '-createdAt', 5 | autoRefresh: true, 6 | onFetchEnd: () => {}, 7 | onPostEnd: () => {}, 8 | onPutEnd: () => {}, 9 | onDeleteEnd: () => {}, 10 | fetchPropsKey: 'fetchProps' 11 | }; 12 | 13 | export const propTypes = { 14 | schemaName: PropTypes.string.isRequired, 15 | /** 16 | * targetName 17 | * place to set server response - store.collections[targetName] 18 | * optional- if empty then target is schemaName 19 | */ 20 | targetName: PropTypes.string, 21 | /** 22 | * query 23 | * object with parameters that pass on fetch 24 | * example {title:'59D454c'} 25 | */ 26 | query: PropTypes.object, 27 | /** 28 | * limit 29 | * Limit the number of objects returned by the query 30 | */ 31 | limit: PropTypes.number, 32 | /** 33 | * skip 34 | * Use with limit to paginate through results 35 | */ 36 | skip: PropTypes.number, 37 | /** 38 | * enableCount 39 | * return the amount of results in data base 40 | */ 41 | enableCount: PropTypes.bool, 42 | /** 43 | * keys 44 | * example: 'title,body' 45 | * Restrict the fields returned by the query 46 | */ 47 | keys: PropTypes.string, 48 | /** 49 | * include 50 | * example: 'post,categories' 51 | * Use on Pointer columns to return the full object 52 | */ 53 | include: PropTypes.string, 54 | /** 55 | * order 56 | * default is '-createdAt' 57 | * Specify a field to sort by 58 | */ 59 | order: PropTypes.string, 60 | /** 61 | * onFetchEnd 62 | * call back after fetch end 63 | * onFetchEnd(error, {data, queryStatus}) 64 | */ 65 | onFetchEnd: PropTypes.func, 66 | /** 67 | * onPostEnd 68 | * call back after fetch end 69 | * onPostEnd(error, {data, queryStatus}) 70 | */ 71 | onPostEnd: PropTypes.func, 72 | /** 73 | * onPutEnd 74 | * call back after fetch end 75 | * onPutEnd(error, {data, queryStatus}) 76 | */ 77 | onPutEnd: PropTypes.func, 78 | /** 79 | * onDeleteEnd 80 | * call back after fetch end 81 | * onDeleteEnd(error, {data, queryStatus}) 82 | */ 83 | onDeleteEnd: PropTypes.func, 84 | /** 85 | * leaveClean 86 | * we remove data from store on componentWillUnmount 87 | * default is true 88 | */ 89 | leaveClean: PropTypes.bool, 90 | /** 91 | * localFirst 92 | * fetch data from server only if we can found your data on local store 93 | */ 94 | localFirst: PropTypes.bool, 95 | /** 96 | * localOnly 97 | * never fetch data from store 98 | */ 99 | localOnly: PropTypes.bool, 100 | /** 101 | * autoRefresh 102 | * default true 103 | * Get data after each create/update/delete doc 104 | */ 105 | autoRefresh: PropTypes.bool, 106 | /** 107 | * render props - pass function that get props and return component. 108 | * (error, props) => 109 | * props = { 110 | * data, 111 | isLoading, 112 | queryStatus, 113 | info, 114 | refreshData, 115 | deleteDocument, 116 | putDocument, 117 | postDocument 118 | } 119 | */ 120 | render: PropTypes.func, 121 | /** 122 | * dataHandler 123 | * pass function that manipulate data before set to store 124 | */ 125 | dataHandler: PropTypes.func 126 | }; 127 | -------------------------------------------------------------------------------- /src/Collection/reducerHandler.js: -------------------------------------------------------------------------------- 1 | import types from '../types'; 2 | 3 | const { Map, List } = require('immutable'); 4 | 5 | const { SET_COLLECTION, CLEAN_COLLECTION, CLEAN_ALL_COLLECTIONS } = types; 6 | // This is not a reducer, return null if it is not a relevant action. 7 | 8 | export default function reducerHandler(state, action) { 9 | const { payload } = action; 10 | const { targetName, status, data, info, error, loading, dispatchId, boomerang } = payload || {}; 11 | switch (action.type) { 12 | case SET_COLLECTION: { 13 | const collection = state.collections.get(targetName); 14 | let nextState = state; 15 | if (!collection) { 16 | nextState = nextState.setIn(['collections', targetName], Map()); 17 | } 18 | if ('status' in payload) { 19 | nextState = nextState.setIn( 20 | ['collections', targetName, 'status'], 21 | status 22 | ); 23 | } 24 | if ('data' in payload) { 25 | nextState = nextState.setIn( 26 | ['collections', targetName, 'data'], 27 | List(data) 28 | ); 29 | } 30 | if ('info' in payload) { 31 | nextState = nextState.setIn(['collections', targetName, 'info'], info); 32 | } 33 | if ('error' in payload) { 34 | nextState = nextState.setIn( 35 | ['collections', targetName, 'error'], 36 | error 37 | ); 38 | } 39 | if ('loading' in payload) { 40 | nextState = nextState.setIn(['collections', targetName, 'loading'], loading); 41 | } 42 | if ('dispatchId' in payload) { 43 | nextState = nextState.setIn(['collections', targetName, 'dispatchId'], dispatchId); 44 | } 45 | if (boomerang) { 46 | nextState = nextState.setIn(['documents', targetName, 'boomerang'], boomerang); 47 | } 48 | return nextState; 49 | } 50 | case CLEAN_COLLECTION: { 51 | const collections = state.collections.delete(targetName); 52 | return state.set('collections', collections); 53 | } 54 | case CLEAN_ALL_COLLECTIONS: { 55 | return state.set('collections', Map()); 56 | } 57 | default: 58 | return null; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/Collection/saga.js: -------------------------------------------------------------------------------- 1 | import fetchCollection from './workers/fetchCollection'; 2 | import refreshCollection from './workers/refreshCollection'; 3 | import deleteDoc from './workers/deleteDoc'; 4 | import putDoc from './workers/putDoc'; 5 | import postDoc from './workers/postDoc'; 6 | 7 | export { fetchCollection, deleteDoc, putDoc, postDoc, refreshCollection }; 8 | -------------------------------------------------------------------------------- /src/Collection/selectors.js: -------------------------------------------------------------------------------- 1 | import { createSelector } from 'reselect'; 2 | import { 3 | isLoading, 4 | } from '../helpers'; 5 | import { Map } from 'immutable'; 6 | 7 | const MAP = Map(); 8 | 9 | const getTargetName = (state, targetName) => targetName; 10 | 11 | export const getCollections = state => state.parse.collections; 12 | 13 | const getImmutableCollection = createSelector( 14 | [getCollections, getTargetName], 15 | (collections, targetName) => collections.get(targetName) || MAP 16 | ); 17 | 18 | export const getCollection = createSelector( 19 | getImmutableCollection, 20 | dataImmutable => dataImmutable.toJS() 21 | ); 22 | export const getData = createSelector( 23 | getImmutableCollection, 24 | dataImmutable => dataImmutable.get('data') && dataImmutable.get('data').toJS() 25 | ); 26 | 27 | export const getStatus = createSelector(getImmutableCollection, dataImmutable => 28 | dataImmutable.get('status') 29 | ); 30 | export const getDispatchId = createSelector(getImmutableCollection, dataImmutable => 31 | dataImmutable.get('dispatchId') 32 | ); 33 | export const getBoomerang = createSelector(getImmutableCollection, dataImmutable => 34 | dataImmutable.get('boomerang') 35 | ); 36 | export const getLoading = createSelector(getImmutableCollection, dataImmutable => 37 | isLoading(dataImmutable.get('status')) 38 | ); 39 | 40 | export const getInfo = createSelector(getImmutableCollection, dataImmutable => 41 | dataImmutable.get('info') 42 | ); 43 | export const getCount = createSelector(getImmutableCollection, dataImmutable => { 44 | const info = dataImmutable.get('info') || {} 45 | return info.count 46 | } 47 | ); 48 | 49 | export const getError = createSelector(getImmutableCollection, dataImmutable => 50 | dataImmutable.get('error') 51 | ); 52 | -------------------------------------------------------------------------------- /src/Collection/store.js: -------------------------------------------------------------------------------- 1 | import { connect } from 'react-redux'; 2 | import { bindActionCreators } from 'redux'; 3 | import { fetchData, deleteDoc, putDoc, postDoc, cleanData } from './actions'; 4 | import { getData, getStatus, getInfo, getError, getDispatchId, getCount, getBoomerang } from './selectors'; 5 | 6 | function mapStateToProps(state, props) { 7 | const keyForData = props.targetName || props.schemaName; 8 | return { 9 | fetchData: getData(state, keyForData), 10 | fetchStatus: getStatus(state, keyForData), 11 | fetchInfo: getInfo(state, keyForData), 12 | fetchError: getError(state, keyForData), 13 | fetchCount: getCount(state, keyForData), 14 | fetchDispatchId: getDispatchId(state, keyForData), 15 | fetchBoomerang: getBoomerang(state, keyForData) 16 | }; 17 | } 18 | 19 | function mapDispatchToProps(dispatch) { 20 | return { 21 | fetchActions: bindActionCreators( 22 | { 23 | fetchData, 24 | deleteDoc, 25 | putDoc, 26 | postDoc, 27 | cleanData 28 | }, 29 | dispatch 30 | ) 31 | }; 32 | } 33 | 34 | export default comp => connect(mapStateToProps, mapDispatchToProps)(comp); -------------------------------------------------------------------------------- /src/Collection/workers/deleteDoc.js: -------------------------------------------------------------------------------- 1 | import regeneratorRuntime from 'regenerator-runtime'; 2 | import { put } from 'redux-saga/effects'; 3 | import httpRequest from '../../server/httpWrapper'; 4 | import types from '../../types'; 5 | import api from '../../server/api'; 6 | import Logger from '../../server/Logger'; 7 | import { setOnStore, refreshCollection } from '../actions'; 8 | 9 | const START = types.DELETE_START; 10 | const FAILED = types.DELETE_FAILED; 11 | const FAILED_NETWORK = types.DELETE_FAILED_NETWORK; 12 | const FINISHED = types.DELETE_FINISHED; 13 | 14 | export default function* deleteDoc(action) { 15 | const { targetName, schemaName, objectId, autoRefresh, dispatchId, boomerang } = action.payload; 16 | const _dispatchId = dispatchId || ''; 17 | const target = targetName || schemaName; 18 | yield put(setOnStore({ targetName: target, status: START, error: null, loading: true, dispatchId: _dispatchId, boomerang })); 19 | const res = yield* httpRequest(api.deleteObject, schemaName, objectId); 20 | if (res.error) { 21 | const errType = res.message === 'Network Error' ? FAILED_NETWORK : FAILED; 22 | console.error('deleteDoc err', schemaName, objectId, res.err); 23 | yield put(setOnStore({ targetName: target, status: errType, error: res, loading: false, dispatchId: _dispatchId, boomerang })); 24 | Logger.onError('DELETE', action, errType, res); 25 | } else { 26 | yield put( 27 | setOnStore({ targetName: target, status: FINISHED, error: null, loading: false, dispatchId: _dispatchId, boomerang, info: {deleteDocId: objectId} }) 28 | ); 29 | Logger.onSuccess('DELETE', action, FINISHED, res); 30 | if(autoRefresh){ 31 | yield put( 32 | refreshCollection({ targetName: target }) 33 | ); 34 | } 35 | } 36 | } 37 | /* eslint no-unused-vars: "off" */ 38 | -------------------------------------------------------------------------------- /src/Collection/workers/fetchCollection.js: -------------------------------------------------------------------------------- 1 | import regeneratorRuntime from 'regenerator-runtime'; 2 | import { put } from 'redux-saga/effects'; 3 | import httpRequest from '../../server/httpWrapper'; 4 | import types from '../../types'; 5 | import api from '../../server/api'; 6 | import { setOnStore } from '../actions'; 7 | import { dig } from '../../helpers'; 8 | import Logger from '../../server/Logger'; 9 | 10 | const START = types.FETCH_START; 11 | const FAILED = types.FETCH_FAILED; 12 | const FAILED_NETWORK = types.FETCH_FAILED_NETWORK; 13 | const FINISHED = types.FETCH_FINISHED; 14 | 15 | export default function* fetchCollection(action) { 16 | const { 17 | targetName, 18 | schemaName, 19 | query, 20 | skip, 21 | page, 22 | enableCount, 23 | keys, 24 | include, 25 | order, 26 | limit, 27 | dataHandler, 28 | dispatchId, 29 | boomerang 30 | } = action.payload; 31 | const target = targetName || schemaName; 32 | const _dispatchId = dispatchId || ''; 33 | yield put(setOnStore({ targetName: target, status: START, error: null, loading: true, dispatchId: _dispatchId, boomerang })); 34 | const res = yield* httpRequest( 35 | api.query, 36 | schemaName, 37 | query, 38 | limit, 39 | skip, 40 | enableCount, 41 | keys, 42 | include, 43 | order 44 | ); 45 | if (res.error) { 46 | const errType = res.message === 'Network Error' ? FAILED_NETWORK : FAILED; 47 | console.error('fetchCollection err: ', schemaName, res.error); 48 | yield put(setOnStore({ targetName: target, status: errType, error: res, loading: false, dispatchId: _dispatchId, boomerang })); 49 | Logger.onError('GET', action, errType, res); 50 | } else { 51 | const _data = dig(res, 'data.results') 52 | const data = dataHandler ? dataHandler(_data) : _data; 53 | const info = { 54 | schemaName, 55 | query, 56 | skip, 57 | page, 58 | enableCount, 59 | keys, 60 | include, 61 | order, 62 | limit, 63 | count: res.data.count, 64 | timestamp: Date.now() 65 | }; 66 | yield put( 67 | setOnStore({ 68 | targetName: target, 69 | status: FINISHED, 70 | error: null, 71 | data, 72 | info, 73 | loading: false, 74 | dispatchId: _dispatchId, 75 | boomerang 76 | }) 77 | ); 78 | Logger.onSuccess('GET', action, FINISHED, res); 79 | } 80 | } 81 | /* eslint no-unused-vars: "off" */ 82 | -------------------------------------------------------------------------------- /src/Collection/workers/postDoc.js: -------------------------------------------------------------------------------- 1 | import regeneratorRuntime from 'regenerator-runtime'; 2 | import { put } from 'redux-saga/effects'; 3 | import types from '../../types'; 4 | import {Logger, api, httpRequest, uploadFilesFromData} from '../../server' 5 | import { setOnStore, refreshCollection } from '../actions'; 6 | import { removeImutableKeys } from '../../helpers'; 7 | 8 | const START = types.POST_START; 9 | const FAILED = types.POST_FAILED; 10 | const FAILED_NETWORK = types.POST_FAILED_NETWORK; 11 | const FINISHED = types.POST_FINISHED; 12 | 13 | export default function* postDoc(action) { 14 | const { schemaName, data, targetName, autoRefresh, filesIncluded, fileValueHandler, dispatchId, boomerang } = action.payload; 15 | const _dispatchId = dispatchId || ''; 16 | const target = targetName || schemaName; 17 | yield put(setOnStore({ targetName: target, status: START, error: null, loading: true, dispatchId: _dispatchId, boomerang })); 18 | let dataToSend, dataFileError, res = null; 19 | try { 20 | dataToSend = filesIncluded ? yield* uploadFilesFromData(data, fileValueHandler) : data; 21 | dataToSend = removeImutableKeys(data) 22 | } catch (error) { 23 | res = error; 24 | res.error = true 25 | dataFileError = true 26 | } 27 | if(!dataFileError){ 28 | res = yield* httpRequest(api.createObject, schemaName, dataToSend); 29 | } 30 | if (res.error) { 31 | const errType = res.message === 'Network Error' ? FAILED_NETWORK : FAILED; 32 | console.error('postDoc err', schemaName, res.err); 33 | Logger.onError('POST', action, errType, res) 34 | yield put(setOnStore({ targetName: target, status: errType, error: res, loading: false, dispatchId: _dispatchId, boomerang })); 35 | } else { 36 | yield put( 37 | setOnStore({ targetName: target, status: FINISHED, error: null, loading: false, dispatchId: _dispatchId, boomerang }) 38 | ); 39 | Logger.onSuccess('POST', action, FINISHED, res); 40 | if(autoRefresh){ 41 | yield put( 42 | refreshCollection({ targetName: target }) 43 | ); 44 | } 45 | } 46 | } 47 | /* eslint no-unused-vars: "off" */ 48 | -------------------------------------------------------------------------------- /src/Collection/workers/putDoc.js: -------------------------------------------------------------------------------- 1 | import regeneratorRuntime from 'regenerator-runtime'; 2 | import { put } from 'redux-saga/effects'; 3 | import types from '../../types'; 4 | import {Logger, api, httpRequest, uploadFilesFromData} from '../../server' 5 | import { setOnStore, refreshCollection } from '../actions'; 6 | import { removeImutableKeys } from '../../helpers'; 7 | 8 | const START = types.PUT_START; 9 | const FAILED = types.PUT_FAILED; 10 | const FAILED_NETWORK = types.PUT_FAILED_NETWORK; 11 | const FINISHED = types.PUT_FINISHED; 12 | 13 | export default function* putDoc(action) { 14 | const { targetName, schemaName, objectId, data, autoRefresh, filesIncluded, fileValueHandler, dispatchId, boomerang } = action.payload; 15 | const target = targetName || schemaName; 16 | const _dispatchId = dispatchId || ''; 17 | yield put(setOnStore({ targetName: target, status: START, error: null, loading: true, dispatchId: _dispatchId, boomerang })); 18 | let dataToSend, dataFileError, res = null; 19 | try { 20 | dataToSend = filesIncluded ? yield* uploadFilesFromData(data, fileValueHandler) : data; 21 | dataToSend = removeImutableKeys(data) 22 | } catch (error) { 23 | res = error; 24 | res.error = true 25 | dataFileError = true 26 | } 27 | if(!dataFileError){ 28 | res = yield* httpRequest(api.updateObject, schemaName, objectId, dataToSend); 29 | } 30 | if (res.error) { 31 | const errType = res.message === 'Network Error' ? FAILED_NETWORK : FAILED; 32 | console.error('putDoc err', schemaName, objectId, res.err); 33 | yield put(setOnStore({ targetName: target, status: errType, error: res, loading: false, dispatchId: _dispatchId, boomerang })); 34 | Logger.onError('PUT', action, errType, res) 35 | } else { 36 | yield put( 37 | setOnStore({ targetName: target, status: FINISHED, error: null, loading: false, dispatchId: _dispatchId, boomerang }) 38 | ); 39 | Logger.onSuccess('PUT', action, FINISHED, res); 40 | if(autoRefresh){ 41 | yield put( 42 | refreshCollection({ targetName: target }) 43 | ); 44 | } 45 | } 46 | } 47 | /* eslint no-unused-vars: "off" */ 48 | -------------------------------------------------------------------------------- /src/Collection/workers/refreshCollection.js: -------------------------------------------------------------------------------- 1 | import regeneratorRuntime from 'regenerator-runtime'; 2 | import { put, select } from 'redux-saga/effects'; 3 | import types from '../../types'; 4 | import { fetchData } from '../actions'; 5 | import { getInfo } from '../selectors'; 6 | 7 | const START = types.FETCH_START; 8 | const FAILED = types.FETCH_FAILED; 9 | const FAILED_NETWORK = types.FETCH_FAILED_NETWORK; 10 | const FINISHED = types.FETCH_FINISHED; 11 | 12 | export default function* refreshCollection(action) { 13 | const { targetName, dispatchId } = action.payload; 14 | const _dispatchId = dispatchId || ''; 15 | const info = yield select(state => getInfo(state, targetName)) 16 | if(info && info.schemaName){ 17 | yield put(fetchData(Object.assign({},info, {targetName, dispatchId: _dispatchId}))); 18 | } 19 | } 20 | /* eslint no-unused-vars: "off" */ 21 | -------------------------------------------------------------------------------- /src/Document/actions.js: -------------------------------------------------------------------------------- 1 | import types from '../types'; 2 | 3 | const { 4 | FETCH_DOCUMENT, 5 | SET_DOCUMENT, 6 | PUT_DOCUMENT, 7 | POST_DOCUMENT, 8 | DELETE_DOCUMENT, 9 | CLEAN_DOCUMENT, 10 | CLEAN_ALL_DOCUMENTS, 11 | UPDATE_DOC_FIELD, 12 | UPDATE_DOC_FIELDS 13 | } = types; 14 | 15 | /** 16 | * fetchData 17 | * @param {object} payload {targetName, schemaName, objectId, include, keys} 18 | * @param {string} payload.targetName 19 | * @param {string} payload.schemaName 20 | * @param {string} payload.objectId 21 | * @param {string} payload.include 22 | * @param {string} payload.keys, 23 | * @param {function} payload.dataHandler, 24 | * @param {function} payload.dispatchId optional, you can pass some unique key to help you follow specific query status 25 | * @param {function} payload.boomerang optional, you can pass some data that help you manage your things with this async query 26 | * 27 | */ 28 | export const fetchData = payload => ({ 29 | type: FETCH_DOCUMENT, 30 | payload 31 | }); 32 | /** 33 | * setOnStore 34 | * @param {*} payload {targetName, status, data, info, error} 35 | * @param {*} data 36 | */ 37 | export const setOnStore = payload => ({ 38 | type: SET_DOCUMENT, 39 | payload 40 | }); 41 | 42 | /** 43 | * updateField 44 | * @param {*} payload {targetName, key, value} 45 | */ 46 | export const updateField = payload => ({ 47 | type: UPDATE_DOC_FIELD, 48 | payload 49 | }); 50 | 51 | /** 52 | * updateFields 53 | * @param {*} payload {targetName, key, value} 54 | */ 55 | export const updateFields = payload => ({ 56 | type: UPDATE_DOC_FIELDS, 57 | payload 58 | }); 59 | 60 | /** 61 | * putDoc 62 | * @param {*} payload {targetName, schemaName, objectId, data, filesIncluded, fileValueHandler, dispatchId, boomerang} 63 | */ 64 | export const putDoc = payload => ({ 65 | type: PUT_DOCUMENT, 66 | payload 67 | }); 68 | /** 69 | * postDoc 70 | * @param {*} payload {targetName, schemaName, data, filesIncluded, fileValueHandler, dispatchId, boomerang} 71 | */ 72 | export const postDoc = payload => ({ 73 | type: POST_DOCUMENT, 74 | payload 75 | }); 76 | /** 77 | * deleteDoc 78 | * @param {*} payload {targetName, schemaName,objectId, dispatchId, boomerang} 79 | */ 80 | export const deleteDoc = payload => ({ 81 | type: DELETE_DOCUMENT, 82 | payload 83 | }); 84 | 85 | /** 86 | * cleanData 87 | * @param {*} payload {targetName} 88 | */ 89 | export const cleanData = payload => ({ 90 | type: CLEAN_DOCUMENT, 91 | payload 92 | }); 93 | export const clearDocuments = () => ({ 94 | type: CLEAN_ALL_DOCUMENTS 95 | }); 96 | export const cleanDocuments = () => ({ 97 | type: CLEAN_ALL_DOCUMENTS 98 | }); 99 | -------------------------------------------------------------------------------- /src/Document/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import PropsTypes from 'prop-types'; 3 | import { createUniqueId } from '../helpers'; 4 | import Document from './Document'; 5 | 6 | export default class FetchDocumentWithUniqueId extends React.PureComponent { 7 | constructor(props) { 8 | super(props); 9 | this.uniqueId = this.props.uniqueId || createUniqueId(); 10 | } 11 | render() { 12 | return ; 13 | } 14 | } 15 | 16 | FetchDocumentWithUniqueId.propTypes = { 17 | uniqueId: PropsTypes.string 18 | }; 19 | -------------------------------------------------------------------------------- /src/Document/prop-types.js: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | 3 | export const defaultProps = { 4 | order: '-createdAt', 5 | autoRefresh: false, 6 | onFetchEnd: () => {}, 7 | onPostEnd: () => {}, 8 | onPutEnd: () => {}, 9 | onDeleteEnd: () => {}, 10 | fetchPropsKey: 'fetchProps' 11 | }; 12 | 13 | export const propTypes = { 14 | schemaName: PropTypes.string.isRequired, 15 | /** 16 | * targetName 17 | * place to set server response - store.documents[targetName] 18 | * if empty then target is objectId but if 19 | * objectId is empty then we create uniqueId for you 20 | */ 21 | targetName: PropTypes.string, 22 | /** 23 | * objectId 24 | * optional - if empty then we didn't run fetch Data 25 | */ 26 | objectId: PropTypes.string, 27 | /** 28 | * keys 29 | * example: 'title,body' 30 | * Restrict the fields returned by the query 31 | */ 32 | keys: PropTypes.string, 33 | /** 34 | * include 35 | * example: 'post,categories' 36 | * Use on Pointer columns to return the full object 37 | */ 38 | include: PropTypes.string, 39 | /** 40 | * onFetchEnd 41 | * call back after fetch end 42 | * onFetchEnd(error, {data, queryStatus}) 43 | */ 44 | onFetchEnd: PropTypes.func, 45 | /** 46 | * onPostEnd 47 | * call back after fetch end 48 | * onPostEnd(error, {data, queryStatus}) 49 | */ 50 | onPostEnd: PropTypes.func, 51 | /** 52 | * onPutEnd 53 | * call back after fetch end 54 | * onPutEnd(error, {data, queryStatus}) 55 | */ 56 | onPutEnd: PropTypes.func, 57 | /** 58 | * onDeleteEnd 59 | * call back after fetch end 60 | * onDeleteEnd(error, {data, queryStatus}) 61 | */ 62 | onDeleteEnd: PropTypes.func, 63 | /** 64 | * leaveClean 65 | * we remove data from store on componentWillUnmount 66 | * default is true 67 | */ 68 | leaveClean: PropTypes.bool, 69 | /** 70 | * localFirst 71 | * fetch data from server only if we can found your data on local store 72 | */ 73 | localFirst: PropTypes.bool, 74 | /** 75 | * localOnly 76 | * never fetch data from store 77 | */ 78 | localOnly: PropTypes.bool, 79 | /** 80 | * autoRefresh 81 | * default false 82 | * Get data after each create/update/delete doc 83 | */ 84 | autoRefresh: PropTypes.bool, 85 | /** 86 | * render - pass function that get props and return component. 87 | * Exmple of use: 88 | * 93 | */ 94 | render: PropTypes.func, 95 | /** 96 | * example: 97 | * 102 | * all the props from FetchDocument will wrap inside props.fetch 103 | */ 104 | component: PropTypes.any, 105 | /** 106 | * dataHandler 107 | * pass function that manipulate data before set to store 108 | */ 109 | dataHandler: PropTypes.func 110 | /* 111 | * What you going to get Fetch: 112 | * First argument - error - the error from serve. 113 | * Second argument - { 114 | * data : {...}, // The data from server response 115 | isLoading: bollean, // True when loading 116 | status : string, // look at the status list 117 | info: {...}, // extra helpful data of the request 118 | refresh, // function that refresh the data from server 119 | deleteDoc, // function 120 | put, // update your document 121 | post, // create new document 122 | ...this.props // all you other props that you want to pass 123 | } 124 | */ 125 | }; 126 | -------------------------------------------------------------------------------- /src/Document/reducerHandler.js: -------------------------------------------------------------------------------- 1 | import types from '../types'; 2 | 3 | const { Map } = require('immutable'); 4 | 5 | const { 6 | SET_DOCUMENT, 7 | CLEAN_DOCUMENT, 8 | CLEAN_ALL_DOCUMENTS, 9 | UPDATE_DOC_FIELD, 10 | UPDATE_DOC_FIELDS 11 | } = types; 12 | // This is not a reducer, return null if it is not a relevant action. 13 | 14 | export default function reducerHandler(state, action) { 15 | const { payload } = action; 16 | const { targetName, status, data, info, error, key, value, loading, dispatchId, boomerang } = payload || {}; 17 | switch (action.type) { 18 | case SET_DOCUMENT: { 19 | const documents = state.documents.get(targetName); 20 | let nextState = state; 21 | if (!documents) { 22 | nextState = nextState.setIn(['documents', targetName], Map()); 23 | } 24 | if ('status' in payload) { 25 | nextState = nextState.setIn( 26 | ['documents', targetName, 'status'], 27 | status 28 | ); 29 | } 30 | if ('data' in payload) { 31 | nextState = nextState.setIn( 32 | ['documents', targetName, 'data'], 33 | Map(data) 34 | ); 35 | } 36 | if ('info' in payload) { 37 | nextState = nextState.setIn(['documents', targetName, 'info'], info); 38 | } 39 | if ('error' in payload) { 40 | nextState = nextState.setIn(['documents', targetName, 'error'], error); 41 | } 42 | if ('loading' in payload) { 43 | nextState = nextState.setIn(['documents', targetName, 'loading'], loading); 44 | } 45 | if ('dispatchId' in payload) { 46 | nextState = nextState.setIn(['documents', targetName, 'dispatchId'], dispatchId); 47 | } 48 | if (boomerang) { 49 | nextState = nextState.setIn(['documents', targetName, 'boomerang'], boomerang); 50 | } 51 | return nextState; 52 | } 53 | case UPDATE_DOC_FIELD: { 54 | const documents = state.documents.get(targetName); 55 | let nextState = state; 56 | if (!documents) { 57 | nextState = nextState.setIn(['documents', targetName], Map()); 58 | } 59 | nextState = nextState.setIn( 60 | ['documents', targetName, 'data', key], 61 | value 62 | ); 63 | return nextState; 64 | } 65 | case UPDATE_DOC_FIELDS: { 66 | const documents = state.documents.get(targetName); 67 | let nextState = state; 68 | if (!documents) { 69 | nextState = nextState.setIn(['documents', targetName], Map({data: Map(data)})); 70 | }else{ 71 | nextState = nextState.mergeIn(['documents', targetName, 'data'], data); 72 | } 73 | return nextState; 74 | } 75 | case CLEAN_DOCUMENT: { 76 | const documents = state.documents.delete(targetName); 77 | return state.set('documents', documents); 78 | } 79 | case CLEAN_ALL_DOCUMENTS: { 80 | return state.set('documents', Map()); 81 | } 82 | default: 83 | return null; 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /src/Document/saga.js: -------------------------------------------------------------------------------- 1 | import fetchDoc from './workers/fetchDoc'; 2 | import putDoc from './workers/putDoc'; 3 | import deleteDoc from './workers/deleteDoc'; 4 | import postDoc from './workers/postDoc'; 5 | 6 | export { fetchDoc, putDoc, deleteDoc, postDoc }; 7 | -------------------------------------------------------------------------------- /src/Document/selectors.js: -------------------------------------------------------------------------------- 1 | import { createSelector } from 'reselect'; 2 | import { Map } from 'immutable'; 3 | import { 4 | isLoading, 5 | } from '../helpers'; 6 | const MAP = Map(); 7 | 8 | const getTargetName = (state, targetName) => targetName; 9 | 10 | export const getDocuments = state => state.parse.documents; 11 | 12 | const getImmutableDoc = createSelector( 13 | [getDocuments, getTargetName], 14 | (documents, targetName) => documents.get(targetName) || MAP 15 | ); 16 | 17 | export const getDocument = createSelector( 18 | getImmutableDoc, 19 | dataImmutable => dataImmutable.toJS() 20 | ); 21 | export const getData = createSelector( 22 | getImmutableDoc, 23 | dataImmutable => dataImmutable.get('data') && dataImmutable.get('data').toJS() 24 | ); 25 | 26 | export const getStatus = createSelector(getImmutableDoc, dataImmutable => 27 | dataImmutable.get('status') 28 | ); 29 | export const getDispatchId = createSelector(getImmutableDoc, dataImmutable => 30 | dataImmutable.get('dispatchId') 31 | ); 32 | export const getBoomerang = createSelector(getImmutableDoc, dataImmutable => 33 | dataImmutable.get('boomerang') 34 | ); 35 | export const getLoading = createSelector(getImmutableDoc, dataImmutable => 36 | isLoading(dataImmutable.get('status')) 37 | ); 38 | 39 | export const getInfo = createSelector(getImmutableDoc, dataImmutable => 40 | dataImmutable.get('info') 41 | ); 42 | 43 | export const getError = createSelector(getImmutableDoc, dataImmutable => 44 | dataImmutable.get('error') 45 | ); 46 | -------------------------------------------------------------------------------- /src/Document/store.js: -------------------------------------------------------------------------------- 1 | import { connect } from 'react-redux'; 2 | import { bindActionCreators } from 'redux'; 3 | import { getData, getStatus, getInfo, getError, getDispatchId, getBoomerang } from './selectors'; 4 | import { 5 | fetchData, 6 | deleteDoc, 7 | putDoc, 8 | postDoc, 9 | cleanData, 10 | updateField, 11 | updateFields 12 | } from './actions'; 13 | 14 | function mapStateToProps(state, props) { 15 | const { targetName, objectId, uniqueId } = props; 16 | const target = targetName || (objectId || uniqueId); 17 | return { 18 | fetchData: getData(state, target), 19 | fetchStatus: getStatus(state, target), 20 | fetchInfo: getInfo(state, target), 21 | fetchError: getError(state, target), 22 | fetchDispatchId: getDispatchId(state, target), 23 | fetchBoomerang: getBoomerang(state, target), 24 | 25 | }; 26 | } 27 | 28 | function mapDispatchToProps(dispatch) { 29 | return { 30 | fetchActions: bindActionCreators( 31 | { 32 | fetchData, 33 | deleteDoc, 34 | putDoc, 35 | postDoc, 36 | cleanData, 37 | updateField, 38 | updateFields 39 | }, 40 | dispatch 41 | ) 42 | }; 43 | } 44 | 45 | export default comp => connect(mapStateToProps, mapDispatchToProps)(comp); -------------------------------------------------------------------------------- /src/Document/workers/deleteDoc.js: -------------------------------------------------------------------------------- 1 | import regeneratorRuntime from 'regenerator-runtime'; 2 | import { put } from 'redux-saga/effects'; 3 | import httpRequest from '../../server/httpWrapper'; 4 | import types from '../../types'; 5 | import api from '../../server/api'; 6 | import Logger from '../../server/Logger'; 7 | import { setOnStore } from '../actions'; 8 | const START = types.DELETE_START; 9 | const FAILED = types.DELETE_FAILED; 10 | const FAILED_NETWORK = types.DELETE_FAILED_NETWORK; 11 | const FINISHED = types.DELETE_FINISHED; 12 | 13 | export default function* deleteDoc(action) { 14 | const { targetName, schemaName, objectId, dispatchId, boomerang } = action.payload; 15 | const target = targetName || objectId; 16 | const _dispatchId = dispatchId || ''; 17 | yield put(setOnStore({ targetName: target, status: START, error: null, loading: true, dispatchId: _dispatchId, boomerang })); 18 | const res = yield* httpRequest(api.deleteObject, schemaName, objectId); 19 | if (res.error) { 20 | const errType = res.message === 'Network Error' ? FAILED_NETWORK : FAILED; 21 | console.error('deleteDoc err', objectId, res.error); 22 | yield put(setOnStore({ targetName: target, status: errType, error: res, loading: false, dispatchId: _dispatchId, boomerang })); 23 | Logger.onError('DELETE' ,action, errType, res) 24 | } else { 25 | const info = { 26 | timestamp: Date.now(), 27 | schemaName, 28 | deleteDocId: objectId 29 | }; 30 | yield put( 31 | setOnStore({ 32 | targetName: target, 33 | status: FINISHED, 34 | info, 35 | error: null, 36 | loading: false, 37 | dispatchId: _dispatchId, 38 | boomerang 39 | }) 40 | ); 41 | Logger.onSuccess('DELETE', action, FINISHED, res) 42 | } 43 | } 44 | /* eslint no-unused-vars: "off" */ 45 | -------------------------------------------------------------------------------- /src/Document/workers/fetchDoc.js: -------------------------------------------------------------------------------- 1 | import regeneratorRuntime from 'regenerator-runtime'; 2 | import { put } from 'redux-saga/effects'; 3 | import httpRequest from '../../server/httpWrapper'; 4 | import types from '../../types'; 5 | import api from '../../server/api'; 6 | import { setOnStore } from '../actions'; 7 | import Logger from '../../server/Logger'; 8 | 9 | const START = types.FETCH_START; 10 | const FAILED = types.FETCH_FAILED; 11 | const FAILED_NETWORK = types.FETCH_FAILED_NETWORK; 12 | const FINISHED = types.FETCH_FINISHED; 13 | 14 | export default function* fetchDoc(action) { 15 | const { targetName, schemaName, objectId, include, keys, dataHandler, dispatchId, boomerang } = action.payload; 16 | const target = targetName || objectId; 17 | const _dispatchId = dispatchId || ''; 18 | yield put(setOnStore({ targetName: target, status: START, error: null, loading: true, dispatchId: _dispatchId, boomerang })); 19 | const res = yield* httpRequest( 20 | api.getObjectById, 21 | schemaName, 22 | objectId, 23 | keys, 24 | include 25 | ); 26 | if (res.error) { 27 | const errType = res.message === 'Network Error' ? FAILED_NETWORK : FAILED; 28 | console.error('get document err', objectId, res.error); 29 | yield put(setOnStore({ targetName: target, status: errType, error: res, loading: false, dispatchId: _dispatchId, boomerang })); 30 | Logger.onError('GET', action, errType, res); 31 | } else { 32 | const info = { 33 | timestamp: Date.now(), 34 | keys, 35 | include, 36 | schemaName 37 | }; 38 | const _data = res.data; 39 | const data = dataHandler ? dataHandler(_data) : _data; 40 | yield put( 41 | setOnStore({ 42 | targetName: target, 43 | status: FINISHED, 44 | data, 45 | info, 46 | error: null, 47 | loading: false, 48 | dispatchId: _dispatchId, 49 | boomerang 50 | }) 51 | ); 52 | Logger.onSuccess('GET', action, FINISHED, res); 53 | } 54 | } 55 | /* eslint no-unused-vars: "off" */ 56 | -------------------------------------------------------------------------------- /src/Document/workers/postDoc.js: -------------------------------------------------------------------------------- 1 | import regeneratorRuntime from 'regenerator-runtime'; 2 | import { put } from 'redux-saga/effects'; 3 | import types from '../../types'; 4 | import {Logger, api, httpRequest, uploadFilesFromData} from '../../server' 5 | import { setOnStore } from '../actions'; 6 | import { dig, removeImutableKeys } from '../../helpers'; 7 | 8 | const START = types.POST_START; 9 | const FAILED = types.POST_FAILED; 10 | const FAILED_NETWORK = types.POST_FAILED_NETWORK; 11 | const FINISHED = types.POST_FINISHED; 12 | 13 | export default function* postDoc(action) { 14 | const { targetName, schemaName, data, filesIncluded, fileValueHandler, dispatchId, boomerang } = action.payload; 15 | const _dispatchId = dispatchId || ''; 16 | yield put(setOnStore({ targetName, status: START, error: null, loading: true, dispatchId: _dispatchId, boomerang })); 17 | let dataToSend, dataFileError, res = null; 18 | try { 19 | dataToSend = filesIncluded ? yield* uploadFilesFromData(data, fileValueHandler) : data; 20 | dataToSend = removeImutableKeys(data) 21 | } catch (error) { 22 | res = error; 23 | res.error = true 24 | dataFileError = true 25 | } 26 | if(!dataFileError){ 27 | res = yield* httpRequest(api.createObject, schemaName, dataToSend); 28 | } 29 | if (res.error) { 30 | const errType = res.message === 'Network Error' ? FAILED_NETWORK : FAILED; 31 | console.error('deleteDoc err', targetName, res.error); 32 | yield put(setOnStore({ targetName, status: errType, error: res, loading: false, dispatchId: _dispatchId, boomerang })); 33 | Logger.onError('POST', action, errType, res) 34 | } else { 35 | const info = { 36 | timestamp: Date.now(), 37 | schemaName, 38 | objectId: res.data.objectId, 39 | data, 40 | resData: dig(res, 'data.results[0]') 41 | }; 42 | yield put( 43 | setOnStore({ 44 | targetName, 45 | status: FINISHED, 46 | info, 47 | error: null, 48 | loading: false, 49 | dispatchId: _dispatchId, 50 | boomerang 51 | }) 52 | ); 53 | Logger.onSuccess('POST', action, FINISHED, res) 54 | } 55 | } 56 | /* eslint no-unused-vars: "off" */ 57 | -------------------------------------------------------------------------------- /src/Document/workers/putDoc.js: -------------------------------------------------------------------------------- 1 | import regeneratorRuntime from 'regenerator-runtime'; 2 | import { put } from 'redux-saga/effects'; 3 | import types from '../../types'; 4 | import {Logger, api, httpRequest, uploadFilesFromData} from '../../server' 5 | import { setOnStore } from '../actions'; 6 | import { dig, removeImutableKeys } from '../../helpers'; 7 | 8 | const START = types.PUT_START; 9 | const FAILED = types.PUT_FAILED; 10 | const FAILED_NETWORK = types.PUT_FAILED_NETWORK; 11 | const FINISHED = types.PUT_FINISHED; 12 | 13 | export default function* putDoc(action) { 14 | const { targetName, schemaName, data, objectId, filesIncluded, fileValueHandler, dispatchId, boomerang } = action.payload; 15 | const target = targetName || objectId; 16 | const _dispatchId = dispatchId || ''; 17 | yield put(setOnStore({ targetName: target, status: START, error: null, loading: true, dispatchId: _dispatchId, boomerang })); 18 | let dataToSend, dataFileError, res = null; 19 | try { 20 | dataToSend = filesIncluded ? yield* uploadFilesFromData(data, fileValueHandler) : data; 21 | dataToSend = removeImutableKeys(data) 22 | } catch (error) { 23 | res = error; 24 | res.error = true 25 | dataFileError = true 26 | } 27 | if(!dataFileError){ 28 | res = yield* httpRequest(api.updateObject, schemaName, objectId, dataToSend); 29 | } 30 | if (res.error) { 31 | const errType = res.message === 'Network Error' ? FAILED_NETWORK : FAILED; 32 | console.error('putDoc err', targetName, res.error); 33 | yield put(setOnStore({ targetName: target, status: errType, error: res, loading: false, dispatchId: _dispatchId, boomerang })); 34 | Logger.onError('PUT', action, errType, res) 35 | } else { 36 | const info = { 37 | timestamp: Date.now(), 38 | schemaName, 39 | objectId, 40 | data: dataToSend, 41 | resData: dig(res, 'data.results[0]') 42 | }; 43 | yield put( 44 | setOnStore({ 45 | targetName: target, 46 | status: FINISHED, 47 | info, 48 | error: null, 49 | loading: false, 50 | dispatchId: _dispatchId, 51 | boomerang 52 | }) 53 | ); 54 | Logger.onSuccess('PUT', action, FINISHED, res) 55 | } 56 | } 57 | /* eslint no-unused-vars: "off" */ 58 | -------------------------------------------------------------------------------- /src/InitialState.js: -------------------------------------------------------------------------------- 1 | const { Record, Map } = require('immutable'); 2 | 3 | const InitialState = Record({ 4 | collections: Map(), 5 | cloudCodes: Map(), 6 | documents: Map() 7 | }); 8 | 9 | export default InitialState; 10 | -------------------------------------------------------------------------------- /src/Loader/index.js: -------------------------------------------------------------------------------- 1 | import React, { createElement } from 'react'; 2 | import { propTypes, defaultProps } from './prop-types'; 3 | import connect from './store'; 4 | 5 | class ShowLoader extends React.Component { 6 | 7 | render() { 8 | const { showLoader, component} = this.props; 9 | if(component){ 10 | return createElement(component, {showLoader}) 11 | } 12 | return this.props.render(showLoader); 13 | } 14 | } 15 | 16 | export default connect(ShowLoader); 17 | 18 | ShowLoader.propTypes = propTypes; 19 | 20 | ShowLoader.defaultProps = defaultProps; 21 | -------------------------------------------------------------------------------- /src/Loader/prop-types.js: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | 3 | export const defaultProps = { 4 | }; 5 | 6 | export const propTypes = { 7 | render: PropTypes.func.isRequired, 8 | /** 9 | * render: 10 | * 13 | * all the props from FetchDocument will wrap inside props.fetch 14 | */ 15 | component: PropTypes.element 16 | /* 17 | * What you going to get Fetch: 18 | * showLoader : boolean 19 | */ 20 | }; 21 | -------------------------------------------------------------------------------- /src/Loader/selectors.js: -------------------------------------------------------------------------------- 1 | import { createSelector } from 'reselect'; 2 | import { Map } from 'immutable'; 3 | import some from 'lodash/some' 4 | const loading = { 'loading': true }; 5 | 6 | const getState = state => state.parse; 7 | // -- Get specific collections 8 | export const showLoader = createSelector( getState, state => { 9 | let status = false 10 | if(state && state.collections){ 11 | let toCheck = state.collections.toJS() 12 | status = some(toCheck, loading); 13 | if(!status){ 14 | status = some(state.cloudCodes.toJS(), loading); 15 | } 16 | if(!status){ 17 | status = some(state.documents.toJS(), loading); 18 | } 19 | } 20 | return status 21 | }); -------------------------------------------------------------------------------- /src/Loader/store.js: -------------------------------------------------------------------------------- 1 | import { connect } from 'react-redux'; 2 | import { showLoader } from './selectors'; 3 | 4 | function mapStateToProps(state, props) { 5 | return { 6 | showLoader: showLoader(state) 7 | }; 8 | } 9 | 10 | export default comp => connect(mapStateToProps, null)(comp); -------------------------------------------------------------------------------- /src/actions.js: -------------------------------------------------------------------------------- 1 | import * as CloudCodeActions from './CloudCode/actions'; 2 | import * as CollectionActions from './Collection/actions'; 3 | import * as DocumentActions from './Document/actions'; 4 | 5 | export { CloudCodeActions, CollectionActions, DocumentActions }; 6 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | // Common 2 | import 'babel-polyfill'; 3 | import api from './server/api'; 4 | import httpRequest from './server/httpWrapper'; 5 | import constants from './types'; 6 | import * as helpers from './helpers'; 7 | // Components 8 | import FetchCollection from './Collection'; 9 | import FetchDocument from './Document'; 10 | import FetchCloudCode from './CloudCode'; 11 | import ShowLoader from './Loader'; 12 | // Parse 13 | import parseReducer, {setClearStateActionType, cleanAllState} from './reducer'; 14 | import parseWatcher from './saga'; 15 | // Selectors 16 | import {cloudCodeSelectors, collectionSelectors, documentSelectors} from './selectors'; 17 | // Actions Wrapped with dispatch 18 | import * as _collectionActions from './Collection/collectionActions' 19 | import * as _documentActions from './Document/documentActions' 20 | import * as _cloudCodeActions from './CloudCode/cloudCodeActions' 21 | // Pure actions 22 | import * as pureCollectionActions from './Collection/actions' 23 | import * as pureDocumentActions from './Document/actions' 24 | import * as pureCloudCodeActions from './CloudCode/actions' 25 | // Logger 26 | import {setLoggerHandlers} from './server/Logger' 27 | const config = api; 28 | 29 | const selectors = { 30 | selectCollections: collectionSelectors.getCollections, 31 | selectCollection: collectionSelectors.getCollection, 32 | selectCollectionData: collectionSelectors.getData, 33 | selectCollectionLoading: collectionSelectors.getLoading, 34 | selectCollectionInfo: collectionSelectors.getInfo, 35 | selectCollectionStatus: collectionSelectors.getStatus, 36 | selectCollectionCount: collectionSelectors.getCount, 37 | selectCollectionError: collectionSelectors.getError, 38 | selectCollectionDispatchId: collectionSelectors.getDispatchId, 39 | selectCollectionBoomerang: collectionSelectors.getBoomerang, 40 | 41 | selectDocuments: documentSelectors.getDocuments, 42 | selectDocument: documentSelectors.getDocument, 43 | selectDocumentData: documentSelectors.getData, 44 | selectDocumentLoading: documentSelectors.getLoading, 45 | selectDocumentInfo: documentSelectors.getInfo, 46 | selectDocumentStatus: documentSelectors.getStatus, 47 | selectDocumentError: documentSelectors.getError, 48 | selectDocumentDispatchId: documentSelectors.getDispatchId, 49 | selectDocumentBoomerang: documentSelectors.getBoomerang, 50 | 51 | selectCloudCodes: cloudCodeSelectors.getCloudCodes, 52 | selectCloudCode: cloudCodeSelectors.getCloudCode, 53 | selectCloudCodeData: cloudCodeSelectors.getData, 54 | selectCloudCodeLoading: cloudCodeSelectors.getLoading, 55 | selectCloudCodeInfo: cloudCodeSelectors.getInfo, 56 | selectCloudCodeStatus: cloudCodeSelectors.getStatus, 57 | selectCloudCodeError: cloudCodeSelectors.getError, 58 | selectCloudCodeDispatchId: cloudCodeSelectors.getDispatchId, 59 | } 60 | 61 | const collectionActions ={ 62 | fetchData: _collectionActions.fetchData, 63 | pure_fetchData: pureCollectionActions.fetchData, 64 | cleanCollections: _collectionActions.cleanCollections, 65 | pure_cleanCollections: pureCollectionActions.cleanCollections, 66 | cleanData: _collectionActions.cleanData, 67 | pure_cleanData: pureCollectionActions.cleanData, 68 | deleteDoc: _collectionActions.deleteDoc, 69 | pure_deleteDoc: pureCollectionActions.deleteDoc, 70 | putDoc: _collectionActions.putDoc, 71 | pure_putDoc: pureCollectionActions.putDoc, 72 | refreshCollection: _collectionActions.refreshCollection, 73 | pure_refreshCollection: pureCollectionActions.refreshCollection, 74 | postDoc: _collectionActions.postDoc, 75 | pure_postDoc: pureCollectionActions.postDoc, 76 | } 77 | const documentActions ={ 78 | fetchData: _documentActions.fetchData, 79 | pure_fetchData: pureDocumentActions.fetchData, 80 | cleanDocuments: _documentActions.cleanDocuments, 81 | pure_cleanDocuments: pureDocumentActions.cleanDocuments, 82 | cleanData: _documentActions.cleanData, 83 | pure_cleanData: pureDocumentActions.cleanData, 84 | deleteDoc: _documentActions.deleteDoc, 85 | pure_deleteDoc: pureDocumentActions.deleteDoc, 86 | putDoc: _documentActions.putDoc, 87 | pure_putDoc: pureDocumentActions.putDoc, 88 | postDoc: _documentActions.postDoc, 89 | pure_postDoc: pureDocumentActions.postDoc, 90 | updateField: _documentActions.updateField, 91 | pure_updateField: pureDocumentActions.updateField, 92 | } 93 | const cloudCodeActions ={ 94 | fetchData: _cloudCodeActions.fetchData, 95 | pure_fetchData: pureCloudCodeActions.fetchData, 96 | cleanCloudsCode: _cloudCodeActions.cleanCloudsCode, 97 | pure_cleanCloudsCode: pureCloudCodeActions.cleanCloudsCode, 98 | cleanData: _cloudCodeActions.cleanData, 99 | pure_cleanData: pureCloudCodeActions.cleanData, 100 | } 101 | let dispatch = null; 102 | export const setReactParseDispatch = _dispatch => { 103 | dispatch = _dispatch; 104 | }; 105 | const actions = { 106 | collectionActions, 107 | cloudCodeActions, 108 | documentActions 109 | } 110 | 111 | export { 112 | dispatch, 113 | config, 114 | api, 115 | httpRequest, 116 | constants, 117 | helpers, 118 | setClearStateActionType, 119 | cleanAllState, 120 | // Logger 121 | setLoggerHandlers, 122 | // Components 123 | FetchCollection, 124 | FetchDocument, 125 | FetchCloudCode, 126 | ShowLoader, 127 | // Parse 128 | parseWatcher, 129 | parseReducer, 130 | // Selectors 131 | selectors, 132 | cloudCodeSelectors, 133 | collectionSelectors, 134 | documentSelectors, 135 | // Actions 136 | actions, 137 | collectionActions, 138 | cloudCodeActions, 139 | documentActions, 140 | }; -------------------------------------------------------------------------------- /src/reducer.js: -------------------------------------------------------------------------------- 1 | import InitialState from './InitialState'; 2 | import cloudCodeHandler from './CloudCode/reducerHandler'; 3 | import collectionHandler from './Collection/reducerHandler'; 4 | import documentHandler from './Document/reducerHandler'; 5 | import {dispatch} from './index'; 6 | 7 | const initialState = new InitialState(); 8 | const CLEAN_ALL_PARSE_STATE = 'CLEAN_ALL_PARSE_STATE'; 9 | 10 | let clearStateActionType = null 11 | 12 | export const cleanAllState = (payload) => { 13 | if(dispatch){ 14 | dispatch({type: 'CLEAN_ALL_PARSE_STATE'}) 15 | }else{ 16 | console.warn('react-parse, missing dispatch, please use setReactParseDispatch') 17 | } 18 | } 19 | 20 | export const setClearStateActionType = function(type){ 21 | clearStateActionType = type 22 | }; 23 | 24 | export default function parseReducer(state = initialState, action) { 25 | if (!(state instanceof InitialState)) { 26 | return initialState.merge(state); 27 | } 28 | if( 29 | (clearStateActionType && action.type === clearStateActionType) || 30 | (action.type === CLEAN_ALL_PARSE_STATE) 31 | ){ 32 | return initialState 33 | } 34 | let nextState = null; 35 | nextState = cloudCodeHandler(state, action); 36 | if (nextState) return nextState; 37 | nextState = collectionHandler(state, action); 38 | if (nextState) return nextState; 39 | nextState = documentHandler(state, action); 40 | if (nextState) return nextState; 41 | return state; 42 | } 43 | -------------------------------------------------------------------------------- /src/saga.js: -------------------------------------------------------------------------------- 1 | import regeneratorRuntime from 'regenerator-runtime'; 2 | import { takeEvery } from 'redux-saga/effects'; 3 | import types from './types'; 4 | import * as Collection from './Collection/saga'; 5 | import * as Document from './Document/saga'; 6 | import CloudCode from './CloudCode/saga'; 7 | 8 | const { 9 | FETCH_CLOUD_CODE, 10 | FETCH_COLLECTION, 11 | REFRESH_COLLECTION, 12 | DELETE_COLLECTION_DOC, 13 | PUT_COLLECTION_DOC, 14 | POST_COLLECTION_DOC, 15 | FETCH_DOCUMENT, 16 | PUT_DOCUMENT, 17 | DELETE_DOCUMENT, 18 | POST_DOCUMENT 19 | } = types; 20 | // Collections 21 | 22 | // all market watchers 23 | export default function* parseWatcher() { 24 | // Collections 25 | yield takeEvery(FETCH_COLLECTION, Collection.fetchCollection); 26 | yield takeEvery(REFRESH_COLLECTION, Collection.refreshCollection); 27 | yield takeEvery(DELETE_COLLECTION_DOC, Collection.deleteDoc); 28 | yield takeEvery(PUT_COLLECTION_DOC, Collection.putDoc); 29 | yield takeEvery(POST_COLLECTION_DOC, Collection.postDoc); 30 | // Documents 31 | yield takeEvery(FETCH_DOCUMENT, Document.fetchDoc); 32 | yield takeEvery(PUT_DOCUMENT, Document.putDoc); 33 | yield takeEvery(DELETE_DOCUMENT, Document.deleteDoc); 34 | yield takeEvery(POST_DOCUMENT, Document.postDoc); 35 | // Cloud code 36 | yield takeEvery(FETCH_CLOUD_CODE, CloudCode); 37 | } 38 | /* eslint no-unused-vars: "off" */ 39 | -------------------------------------------------------------------------------- /src/selectors.js: -------------------------------------------------------------------------------- 1 | import * as cloudCodeSelectors from './CloudCode/selectors'; 2 | import * as collectionSelectors from './Collection/selectors'; 3 | import * as documentSelectors from './Document/selectors'; 4 | 5 | export { cloudCodeSelectors, collectionSelectors, documentSelectors }; 6 | -------------------------------------------------------------------------------- /src/server/ErrorHandle.js: -------------------------------------------------------------------------------- 1 | import {handleError} from './api' 2 | 3 | export default function errorHandle(error, params) { 4 | if(handleError){ 5 | handleError(error, params) 6 | } 7 | }; -------------------------------------------------------------------------------- /src/server/Logger.js: -------------------------------------------------------------------------------- 1 | let _onSuccess 2 | let _onError 3 | /** 4 | * setLoggerHandlers 5 | * @param {*} payload object 6 | * @param {Function} payload.onSuccess 7 | * @param {Function} payload.onError 8 | */ 9 | export const setLoggerHandlers = function(payload){ 10 | if(payload && payload.onSuccess){ 11 | _onSuccess = payload.onSuccess 12 | } 13 | if(payload && payload.onError){ 14 | _onError = payload.onError 15 | } 16 | } 17 | 18 | 19 | const onSuccess = function(type, action, status, res){ 20 | if(_onSuccess){ 21 | _onSuccess(action, status) 22 | } 23 | if(action.payload.onSuccess){ 24 | action.payload.onSuccess({type, action, status, res}) 25 | } 26 | } 27 | const onError = function(type, action, status, res){ 28 | if(_onError){ 29 | _onError(action, status) 30 | } 31 | if(action.payload.onError){ 32 | action.onError({type, action, status, res}) 33 | } 34 | } 35 | 36 | const Logger = { 37 | onSuccess, 38 | onError 39 | } 40 | export default Logger; -------------------------------------------------------------------------------- /src/server/httpWrapper.js: -------------------------------------------------------------------------------- 1 | const regeneratorRuntime = require('regenerator-runtime'); 2 | import {call} from 'redux-saga/effects' 3 | import ErrorHandle from './ErrorHandle' 4 | 5 | export default function* httpRequest (...params) { 6 | try { 7 | const res = yield makeRequest(...params); 8 | return res 9 | } catch (error) { 10 | error.error = true; 11 | yield ErrorHandle(error); 12 | return error 13 | } 14 | } 15 | 16 | function* makeRequest(...params) { 17 | return yield call(...params); 18 | }; 19 | 20 | 21 | /* eslint no-unused-vars: "off" */ 22 | -------------------------------------------------------------------------------- /src/server/index.js: -------------------------------------------------------------------------------- 1 | import api from './api'; 2 | import httpRequest from './httpWrapper'; 3 | import Logger from './Logger'; 4 | import uploadFilesFromData from './util/uploadFiles'; 5 | 6 | export { 7 | api, 8 | Logger, 9 | httpRequest, 10 | uploadFilesFromData 11 | } -------------------------------------------------------------------------------- /src/server/util/uploadFiles.js: -------------------------------------------------------------------------------- 1 | import regeneratorRuntime from 'regenerator-runtime'; 2 | import api from '../api'; 3 | import { call } from 'redux-saga/effects'; 4 | let RNFetchBlob = null; 5 | 6 | export const setRNFetchBlob = function(res) { 7 | RNFetchBlob = res 8 | } 9 | const browserFileUnloader = function* (file) { 10 | return yield call(api.uploadFile, file); 11 | } 12 | const nativeFileUnloader = function* (file) { 13 | if(!RNFetchBlob){ 14 | throw 'react parse need instance of RNFetchBlob, please install rn-fetch-blo and use setRNFetchBlob from react-parse' 15 | } else{ 16 | return yield call(api.uploadFileFromReactNativeStorage,RNFetchBlob, file); 17 | } 18 | } 19 | 20 | export default function* uploadFilesFromData(data, fileValueHandler) { 21 | if(!data) return; 22 | const isReactNative = typeof navigator != 'undefined' && navigator.product == 'ReactNative' 23 | for (var k in data) { 24 | if (data[k] instanceof File) { 25 | let fileRes 26 | try { 27 | if(isReactNative){ 28 | fileRes = yield nativeFileUnloader(data[k]); 29 | }else{ 30 | fileRes = yield browserFileUnloader(data[k]); 31 | } 32 | } catch(e) { 33 | throw e 34 | } 35 | data[k] = fileValueHandler 36 | ? fileValueHandler(fileRes) 37 | : { 38 | name: isReactNative ? fileRes.name : fileRes.data.name, 39 | url: isReactNative ? fileRes.url: fileRes.data.url, 40 | __type: 'File' 41 | } 42 | } 43 | } 44 | return data; 45 | } -------------------------------------------------------------------------------- /src/types.js: -------------------------------------------------------------------------------- 1 | export default { 2 | // FETCH 3 | FETCH_START: 'FETCH_START', 4 | FETCH_FAILED: 'FETCH_FAILED', 5 | FETCH_FAILED_NETWORK: 'FETCH_FAILED_NETWORK', 6 | FETCH_FINISHED: 'FETCH_FINISHED', 7 | // POST 8 | POST_START: 'POST_START', 9 | POST_FAILED: 'POST_FAILED', 10 | POST_FAILED_NETWORK: 'POST_FAILED_NETWORK', 11 | POST_FINISHED: 'POST_FINISHED', 12 | // DELETE 13 | DELETE_START: 'DELETE_START', 14 | DELETE_FAILED: 'DELETE_FAILED', 15 | DELETE_FAILED_NETWORK: 'DELETE_FAILED_NETWORK', 16 | DELETE_FINISHED: 'DELETE_FINISHED', 17 | // PUT 18 | PUT_START: 'PUT_START', 19 | PUT_FAILED: 'PUT_FAILED', 20 | PUT_FAILED_NETWORK: 'PUT_FAILED_NETWORK', 21 | PUT_FINISHED: 'PUT_FINISHED', 22 | // Cloud Code 23 | FETCH_CLOUD_CODE: 'FETCH_CLOUD_CODE', 24 | SET_CLOUD_CODE: 'SET_CLOUD_CODE', 25 | CLEAN_CLOUD_CODE: 'CLEAN_CLOUD_CODE', 26 | CLEAN_ALL_CLOUD_CODE: 'CLEAN_ALL_CLOUD_CODE', 27 | // Collection 28 | FETCH_COLLECTION: 'FETCH_COLLECTION', 29 | REFRESH_COLLECTION: 'REFRESH_COLLECTION', 30 | SET_COLLECTION: 'SET_COLLECTION', 31 | CLEAN_COLLECTION: 'CLEAN_COLLECTION', 32 | CLEAN_ALL_COLLECTIONS: 'CLEAN_ALL_COLLECTIONS', 33 | DELETE_COLLECTION_DOC: 'DELETE_COLLECTION_DOC', 34 | PUT_COLLECTION_DOC: 'PUT_COLLECTION_DOC', 35 | POST_COLLECTION_DOC: 'POST_COLLECTION_DOC', 36 | // Document 37 | FETCH_DOCUMENT: 'FETCH_DOCUMENT', 38 | SET_DOCUMENT: 'SET_DOCUMENT', 39 | PUT_DOCUMENT: 'PUT_DOCUMENT', 40 | DELETE_DOCUMENT: 'DELETE_DOCUMENT', 41 | POST_DOCUMENT: 'POST_DOCUMENT', 42 | CLEAN_DOCUMENT: 'CLEAN_DOCUMENT', 43 | CLEAN_ALL_DOCUMENTS: 'CLEAN_ALL_DOCUMENTS', 44 | UPDATE_DOC_FIELD: 'UPDATE_DOC_FIELD', 45 | UPDATE_DOC_FIELDS: 'UPDATE_DOC_FIELDS' 46 | }; 47 | --------------------------------------------------------------------------------