diff --git a/ui/js/actions/content.js b/ui/js/actions/content.js index 0daeeadaf..0d26947fe 100644 --- a/ui/js/actions/content.js +++ b/ui/js/actions/content.js @@ -11,6 +11,7 @@ import { selectResolvingUris } from "selectors/content"; import { selectCostInfoForUri } from "selectors/cost_info"; import { doOpenModal } from "actions/app"; import { doClaimEligiblePurchaseRewards } from "actions/rewards"; +import batchActions from "util/batchActions"; export function doResolveUri(uri) { return function(dispatch, getState) { @@ -63,20 +64,29 @@ export function doFetchFeaturedUris() { const success = ({ Categories, Uris }) => { let featuredUris = {}; + const actions = []; Categories.forEach(category => { if (Uris[category] && Uris[category].length) { - featuredUris[category] = Uris[category]; + const uris = Uris[category]; + + featuredUris[category] = uris; + uris.forEach(uri => { + actions.push(doResolveUri(uri)); + }); } }); - dispatch({ + actions.push({ type: types.FETCH_FEATURED_CONTENT_COMPLETED, data: { categories: Categories, uris: featuredUris, + success: true, }, }); + + dispatch(batchActions(...actions)); }; const failure = () => { diff --git a/ui/js/actions/file_info.js b/ui/js/actions/file_info.js index 3ee12aa02..ba4c606db 100644 --- a/ui/js/actions/file_info.js +++ b/ui/js/actions/file_info.js @@ -98,7 +98,9 @@ export function doDeleteFile(outpoint, deleteFromComputer) { export function doFetchFileInfosAndPublishedClaims() { return function(dispatch, getState) { - const state = getState(); + const state = getState(), + isClaimListMinePending = selectClaimListMineIsPending(state), + isFileInfoListPending = selectFileListIsPending(state); dispatch(doFetchClaimListMine()); dispatch(doFileList()); diff --git a/ui/js/actions/search.js b/ui/js/actions/search.js index ab844df03..a693dc26a 100644 --- a/ui/js/actions/search.js +++ b/ui/js/actions/search.js @@ -4,6 +4,7 @@ import lighthouse from "lighthouse"; import { doResolveUri } from "actions/content"; import { doNavigate, doHistoryPush } from "actions/app"; import { selectCurrentPage } from "selectors/app"; +import batchActions from "util/batchActions"; export function doSearch(query) { return function(dispatch, getState) { @@ -25,22 +26,26 @@ export function doSearch(query) { dispatch(doNavigate("search", { query: query })); } else { lighthouse.search(query).then(results => { + const actions = []; + results.forEach(result => { const uri = lbryuri.build({ channelName: result.channel_name, contentName: result.name, claimId: result.channel_id || result.claim_id, }); - dispatch(doResolveUri(uri)); + actions.push(doResolveUri(uri)); }); - dispatch({ + actions.push({ type: types.SEARCH_COMPLETED, data: { query, results, }, }); + + dispatch(batchActions(...actions)); }); } }; diff --git a/ui/js/page/showPage/view.jsx b/ui/js/page/showPage/view.jsx index 2ef928c99..0c1bd830b 100644 --- a/ui/js/page/showPage/view.jsx +++ b/ui/js/page/showPage/view.jsx @@ -6,15 +6,13 @@ import FilePage from "page/filePage"; class ShowPage extends React.PureComponent { componentWillMount() { - this.resolve(this.props); + const { isResolvingUri, resolveUri, uri } = this.props; + + if (!isResolvingUri) resolveUri(uri); } componentWillReceiveProps(nextProps) { - this.resolve(nextProps); - } - - resolve(props) { - const { isResolvingUri, resolveUri, claim, uri } = props; + const { isResolvingUri, resolveUri, claim, uri } = this.props; if (!isResolvingUri && claim === undefined && uri) { resolveUri(uri); @@ -26,7 +24,7 @@ class ShowPage extends React.PureComponent { let innerContent = ""; - if (isResolvingUri || !claim) { + if (isResolvingUri && !claim) { innerContent = (
@@ -44,7 +42,7 @@ class ShowPage extends React.PureComponent {
); - } else if (claim.name.length && claim.name[0] === "@") { + } else if (claim && claim.name.length && claim.name[0] === "@") { innerContent = ; } else if (claim) { innerContent = ; diff --git a/ui/js/store.js b/ui/js/store.js index 9bc70dc25..23796c99e 100644 --- a/ui/js/store.js +++ b/ui/js/store.js @@ -1,50 +1,56 @@ -const redux = require('redux'); -const thunk = require('redux-thunk').default; +import { createLogger } from "redux-logger"; +import appReducer from "reducers/app"; +import availabilityReducer from "reducers/availability"; +import claimsReducer from "reducers/claims"; +import contentReducer from "reducers/content"; +import costInfoReducer from "reducers/cost_info"; +import fileInfoReducer from "reducers/file_info"; +import rewardsReducer from "reducers/rewards"; +import searchReducer from "reducers/search"; +import settingsReducer from "reducers/settings"; +import userReducer from "reducers/user"; +import walletReducer from "reducers/wallet"; +import { persistStore, autoRehydrate } from "redux-persist"; +import createCompressor from "redux-persist-transform-compress"; +import createFilter from "redux-persist-transform-filter"; +import { REHYDRATE } from "redux-persist/constants"; +import createActionBuffer from "redux-action-buffer"; + +const localForage = require("localforage"); +const redux = require("redux"); +const thunk = require("redux-thunk").default; const env = ENV; -import { createLogger } from 'redux-logger'; -import appReducer from 'reducers/app'; -import availabilityReducer from 'reducers/availability'; -import claimsReducer from 'reducers/claims'; -import contentReducer from 'reducers/content'; -import costInfoReducer from 'reducers/cost_info'; -import fileInfoReducer from 'reducers/file_info'; -import rewardsReducer from 'reducers/rewards'; -import searchReducer from 'reducers/search'; -import settingsReducer from 'reducers/settings'; -import walletReducer from 'reducers/wallet'; -import userReducer from 'reducers/user'; - function isFunction(object) { - return typeof object === 'function'; + return typeof object === "function"; } function isNotFunction(object) { - return !isFunction(object); + return !isFunction(object); } function createBulkThunkMiddleware() { - return ({ dispatch, getState }) => next => action => { - if (action.type === 'BATCH_ACTIONS') { - action.actions - .filter(isFunction) - .map(actionFn => actionFn(dispatch, getState)); - } - return next(action); - }; + return ({ dispatch, getState }) => next => action => { + if (action.type === "BATCH_ACTIONS") { + action.actions + .filter(isFunction) + .map(actionFn => actionFn(dispatch, getState)); + } + return next(action); + }; } function enableBatching(reducer) { - return function batchingReducer(state, action) { - switch (action.type) { - case 'BATCH_ACTIONS': - return action.actions - .filter(isNotFunction) - .reduce(batchingReducer, state); - default: - return reducer(state, action); - } - }; + return function batchingReducer(state, action) { + switch (action.type) { + case "BATCH_ACTIONS": + return action.actions + .filter(isNotFunction) + .reduce(batchingReducer, state); + default: + return reducer(state, action); + } + }; } const reducers = redux.combineReducers({ @@ -64,17 +70,36 @@ const reducers = redux.combineReducers({ const bulkThunk = createBulkThunkMiddleware(); const middleware = [thunk, bulkThunk]; -if (env === 'development') { - const logger = createLogger({ - collapsed: true - }); - middleware.push(logger); +if (env === "development") { + const logger = createLogger({ + collapsed: true, + }); + middleware.push(logger); } +middleware.push(createActionBuffer(REHYDRATE)); + const createStoreWithMiddleware = redux.compose( - redux.applyMiddleware(...middleware) + autoRehydrate(), + redux.applyMiddleware(...middleware) )(redux.createStore); const reduxStore = createStoreWithMiddleware(enableBatching(reducers)); +const compressor = createCompressor(); +const saveClaimsFilter = createFilter("claims", [ + "byId", + "claimsByUri", + "myClaims", +]); + +const persistOptions = { + whitelist: ["claims"], + // Order is important. Needs to be compressed last or other transforms can't + // read the data + transforms: [saveClaimsFilter, compressor], + debounce: 1000, + storage: localForage, +}; +persistStore(reduxStore, persistOptions); export default reduxStore; diff --git a/ui/package-lock.json b/ui/package-lock.json index 7754552e1..cb870b578 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -15,10 +15,9 @@ "dev": true }, "acorn": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.0.3.tgz", - "integrity": "sha1-xGDfCEkUY/AozLguqzcwvwEIez0=", - "dev": true + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz", + "integrity": "sha1-yM4n3grMdtiW0rH6099YjZ6C8BQ=" }, "acorn-dynamic-import": { "version": "2.0.2", @@ -201,6 +200,11 @@ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=" }, + "ast-types": { + "version": "0.8.15", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.8.15.tgz", + "integrity": "sha1-ju8IJ/BN/w7IhXupJavj/qYZTlI=" + }, "async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/async/-/async-2.4.1.tgz", @@ -666,6 +670,11 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, + "base62": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/base62/-/base62-0.1.1.tgz", + "integrity": "sha1-e0F0wvlESXU7EcJlHAg9qEGnsIQ=" + }, "base64-js": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.0.tgz", @@ -1312,6 +1321,11 @@ "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", "dev": true }, + "es3ify": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/es3ify/-/es3ify-0.1.4.tgz", + "integrity": "sha1-rZ+l3xrjTz8x4SEbWBiy1RB439E=" + }, "es5-ext": { "version": "0.10.23", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.23.tgz", @@ -1507,17 +1521,29 @@ } } }, + "esmangle-evaluator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esmangle-evaluator/-/esmangle-evaluator-1.0.1.tgz", + "integrity": "sha1-Yg2GbvSGGzMR91dm1SqFcrs8YzY=" + }, "espree": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/espree/-/espree-3.4.3.tgz", "integrity": "sha1-KRC1zNSc6JPC//+qtP2LOjG4I3Q=", - "dev": true + "dev": true, + "dependencies": { + "acorn": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.0.3.tgz", + "integrity": "sha1-xGDfCEkUY/AozLguqzcwvwEIez0=", + "dev": true + } + } }, - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", - "dev": true + "esprima-fb": { + "version": "3001.1.0-dev-harmony-fb", + "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-3001.0001.0000-dev-harmony-fb.tgz", + "integrity": "sha1-t303q8046gt3Qmu4vCkizmtCZBE=" }, "esquery": { "version": "1.0.0", @@ -1650,6 +1676,18 @@ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=" }, + "falafel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/falafel/-/falafel-1.2.0.tgz", + "integrity": "sha1-wY0k71CRF0pJfzGM0ksCaiXN2rQ=", + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + } + } + }, "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", @@ -1746,8 +1784,7 @@ "foreach": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "dev": true + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" }, "forever-agent": { "version": "0.6.1", @@ -1787,9 +1824,9 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.1.tgz", - "integrity": "sha1-8Z/Sj0Pur3YWgOUZogPE0LPTGv8=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", + "integrity": "sha512-Sn44E5wQW4bTHXvQmvSHwqbuiXtduD6Rrjm2ZtUEGbyrig+nUH3t/QD4M4/ZXViY556TBpRgZkHLDx3JxPwxiw==", "optional": true, "dependencies": { "abbrev": { @@ -1797,22 +1834,22 @@ "bundled": true, "optional": true }, + "ajv": { + "version": "4.11.8", + "bundled": true, + "optional": true + }, "ansi-regex": { "version": "2.1.1", "bundled": true }, - "ansi-styles": { - "version": "2.2.1", - "bundled": true, - "optional": true - }, "aproba": { "version": "1.1.1", "bundled": true, "optional": true }, "are-we-there-yet": { - "version": "1.1.2", + "version": "1.1.4", "bundled": true, "optional": true }, @@ -1859,7 +1896,7 @@ "bundled": true }, "brace-expansion": { - "version": "1.1.6", + "version": "1.1.7", "bundled": true }, "buffer-shims": { @@ -1867,12 +1904,12 @@ "bundled": true }, "caseless": { - "version": "0.11.0", + "version": "0.12.0", "bundled": true, "optional": true }, - "chalk": { - "version": "1.1.3", + "co": { + "version": "4.6.0", "bundled": true, "optional": true }, @@ -1884,11 +1921,6 @@ "version": "1.0.5", "bundled": true }, - "commander": { - "version": "2.9.0", - "bundled": true, - "optional": true - }, "concat-map": { "version": "0.0.1", "bundled": true @@ -1919,12 +1951,12 @@ } }, "debug": { - "version": "2.2.0", + "version": "2.6.8", "bundled": true, "optional": true }, "deep-extend": { - "version": "0.4.1", + "version": "0.4.2", "bundled": true, "optional": true }, @@ -1942,13 +1974,8 @@ "bundled": true, "optional": true }, - "escape-string-regexp": { - "version": "1.0.5", - "bundled": true, - "optional": true - }, "extend": { - "version": "3.0.0", + "version": "3.0.1", "bundled": true, "optional": true }, @@ -1962,7 +1989,7 @@ "optional": true }, "form-data": { - "version": "2.1.2", + "version": "2.1.4", "bundled": true, "optional": true }, @@ -1971,7 +1998,7 @@ "bundled": true }, "fstream": { - "version": "1.0.10", + "version": "1.0.11", "bundled": true }, "fstream-ignore": { @@ -1980,22 +2007,12 @@ "optional": true }, "gauge": { - "version": "2.7.3", - "bundled": true, - "optional": true - }, - "generate-function": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "generate-object-property": { - "version": "1.2.0", + "version": "2.7.4", "bundled": true, "optional": true }, "getpass": { - "version": "0.1.6", + "version": "0.1.7", "bundled": true, "optional": true, "dependencies": { @@ -2007,25 +2024,20 @@ } }, "glob": { - "version": "7.1.1", + "version": "7.1.2", "bundled": true }, "graceful-fs": { "version": "4.1.11", "bundled": true }, - "graceful-readlink": { - "version": "1.0.1", + "har-schema": { + "version": "1.0.5", "bundled": true, "optional": true }, "har-validator": { - "version": "2.0.6", - "bundled": true, - "optional": true - }, - "has-ansi": { - "version": "2.0.0", + "version": "4.2.1", "bundled": true, "optional": true }, @@ -2065,16 +2077,6 @@ "version": "1.0.0", "bundled": true }, - "is-my-json-valid": { - "version": "2.15.0", - "bundled": true, - "optional": true - }, - "is-property": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, "is-typedarray": { "version": "1.0.0", "bundled": true, @@ -2104,31 +2106,43 @@ "bundled": true, "optional": true }, + "json-stable-stringify": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, "json-stringify-safe": { "version": "5.0.1", "bundled": true, "optional": true }, - "jsonpointer": { - "version": "4.0.1", + "jsonify": { + "version": "0.0.0", "bundled": true, "optional": true }, "jsprim": { - "version": "1.3.1", + "version": "1.4.0", "bundled": true, - "optional": true + "optional": true, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "optional": true + } + } }, "mime-db": { - "version": "1.26.0", + "version": "1.27.0", "bundled": true }, "mime-types": { - "version": "2.1.14", + "version": "2.1.15", "bundled": true }, "minimatch": { - "version": "3.0.3", + "version": "3.0.4", "bundled": true }, "minimist": { @@ -2140,22 +2154,22 @@ "bundled": true }, "ms": { - "version": "0.7.1", + "version": "2.0.0", "bundled": true, "optional": true }, "node-pre-gyp": { - "version": "0.6.33", + "version": "0.6.36", "bundled": true, "optional": true }, "nopt": { - "version": "3.0.6", + "version": "4.0.1", "bundled": true, "optional": true }, "npmlog": { - "version": "4.0.2", + "version": "4.1.0", "bundled": true, "optional": true }, @@ -2177,17 +2191,27 @@ "version": "1.4.0", "bundled": true }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "osenv": { + "version": "0.1.4", + "bundled": true, + "optional": true + }, "path-is-absolute": { "version": "1.0.1", "bundled": true }, - "pinkie": { - "version": "2.0.4", - "bundled": true, - "optional": true - }, - "pinkie-promise": { - "version": "2.0.1", + "performance-now": { + "version": "0.2.0", "bundled": true, "optional": true }, @@ -2201,12 +2225,12 @@ "optional": true }, "qs": { - "version": "6.3.1", + "version": "6.4.0", "bundled": true, "optional": true }, "rc": { - "version": "1.1.7", + "version": "1.2.1", "bundled": true, "optional": true, "dependencies": { @@ -2218,17 +2242,20 @@ } }, "readable-stream": { - "version": "2.2.2", - "bundled": true, - "optional": true + "version": "2.2.9", + "bundled": true }, "request": { - "version": "2.79.0", + "version": "2.81.0", "bundled": true, "optional": true }, "rimraf": { - "version": "2.5.4", + "version": "2.6.1", + "bundled": true + }, + "safe-buffer": { + "version": "5.0.1", "bundled": true }, "semver": { @@ -2252,7 +2279,7 @@ "optional": true }, "sshpk": { - "version": "1.10.2", + "version": "1.13.0", "bundled": true, "optional": true, "dependencies": { @@ -2264,7 +2291,7 @@ } }, "string_decoder": { - "version": "0.10.31", + "version": "1.0.1", "bundled": true }, "string-width": { @@ -2285,31 +2312,14 @@ "bundled": true, "optional": true }, - "supports-color": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, "tar": { "version": "2.2.1", "bundled": true }, "tar-pack": { - "version": "3.3.0", + "version": "3.4.0", "bundled": true, - "optional": true, - "dependencies": { - "once": { - "version": "1.3.3", - "bundled": true, - "optional": true - }, - "readable-stream": { - "version": "2.1.5", - "bundled": true, - "optional": true - } - } + "optional": true }, "tough-cookie": { "version": "2.3.2", @@ -2317,7 +2327,7 @@ "optional": true }, "tunnel-agent": { - "version": "0.4.3", + "version": "0.6.0", "bundled": true, "optional": true }, @@ -2346,18 +2356,13 @@ "optional": true }, "wide-align": { - "version": "1.1.0", + "version": "1.1.2", "bundled": true, "optional": true }, "wrappy": { "version": "1.0.2", "bundled": true - }, - "xtend": { - "version": "4.0.1", - "bundled": true, - "optional": true } } }, @@ -2626,9 +2631,9 @@ } }, "iconv-lite": { - "version": "0.4.17", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.17.tgz", - "integrity": "sha1-T9qjs4rLwsAxsEXQ7c3+HsqxjI0=" + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.18.tgz", + "integrity": "sha512-sr1ZQph3UwHTR0XftSbK85OvBbxe/abLGzEnPENCQwmHf7sck8Oyu4ob3LgBxWWxRoM+QszeUyl7jbqapu2TqA==" }, "ieee754": { "version": "1.1.8", @@ -2642,6 +2647,11 @@ "integrity": "sha1-QyNS5XrM2HqzEQ6C0/6g5HgSFW0=", "dev": true }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" + }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -2674,6 +2684,11 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, + "inline-process-browser": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/inline-process-browser/-/inline-process-browser-1.0.0.tgz", + "integrity": "sha1-RqYbFT3TybFiSxoAYm7bT39BTyI=" + }, "inquirer": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", @@ -2903,7 +2918,15 @@ "version": "3.8.4", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.8.4.tgz", "integrity": "sha1-UgtFZPhlc7qWZir4Woyvp7S1pvY=", - "dev": true + "dev": true, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true + } + } }, "jsbn": { "version": "0.1.1", @@ -2976,6 +2999,18 @@ } } }, + "jstransform": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jstransform/-/jstransform-3.0.0.tgz", + "integrity": "sha1-olkats7o2XvzvoMNv6IxO4fNZAs=", + "dependencies": { + "source-map": { + "version": "0.1.31", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.31.tgz", + "integrity": "sha1-n3BNDWnZ4TioG63267T94z0VHGE=" + } + } + }, "jsx-ast-utils": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz", @@ -3004,6 +3039,11 @@ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true }, + "lie": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.0.2.tgz", + "integrity": "sha1-/9oh17uibzd8rYZdNkmy/Izjn+o=" + }, "lint-staged": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-3.6.1.tgz", @@ -3065,6 +3105,11 @@ "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", "dev": true }, + "localforage": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.5.0.tgz", + "integrity": "sha1-a5lOGbVmEfqF3zmS3zl6xKtm6BU=" + }, "locate-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", @@ -3159,6 +3204,16 @@ "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", "dev": true }, + "lodash.forin": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.forin/-/lodash.forin-4.4.0.tgz", + "integrity": "sha1-XT8grlZAEfvog4H32YlJyclRlzE=" + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" + }, "lodash.isarguments": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", @@ -3171,12 +3226,32 @@ "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", "dev": true }, + "lodash.isempty": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", + "integrity": "sha1-b4bL7di+TsmHvpqvM8loTbGzHn4=" + }, "lodash.keys": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", "dev": true }, + "lodash.pickby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.pickby/-/lodash.pickby-4.6.0.tgz", + "integrity": "sha1-feoh2MGNdwOifHBMFdO4SmfjOv8=" + }, + "lodash.set": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", + "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=" + }, + "lodash.unset": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.unset/-/lodash.unset-4.5.2.tgz", + "integrity": "sha1-Nw0dPoW3Kn4bDN8tJyEhMG8j5O0=" + }, "log-symbols": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", @@ -3210,6 +3285,11 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==" }, + "lz-string": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", + "integrity": "sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY=" + }, "map-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", @@ -3487,8 +3567,7 @@ "object-keys": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", - "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", - "dev": true + "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=" }, "object.assign": { "version": "4.0.4", @@ -3922,19 +4001,19 @@ "integrity": "sha1-0xzLFJmuIjwNIdFIVlCqSg03TOA=" }, "react": { - "version": "15.5.4", - "resolved": "https://registry.npmjs.org/react/-/react-15.5.4.tgz", - "integrity": "sha1-+oPrAVBqsjfNwcjDsc6o3gEr8Ec=" + "version": "15.6.0", + "resolved": "https://registry.npmjs.org/react/-/react-15.6.0.tgz", + "integrity": "sha1-wjKZtI4w7TAlCM6J4aAskZ+Ca84=" }, "react-dom": { - "version": "15.5.4", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-15.5.4.tgz", - "integrity": "sha1-ugwoeG/VLtfk8hNf4CiNRirvk9o=" + "version": "15.6.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-15.6.0.tgz", + "integrity": "sha1-i8I8sMgOcGNVt2yp+M5Hz3vfttE=" }, "react-modal": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-1.9.2.tgz", - "integrity": "sha512-4FG4SsYdJ9ncLYIP17Q8HEWRXbEsd+lHkG3vJd+koqXdPDMzP+2KZFjrkMOVvLyvXYSpgVTqEqeLFnkJ2x8+Ig==" + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-1.9.4.tgz", + "integrity": "sha512-ourtHswaEA/KyeI20AsCOSWTC23WF3z0b1C3qzQtA5UhBOdwQ2sEK2OPJGN8u7iFGJ83etmk605aeF/i4tGVEQ==" }, "react-redux": { "version": "5.0.5", @@ -3967,6 +4046,18 @@ "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", "dev": true }, + "recast": { + "version": "0.10.43", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.10.43.tgz", + "integrity": "sha1-uV1Q9tYHYaX2JS4V2AZ4FoSRzn8=", + "dependencies": { + "esprima-fb": { + "version": "15001.1001.0-dev-harmony-fb", + "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz", + "integrity": "sha1-Q761fsJujPI3092LM+QlM1d/Jlk=" + } + } + }, "rechoir": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", @@ -3997,11 +4088,31 @@ "resolved": "https://registry.npmjs.org/redux/-/redux-3.6.0.tgz", "integrity": "sha1-iHwrPQub2G7KK+cFccJ2VMGeGI0=" }, + "redux-action-buffer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/redux-action-buffer/-/redux-action-buffer-1.1.0.tgz", + "integrity": "sha1-nGkqtlMrBC0NQ6nwGkitoSD8lBo=" + }, "redux-logger": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/redux-logger/-/redux-logger-3.0.6.tgz", "integrity": "sha1-91VZZvMJjzyIYExEnPC69XeCdL8=" }, + "redux-persist": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/redux-persist/-/redux-persist-4.8.0.tgz", + "integrity": "sha1-F/2ZiUm97vknXkz2CtW74cc2dfw=" + }, + "redux-persist-transform-compress": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/redux-persist-transform-compress/-/redux-persist-transform-compress-4.2.0.tgz", + "integrity": "sha1-UInimd9xMIePykX5f/6CiIugJpA=" + }, + "redux-persist-transform-filter": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/redux-persist-transform-filter/-/redux-persist-transform-filter-0.0.10.tgz", + "integrity": "sha1-mjsQbOiTnSy79SEsdH7Rd//xQoA=" + }, "redux-thunk": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.2.0.tgz", @@ -4523,8 +4634,29 @@ "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=" + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } }, "timers-browserify": { "version": "2.0.2", @@ -4604,9 +4736,9 @@ "integrity": "sha1-BMgamb3V3FImPqKdJMa/jUgYpLs=" }, "uglify-js": { - "version": "2.8.28", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.28.tgz", - "integrity": "sha512-WqKNbmNJKzIdIEQu/U2ytgGBbhCy2PVks94GoetczOAJ/zCgVu2CuO7gguI5KPFGPtUtI1dmPQl6h0D4cPzypA==", + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", "dev": true, "dependencies": { "camelcase": { @@ -4652,6 +4784,11 @@ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", "dev": true }, + "unreachable-branch-transform": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unreachable-branch-transform/-/unreachable-branch-transform-0.3.0.tgz", + "integrity": "sha1-2ZzExudG0mSSiEW2EdtUsPNHTKo=" + }, "url": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", @@ -4765,6 +4902,12 @@ "integrity": "sha1-LgRX8KuxrF3zqxBsacZy8jZ4Xwc=", "dev": true, "dependencies": { + "acorn": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.0.3.tgz", + "integrity": "sha1-xGDfCEkUY/AozLguqzcwvwEIez0=", + "dev": true + }, "camelcase": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", @@ -5090,8 +5233,7 @@ "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" }, "y18n": { "version": "3.2.1", diff --git a/ui/package.json b/ui/package.json index 4d90824e2..b7f011ffd 100644 --- a/ui/package.json +++ b/ui/package.json @@ -26,6 +26,7 @@ "babel-preset-react": "^6.11.1", "from2": "^2.3.0", "jshashes": "^1.0.6", + "localforage": "^1.5.0", "node-sass": "^3.8.0", "rc-progress": "^2.0.6", "react": "^15.4.0", @@ -33,7 +34,11 @@ "react-modal": "^1.5.2", "react-redux": "^5.0.3", "redux": "^3.6.0", + "redux-action-buffer": "^1.1.0", "redux-logger": "^3.0.1", + "redux-persist": "^4.8.0", + "redux-persist-transform-compress": "^4.2.0", + "redux-persist-transform-filter": "0.0.10", "redux-thunk": "^2.2.0", "render-media": "^2.10.0", "reselect": "^3.0.0",