From 2ae55569166d8aa9b0fe869c93056035ef5ef295 Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Wed, 17 Jan 2018 06:28:01 +0100 Subject: [PATCH 01/41] added claims, file_info and search actions, reducers and selectors --- build/index.js | 3178 ++++++++++++++++++++++++++--- src/index.js | 79 +- src/lbry.js | 26 +- src/lbryapi.js | 3 +- src/lbryuri.js | 238 +++ src/redux/actions/claims.js | 107 + src/redux/actions/file_info.js | 66 + src/redux/actions/navigation.js | 64 + src/redux/actions/search.js | 67 + src/redux/actions/wallet.js | 207 ++ src/redux/reducers/claims.js | 183 ++ src/redux/reducers/cost_info.js | 2 +- src/redux/reducers/file_info.js | 156 ++ src/redux/reducers/search.js | 32 + src/redux/reducers/wallet.js | 148 ++ src/redux/selectors/claims.js | 159 +- src/redux/selectors/cost_info.js | 4 +- src/redux/selectors/file_info.js | 106 + src/redux/selectors/navigation.js | 139 ++ src/redux/selectors/search.js | 79 + src/redux/selectors/wallet.js | 125 ++ src/util/batchActions.js | 9 + src/util/query_params.js | 28 + webpack.config.js | 2 +- 24 files changed, 4907 insertions(+), 300 deletions(-) create mode 100644 src/lbryuri.js create mode 100644 src/redux/actions/claims.js create mode 100644 src/redux/actions/file_info.js create mode 100644 src/redux/actions/navigation.js create mode 100644 src/redux/actions/search.js create mode 100644 src/redux/actions/wallet.js create mode 100644 src/redux/reducers/claims.js create mode 100644 src/redux/reducers/file_info.js create mode 100644 src/redux/reducers/search.js create mode 100644 src/redux/reducers/wallet.js create mode 100644 src/redux/selectors/file_info.js create mode 100644 src/redux/selectors/navigation.js create mode 100644 src/redux/selectors/search.js create mode 100644 src/redux/selectors/wallet.js create mode 100644 src/util/batchActions.js create mode 100644 src/util/query_params.js diff --git a/build/index.js b/build/index.js index 48561f4..f90f0a5 100644 --- a/build/index.js +++ b/build/index.js @@ -1,5 +1,14 @@ -module.exports = -/******/ (function(modules) { // webpackBootstrap +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else { + var a = factory(); + for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i]; + } +})(typeof self !== 'undefined' ? self : this, function() { +return /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ @@ -61,7 +70,7 @@ module.exports = /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 1); +/******/ return __webpack_require__(__webpack_require__.s = 10); /******/ }) /************************************************************************/ /******/ ([ @@ -74,8 +83,923 @@ module.exports = Object.defineProperty(exports, "__esModule", { value: true }); +var OPEN_MODAL = exports.OPEN_MODAL = 'OPEN_MODAL'; +var CLOSE_MODAL = exports.CLOSE_MODAL = 'CLOSE_MODAL'; +var SHOW_SNACKBAR = exports.SHOW_SNACKBAR = 'SHOW_SNACKBAR'; +var REMOVE_SNACKBAR_SNACK = exports.REMOVE_SNACKBAR_SNACK = 'REMOVE_SNACKBAR_SNACK'; +var WINDOW_FOCUSED = exports.WINDOW_FOCUSED = 'WINDOW_FOCUSED'; +var DAEMON_READY = exports.DAEMON_READY = 'DAEMON_READY'; +var DAEMON_VERSION_MATCH = exports.DAEMON_VERSION_MATCH = 'DAEMON_VERSION_MATCH'; +var DAEMON_VERSION_MISMATCH = exports.DAEMON_VERSION_MISMATCH = 'DAEMON_VERSION_MISMATCH'; +var VOLUME_CHANGED = exports.VOLUME_CHANGED = 'VOLUME_CHANGED'; -var _jsonrpc = __webpack_require__(2); +// Navigation +var CHANGE_AFTER_AUTH_PATH = exports.CHANGE_AFTER_AUTH_PATH = 'CHANGE_AFTER_AUTH_PATH'; +var WINDOW_SCROLLED = exports.WINDOW_SCROLLED = 'WINDOW_SCROLLED'; +var HISTORY_NAVIGATE = exports.HISTORY_NAVIGATE = 'HISTORY_NAVIGATE'; + +// Upgrades +var UPGRADE_CANCELLED = exports.UPGRADE_CANCELLED = 'UPGRADE_CANCELLED'; +var DOWNLOAD_UPGRADE = exports.DOWNLOAD_UPGRADE = 'DOWNLOAD_UPGRADE'; +var UPGRADE_DOWNLOAD_STARTED = exports.UPGRADE_DOWNLOAD_STARTED = 'UPGRADE_DOWNLOAD_STARTED'; +var UPGRADE_DOWNLOAD_COMPLETED = exports.UPGRADE_DOWNLOAD_COMPLETED = 'UPGRADE_DOWNLOAD_COMPLETED'; +var UPGRADE_DOWNLOAD_PROGRESSED = exports.UPGRADE_DOWNLOAD_PROGRESSED = 'UPGRADE_DOWNLOAD_PROGRESSED'; +var CHECK_UPGRADE_AVAILABLE = exports.CHECK_UPGRADE_AVAILABLE = 'CHECK_UPGRADE_AVAILABLE'; +var CHECK_UPGRADE_START = exports.CHECK_UPGRADE_START = 'CHECK_UPGRADE_START'; +var CHECK_UPGRADE_SUCCESS = exports.CHECK_UPGRADE_SUCCESS = 'CHECK_UPGRADE_SUCCESS'; +var CHECK_UPGRADE_FAIL = exports.CHECK_UPGRADE_FAIL = 'CHECK_UPGRADE_FAIL'; +var CHECK_UPGRADE_SUBSCRIBE = exports.CHECK_UPGRADE_SUBSCRIBE = 'CHECK_UPGRADE_SUBSCRIBE'; +var UPDATE_VERSION = exports.UPDATE_VERSION = 'UPDATE_VERSION'; +var UPDATE_REMOTE_VERSION = exports.UPDATE_REMOTE_VERSION = 'UPDATE_REMOTE_VERSION'; +var SKIP_UPGRADE = exports.SKIP_UPGRADE = 'SKIP_UPGRADE'; +var START_UPGRADE = exports.START_UPGRADE = 'START_UPGRADE'; + +// Wallet +var GET_NEW_ADDRESS_STARTED = exports.GET_NEW_ADDRESS_STARTED = 'GET_NEW_ADDRESS_STARTED'; +var GET_NEW_ADDRESS_COMPLETED = exports.GET_NEW_ADDRESS_COMPLETED = 'GET_NEW_ADDRESS_COMPLETED'; +var FETCH_TRANSACTIONS_STARTED = exports.FETCH_TRANSACTIONS_STARTED = 'FETCH_TRANSACTIONS_STARTED'; +var FETCH_TRANSACTIONS_COMPLETED = exports.FETCH_TRANSACTIONS_COMPLETED = 'FETCH_TRANSACTIONS_COMPLETED'; +var UPDATE_BALANCE = exports.UPDATE_BALANCE = 'UPDATE_BALANCE'; +var CHECK_ADDRESS_IS_MINE_STARTED = exports.CHECK_ADDRESS_IS_MINE_STARTED = 'CHECK_ADDRESS_IS_MINE_STARTED'; +var CHECK_ADDRESS_IS_MINE_COMPLETED = exports.CHECK_ADDRESS_IS_MINE_COMPLETED = 'CHECK_ADDRESS_IS_MINE_COMPLETED'; +var SET_DRAFT_TRANSACTION_AMOUNT = exports.SET_DRAFT_TRANSACTION_AMOUNT = 'SET_DRAFT_TRANSACTION_AMOUNT'; +var SET_DRAFT_TRANSACTION_ADDRESS = exports.SET_DRAFT_TRANSACTION_ADDRESS = 'SET_DRAFT_TRANSACTION_ADDRESS'; +var SEND_TRANSACTION_STARTED = exports.SEND_TRANSACTION_STARTED = 'SEND_TRANSACTION_STARTED'; +var SEND_TRANSACTION_COMPLETED = exports.SEND_TRANSACTION_COMPLETED = 'SEND_TRANSACTION_COMPLETED'; +var SEND_TRANSACTION_FAILED = exports.SEND_TRANSACTION_FAILED = 'SEND_TRANSACTION_FAILED'; +var FETCH_BLOCK_SUCCESS = exports.FETCH_BLOCK_SUCCESS = 'FETCH_BLOCK_SUCCESS'; +var SUPPORT_TRANSACTION_STARTED = exports.SUPPORT_TRANSACTION_STARTED = 'SUPPORT_TRANSACTION_STARTED'; +var SUPPORT_TRANSACTION_COMPLETED = exports.SUPPORT_TRANSACTION_COMPLETED = 'SUPPORT_TRANSACTION_COMPLETED'; +var SUPPORT_TRANSACTION_FAILED = exports.SUPPORT_TRANSACTION_FAILED = 'SUPPORT_TRANSACTION_FAILED'; + +// Claims +var FETCH_FEATURED_CONTENT_STARTED = exports.FETCH_FEATURED_CONTENT_STARTED = 'FETCH_FEATURED_CONTENT_STARTED'; +var FETCH_FEATURED_CONTENT_COMPLETED = exports.FETCH_FEATURED_CONTENT_COMPLETED = 'FETCH_FEATURED_CONTENT_COMPLETED'; +var RESOLVE_URIS_STARTED = exports.RESOLVE_URIS_STARTED = 'RESOLVE_URIS_STARTED'; +var RESOLVE_URIS_COMPLETED = exports.RESOLVE_URIS_COMPLETED = 'RESOLVE_URIS_COMPLETED'; +var FETCH_CHANNEL_CLAIMS_STARTED = exports.FETCH_CHANNEL_CLAIMS_STARTED = 'FETCH_CHANNEL_CLAIMS_STARTED'; +var FETCH_CHANNEL_CLAIMS_COMPLETED = exports.FETCH_CHANNEL_CLAIMS_COMPLETED = 'FETCH_CHANNEL_CLAIMS_COMPLETED'; +var FETCH_CHANNEL_CLAIM_COUNT_STARTED = exports.FETCH_CHANNEL_CLAIM_COUNT_STARTED = 'FETCH_CHANNEL_CLAIM_COUNT_STARTED'; +var FETCH_CHANNEL_CLAIM_COUNT_COMPLETED = exports.FETCH_CHANNEL_CLAIM_COUNT_COMPLETED = 'FETCH_CHANNEL_CLAIM_COUNT_COMPLETED'; +var FETCH_CLAIM_LIST_MINE_STARTED = exports.FETCH_CLAIM_LIST_MINE_STARTED = 'FETCH_CLAIM_LIST_MINE_STARTED'; +var FETCH_CLAIM_LIST_MINE_COMPLETED = exports.FETCH_CLAIM_LIST_MINE_COMPLETED = 'FETCH_CLAIM_LIST_MINE_COMPLETED'; +var ABANDON_CLAIM_STARTED = exports.ABANDON_CLAIM_STARTED = 'ABANDON_CLAIM_STARTED'; +var ABANDON_CLAIM_SUCCEEDED = exports.ABANDON_CLAIM_SUCCEEDED = 'ABANDON_CLAIM_SUCCEEDED'; +var FETCH_CHANNEL_LIST_MINE_STARTED = exports.FETCH_CHANNEL_LIST_MINE_STARTED = 'FETCH_CHANNEL_LIST_MINE_STARTED'; +var FETCH_CHANNEL_LIST_MINE_COMPLETED = exports.FETCH_CHANNEL_LIST_MINE_COMPLETED = 'FETCH_CHANNEL_LIST_MINE_COMPLETED'; +var CREATE_CHANNEL_STARTED = exports.CREATE_CHANNEL_STARTED = 'CREATE_CHANNEL_STARTED'; +var CREATE_CHANNEL_COMPLETED = exports.CREATE_CHANNEL_COMPLETED = 'CREATE_CHANNEL_COMPLETED'; +var PUBLISH_STARTED = exports.PUBLISH_STARTED = 'PUBLISH_STARTED'; +var PUBLISH_COMPLETED = exports.PUBLISH_COMPLETED = 'PUBLISH_COMPLETED'; +var PUBLISH_FAILED = exports.PUBLISH_FAILED = 'PUBLISH_FAILED'; +var SET_PLAYING_URI = exports.SET_PLAYING_URI = 'PLAY_URI'; + +// Files +var FILE_LIST_STARTED = exports.FILE_LIST_STARTED = 'FILE_LIST_STARTED'; +var FILE_LIST_SUCCEEDED = exports.FILE_LIST_SUCCEEDED = 'FILE_LIST_SUCCEEDED'; +var FETCH_FILE_INFO_STARTED = exports.FETCH_FILE_INFO_STARTED = 'FETCH_FILE_INFO_STARTED'; +var FETCH_FILE_INFO_COMPLETED = exports.FETCH_FILE_INFO_COMPLETED = 'FETCH_FILE_INFO_COMPLETED'; +var FETCH_COST_INFO_STARTED = exports.FETCH_COST_INFO_STARTED = 'FETCH_COST_INFO_STARTED'; +var FETCH_COST_INFO_COMPLETED = exports.FETCH_COST_INFO_COMPLETED = 'FETCH_COST_INFO_COMPLETED'; +var LOADING_VIDEO_STARTED = exports.LOADING_VIDEO_STARTED = 'LOADING_VIDEO_STARTED'; +var LOADING_VIDEO_COMPLETED = exports.LOADING_VIDEO_COMPLETED = 'LOADING_VIDEO_COMPLETED'; +var LOADING_VIDEO_FAILED = exports.LOADING_VIDEO_FAILED = 'LOADING_VIDEO_FAILED'; +var DOWNLOADING_STARTED = exports.DOWNLOADING_STARTED = 'DOWNLOADING_STARTED'; +var DOWNLOADING_PROGRESSED = exports.DOWNLOADING_PROGRESSED = 'DOWNLOADING_PROGRESSED'; +var DOWNLOADING_COMPLETED = exports.DOWNLOADING_COMPLETED = 'DOWNLOADING_COMPLETED'; +var PLAY_VIDEO_STARTED = exports.PLAY_VIDEO_STARTED = 'PLAY_VIDEO_STARTED'; +var FETCH_AVAILABILITY_STARTED = exports.FETCH_AVAILABILITY_STARTED = 'FETCH_AVAILABILITY_STARTED'; +var FETCH_AVAILABILITY_COMPLETED = exports.FETCH_AVAILABILITY_COMPLETED = 'FETCH_AVAILABILITY_COMPLETED'; +var FILE_DELETE = exports.FILE_DELETE = 'FILE_DELETE'; + +// Search +var SEARCH_STARTED = exports.SEARCH_STARTED = 'SEARCH_STARTED'; +var SEARCH_COMPLETED = exports.SEARCH_COMPLETED = 'SEARCH_COMPLETED'; +var SEARCH_CANCELLED = exports.SEARCH_CANCELLED = 'SEARCH_CANCELLED'; + +// Settings +var DAEMON_SETTINGS_RECEIVED = exports.DAEMON_SETTINGS_RECEIVED = 'DAEMON_SETTINGS_RECEIVED'; +var CLIENT_SETTING_CHANGED = exports.CLIENT_SETTING_CHANGED = 'CLIENT_SETTING_CHANGED'; + +// User +var AUTHENTICATION_STARTED = exports.AUTHENTICATION_STARTED = 'AUTHENTICATION_STARTED'; +var AUTHENTICATION_SUCCESS = exports.AUTHENTICATION_SUCCESS = 'AUTHENTICATION_SUCCESS'; +var AUTHENTICATION_FAILURE = exports.AUTHENTICATION_FAILURE = 'AUTHENTICATION_FAILURE'; +var USER_EMAIL_DECLINE = exports.USER_EMAIL_DECLINE = 'USER_EMAIL_DECLINE'; +var USER_EMAIL_NEW_STARTED = exports.USER_EMAIL_NEW_STARTED = 'USER_EMAIL_NEW_STARTED'; +var USER_EMAIL_NEW_SUCCESS = exports.USER_EMAIL_NEW_SUCCESS = 'USER_EMAIL_NEW_SUCCESS'; +var USER_EMAIL_NEW_EXISTS = exports.USER_EMAIL_NEW_EXISTS = 'USER_EMAIL_NEW_EXISTS'; +var USER_EMAIL_NEW_FAILURE = exports.USER_EMAIL_NEW_FAILURE = 'USER_EMAIL_NEW_FAILURE'; +var USER_EMAIL_VERIFY_STARTED = exports.USER_EMAIL_VERIFY_STARTED = 'USER_EMAIL_VERIFY_STARTED'; +var USER_EMAIL_VERIFY_SUCCESS = exports.USER_EMAIL_VERIFY_SUCCESS = 'USER_EMAIL_VERIFY_SUCCESS'; +var USER_EMAIL_VERIFY_FAILURE = exports.USER_EMAIL_VERIFY_FAILURE = 'USER_EMAIL_VERIFY_FAILURE'; +var USER_IDENTITY_VERIFY_STARTED = exports.USER_IDENTITY_VERIFY_STARTED = 'USER_IDENTITY_VERIFY_STARTED'; +var USER_IDENTITY_VERIFY_SUCCESS = exports.USER_IDENTITY_VERIFY_SUCCESS = 'USER_IDENTITY_VERIFY_SUCCESS'; +var USER_IDENTITY_VERIFY_FAILURE = exports.USER_IDENTITY_VERIFY_FAILURE = 'USER_IDENTITY_VERIFY_FAILURE'; +var USER_FETCH_STARTED = exports.USER_FETCH_STARTED = 'USER_FETCH_STARTED'; +var USER_FETCH_SUCCESS = exports.USER_FETCH_SUCCESS = 'USER_FETCH_SUCCESS'; +var USER_FETCH_FAILURE = exports.USER_FETCH_FAILURE = 'USER_FETCH_FAILURE'; +var USER_INVITE_STATUS_FETCH_STARTED = exports.USER_INVITE_STATUS_FETCH_STARTED = 'USER_INVITE_STATUS_FETCH_STARTED'; +var USER_INVITE_STATUS_FETCH_SUCCESS = exports.USER_INVITE_STATUS_FETCH_SUCCESS = 'USER_INVITE_STATUS_FETCH_SUCCESS'; +var USER_INVITE_STATUS_FETCH_FAILURE = exports.USER_INVITE_STATUS_FETCH_FAILURE = 'USER_INVITE_STATUS_FETCH_FAILURE'; +var USER_INVITE_NEW_STARTED = exports.USER_INVITE_NEW_STARTED = 'USER_INVITE_NEW_STARTED'; +var USER_INVITE_NEW_SUCCESS = exports.USER_INVITE_NEW_SUCCESS = 'USER_INVITE_NEW_SUCCESS'; +var USER_INVITE_NEW_FAILURE = exports.USER_INVITE_NEW_FAILURE = 'USER_INVITE_NEW_FAILURE'; +var FETCH_ACCESS_TOKEN_SUCCESS = exports.FETCH_ACCESS_TOKEN_SUCCESS = 'FETCH_ACCESS_TOKEN_SUCCESS'; + +// Rewards +var FETCH_REWARDS_STARTED = exports.FETCH_REWARDS_STARTED = 'FETCH_REWARDS_STARTED'; +var FETCH_REWARDS_COMPLETED = exports.FETCH_REWARDS_COMPLETED = 'FETCH_REWARDS_COMPLETED'; +var CLAIM_REWARD_STARTED = exports.CLAIM_REWARD_STARTED = 'CLAIM_REWARD_STARTED'; +var CLAIM_REWARD_SUCCESS = exports.CLAIM_REWARD_SUCCESS = 'CLAIM_REWARD_SUCCESS'; +var CLAIM_REWARD_FAILURE = exports.CLAIM_REWARD_FAILURE = 'CLAIM_REWARD_FAILURE'; +var CLAIM_REWARD_CLEAR_ERROR = exports.CLAIM_REWARD_CLEAR_ERROR = 'CLAIM_REWARD_CLEAR_ERROR'; +var FETCH_REWARD_CONTENT_COMPLETED = exports.FETCH_REWARD_CONTENT_COMPLETED = 'FETCH_REWARD_CONTENT_COMPLETED'; + +// Language +var DOWNLOAD_LANGUAGE_SUCCEEDED = exports.DOWNLOAD_LANGUAGE_SUCCEEDED = 'DOWNLOAD_LANGUAGE_SUCCEEDED'; +var DOWNLOAD_LANGUAGE_FAILED = exports.DOWNLOAD_LANGUAGE_FAILED = 'DOWNLOAD_LANGUAGE_FAILED'; + +// ShapeShift +var GET_SUPPORTED_COINS_START = exports.GET_SUPPORTED_COINS_START = 'GET_SUPPORTED_COINS_START'; +var GET_SUPPORTED_COINS_SUCCESS = exports.GET_SUPPORTED_COINS_SUCCESS = 'GET_SUPPORTED_COINS_SUCCESS'; +var GET_SUPPORTED_COINS_FAIL = exports.GET_SUPPORTED_COINS_FAIL = 'GET_SUPPORTED_COINS_FAIL'; +var GET_COIN_STATS_START = exports.GET_COIN_STATS_START = 'GET_COIN_STATS_START'; +var GET_COIN_STATS_SUCCESS = exports.GET_COIN_STATS_SUCCESS = 'GET_COIN_STATS_SUCCESS'; +var GET_COIN_STATS_FAIL = exports.GET_COIN_STATS_FAIL = 'GET_COIN_STATS_FAIL'; +var PREPARE_SHAPE_SHIFT_START = exports.PREPARE_SHAPE_SHIFT_START = 'PREPARE_SHAPE_SHIFT_START'; +var PREPARE_SHAPE_SHIFT_SUCCESS = exports.PREPARE_SHAPE_SHIFT_SUCCESS = 'PREPARE_SHAPE_SHIFT_SUCCESS'; +var PREPARE_SHAPE_SHIFT_FAIL = exports.PREPARE_SHAPE_SHIFT_FAIL = 'PREPARE_SHAPE_SHIFT_FAIL'; +var GET_ACTIVE_SHIFT_START = exports.GET_ACTIVE_SHIFT_START = 'GET_ACTIVE_SHIFT_START'; +var GET_ACTIVE_SHIFT_SUCCESS = exports.GET_ACTIVE_SHIFT_SUCCESS = 'GET_ACTIVE_SHIFT_SUCCESS'; +var GET_ACTIVE_SHIFT_FAIL = exports.GET_ACTIVE_SHIFT_FAIL = 'GET_ACTIVE_SHIFT_FAIL'; +var CLEAR_SHAPE_SHIFT = exports.CLEAR_SHAPE_SHIFT = 'CLEAR_SHAPE_SHIFT'; + +// Subscriptions +var CHANNEL_SUBSCRIBE = exports.CHANNEL_SUBSCRIBE = 'CHANNEL_SUBSCRIBE'; +var CHANNEL_UNSUBSCRIBE = exports.CHANNEL_UNSUBSCRIBE = 'CHANNEL_UNSUBSCRIBE'; +var HAS_FETCHED_SUBSCRIPTIONS = exports.HAS_FETCHED_SUBSCRIPTIONS = 'HAS_FETCHED_SUBSCRIPTIONS'; + +// Video controls +var SET_VIDEO_PAUSE = exports.SET_VIDEO_PAUSE = 'SET_VIDEO_PAUSE'; + +// Media controls +var MEDIA_PLAY = exports.MEDIA_PLAY = 'MEDIA_PLAY'; +var MEDIA_PAUSE = exports.MEDIA_PAUSE = 'MEDIA_PAUSE'; +var MEDIA_POSITION = exports.MEDIA_POSITION = 'MEDIA_POSITION'; + +/***/ }), +/* 1 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); + +var CHANNEL_NAME_MIN_LEN = 1; +var CLAIM_ID_MAX_LEN = 40; + +var Lbryuri = {}; + +Lbryuri.REGEXP_INVALID_URI = /[^A-Za-z0-9-]/g; +Lbryuri.REGEXP_ADDRESS = /^b(?=[^0OIl]{32,33})[0-9A-Za-z]{32,33}$/; + +/** + * Parses a LBRY name into its component parts. Throws errors with user-friendly + * messages for invalid names. + * + * N.B. that "name" indicates the value in the name position of the URI. For + * claims for channel content, this will actually be the channel name, and + * the content name is in the path (e.g. lbry://@channel/content) + * + * In most situations, you'll want to use the contentName and channelName keys + * and ignore the name key. + * + * Returns a dictionary with keys: + * - name (string): The value in the "name" position in the URI. Note that this + * could be either content name or channel name; see above. + * - path (string, if persent) + * - claimSequence (int, if present) + * - bidPosition (int, if present) + * - claimId (string, if present) + * - isChannel (boolean) + * - contentName (string): For anon claims, the name; for channel claims, the path + * - channelName (string, if present): Channel name without @ + */ +Lbryuri.parse = function (uri) { + var requireProto = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + // Break into components. Empty sub-matches are converted to null + var componentsRegex = new RegExp('^((?:lbry://)?)' + // protocol + '([^:$#/]*)' + // name (stops at the first separator or end) + '([:$#]?)([^/]*)' + // modifier separator, modifier (stops at the first path separator or end) + '(/?)(.*)' // path separator, path + ); + + var _componentsRegex$exec = componentsRegex.exec(uri).slice(1).map(function (match) { + return match || null; + }), + _componentsRegex$exec2 = _slicedToArray(_componentsRegex$exec, 6), + proto = _componentsRegex$exec2[0], + name = _componentsRegex$exec2[1], + modSep = _componentsRegex$exec2[2], + modVal = _componentsRegex$exec2[3], + pathSep = _componentsRegex$exec2[4], + path = _componentsRegex$exec2[5]; + + var contentName = void 0; + + // Validate protocol + if (requireProto && !proto) { + throw new Error(__('LBRY URIs must include a protocol prefix (lbry://).')); + } + + // Validate and process name + if (!name) { + throw new Error(__('URI does not include name.')); + } + + var isChannel = name.startsWith('@'); + var channelName = isChannel ? name.slice(1) : name; + + if (isChannel) { + if (!channelName) { + throw new Error(__('No channel name after @.')); + } + + if (channelName.length < CHANNEL_NAME_MIN_LEN) { + throw new Error(__('Channel names must be at least %s characters.', CHANNEL_NAME_MIN_LEN)); + } + + contentName = path; + } + + var nameBadChars = (channelName || name).match(Lbryuri.REGEXP_INVALID_URI); + if (nameBadChars) { + throw new Error(__('Invalid character %s in name: %s.', nameBadChars.length === 1 ? '' : 's', nameBadChars.join(', '))); + } + + // Validate and process modifier (claim ID, bid position or claim sequence) + var claimId = void 0; + var claimSequence = void 0; + var bidPosition = void 0; + if (modSep) { + if (!modVal) { + throw new Error(__('No modifier provided after separator %s.', modSep)); + } + + if (modSep === '#') { + claimId = modVal; + } else if (modSep === ':') { + claimSequence = modVal; + } else if (modSep === '$') { + bidPosition = modVal; + } + } + + if (claimId && (claimId.length > CLAIM_ID_MAX_LEN || !claimId.match(/^[0-9a-f]+$/)) && !claimId.match(/^pending/) // ought to be dropped when savePendingPublish drops hack + ) { + throw new Error(__('Invalid claim ID %s.', claimId)); + } + + if (claimSequence && !claimSequence.match(/^-?[1-9][0-9]*$/)) { + throw new Error(__('Claim sequence must be a number.')); + } + + if (bidPosition && !bidPosition.match(/^-?[1-9][0-9]*$/)) { + throw new Error(__('Bid position must be a number.')); + } + + // Validate and process path + if (path) { + if (!isChannel) { + throw new Error(__('Only channel URIs may have a path.')); + } + + var pathBadChars = path.match(Lbryuri.REGEXP_INVALID_URI); + if (pathBadChars) { + throw new Error(__('Invalid character in path: %s', pathBadChars.join(', '))); + } + + contentName = path; + } else if (pathSep) { + throw new Error(__('No path provided after /')); + } + + return _extends({ + name: name, + path: path, + isChannel: isChannel + }, contentName ? { contentName: contentName } : {}, channelName ? { channelName: channelName } : {}, claimSequence ? { claimSequence: parseInt(claimSequence, 10) } : {}, bidPosition ? { bidPosition: parseInt(bidPosition, 10) } : {}, claimId ? { claimId: claimId } : {}, path ? { path: path } : {}); +}; + +/** + * Takes an object in the same format returned by lbryuri.parse() and builds a URI. + * + * The channelName key will accept names with or without the @ prefix. + */ +Lbryuri.build = function (uriObj) { + var includeProto = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + var claimId = uriObj.claimId, + claimSequence = uriObj.claimSequence, + bidPosition = uriObj.bidPosition, + contentName = uriObj.contentName, + channelName = uriObj.channelName; + var name = uriObj.name, + path = uriObj.path; + + + if (channelName) { + var channelNameFormatted = channelName.startsWith('@') ? channelName : '@' + channelName; + if (!name) { + name = channelNameFormatted; + } else if (name !== channelNameFormatted) { + throw new Error(__('Received a channel content URI, but name and channelName do not match. "name" represents the value in the name position of the URI (lbry://name...), which for channel content will be the channel name. In most cases, to construct a channel URI you should just pass channelName and contentName.')); + } + } + + if (contentName) { + if (!name) { + name = contentName; + } else if (!path) { + path = contentName; + } + if (path && path !== contentName) { + throw new Error(__('Path and contentName do not match. Only one is required; most likely you wanted contentName.')); + } + } + + return (includeProto ? 'lbry://' : '') + name + (claimId ? '#' + claimId : '') + (claimSequence ? ':' + claimSequence : '') + (bidPosition ? '' + bidPosition : '') + (path ? '/' + path : ''); +}; + +/* Takes a parseable LBRY URI and converts it to standard, canonical format (currently this just + * consists of adding the lbry:// prefix if needed) */ +Lbryuri.normalize = function (uri) { + if (uri.match(/pending_claim/)) return uri; + + var _Lbryuri$parse = Lbryuri.parse(uri), + name = _Lbryuri$parse.name, + path = _Lbryuri$parse.path, + bidPosition = _Lbryuri$parse.bidPosition, + claimSequence = _Lbryuri$parse.claimSequence, + claimId = _Lbryuri$parse.claimId; + + return Lbryuri.build({ name: name, path: path, claimSequence: claimSequence, bidPosition: bidPosition, claimId: claimId }); +}; + +Lbryuri.isValid = function (uri) { + var parts = void 0; + try { + parts = Lbryuri.parse(Lbryuri.normalize(uri)); + } catch (error) { + return false; + } + return parts && parts.name; +}; + +Lbryuri.isValidName = function (name) { + var checkCase = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + + var regexp = new RegExp('^[a-z0-9-]+$', checkCase ? '' : 'i'); + return regexp.test(name); +}; + +Lbryuri.isClaimable = function (uri) { + var parts = void 0; + try { + parts = Lbryuri.parse(Lbryuri.normalize(uri)); + } catch (error) { + return false; + } + return parts && parts.name && !parts.claimId && !parts.bidPosition && !parts.claimSequence && !parts.isChannel && !parts.path; +}; + +if (window) { + window.lbryuri = Lbryuri; +} +exports.default = Lbryuri; + +/***/ }), +/* 2 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.makeSelectIsUriResolving = exports.selectResolvingUris = exports.selectMyChannelClaims = exports.selectFetchingMyChannels = exports.selectMyClaimsOutpoints = exports.selectAllMyClaimsByOutpoint = exports.selectMyClaimsWithoutChannels = exports.selectMyClaims = exports.selectPendingClaims = exports.selectIsFetchingClaimListMine = exports.makeSelectContentTypeForUri = exports.makeSelectTitleForUri = exports.makeSelectMetadataForUri = exports.makeSelectClaimsInChannelForCurrentPage = exports.makeSelectFetchingChannelClaims = exports.selectAllFetchingChannelClaims = exports.makeSelectClaimIsMine = exports.selectMyActiveClaims = exports.selectAbandoningIds = exports.selectMyClaimsRaw = exports.makeSelectClaimForUri = exports.selectAllClaimsByChannel = exports.selectClaimsByUri = exports.selectClaimsById = undefined; + +var _lbryuri = __webpack_require__(1); + +var _lbryuri2 = _interopRequireDefault(_lbryuri); + +var _navigation = __webpack_require__(3); + +var _reselect = __webpack_require__(4); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } + +var selectState = function selectState(state) { + return state.claims || {}; +}; + +var selectClaimsById = exports.selectClaimsById = (0, _reselect.createSelector)(selectState, function (state) { + return state.byId || {}; +}); + +var selectClaimsByUri = exports.selectClaimsByUri = (0, _reselect.createSelector)(selectState, selectClaimsById, function (state, byId) { + var byUri = state.claimsByUri || {}; + var claims = {}; + + Object.keys(byUri).forEach(function (uri) { + var claimId = byUri[uri]; + + // NOTE returning a null claim allows us to differentiate between an + // undefined (never fetched claim) and one which just doesn't exist. Not + // the cleanest solution but couldn't think of anything better right now + if (claimId === null) { + claims[uri] = null; + } else { + claims[uri] = byId[claimId]; + } + }); + + return claims; +}); + +var selectAllClaimsByChannel = exports.selectAllClaimsByChannel = (0, _reselect.createSelector)(selectState, function (state) { + return state.claimsByChannel || {}; +}); + +var makeSelectClaimForUri = exports.makeSelectClaimForUri = function makeSelectClaimForUri(uri) { + return (0, _reselect.createSelector)(selectClaimsByUri, function (claims) { + return claims && claims[_lbryuri2.default.normalize(uri)]; + }); +}; + +var selectMyClaimsRaw = exports.selectMyClaimsRaw = (0, _reselect.createSelector)(selectState, function (state) { + return state.myClaims; +}); + +var selectAbandoningIds = exports.selectAbandoningIds = (0, _reselect.createSelector)(selectState, function (state) { + return Object.keys(state.abandoningById || {}); +}); + +var selectMyActiveClaims = exports.selectMyActiveClaims = (0, _reselect.createSelector)(selectMyClaimsRaw, selectAbandoningIds, function (claims, abandoningIds) { + return new Set(claims && claims.map(function (claim) { + return claim.claim_id; + }).filter(function (claimId) { + return Object.keys(abandoningIds).indexOf(claimId) === -1; + })); +}); + +var makeSelectClaimIsMine = exports.makeSelectClaimIsMine = function makeSelectClaimIsMine(rawUri) { + var uri = _lbryuri2.default.normalize(rawUri); + return (0, _reselect.createSelector)(selectClaimsByUri, selectMyActiveClaims, function (claims, myClaims) { + return claims && claims[uri] && claims[uri].claim_id && myClaims.has(claims[uri].claim_id); + }); +}; + +var selectAllFetchingChannelClaims = exports.selectAllFetchingChannelClaims = (0, _reselect.createSelector)(selectState, function (state) { + return state.fetchingChannelClaims || {}; +}); + +var makeSelectFetchingChannelClaims = exports.makeSelectFetchingChannelClaims = function makeSelectFetchingChannelClaims(uri) { + return (0, _reselect.createSelector)(selectAllFetchingChannelClaims, function (fetching) { + return fetching && fetching[uri]; + }); +}; + +var makeSelectClaimsInChannelForCurrentPage = exports.makeSelectClaimsInChannelForCurrentPage = function makeSelectClaimsInChannelForCurrentPage(uri) { + var pageSelector = (0, _navigation.makeSelectCurrentParam)('page'); + + return (0, _reselect.createSelector)(selectClaimsById, selectAllClaimsByChannel, pageSelector, function (byId, allClaims, page) { + var byChannel = allClaims[uri] || {}; + var claimIds = byChannel[page || 1]; + + if (!claimIds) return claimIds; + + return claimIds.map(function (claimId) { + return byId[claimId]; + }); + }); +}; + +var makeSelectMetadataForUri = exports.makeSelectMetadataForUri = function makeSelectMetadataForUri(uri) { + return (0, _reselect.createSelector)(makeSelectClaimForUri(uri), function (claim) { + var metadata = claim && claim.value && claim.value.stream && claim.value.stream.metadata; + + return metadata || (claim === undefined ? undefined : null); + }); +}; + +var makeSelectTitleForUri = exports.makeSelectTitleForUri = function makeSelectTitleForUri(uri) { + return (0, _reselect.createSelector)(makeSelectMetadataForUri(uri), function (metadata) { + return metadata && metadata.title; + }); +}; + +var makeSelectContentTypeForUri = exports.makeSelectContentTypeForUri = function makeSelectContentTypeForUri(uri) { + return (0, _reselect.createSelector)(makeSelectClaimForUri(uri), function (claim) { + var source = claim && claim.value && claim.value.stream && claim.value.stream.source; + return source ? source.contentType : undefined; + }); +}; + +var selectIsFetchingClaimListMine = exports.selectIsFetchingClaimListMine = (0, _reselect.createSelector)(selectState, function (state) { + return state.isFetchingClaimListMine; +}); + +var selectPendingClaims = exports.selectPendingClaims = (0, _reselect.createSelector)(selectState, function (state) { + return Object.values(state.pendingById || {}); +}); + +var selectMyClaims = exports.selectMyClaims = (0, _reselect.createSelector)(selectMyActiveClaims, selectClaimsById, selectAbandoningIds, selectPendingClaims, function (myClaimIds, byId, abandoningIds, pendingClaims) { + var claims = []; + + myClaimIds.forEach(function (id) { + var claim = byId[id]; + + if (claim && abandoningIds.indexOf(id) === -1) claims.push(claim); + }); + + return [].concat(claims, _toConsumableArray(pendingClaims)); +}); + +var selectMyClaimsWithoutChannels = exports.selectMyClaimsWithoutChannels = (0, _reselect.createSelector)(selectMyClaims, function (myClaims) { + return myClaims.filter(function (claim) { + return !claim.name.match(/^@/); + }); +}); + +var selectAllMyClaimsByOutpoint = exports.selectAllMyClaimsByOutpoint = (0, _reselect.createSelector)(selectMyClaimsRaw, function (claims) { + return new Set(claims && claims.length ? claims.map(function (claim) { + return claim.txid + ':' + claim.nout; + }) : null); +}); + +var selectMyClaimsOutpoints = exports.selectMyClaimsOutpoints = (0, _reselect.createSelector)(selectMyClaims, function (myClaims) { + var outpoints = []; + + myClaims.forEach(function (claim) { + return outpoints.push(claim.txid + ':' + claim.nout); + }); + + return outpoints; +}); + +var selectFetchingMyChannels = exports.selectFetchingMyChannels = (0, _reselect.createSelector)(selectState, function (state) { + return state.fetchingMyChannels; +}); + +var selectMyChannelClaims = exports.selectMyChannelClaims = (0, _reselect.createSelector)(selectState, selectClaimsById, function (state, byId) { + var ids = state.myChannelClaims || []; + var claims = []; + + ids.forEach(function (id) { + if (byId[id]) { + // I'm not sure why this check is necessary, but it ought to be a quick fix for https://github.com/lbryio/lbry-app/issues/544 + claims.push(byId[id]); + } + }); + + return claims; +}); + +var selectResolvingUris = exports.selectResolvingUris = (0, _reselect.createSelector)(selectState, function (state) { + return state.resolvingUris || []; +}); + +var makeSelectIsUriResolving = exports.makeSelectIsUriResolving = function makeSelectIsUriResolving(uri) { + return (0, _reselect.createSelector)(selectResolvingUris, function (resolvingUris) { + return resolvingUris && resolvingUris.indexOf(uri) !== -1; + }); +}; + +/***/ }), +/* 3 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.selectActiveHistoryEntry = exports.selectHistoryStack = exports.selectHistoryIndex = exports.selectIsForwardDisabled = exports.selectIsBackDisabled = exports.selectPathAfterAuth = exports.selectPageTitle = exports.selectHeaderLinks = exports.makeSelectCurrentParam = exports.selectCurrentParams = exports.selectCurrentPage = exports.computePageFromPath = exports.selectCurrentPath = exports.selectState = undefined; + +var _reselect = __webpack_require__(4); + +var _query_params = __webpack_require__(7); + +var _lbryuri = __webpack_require__(1); + +var _lbryuri2 = _interopRequireDefault(_lbryuri); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var selectState = exports.selectState = function selectState(state) { + return state.navigation || {}; +}; + +var selectCurrentPath = exports.selectCurrentPath = (0, _reselect.createSelector)(selectState, function (state) { + return state.currentPath; +}); + +var computePageFromPath = exports.computePageFromPath = function computePageFromPath(path) { + return path.replace(/^\//, '').split('?')[0]; +}; + +var selectCurrentPage = exports.selectCurrentPage = (0, _reselect.createSelector)(selectCurrentPath, function (path) { + return computePageFromPath(path); +}); + +var selectCurrentParams = exports.selectCurrentParams = (0, _reselect.createSelector)(selectCurrentPath, function (path) { + if (path === undefined) return {}; + if (!path.match(/\?/)) return {}; + + return (0, _query_params.parseQueryParams)(path.split('?')[1]); +}); + +var makeSelectCurrentParam = exports.makeSelectCurrentParam = function makeSelectCurrentParam(param) { + return (0, _reselect.createSelector)(selectCurrentParams, function (params) { + return params ? params[param] : undefined; + }); +}; + +var selectHeaderLinks = exports.selectHeaderLinks = (0, _reselect.createSelector)(selectCurrentPage, function (page) { + // This contains intentional fall throughs + switch (page) { + case 'wallet': + case 'history': + case 'send': + case 'getcredits': + case 'invite': + case 'rewards': + case 'backup': + return { + wallet: __('Overview'), + getcredits: __('Get Credits'), + send: __('Send / Receive'), + rewards: __('Rewards'), + invite: __('Invites'), + history: __('History') + }; + case 'downloaded': + case 'published': + return { + downloaded: __('Downloaded'), + published: __('Published') + }; + case 'settings': + case 'help': + return { + settings: __('Settings'), + help: __('Help') + }; + case 'discover': + case 'subscriptions': + return { + discover: __('Discover'), + subscriptions: __('Subscriptions') + }; + default: + return null; + } +}); + +var selectPageTitle = exports.selectPageTitle = (0, _reselect.createSelector)(selectCurrentPage, selectCurrentParams, function (page, params) { + switch (page) { + case 'settings': + return __('Settings'); + case 'report': + return __('Report'); + case 'wallet': + return __('Wallet'); + case 'send': + return __('Send or Receive LBRY Credits'); + case 'getcredits': + return __('Get LBRY Credits'); + case 'backup': + return __('Backup Your Wallet'); + case 'rewards': + return __('Rewards'); + case 'invite': + return __('Invites'); + case 'start': + return __('Start'); + case 'publish': + return params.id ? __('Edit') : __('Publish'); + case 'help': + return __('Help'); + case 'developer': + return __('Developer'); + case 'show': + { + var parts = [_lbryuri2.default.normalize(params.uri)]; + // If the params has any keys other than "uri" + if (Object.keys(params).length > 1) { + parts.push((0, _query_params.toQueryString)(Object.assign({}, params, { uri: null }))); + } + return parts.join('?'); + } + case 'downloaded': + return __('Downloads & Purchases'); + case 'published': + return __('Publications'); + case 'search': + return params.query ? __('Search results for %s', params.query) : __('Search'); + case 'subscriptions': + return __('Your Subscriptions'); + case 'discover': + case false: + case null: + case '': + return ''; + default: + return page[0].toUpperCase() + (page.length > 0 ? page.substr(1) : ''); + } +}); + +var selectPathAfterAuth = exports.selectPathAfterAuth = (0, _reselect.createSelector)(selectState, function (state) { + return state.pathAfterAuth; +}); + +var selectIsBackDisabled = exports.selectIsBackDisabled = (0, _reselect.createSelector)(selectState, function (state) { + return state.index === 0; +}); + +var selectIsForwardDisabled = exports.selectIsForwardDisabled = (0, _reselect.createSelector)(selectState, function (state) { + return state.index === state.stack.length - 1; +}); + +var selectHistoryIndex = exports.selectHistoryIndex = (0, _reselect.createSelector)(selectState, function (state) { + return state.index; +}); + +var selectHistoryStack = exports.selectHistoryStack = (0, _reselect.createSelector)(selectState, function (state) { + return state.stack; +}); + +// returns current page attributes (scrollY, path) +var selectActiveHistoryEntry = exports.selectActiveHistoryEntry = (0, _reselect.createSelector)(selectState, function (state) { + return state.stack[state.index]; +}); + +/***/ }), +/* 4 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +exports.__esModule = true; +exports.defaultMemoize = defaultMemoize; +exports.createSelectorCreator = createSelectorCreator; +exports.createStructuredSelector = createStructuredSelector; +function defaultEqualityCheck(a, b) { + return a === b; +} + +function areArgumentsShallowlyEqual(equalityCheck, prev, next) { + if (prev === null || next === null || prev.length !== next.length) { + return false; + } + + // Do this in a for loop (and not a `forEach` or an `every`) so we can determine equality as fast as possible. + var length = prev.length; + for (var i = 0; i < length; i++) { + if (!equalityCheck(prev[i], next[i])) { + return false; + } + } + + return true; +} + +function defaultMemoize(func) { + var equalityCheck = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultEqualityCheck; + + var lastArgs = null; + var lastResult = null; + // we reference arguments instead of spreading them for performance reasons + return function () { + if (!areArgumentsShallowlyEqual(equalityCheck, lastArgs, arguments)) { + // apply arguments instead of spreading for performance. + lastResult = func.apply(null, arguments); + } + + lastArgs = arguments; + return lastResult; + }; +} + +function getDependencies(funcs) { + var dependencies = Array.isArray(funcs[0]) ? funcs[0] : funcs; + + if (!dependencies.every(function (dep) { + return typeof dep === 'function'; + })) { + var dependencyTypes = dependencies.map(function (dep) { + return typeof dep; + }).join(', '); + throw new Error('Selector creators expect all input-selectors to be functions, ' + ('instead received the following types: [' + dependencyTypes + ']')); + } + + return dependencies; +} + +function createSelectorCreator(memoize) { + for (var _len = arguments.length, memoizeOptions = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + memoizeOptions[_key - 1] = arguments[_key]; + } + + return function () { + for (var _len2 = arguments.length, funcs = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + funcs[_key2] = arguments[_key2]; + } + + var recomputations = 0; + var resultFunc = funcs.pop(); + var dependencies = getDependencies(funcs); + + var memoizedResultFunc = memoize.apply(undefined, [function () { + recomputations++; + // apply arguments instead of spreading for performance. + return resultFunc.apply(null, arguments); + }].concat(memoizeOptions)); + + // If a selector is called with the exact same arguments we don't need to traverse our dependencies again. + var selector = defaultMemoize(function () { + var params = []; + var length = dependencies.length; + + for (var i = 0; i < length; i++) { + // apply arguments instead of spreading and mutate a local list of params for performance. + params.push(dependencies[i].apply(null, arguments)); + } + + // apply arguments instead of spreading for performance. + return memoizedResultFunc.apply(null, params); + }); + + selector.resultFunc = resultFunc; + selector.recomputations = function () { + return recomputations; + }; + selector.resetRecomputations = function () { + return recomputations = 0; + }; + return selector; + }; +} + +var createSelector = exports.createSelector = createSelectorCreator(defaultMemoize); + +function createStructuredSelector(selectors) { + var selectorCreator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : createSelector; + + if (typeof selectors !== 'object') { + throw new Error('createStructuredSelector expects first argument to be an object ' + ('where each property is a selector, instead received a ' + typeof selectors)); + } + var objectKeys = Object.keys(selectors); + return selectorCreator(objectKeys.map(function (key) { + return selectors[key]; + }), function () { + for (var _len3 = arguments.length, values = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { + values[_key3] = arguments[_key3]; + } + + return values.reduce(function (composition, value, index) { + composition[objectKeys[index]] = value; + return composition; + }, {}); + }); +} + +/***/ }), +/* 5 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _jsonrpc = __webpack_require__(11); var _jsonrpc2 = _interopRequireDefault(_jsonrpc); @@ -95,21 +1019,6 @@ function apiCall(method, params, resolve, reject) { return _jsonrpc2.default.call(Lbry.daemonConnectionString, method, params, resolve, reject, reject); } -var lbryProxy = new Proxy(Lbry, { - get: function get(target, name) { - if (name in target) { - return target[name]; - } - - return function () { - var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - return new Promise(function (resolve, reject) { - apiCall(name, params, resolve, reject); - }); - }; - } -}); - function getLocal(key) { var fallback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined; @@ -372,10 +1281,25 @@ Lbry.resolve = function () { }); }; +var lbryProxy = new Proxy(Lbry, { + get: function get(target, name) { + if (name in target) { + return target[name]; + } + + return function () { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return new Promise(function (resolve, reject) { + apiCall(name, params, resolve, reject); + }); + }; + } +}); + exports.default = lbryProxy; /***/ }), -/* 1 */ +/* 6 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -384,28 +1308,845 @@ exports.default = lbryProxy; Object.defineProperty(exports, "__esModule", { value: true }); -exports.costInfoReducer = exports.LbryApi = exports.Lbry = undefined; -var _lbry = __webpack_require__(0); +var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); + +exports.doResolveUris = doResolveUris; +exports.doResolveUri = doResolveUri; +exports.doFetchClaimListMine = doFetchClaimListMine; +exports.doAbandonClaim = doAbandonClaim; + +var _action_types = __webpack_require__(0); + +var ACTIONS = _interopRequireWildcard(_action_types); + +var _lbry = __webpack_require__(5); var _lbry2 = _interopRequireDefault(_lbry); -var _lbryapi = __webpack_require__(3); +var _lbryuri = __webpack_require__(1); -var _lbryapi2 = _interopRequireDefault(_lbryapi); +var _lbryuri2 = _interopRequireDefault(_lbryuri); -var _cost_info = __webpack_require__(8); - -var _cost_info2 = _interopRequireDefault(_cost_info); +var _claims = __webpack_require__(2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -var Lbry = exports.Lbry = _lbry2.default; -var LbryApi = exports.LbryApi = _lbryapi2.default; -var costInfoReducer = exports.costInfoReducer = _cost_info2.default; +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function doResolveUris(uris) { + return function (dispatch, getState) { + var normalizedUris = uris.map(_lbryuri2.default.normalize); + var state = getState(); + + // Filter out URIs that are already resolving + var resolvingUris = (0, _claims.selectResolvingUris)(state); + var urisToResolve = normalizedUris.filter(function (uri) { + return !resolvingUris.includes(uri); + }); + + if (urisToResolve.length === 0) { + return; + } + + dispatch({ + type: ACTIONS.RESOLVE_URIS_STARTED, + data: { uris: normalizedUris } + }); + + var resolveInfo = {}; + _lbry2.default.resolve({ uris: urisToResolve }).then(function (result) { + Object.entries(result).forEach(function (_ref) { + var _ref2 = _slicedToArray(_ref, 2), + uri = _ref2[0], + uriResolveInfo = _ref2[1]; + + var fallbackResolveInfo = { + claim: null, + claimsInChannel: null, + certificate: null + }; + + var _ref3 = uriResolveInfo && !uriResolveInfo.error ? uriResolveInfo : fallbackResolveInfo, + claim = _ref3.claim, + certificate = _ref3.certificate, + claimsInChannel = _ref3.claims_in_channel; + + resolveInfo[uri] = { claim: claim, certificate: certificate, claimsInChannel: claimsInChannel }; + }); + + dispatch({ + type: ACTIONS.RESOLVE_URIS_COMPLETED, + data: { resolveInfo: resolveInfo } + }); + }); + }; +} + +function doResolveUri(uri) { + return doResolveUris([uri]); +} + +function doFetchClaimListMine() { + return function (dispatch) { + dispatch({ + type: ACTIONS.FETCH_CLAIM_LIST_MINE_STARTED + }); + + _lbry2.default.claim_list_mine().then(function (claims) { + dispatch({ + type: ACTIONS.FETCH_CLAIM_LIST_MINE_COMPLETED, + data: { + claims: claims + } + }); + }); + }; +} + +function doAbandonClaim(txid, nout) { + return function (dispatch, getState) { + var state = getState(); + var myClaims = selectMyClaimsRaw(state); + + var _myClaims$find = myClaims.find(function (claim) { + return claim.txid === txid && claim.nout === nout; + }), + claimId = _myClaims$find.claim_id, + name = _myClaims$find.name; + + dispatch({ + type: ACTIONS.ABANDON_CLAIM_STARTED, + data: { + claimId: claimId + } + }); + + var errorCallback = function errorCallback() { + dispatch(doOpenModal(MODALS.TRANSACTION_FAILED)); + }; + + var successCallback = function successCallback(results) { + if (results.txid) { + dispatch({ + type: ACTIONS.ABANDON_CLAIM_SUCCEEDED, + data: { + claimId: claimId + } + }); + dispatch(doResolveUri(_lbryuri2.default.build({ name: name, claimId: claimId }))); + dispatch(doFetchClaimListMine()); + } else { + dispatch(doOpenModal(MODALS.TRANSACTION_FAILED)); + } + }; + + _lbry2.default.claim_abandon({ + txid: txid, + nout: nout + }).then(successCallback, errorCallback); + }; +} /***/ }), -/* 2 */ +/* 7 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); + +exports.parseQueryParams = parseQueryParams; +exports.toQueryString = toQueryString; +function parseQueryParams(queryString) { + if (queryString === '') return {}; + var parts = queryString.split('?').pop().split('&').map(function (p) { + return p.split('='); + }); + + var params = {}; + parts.forEach(function (array) { + var _array = _slicedToArray(array, 2), + first = _array[0], + second = _array[1]; + + params[first] = second; + }); + return params; +} + +function toQueryString(params) { + if (!params) return ''; + + var parts = []; + Object.keys(params).forEach(function (key) { + if (Object.prototype.hasOwnProperty.call(params, key) && params[key]) { + parts.push(key + '=' + params[key]); + } + }); + + return parts.join('&'); +} + +/***/ }), +/* 8 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(process) { + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +var _lbry = __webpack_require__(5); + +var _lbry2 = _interopRequireDefault(_lbry); + +var _querystring = __webpack_require__(14); + +var _querystring2 = _interopRequireDefault(_querystring); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var LbryApi = { + enabled: true, + exchangePromise: null, + exchangeLastFetched: null +}; + +var CONNECTION_STRING = process.env.LBRY_APP_API_URL ? process.env.LBRY_APP_API_URL.replace(/\/*$/, '/') // exactly one slash at the end +: 'https://api.lbry.io/'; + +var EXCHANGE_RATE_TIMEOUT = 20 * 60 * 1000; + +LbryApi.getExchangeRates = function () { + if (!LbryApi.exchangeLastFetched || Date.now() - LbryApi.exchangeLastFetched > EXCHANGE_RATE_TIMEOUT) { + LbryApi.exchangePromise = new Promise(function (resolve, reject) { + LbryApi.call('lbc', 'exchange_rate', {}, 'get', true).then(function (_ref) { + var LBC_USD = _ref.lbc_usd, + LBC_BTC = _ref.lbc_btc, + BTC_USD = _ref.btc_usd; + + var rates = { LBC_USD: LBC_USD, LBC_BTC: LBC_BTC, BTC_USD: BTC_USD }; + resolve(rates); + }).catch(reject); + }); + LbryApi.exchangeLastFetched = Date.now(); + } + return LbryApi.exchangePromise; +}; + +LbryApi.call = function (resource, action) { + var params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + var method = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'get'; + + if (!LbryApi.enabled) { + console.log(__('Internal API disabled')); + return Promise.reject(new Error(__('LBRY internal API is disabled'))); + } + + if (!(method === 'get' || method === 'post')) { + return Promise.reject(new Error(__('Invalid method'))); + } + + function checkAndParse(response) { + if (response.status >= 200 && response.status < 300) { + return response.json(); + } + return response.json().then(function (json) { + var error = void 0; + if (json.error) { + error = new Error(json.error); + } else { + error = new Error('Unknown API error signature'); + } + error.response = response; // This is primarily a hack used in actions/user.js + return Promise.reject(error); + }); + } + + function makeRequest(url, options) { + return fetch(url, options).then(checkAndParse); + } + + var fullParams = _extends({}, params); + var qs = _querystring2.default.stringify(fullParams); + var url = '' + CONNECTION_STRING + resource + '/' + action + '?' + qs; + + var options = { + method: 'GET' + }; + + if (method === 'post') { + options = { + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded' + }, + body: qs + }; + url = '' + CONNECTION_STRING + resource + '/' + action; + } + + return makeRequest(url, options).then(function (response) { + return response.data; + }); +}; + +exports.default = LbryApi; +/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(13))) + +/***/ }), +/* 9 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.selectTotalDownloadProgress = exports.selectDownloadingFileInfos = exports.selectFileInfosDownloaded = exports.makeSelectLoadingForUri = exports.selectUrisLoading = exports.makeSelectDownloadingForUri = exports.selectDownloadingByOutpoint = exports.makeSelectFileInfoForUri = exports.selectIsFetchingFileListDownloadedOrPublished = exports.selectIsFetchingFileList = exports.selectFileInfosByOutpoint = exports.selectState = undefined; + +var _claims = __webpack_require__(2); + +var _reselect = __webpack_require__(4); + +var selectState = exports.selectState = function selectState(state) { + return state.fileInfo || {}; +}; + +var selectFileInfosByOutpoint = exports.selectFileInfosByOutpoint = (0, _reselect.createSelector)(selectState, function (state) { + return state.byOutpoint || {}; +}); + +var selectIsFetchingFileList = exports.selectIsFetchingFileList = (0, _reselect.createSelector)(selectState, function (state) { + return state.isFetchingFileList; +}); + +var selectIsFetchingFileListDownloadedOrPublished = exports.selectIsFetchingFileListDownloadedOrPublished = (0, _reselect.createSelector)(selectIsFetchingFileList, _claims.selectIsFetchingClaimListMine, function (isFetchingFileList, isFetchingClaimListMine) { + return isFetchingFileList || isFetchingClaimListMine; +}); + +var makeSelectFileInfoForUri = exports.makeSelectFileInfoForUri = function makeSelectFileInfoForUri(uri) { + return (0, _reselect.createSelector)(_claims.selectClaimsByUri, selectFileInfosByOutpoint, function (claims, byOutpoint) { + var claim = claims[uri]; + var outpoint = claim ? claim.txid + ':' + claim.nout : undefined; + + return outpoint ? byOutpoint[outpoint] : undefined; + }); +}; + +var selectDownloadingByOutpoint = exports.selectDownloadingByOutpoint = (0, _reselect.createSelector)(selectState, function (state) { + return state.downloadingByOutpoint || {}; +}); + +var makeSelectDownloadingForUri = exports.makeSelectDownloadingForUri = function makeSelectDownloadingForUri(uri) { + return (0, _reselect.createSelector)(selectDownloadingByOutpoint, makeSelectFileInfoForUri(uri), function (byOutpoint, fileInfo) { + if (!fileInfo) return false; + return byOutpoint[fileInfo.outpoint]; + }); +}; + +var selectUrisLoading = exports.selectUrisLoading = (0, _reselect.createSelector)(selectState, function (state) { + return state.urisLoading || {}; +}); + +var makeSelectLoadingForUri = exports.makeSelectLoadingForUri = function makeSelectLoadingForUri(uri) { + return (0, _reselect.createSelector)(selectUrisLoading, function (byUri) { + return byUri && byUri[uri]; + }); +}; + +var selectFileInfosDownloaded = exports.selectFileInfosDownloaded = (0, _reselect.createSelector)(selectFileInfosByOutpoint, _claims.selectMyClaims, function (byOutpoint, myClaims) { + return Object.values(byOutpoint).filter(function (fileInfo) { + var myClaimIds = myClaims.map(function (claim) { + return claim.claim_id; + }); + + return fileInfo && myClaimIds.indexOf(fileInfo.claim_id) === -1 && (fileInfo.completed || fileInfo.written_bytes); + }); +}); + +// export const selectFileInfoForUri = (state, props) => { +// const claims = selectClaimsByUri(state), +// claim = claims[props.uri], +// fileInfos = selectAllFileInfos(state), +// outpoint = claim ? `${claim.txid}:${claim.nout}` : undefined; + +// return outpoint && fileInfos ? fileInfos[outpoint] : undefined; +// }; + +var selectDownloadingFileInfos = exports.selectDownloadingFileInfos = (0, _reselect.createSelector)(selectDownloadingByOutpoint, selectFileInfosByOutpoint, function (downloadingByOutpoint, fileInfosByOutpoint) { + var outpoints = Object.keys(downloadingByOutpoint); + var fileInfos = []; + + outpoints.forEach(function (outpoint) { + var fileInfo = fileInfosByOutpoint[outpoint]; + + if (fileInfo) fileInfos.push(fileInfo); + }); + + return fileInfos; +}); + +var selectTotalDownloadProgress = exports.selectTotalDownloadProgress = (0, _reselect.createSelector)(selectDownloadingFileInfos, function (fileInfos) { + var progress = []; + + fileInfos.forEach(function (fileInfo) { + progress.push(fileInfo.written_bytes / fileInfo.total_bytes * 100); + }); + + var totalProgress = progress.reduce(function (a, b) { + return a + b; + }, 0); + + if (fileInfos.length > 0) return totalProgress / fileInfos.length / 100.0; + return -1; +}); + +/***/ }), +/* 10 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.selectWunderBarIcon = exports.selectWunderBarAddress = exports.selectSearchUrisByQuery = exports.selectIsSearching = exports.selectSearchQuery = exports.makeSelectSearchUris = exports.selectTotalDownloadProgress = exports.selectDownloadingFileInfos = exports.selectFileInfosDownloaded = exports.makeSelectLoadingForUri = exports.selectUrisLoading = exports.makeSelectDownloadingForUri = exports.selectDownloadingByOutpoint = exports.makeSelectFileInfoForUri = exports.selectIsFetchingFileListDownloadedOrPublished = exports.selectIsFetchingFileList = exports.selectFileInfosByOutpoint = exports.selectFetchingCostInfo = exports.selectCostForCurrentPageUri = exports.selectAllCostInfoByUri = exports.makeSelectCostInfoForUri = exports.makeSelectFetchingCostInfoForUri = exports.selectResolvingUris = exports.selectMyChannelClaims = exports.selectFetchingMyChannels = exports.selectMyClaimsOutpoints = exports.selectAllMyClaimsByOutpoint = exports.selectMyClaimsWithoutChannels = exports.selectMyClaims = exports.selectPendingClaims = exports.selectIsFetchingClaimListMine = exports.selectAllFetchingChannelClaims = exports.selectMyActiveClaims = exports.selectAbandoningIds = exports.selectMyClaimsRaw = exports.selectAllClaimsByChannel = exports.selectClaimsByUri = exports.selectClaimsById = exports.makeSelectIsUriResolving = exports.makeSelectContentTypeForUri = exports.makeSelectTitleForUri = exports.makeSelectMetadataForUri = exports.makeSelectClaimsInChannelForCurrentPage = exports.makeSelectFetchingChannelClaims = exports.makeSelectClaimIsMine = exports.makeSelectClaimForUri = exports.walletReducer = exports.searchReducer = exports.fileInfoReducer = exports.costInfoReducer = exports.claimsReducer = exports.doSearch = exports.doFetchFileInfosAndPublishedClaims = exports.doFileList = exports.doFetchFileInfo = exports.doFetchCostInfoForUri = exports.doResolveUri = exports.doResolveUris = exports.doAbandonClaim = exports.doFetchClaimListMine = exports.Lbryuri = exports.LbryApi = exports.Lbry = undefined; + +var _claims = __webpack_require__(6); + +Object.defineProperty(exports, 'doFetchClaimListMine', { + enumerable: true, + get: function get() { + return _claims.doFetchClaimListMine; + } +}); +Object.defineProperty(exports, 'doAbandonClaim', { + enumerable: true, + get: function get() { + return _claims.doAbandonClaim; + } +}); +Object.defineProperty(exports, 'doResolveUris', { + enumerable: true, + get: function get() { + return _claims.doResolveUris; + } +}); +Object.defineProperty(exports, 'doResolveUri', { + enumerable: true, + get: function get() { + return _claims.doResolveUri; + } +}); + +var _cost_info = __webpack_require__(12); + +Object.defineProperty(exports, 'doFetchCostInfoForUri', { + enumerable: true, + get: function get() { + return _cost_info.doFetchCostInfoForUri; + } +}); + +var _file_info = __webpack_require__(17); + +Object.defineProperty(exports, 'doFetchFileInfo', { + enumerable: true, + get: function get() { + return _file_info.doFetchFileInfo; + } +}); +Object.defineProperty(exports, 'doFileList', { + enumerable: true, + get: function get() { + return _file_info.doFileList; + } +}); +Object.defineProperty(exports, 'doFetchFileInfosAndPublishedClaims', { + enumerable: true, + get: function get() { + return _file_info.doFetchFileInfosAndPublishedClaims; + } +}); + +var _search = __webpack_require__(18); + +Object.defineProperty(exports, 'doSearch', { + enumerable: true, + get: function get() { + return _search.doSearch; + } +}); + +var _claims2 = __webpack_require__(21); + +Object.defineProperty(exports, 'claimsReducer', { + enumerable: true, + get: function get() { + return _claims2.claimsReducer; + } +}); + +var _cost_info2 = __webpack_require__(22); + +Object.defineProperty(exports, 'costInfoReducer', { + enumerable: true, + get: function get() { + return _cost_info2.costInfoReducer; + } +}); + +var _file_info2 = __webpack_require__(23); + +Object.defineProperty(exports, 'fileInfoReducer', { + enumerable: true, + get: function get() { + return _file_info2.fileInfoReducer; + } +}); + +var _search2 = __webpack_require__(24); + +Object.defineProperty(exports, 'searchReducer', { + enumerable: true, + get: function get() { + return _search2.searchReducer; + } +}); + +var _wallet = __webpack_require__(25); + +Object.defineProperty(exports, 'walletReducer', { + enumerable: true, + get: function get() { + return _wallet.walletReducer; + } +}); + +var _claims3 = __webpack_require__(2); + +Object.defineProperty(exports, 'makeSelectClaimForUri', { + enumerable: true, + get: function get() { + return _claims3.makeSelectClaimForUri; + } +}); +Object.defineProperty(exports, 'makeSelectClaimIsMine', { + enumerable: true, + get: function get() { + return _claims3.makeSelectClaimIsMine; + } +}); +Object.defineProperty(exports, 'makeSelectFetchingChannelClaims', { + enumerable: true, + get: function get() { + return _claims3.makeSelectFetchingChannelClaims; + } +}); +Object.defineProperty(exports, 'makeSelectClaimsInChannelForCurrentPage', { + enumerable: true, + get: function get() { + return _claims3.makeSelectClaimsInChannelForCurrentPage; + } +}); +Object.defineProperty(exports, 'makeSelectMetadataForUri', { + enumerable: true, + get: function get() { + return _claims3.makeSelectMetadataForUri; + } +}); +Object.defineProperty(exports, 'makeSelectTitleForUri', { + enumerable: true, + get: function get() { + return _claims3.makeSelectTitleForUri; + } +}); +Object.defineProperty(exports, 'makeSelectContentTypeForUri', { + enumerable: true, + get: function get() { + return _claims3.makeSelectContentTypeForUri; + } +}); +Object.defineProperty(exports, 'makeSelectIsUriResolving', { + enumerable: true, + get: function get() { + return _claims3.makeSelectIsUriResolving; + } +}); +Object.defineProperty(exports, 'selectClaimsById', { + enumerable: true, + get: function get() { + return _claims3.selectClaimsById; + } +}); +Object.defineProperty(exports, 'selectClaimsByUri', { + enumerable: true, + get: function get() { + return _claims3.selectClaimsByUri; + } +}); +Object.defineProperty(exports, 'selectAllClaimsByChannel', { + enumerable: true, + get: function get() { + return _claims3.selectAllClaimsByChannel; + } +}); +Object.defineProperty(exports, 'selectMyClaimsRaw', { + enumerable: true, + get: function get() { + return _claims3.selectMyClaimsRaw; + } +}); +Object.defineProperty(exports, 'selectAbandoningIds', { + enumerable: true, + get: function get() { + return _claims3.selectAbandoningIds; + } +}); +Object.defineProperty(exports, 'selectMyActiveClaims', { + enumerable: true, + get: function get() { + return _claims3.selectMyActiveClaims; + } +}); +Object.defineProperty(exports, 'selectAllFetchingChannelClaims', { + enumerable: true, + get: function get() { + return _claims3.selectAllFetchingChannelClaims; + } +}); +Object.defineProperty(exports, 'selectIsFetchingClaimListMine', { + enumerable: true, + get: function get() { + return _claims3.selectIsFetchingClaimListMine; + } +}); +Object.defineProperty(exports, 'selectPendingClaims', { + enumerable: true, + get: function get() { + return _claims3.selectPendingClaims; + } +}); +Object.defineProperty(exports, 'selectMyClaims', { + enumerable: true, + get: function get() { + return _claims3.selectMyClaims; + } +}); +Object.defineProperty(exports, 'selectMyClaimsWithoutChannels', { + enumerable: true, + get: function get() { + return _claims3.selectMyClaimsWithoutChannels; + } +}); +Object.defineProperty(exports, 'selectAllMyClaimsByOutpoint', { + enumerable: true, + get: function get() { + return _claims3.selectAllMyClaimsByOutpoint; + } +}); +Object.defineProperty(exports, 'selectMyClaimsOutpoints', { + enumerable: true, + get: function get() { + return _claims3.selectMyClaimsOutpoints; + } +}); +Object.defineProperty(exports, 'selectFetchingMyChannels', { + enumerable: true, + get: function get() { + return _claims3.selectFetchingMyChannels; + } +}); +Object.defineProperty(exports, 'selectMyChannelClaims', { + enumerable: true, + get: function get() { + return _claims3.selectMyChannelClaims; + } +}); +Object.defineProperty(exports, 'selectResolvingUris', { + enumerable: true, + get: function get() { + return _claims3.selectResolvingUris; + } +}); + +var _cost_info3 = __webpack_require__(26); + +Object.defineProperty(exports, 'makeSelectFetchingCostInfoForUri', { + enumerable: true, + get: function get() { + return _cost_info3.makeSelectFetchingCostInfoForUri; + } +}); +Object.defineProperty(exports, 'makeSelectCostInfoForUri', { + enumerable: true, + get: function get() { + return _cost_info3.makeSelectCostInfoForUri; + } +}); +Object.defineProperty(exports, 'selectAllCostInfoByUri', { + enumerable: true, + get: function get() { + return _cost_info3.selectAllCostInfoByUri; + } +}); +Object.defineProperty(exports, 'selectCostForCurrentPageUri', { + enumerable: true, + get: function get() { + return _cost_info3.selectCostForCurrentPageUri; + } +}); +Object.defineProperty(exports, 'selectFetchingCostInfo', { + enumerable: true, + get: function get() { + return _cost_info3.selectFetchingCostInfo; + } +}); + +var _file_info3 = __webpack_require__(9); + +Object.defineProperty(exports, 'selectFileInfosByOutpoint', { + enumerable: true, + get: function get() { + return _file_info3.selectFileInfosByOutpoint; + } +}); +Object.defineProperty(exports, 'selectIsFetchingFileList', { + enumerable: true, + get: function get() { + return _file_info3.selectIsFetchingFileList; + } +}); +Object.defineProperty(exports, 'selectIsFetchingFileListDownloadedOrPublished', { + enumerable: true, + get: function get() { + return _file_info3.selectIsFetchingFileListDownloadedOrPublished; + } +}); +Object.defineProperty(exports, 'makeSelectFileInfoForUri', { + enumerable: true, + get: function get() { + return _file_info3.makeSelectFileInfoForUri; + } +}); +Object.defineProperty(exports, 'selectDownloadingByOutpoint', { + enumerable: true, + get: function get() { + return _file_info3.selectDownloadingByOutpoint; + } +}); +Object.defineProperty(exports, 'makeSelectDownloadingForUri', { + enumerable: true, + get: function get() { + return _file_info3.makeSelectDownloadingForUri; + } +}); +Object.defineProperty(exports, 'selectUrisLoading', { + enumerable: true, + get: function get() { + return _file_info3.selectUrisLoading; + } +}); +Object.defineProperty(exports, 'makeSelectLoadingForUri', { + enumerable: true, + get: function get() { + return _file_info3.makeSelectLoadingForUri; + } +}); +Object.defineProperty(exports, 'selectFileInfosDownloaded', { + enumerable: true, + get: function get() { + return _file_info3.selectFileInfosDownloaded; + } +}); +Object.defineProperty(exports, 'selectDownloadingFileInfos', { + enumerable: true, + get: function get() { + return _file_info3.selectDownloadingFileInfos; + } +}); +Object.defineProperty(exports, 'selectTotalDownloadProgress', { + enumerable: true, + get: function get() { + return _file_info3.selectTotalDownloadProgress; + } +}); + +var _search3 = __webpack_require__(27); + +Object.defineProperty(exports, 'makeSelectSearchUris', { + enumerable: true, + get: function get() { + return _search3.makeSelectSearchUris; + } +}); +Object.defineProperty(exports, 'selectSearchQuery', { + enumerable: true, + get: function get() { + return _search3.selectSearchQuery; + } +}); +Object.defineProperty(exports, 'selectIsSearching', { + enumerable: true, + get: function get() { + return _search3.selectIsSearching; + } +}); +Object.defineProperty(exports, 'selectSearchUrisByQuery', { + enumerable: true, + get: function get() { + return _search3.selectSearchUrisByQuery; + } +}); +Object.defineProperty(exports, 'selectWunderBarAddress', { + enumerable: true, + get: function get() { + return _search3.selectWunderBarAddress; + } +}); +Object.defineProperty(exports, 'selectWunderBarIcon', { + enumerable: true, + get: function get() { + return _search3.selectWunderBarIcon; + } +}); + +var _lbry = __webpack_require__(5); + +var _lbry2 = _interopRequireDefault(_lbry); + +var _lbryapi = __webpack_require__(8); + +var _lbryapi2 = _interopRequireDefault(_lbryapi); + +var _lbryuri = __webpack_require__(1); + +var _lbryuri2 = _interopRequireDefault(_lbryuri); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.Lbry = _lbry2.default; +exports.LbryApi = _lbryapi2.default; +exports.Lbryuri = _lbryuri2.default; + +// actions +// common + +/***/ }), +/* 11 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -492,117 +2233,67 @@ jsonrpc.call = function (connectionString, method, params, callback, errorCallba exports.default = jsonrpc; /***/ }), -/* 3 */ +/* 12 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -/* WEBPACK VAR INJECTION */(function(process) { + Object.defineProperty(exports, "__esModule", { value: true }); +exports.doFetchCostInfoForUri = doFetchCostInfoForUri; -var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; +var _action_types = __webpack_require__(0); -var _lbry = __webpack_require__(0); +var ACTIONS = _interopRequireWildcard(_action_types); -var _lbry2 = _interopRequireDefault(_lbry); +var _lbryapi = __webpack_require__(8); -var _querystring = __webpack_require__(5); +var _lbryapi2 = _interopRequireDefault(_lbryapi); -var _querystring2 = _interopRequireDefault(_querystring); +var _claims = __webpack_require__(2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -var LbryApi = { - exchangePromise: null, - exchangeLastFetched: null -}; +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } -var CONNECTION_STRING = process.env.LBRY_APP_API_URL ? process.env.LBRY_APP_API_URL.replace(/\/*$/, '/') // exactly one slash at the end -: 'https://api.lbry.io/'; +// eslint-disable-next-line import/prefer-default-export +function doFetchCostInfoForUri(uri) { + return function (dispatch, getState) { + var state = getState(); + var claim = (0, _claims.selectClaimsByUri)(state)[uri]; -var EXCHANGE_RATE_TIMEOUT = 20 * 60 * 1000; + if (!claim) return; -LbryApi.getExchangeRates = function () { - if (!LbryApi.exchangeLastFetched || Date.now() - LbryApi.exchangeLastFetched > EXCHANGE_RATE_TIMEOUT) { - LbryApi.exchangePromise = new Promise(function (resolve, reject) { - LbryApi.call('lbc', 'exchange_rate', {}, 'get', true).then(function (_ref) { - var LBC_USD = _ref.lbc_usd, - LBC_BTC = _ref.lbc_btc, - BTC_USD = _ref.btc_usd; - - var rates = { LBC_USD: LBC_USD, LBC_BTC: LBC_BTC, BTC_USD: BTC_USD }; - resolve(rates); - }).catch(reject); - }); - LbryApi.exchangeLastFetched = Date.now(); - } - return LbryApi.exchangePromise; -}; - -LbryApi.call = function (resource, action) { - var params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; - var method = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'get'; - - if (!Lbryio.enabled) { - console.log(__('Internal API disabled')); - return Promise.reject(new Error(__('LBRY internal API is disabled'))); - } - - if (!(method === 'get' || method === 'post')) { - return Promise.reject(new Error(__('Invalid method'))); - } - - function checkAndParse(response) { - if (response.status >= 200 && response.status < 300) { - return response.json(); + function resolve(costInfo) { + dispatch({ + type: ACTIONS.FETCH_COST_INFO_COMPLETED, + data: { + uri: uri, + costInfo: costInfo + } + }); } - return response.json().then(function (json) { - var error = void 0; - if (json.error) { - error = new Error(json.error); - } else { - error = new Error('Unknown API error signature'); - } - error.response = response; // This is primarily a hack used in actions/user.js - return Promise.reject(error); - }); - } - function makeRequest(url, options) { - return fetch(url, options).then(checkAndParse); - } + var fee = claim.value && claim.value.stream && claim.value.stream.metadata ? claim.value.stream.metadata.fee : undefined; - var fullParams = _extends({}, params); - var qs = _querystring2.default.stringify(fullParams); - var url = '' + CONNECTION_STRING + resource + '/' + action + '?' + qs; + if (fee === undefined) { + resolve({ cost: 0, includesData: true }); + } else if (fee.currency === 'LBC') { + resolve({ cost: fee.amount, includesData: true }); + } else { + _lbryapi2.default.getExchangeRates().then(function (_ref) { + var LBC_USD = _ref.LBC_USD; - var options = { - method: 'GET' + resolve({ cost: fee.amount / LBC_USD, includesData: true }); + }); + } }; - - if (method === 'post') { - options = { - method: 'POST', - headers: { - 'Content-Type': 'application/x-www-form-urlencoded' - }, - body: qs - }; - url = '' + CONNECTION_STRING + resource + '/' + action; - } - - return makeRequest(url, options).then(function (response) { - return response.data; - }); -}; - -exports.default = LbryApi; -/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4))) +} /***/ }), -/* 4 */ +/* 13 */ /***/ (function(module, exports) { // shim for using process in browser @@ -792,18 +2483,18 @@ process.umask = function() { return 0; }; /***/ }), -/* 5 */ +/* 14 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -exports.decode = exports.parse = __webpack_require__(6); -exports.encode = exports.stringify = __webpack_require__(7); +exports.decode = exports.parse = __webpack_require__(15); +exports.encode = exports.stringify = __webpack_require__(16); /***/ }), -/* 6 */ +/* 15 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -894,7 +2585,7 @@ var isArray = Array.isArray || function (xs) { /***/ }), -/* 7 */ +/* 16 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -986,7 +2677,7 @@ var objectKeys = Object.keys || function (obj) { /***/ }), -/* 8 */ +/* 17 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -995,9 +2686,542 @@ var objectKeys = Object.keys || function (obj) { Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = reducer; +exports.doFetchFileInfo = doFetchFileInfo; +exports.doFileList = doFileList; +exports.doFetchFileInfosAndPublishedClaims = doFetchFileInfosAndPublishedClaims; -var _action_types = __webpack_require__(9); +var _action_types = __webpack_require__(0); + +var ACTIONS = _interopRequireWildcard(_action_types); + +var _lbry = __webpack_require__(5); + +var _lbry2 = _interopRequireDefault(_lbry); + +var _claims = __webpack_require__(6); + +var _claims2 = __webpack_require__(2); + +var _file_info = __webpack_require__(9); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function doFetchFileInfo(uri) { + return function (dispatch, getState) { + var state = getState(); + var claim = (0, _claims2.selectClaimsByUri)(state)[uri]; + var outpoint = claim ? claim.txid + ':' + claim.nout : null; + var alreadyFetching = !!(0, _file_info.selectUrisLoading)(state)[uri]; + + if (!alreadyFetching) { + dispatch({ + type: ACTIONS.FETCH_FILE_INFO_STARTED, + data: { + outpoint: outpoint + } + }); + + _lbry2.default.file_list({ outpoint: outpoint, full_status: true }).then(function (fileInfos) { + dispatch({ + type: ACTIONS.FETCH_FILE_INFO_COMPLETED, + data: { + outpoint: outpoint, + fileInfo: fileInfos && fileInfos.length ? fileInfos[0] : null + } + }); + }); + } + }; +} + +function doFileList() { + return function (dispatch, getState) { + var state = getState(); + var isFetching = (0, _file_info.selectIsFetchingFileList)(state); + + if (!isFetching) { + dispatch({ + type: ACTIONS.FILE_LIST_STARTED + }); + + _lbry2.default.file_list().then(function (fileInfos) { + dispatch({ + type: ACTIONS.FILE_LIST_SUCCEEDED, + data: { + fileInfos: fileInfos + } + }); + }); + } + }; +} + +function doFetchFileInfosAndPublishedClaims() { + return function (dispatch, getState) { + var state = getState(); + var isFetchingClaimListMine = (0, _claims2.selectIsFetchingClaimListMine)(state); + var isFetchingFileInfo = (0, _file_info.selectIsFetchingFileList)(state); + + if (!isFetchingClaimListMine) dispatch((0, _claims.doFetchClaimListMine)()); + if (!isFetchingFileInfo) dispatch(doFileList()); + }; +} + +/***/ }), +/* 18 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.doSearch = doSearch; + +var _action_types = __webpack_require__(0); + +var ACTIONS = _interopRequireWildcard(_action_types); + +var _lbryuri = __webpack_require__(1); + +var _lbryuri2 = _interopRequireDefault(_lbryuri); + +var _claims = __webpack_require__(6); + +var _navigation = __webpack_require__(19); + +var _navigation2 = __webpack_require__(3); + +var _batchActions = __webpack_require__(20); + +var _batchActions2 = _interopRequireDefault(_batchActions); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +// eslint-disable-next-line import/prefer-default-export +function doSearch(rawQuery) { + return function (dispatch, getState) { + var state = getState(); + var page = (0, _navigation2.selectCurrentPage)(state); + + var query = rawQuery.replace(/^lbry:\/\//i, ''); + + if (!query) { + dispatch({ + type: ACTIONS.SEARCH_CANCELLED + }); + return; + } + + dispatch({ + type: ACTIONS.SEARCH_STARTED, + data: { query: query } + }); + + if (page !== 'search') { + dispatch((0, _navigation.doNavigate)('search', { query: query })); + } else { + fetch('https://lighthouse.lbry.io/search?s=' + query).then(function (response) { + return response.status === 200 ? Promise.resolve(response.json()) : Promise.reject(new Error(response.statusText)); + }).then(function (data) { + var uris = []; + var actions = []; + + data.forEach(function (result) { + var uri = _lbryuri2.default.build({ + name: result.name, + claimId: result.claimId + }); + actions.push((0, _claims.doResolveUri)(uri)); + uris.push(uri); + }); + + actions.push({ + type: ACTIONS.SEARCH_COMPLETED, + data: { + query: query, + uris: uris + } + }); + dispatch(_batchActions2.default.apply(undefined, actions)); + }).catch(function () { + dispatch({ + type: ACTIONS.SEARCH_CANCELLED + }); + }); + } + }; +} + +/***/ }), +/* 19 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.doNavigate = doNavigate; +exports.doAuthNavigate = doAuthNavigate; +exports.doHistoryTraverse = doHistoryTraverse; +exports.doHistoryBack = doHistoryBack; +exports.doHistoryForward = doHistoryForward; +exports.doRecordScroll = doRecordScroll; + +var _action_types = __webpack_require__(0); + +var ACTIONS = _interopRequireWildcard(_action_types); + +var _navigation = __webpack_require__(3); + +var _query_params = __webpack_require__(7); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function doNavigate(path) { + var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + + return function (dispatch) { + if (!path) { + return; + } + + var url = path; + if (params && Object.values(params).length) { + url += '?' + (0, _query_params.toQueryString)(params); + } + + var scrollY = options.scrollY; + + + dispatch({ + type: ACTIONS.HISTORY_NAVIGATE, + data: { url: url, index: options.index, scrollY: scrollY } + }); + }; +} + +function doAuthNavigate() { + var pathAfterAuth = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + return function (dispatch) { + if (pathAfterAuth) { + dispatch({ + type: ACTIONS.CHANGE_AFTER_AUTH_PATH, + data: { + path: pathAfterAuth + '?' + (0, _query_params.toQueryString)(params) + } + }); + } + dispatch(doNavigate('/auth')); + }; +} + +function doHistoryTraverse(dispatch, state, modifier) { + var stack = (0, _navigation.selectHistoryStack)(state); + var index = (0, _navigation.selectHistoryIndex)(state) + modifier; + + if (index >= 0 && index < stack.length) { + var historyItem = stack[index]; + dispatch(doNavigate(historyItem.path, {}, { scrollY: historyItem.scrollY, index: index })); + } +} + +function doHistoryBack() { + return function (dispatch, getState) { + return doHistoryTraverse(dispatch, getState(), -1); + }; +} + +function doHistoryForward() { + return function (dispatch, getState) { + return doHistoryTraverse(dispatch, getState(), 1); + }; +} + +function doRecordScroll(scroll) { + return function (dispatch) { + dispatch({ + type: ACTIONS.WINDOW_SCROLLED, + data: { scrollY: scroll } + }); + }; +} + +/***/ }), +/* 20 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +// https://github.com/reactjs/redux/issues/911 +function batchActions() { + for (var _len = arguments.length, actions = Array(_len), _key = 0; _key < _len; _key++) { + actions[_key] = arguments[_key]; + } + + return { + type: 'BATCH_ACTIONS', + actions: actions + }; +} + +exports.default = batchActions; + +/***/ }), +/* 21 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); + +exports.claimsReducer = claimsReducer; + +var _action_types = __webpack_require__(0); + +var ACTIONS = _interopRequireWildcard(_action_types); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +var reducers = {}; + +var defaultState = {}; + +reducers[ACTIONS.RESOLVE_URIS_COMPLETED] = function (state, action) { + var resolveInfo = action.data.resolveInfo; + + var byUri = Object.assign({}, state.claimsByUri); + var byId = Object.assign({}, state.byId); + + Object.entries(resolveInfo).forEach(function (_ref) { + var _ref2 = _slicedToArray(_ref, 2), + uri = _ref2[0], + _ref2$ = _ref2[1], + certificate = _ref2$.certificate, + claim = _ref2$.claim; + + if (claim) { + byId[claim.claim_id] = claim; + byUri[uri] = claim.claim_id; + } else if (claim === undefined && certificate !== undefined) { + byId[certificate.claim_id] = certificate; + // Don't point URI at the channel certificate unless it actually is + // a channel URI. This is brittle. + if (!uri.split(certificate.name)[1].match(/\//)) { + byUri[uri] = certificate.claim_id; + } else { + byUri[uri] = null; + } + } else { + byUri[uri] = null; + } + }); + + return Object.assign({}, state, { + byId: byId, + claimsByUri: byUri + }); +}; + +reducers[ACTIONS.FETCH_CLAIM_LIST_MINE_STARTED] = function (state) { + return Object.assign({}, state, { + isFetchingClaimListMine: true + }); +}; + +reducers[ACTIONS.FETCH_CLAIM_LIST_MINE_COMPLETED] = function (state, action) { + var claims = action.data.claims; + + var byId = Object.assign({}, state.byId); + var pendingById = Object.assign({}, state.pendingById); + + claims.filter(function (claim) { + return claim.category && claim.category.match(/claim/); + }).forEach(function (claim) { + byId[claim.claim_id] = claim; + + var pending = Object.values(pendingById).find(function (pendingClaim) { + return pendingClaim.name === claim.name && pendingClaim.channel_name === claim.channel_name; + }); + + if (pending) { + delete pendingById[pending.claim_id]; + } + }); + + // Remove old timed out pending publishes + Object.values(pendingById).filter(function (pendingClaim) { + return Date.now() - pendingClaim.time >= 20 * 60 * 1000; + }).forEach(function (pendingClaim) { + delete pendingById[pendingClaim.claim_id]; + }); + + return Object.assign({}, state, { + isFetchingClaimListMine: false, + myClaims: claims, + byId: byId, + pendingById: pendingById + }); +}; + +reducers[ACTIONS.FETCH_CHANNEL_LIST_MINE_STARTED] = function (state) { + return Object.assign({}, state, { fetchingMyChannels: true }); +}; + +reducers[ACTIONS.FETCH_CHANNEL_LIST_MINE_COMPLETED] = function (state, action) { + var claims = action.data.claims; + + var myChannelClaims = new Set(state.myChannelClaims); + var byId = Object.assign({}, state.byId); + + claims.forEach(function (claim) { + myChannelClaims.add(claim.claim_id); + byId[claims.claim_id] = claim; + }); + + return Object.assign({}, state, { + byId: byId, + fetchingMyChannels: false, + myChannelClaims: myChannelClaims + }); +}; + +reducers[ACTIONS.FETCH_CHANNEL_CLAIMS_STARTED] = function (state, action) { + var _action$data = action.data, + uri = _action$data.uri, + page = _action$data.page; + + var fetchingChannelClaims = Object.assign({}, state.fetchingChannelClaims); + + fetchingChannelClaims[uri] = page; + + return Object.assign({}, state, { + fetchingChannelClaims: fetchingChannelClaims + }); +}; + +reducers[ACTIONS.FETCH_CHANNEL_CLAIMS_COMPLETED] = function (state, action) { + var _action$data2 = action.data, + uri = _action$data2.uri, + claims = _action$data2.claims, + page = _action$data2.page; + + + var claimsByChannel = Object.assign({}, state.claimsByChannel); + var byChannel = Object.assign({}, claimsByChannel[uri]); + var allClaimIds = new Set(byChannel.all); + var currentPageClaimIds = []; + var byId = Object.assign({}, state.byId); + var fetchingChannelClaims = Object.assign({}, state.fetchingChannelClaims); + + if (claims !== undefined) { + claims.forEach(function (claim) { + allClaimIds.add(claim.claim_id); + currentPageClaimIds.push(claim.claim_id); + byId[claim.claim_id] = claim; + }); + } + + byChannel.all = allClaimIds; + byChannel[page] = currentPageClaimIds; + claimsByChannel[uri] = byChannel; + delete fetchingChannelClaims[uri]; + + return Object.assign({}, state, { + claimsByChannel: claimsByChannel, + byId: byId, + fetchingChannelClaims: fetchingChannelClaims + }); +}; + +reducers[ACTIONS.ABANDON_CLAIM_STARTED] = function (state, action) { + var claimId = action.data.claimId; + + var abandoningById = Object.assign({}, state.abandoningById); + + abandoningById[claimId] = true; + + return Object.assign({}, state, { + abandoningById: abandoningById + }); +}; + +reducers[ACTIONS.ABANDON_CLAIM_SUCCEEDED] = function (state, action) { + var claimId = action.data.claimId; + + var byId = Object.assign({}, state.byId); + var claimsByUri = Object.assign({}, state.claimsByUri); + + Object.keys(claimsByUri).forEach(function (uri) { + if (claimsByUri[uri] === claimId) { + delete claimsByUri[uri]; + } + }); + + delete byId[claimId]; + + return Object.assign({}, state, { + byId: byId, + claimsByUri: claimsByUri + }); +}; + +reducers[ACTIONS.CREATE_CHANNEL_COMPLETED] = function (state, action) { + var channelClaim = action.data.channelClaim; + + var byId = Object.assign({}, state.byId); + var myChannelClaims = new Set(state.myChannelClaims); + + byId[channelClaim.claim_id] = channelClaim; + myChannelClaims.add(channelClaim.claim_id); + + return Object.assign({}, state, { + byId: byId, + myChannelClaims: myChannelClaims + }); +}; + +function claimsReducer() { + var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultState; + var action = arguments[1]; + + var handler = reducers[action.type]; + if (handler) return handler(state, action); + return state; +} + +/***/ }), +/* 22 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.costInfoReducer = costInfoReducer; + +var _action_types = __webpack_require__(0); var ACTIONS = _interopRequireWildcard(_action_types); @@ -1034,7 +3258,7 @@ reducers[ACTIONS.FETCH_COST_INFO_COMPLETED] = function (state, action) { }); }; -function reducer() { +function costInfoReducer() { var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultState; var action = arguments[1]; @@ -1044,7 +3268,7 @@ function reducer() { } /***/ }), -/* 9 */ +/* 23 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1053,170 +3277,568 @@ function reducer() { Object.defineProperty(exports, "__esModule", { value: true }); -var OPEN_MODAL = exports.OPEN_MODAL = 'OPEN_MODAL'; -var CLOSE_MODAL = exports.CLOSE_MODAL = 'CLOSE_MODAL'; -var SHOW_SNACKBAR = exports.SHOW_SNACKBAR = 'SHOW_SNACKBAR'; -var REMOVE_SNACKBAR_SNACK = exports.REMOVE_SNACKBAR_SNACK = 'REMOVE_SNACKBAR_SNACK'; -var WINDOW_FOCUSED = exports.WINDOW_FOCUSED = 'WINDOW_FOCUSED'; -var DAEMON_READY = exports.DAEMON_READY = 'DAEMON_READY'; -var DAEMON_VERSION_MATCH = exports.DAEMON_VERSION_MATCH = 'DAEMON_VERSION_MATCH'; -var DAEMON_VERSION_MISMATCH = exports.DAEMON_VERSION_MISMATCH = 'DAEMON_VERSION_MISMATCH'; -var VOLUME_CHANGED = exports.VOLUME_CHANGED = 'VOLUME_CHANGED'; +exports.fileInfoReducer = fileInfoReducer; -// Navigation -var CHANGE_AFTER_AUTH_PATH = exports.CHANGE_AFTER_AUTH_PATH = 'CHANGE_AFTER_AUTH_PATH'; -var WINDOW_SCROLLED = exports.WINDOW_SCROLLED = 'WINDOW_SCROLLED'; -var HISTORY_NAVIGATE = exports.HISTORY_NAVIGATE = 'HISTORY_NAVIGATE'; +var _action_types = __webpack_require__(0); -// Upgrades -var UPGRADE_CANCELLED = exports.UPGRADE_CANCELLED = 'UPGRADE_CANCELLED'; -var DOWNLOAD_UPGRADE = exports.DOWNLOAD_UPGRADE = 'DOWNLOAD_UPGRADE'; -var UPGRADE_DOWNLOAD_STARTED = exports.UPGRADE_DOWNLOAD_STARTED = 'UPGRADE_DOWNLOAD_STARTED'; -var UPGRADE_DOWNLOAD_COMPLETED = exports.UPGRADE_DOWNLOAD_COMPLETED = 'UPGRADE_DOWNLOAD_COMPLETED'; -var UPGRADE_DOWNLOAD_PROGRESSED = exports.UPGRADE_DOWNLOAD_PROGRESSED = 'UPGRADE_DOWNLOAD_PROGRESSED'; -var CHECK_UPGRADE_AVAILABLE = exports.CHECK_UPGRADE_AVAILABLE = 'CHECK_UPGRADE_AVAILABLE'; -var CHECK_UPGRADE_START = exports.CHECK_UPGRADE_START = 'CHECK_UPGRADE_START'; -var CHECK_UPGRADE_SUCCESS = exports.CHECK_UPGRADE_SUCCESS = 'CHECK_UPGRADE_SUCCESS'; -var CHECK_UPGRADE_FAIL = exports.CHECK_UPGRADE_FAIL = 'CHECK_UPGRADE_FAIL'; -var CHECK_UPGRADE_SUBSCRIBE = exports.CHECK_UPGRADE_SUBSCRIBE = 'CHECK_UPGRADE_SUBSCRIBE'; -var UPDATE_VERSION = exports.UPDATE_VERSION = 'UPDATE_VERSION'; -var UPDATE_REMOTE_VERSION = exports.UPDATE_REMOTE_VERSION = 'UPDATE_REMOTE_VERSION'; -var SKIP_UPGRADE = exports.SKIP_UPGRADE = 'SKIP_UPGRADE'; -var START_UPGRADE = exports.START_UPGRADE = 'START_UPGRADE'; +var ACTIONS = _interopRequireWildcard(_action_types); -// Wallet -var GET_NEW_ADDRESS_STARTED = exports.GET_NEW_ADDRESS_STARTED = 'GET_NEW_ADDRESS_STARTED'; -var GET_NEW_ADDRESS_COMPLETED = exports.GET_NEW_ADDRESS_COMPLETED = 'GET_NEW_ADDRESS_COMPLETED'; -var FETCH_TRANSACTIONS_STARTED = exports.FETCH_TRANSACTIONS_STARTED = 'FETCH_TRANSACTIONS_STARTED'; -var FETCH_TRANSACTIONS_COMPLETED = exports.FETCH_TRANSACTIONS_COMPLETED = 'FETCH_TRANSACTIONS_COMPLETED'; -var UPDATE_BALANCE = exports.UPDATE_BALANCE = 'UPDATE_BALANCE'; -var CHECK_ADDRESS_IS_MINE_STARTED = exports.CHECK_ADDRESS_IS_MINE_STARTED = 'CHECK_ADDRESS_IS_MINE_STARTED'; -var CHECK_ADDRESS_IS_MINE_COMPLETED = exports.CHECK_ADDRESS_IS_MINE_COMPLETED = 'CHECK_ADDRESS_IS_MINE_COMPLETED'; -var SET_DRAFT_TRANSACTION_AMOUNT = exports.SET_DRAFT_TRANSACTION_AMOUNT = 'SET_DRAFT_TRANSACTION_AMOUNT'; -var SET_DRAFT_TRANSACTION_ADDRESS = exports.SET_DRAFT_TRANSACTION_ADDRESS = 'SET_DRAFT_TRANSACTION_ADDRESS'; -var SEND_TRANSACTION_STARTED = exports.SEND_TRANSACTION_STARTED = 'SEND_TRANSACTION_STARTED'; -var SEND_TRANSACTION_COMPLETED = exports.SEND_TRANSACTION_COMPLETED = 'SEND_TRANSACTION_COMPLETED'; -var SEND_TRANSACTION_FAILED = exports.SEND_TRANSACTION_FAILED = 'SEND_TRANSACTION_FAILED'; -var FETCH_BLOCK_SUCCESS = exports.FETCH_BLOCK_SUCCESS = 'FETCH_BLOCK_SUCCESS'; -var SUPPORT_TRANSACTION_STARTED = exports.SUPPORT_TRANSACTION_STARTED = 'SUPPORT_TRANSACTION_STARTED'; -var SUPPORT_TRANSACTION_COMPLETED = exports.SUPPORT_TRANSACTION_COMPLETED = 'SUPPORT_TRANSACTION_COMPLETED'; -var SUPPORT_TRANSACTION_FAILED = exports.SUPPORT_TRANSACTION_FAILED = 'SUPPORT_TRANSACTION_FAILED'; +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } -// Claims -var FETCH_FEATURED_CONTENT_STARTED = exports.FETCH_FEATURED_CONTENT_STARTED = 'FETCH_FEATURED_CONTENT_STARTED'; -var FETCH_FEATURED_CONTENT_COMPLETED = exports.FETCH_FEATURED_CONTENT_COMPLETED = 'FETCH_FEATURED_CONTENT_COMPLETED'; -var RESOLVE_URIS_STARTED = exports.RESOLVE_URIS_STARTED = 'RESOLVE_URIS_STARTED'; -var RESOLVE_URIS_COMPLETED = exports.RESOLVE_URIS_COMPLETED = 'RESOLVE_URIS_COMPLETED'; -var FETCH_CHANNEL_CLAIMS_STARTED = exports.FETCH_CHANNEL_CLAIMS_STARTED = 'FETCH_CHANNEL_CLAIMS_STARTED'; -var FETCH_CHANNEL_CLAIMS_COMPLETED = exports.FETCH_CHANNEL_CLAIMS_COMPLETED = 'FETCH_CHANNEL_CLAIMS_COMPLETED'; -var FETCH_CHANNEL_CLAIM_COUNT_STARTED = exports.FETCH_CHANNEL_CLAIM_COUNT_STARTED = 'FETCH_CHANNEL_CLAIM_COUNT_STARTED'; -var FETCH_CHANNEL_CLAIM_COUNT_COMPLETED = exports.FETCH_CHANNEL_CLAIM_COUNT_COMPLETED = 'FETCH_CHANNEL_CLAIM_COUNT_COMPLETED'; -var FETCH_CLAIM_LIST_MINE_STARTED = exports.FETCH_CLAIM_LIST_MINE_STARTED = 'FETCH_CLAIM_LIST_MINE_STARTED'; -var FETCH_CLAIM_LIST_MINE_COMPLETED = exports.FETCH_CLAIM_LIST_MINE_COMPLETED = 'FETCH_CLAIM_LIST_MINE_COMPLETED'; -var ABANDON_CLAIM_STARTED = exports.ABANDON_CLAIM_STARTED = 'ABANDON_CLAIM_STARTED'; -var ABANDON_CLAIM_SUCCEEDED = exports.ABANDON_CLAIM_SUCCEEDED = 'ABANDON_CLAIM_SUCCEEDED'; -var FETCH_CHANNEL_LIST_MINE_STARTED = exports.FETCH_CHANNEL_LIST_MINE_STARTED = 'FETCH_CHANNEL_LIST_MINE_STARTED'; -var FETCH_CHANNEL_LIST_MINE_COMPLETED = exports.FETCH_CHANNEL_LIST_MINE_COMPLETED = 'FETCH_CHANNEL_LIST_MINE_COMPLETED'; -var CREATE_CHANNEL_STARTED = exports.CREATE_CHANNEL_STARTED = 'CREATE_CHANNEL_STARTED'; -var CREATE_CHANNEL_COMPLETED = exports.CREATE_CHANNEL_COMPLETED = 'CREATE_CHANNEL_COMPLETED'; -var PUBLISH_STARTED = exports.PUBLISH_STARTED = 'PUBLISH_STARTED'; -var PUBLISH_COMPLETED = exports.PUBLISH_COMPLETED = 'PUBLISH_COMPLETED'; -var PUBLISH_FAILED = exports.PUBLISH_FAILED = 'PUBLISH_FAILED'; -var SET_PLAYING_URI = exports.SET_PLAYING_URI = 'PLAY_URI'; +var reducers = {}; +var defaultState = {}; -// Files -var FILE_LIST_STARTED = exports.FILE_LIST_STARTED = 'FILE_LIST_STARTED'; -var FILE_LIST_SUCCEEDED = exports.FILE_LIST_SUCCEEDED = 'FILE_LIST_SUCCEEDED'; -var FETCH_FILE_INFO_STARTED = exports.FETCH_FILE_INFO_STARTED = 'FETCH_FILE_INFO_STARTED'; -var FETCH_FILE_INFO_COMPLETED = exports.FETCH_FILE_INFO_COMPLETED = 'FETCH_FILE_INFO_COMPLETED'; -var FETCH_COST_INFO_STARTED = exports.FETCH_COST_INFO_STARTED = 'FETCH_COST_INFO_STARTED'; -var FETCH_COST_INFO_COMPLETED = exports.FETCH_COST_INFO_COMPLETED = 'FETCH_COST_INFO_COMPLETED'; -var LOADING_VIDEO_STARTED = exports.LOADING_VIDEO_STARTED = 'LOADING_VIDEO_STARTED'; -var LOADING_VIDEO_COMPLETED = exports.LOADING_VIDEO_COMPLETED = 'LOADING_VIDEO_COMPLETED'; -var LOADING_VIDEO_FAILED = exports.LOADING_VIDEO_FAILED = 'LOADING_VIDEO_FAILED'; -var DOWNLOADING_STARTED = exports.DOWNLOADING_STARTED = 'DOWNLOADING_STARTED'; -var DOWNLOADING_PROGRESSED = exports.DOWNLOADING_PROGRESSED = 'DOWNLOADING_PROGRESSED'; -var DOWNLOADING_COMPLETED = exports.DOWNLOADING_COMPLETED = 'DOWNLOADING_COMPLETED'; -var PLAY_VIDEO_STARTED = exports.PLAY_VIDEO_STARTED = 'PLAY_VIDEO_STARTED'; -var FETCH_AVAILABILITY_STARTED = exports.FETCH_AVAILABILITY_STARTED = 'FETCH_AVAILABILITY_STARTED'; -var FETCH_AVAILABILITY_COMPLETED = exports.FETCH_AVAILABILITY_COMPLETED = 'FETCH_AVAILABILITY_COMPLETED'; -var FILE_DELETE = exports.FILE_DELETE = 'FILE_DELETE'; +reducers[ACTIONS.FILE_LIST_STARTED] = function (state) { + return Object.assign({}, state, { + isFetchingFileList: true + }); +}; -// Search -var SEARCH_STARTED = exports.SEARCH_STARTED = 'SEARCH_STARTED'; -var SEARCH_COMPLETED = exports.SEARCH_COMPLETED = 'SEARCH_COMPLETED'; -var SEARCH_CANCELLED = exports.SEARCH_CANCELLED = 'SEARCH_CANCELLED'; +reducers[ACTIONS.FILE_LIST_SUCCEEDED] = function (state, action) { + var fileInfos = action.data.fileInfos; -// Settings -var DAEMON_SETTINGS_RECEIVED = exports.DAEMON_SETTINGS_RECEIVED = 'DAEMON_SETTINGS_RECEIVED'; -var CLIENT_SETTING_CHANGED = exports.CLIENT_SETTING_CHANGED = 'CLIENT_SETTING_CHANGED'; + var newByOutpoint = Object.assign({}, state.byOutpoint); + var pendingByOutpoint = Object.assign({}, state.pendingByOutpoint); -// User -var AUTHENTICATION_STARTED = exports.AUTHENTICATION_STARTED = 'AUTHENTICATION_STARTED'; -var AUTHENTICATION_SUCCESS = exports.AUTHENTICATION_SUCCESS = 'AUTHENTICATION_SUCCESS'; -var AUTHENTICATION_FAILURE = exports.AUTHENTICATION_FAILURE = 'AUTHENTICATION_FAILURE'; -var USER_EMAIL_DECLINE = exports.USER_EMAIL_DECLINE = 'USER_EMAIL_DECLINE'; -var USER_EMAIL_NEW_STARTED = exports.USER_EMAIL_NEW_STARTED = 'USER_EMAIL_NEW_STARTED'; -var USER_EMAIL_NEW_SUCCESS = exports.USER_EMAIL_NEW_SUCCESS = 'USER_EMAIL_NEW_SUCCESS'; -var USER_EMAIL_NEW_EXISTS = exports.USER_EMAIL_NEW_EXISTS = 'USER_EMAIL_NEW_EXISTS'; -var USER_EMAIL_NEW_FAILURE = exports.USER_EMAIL_NEW_FAILURE = 'USER_EMAIL_NEW_FAILURE'; -var USER_EMAIL_VERIFY_STARTED = exports.USER_EMAIL_VERIFY_STARTED = 'USER_EMAIL_VERIFY_STARTED'; -var USER_EMAIL_VERIFY_SUCCESS = exports.USER_EMAIL_VERIFY_SUCCESS = 'USER_EMAIL_VERIFY_SUCCESS'; -var USER_EMAIL_VERIFY_FAILURE = exports.USER_EMAIL_VERIFY_FAILURE = 'USER_EMAIL_VERIFY_FAILURE'; -var USER_IDENTITY_VERIFY_STARTED = exports.USER_IDENTITY_VERIFY_STARTED = 'USER_IDENTITY_VERIFY_STARTED'; -var USER_IDENTITY_VERIFY_SUCCESS = exports.USER_IDENTITY_VERIFY_SUCCESS = 'USER_IDENTITY_VERIFY_SUCCESS'; -var USER_IDENTITY_VERIFY_FAILURE = exports.USER_IDENTITY_VERIFY_FAILURE = 'USER_IDENTITY_VERIFY_FAILURE'; -var USER_FETCH_STARTED = exports.USER_FETCH_STARTED = 'USER_FETCH_STARTED'; -var USER_FETCH_SUCCESS = exports.USER_FETCH_SUCCESS = 'USER_FETCH_SUCCESS'; -var USER_FETCH_FAILURE = exports.USER_FETCH_FAILURE = 'USER_FETCH_FAILURE'; -var USER_INVITE_STATUS_FETCH_STARTED = exports.USER_INVITE_STATUS_FETCH_STARTED = 'USER_INVITE_STATUS_FETCH_STARTED'; -var USER_INVITE_STATUS_FETCH_SUCCESS = exports.USER_INVITE_STATUS_FETCH_SUCCESS = 'USER_INVITE_STATUS_FETCH_SUCCESS'; -var USER_INVITE_STATUS_FETCH_FAILURE = exports.USER_INVITE_STATUS_FETCH_FAILURE = 'USER_INVITE_STATUS_FETCH_FAILURE'; -var USER_INVITE_NEW_STARTED = exports.USER_INVITE_NEW_STARTED = 'USER_INVITE_NEW_STARTED'; -var USER_INVITE_NEW_SUCCESS = exports.USER_INVITE_NEW_SUCCESS = 'USER_INVITE_NEW_SUCCESS'; -var USER_INVITE_NEW_FAILURE = exports.USER_INVITE_NEW_FAILURE = 'USER_INVITE_NEW_FAILURE'; -var FETCH_ACCESS_TOKEN_SUCCESS = exports.FETCH_ACCESS_TOKEN_SUCCESS = 'FETCH_ACCESS_TOKEN_SUCCESS'; + fileInfos.forEach(function (fileInfo) { + var outpoint = fileInfo.outpoint; -// Rewards -var FETCH_REWARDS_STARTED = exports.FETCH_REWARDS_STARTED = 'FETCH_REWARDS_STARTED'; -var FETCH_REWARDS_COMPLETED = exports.FETCH_REWARDS_COMPLETED = 'FETCH_REWARDS_COMPLETED'; -var CLAIM_REWARD_STARTED = exports.CLAIM_REWARD_STARTED = 'CLAIM_REWARD_STARTED'; -var CLAIM_REWARD_SUCCESS = exports.CLAIM_REWARD_SUCCESS = 'CLAIM_REWARD_SUCCESS'; -var CLAIM_REWARD_FAILURE = exports.CLAIM_REWARD_FAILURE = 'CLAIM_REWARD_FAILURE'; -var CLAIM_REWARD_CLEAR_ERROR = exports.CLAIM_REWARD_CLEAR_ERROR = 'CLAIM_REWARD_CLEAR_ERROR'; -var FETCH_REWARD_CONTENT_COMPLETED = exports.FETCH_REWARD_CONTENT_COMPLETED = 'FETCH_REWARD_CONTENT_COMPLETED'; -// Language -var DOWNLOAD_LANGUAGE_SUCCEEDED = exports.DOWNLOAD_LANGUAGE_SUCCEEDED = 'DOWNLOAD_LANGUAGE_SUCCEEDED'; -var DOWNLOAD_LANGUAGE_FAILED = exports.DOWNLOAD_LANGUAGE_FAILED = 'DOWNLOAD_LANGUAGE_FAILED'; + if (outpoint) newByOutpoint[fileInfo.outpoint] = fileInfo; + }); -// ShapeShift -var GET_SUPPORTED_COINS_START = exports.GET_SUPPORTED_COINS_START = 'GET_SUPPORTED_COINS_START'; -var GET_SUPPORTED_COINS_SUCCESS = exports.GET_SUPPORTED_COINS_SUCCESS = 'GET_SUPPORTED_COINS_SUCCESS'; -var GET_SUPPORTED_COINS_FAIL = exports.GET_SUPPORTED_COINS_FAIL = 'GET_SUPPORTED_COINS_FAIL'; -var GET_COIN_STATS_START = exports.GET_COIN_STATS_START = 'GET_COIN_STATS_START'; -var GET_COIN_STATS_SUCCESS = exports.GET_COIN_STATS_SUCCESS = 'GET_COIN_STATS_SUCCESS'; -var GET_COIN_STATS_FAIL = exports.GET_COIN_STATS_FAIL = 'GET_COIN_STATS_FAIL'; -var PREPARE_SHAPE_SHIFT_START = exports.PREPARE_SHAPE_SHIFT_START = 'PREPARE_SHAPE_SHIFT_START'; -var PREPARE_SHAPE_SHIFT_SUCCESS = exports.PREPARE_SHAPE_SHIFT_SUCCESS = 'PREPARE_SHAPE_SHIFT_SUCCESS'; -var PREPARE_SHAPE_SHIFT_FAIL = exports.PREPARE_SHAPE_SHIFT_FAIL = 'PREPARE_SHAPE_SHIFT_FAIL'; -var GET_ACTIVE_SHIFT_START = exports.GET_ACTIVE_SHIFT_START = 'GET_ACTIVE_SHIFT_START'; -var GET_ACTIVE_SHIFT_SUCCESS = exports.GET_ACTIVE_SHIFT_SUCCESS = 'GET_ACTIVE_SHIFT_SUCCESS'; -var GET_ACTIVE_SHIFT_FAIL = exports.GET_ACTIVE_SHIFT_FAIL = 'GET_ACTIVE_SHIFT_FAIL'; -var CLEAR_SHAPE_SHIFT = exports.CLEAR_SHAPE_SHIFT = 'CLEAR_SHAPE_SHIFT'; + return Object.assign({}, state, { + isFetchingFileList: false, + byOutpoint: newByOutpoint, + pendingByOutpoint: pendingByOutpoint + }); +}; -// Subscriptions -var CHANNEL_SUBSCRIBE = exports.CHANNEL_SUBSCRIBE = 'CHANNEL_SUBSCRIBE'; -var CHANNEL_UNSUBSCRIBE = exports.CHANNEL_UNSUBSCRIBE = 'CHANNEL_UNSUBSCRIBE'; -var HAS_FETCHED_SUBSCRIPTIONS = exports.HAS_FETCHED_SUBSCRIPTIONS = 'HAS_FETCHED_SUBSCRIPTIONS'; +reducers[ACTIONS.FETCH_FILE_INFO_STARTED] = function (state, action) { + var outpoint = action.data.outpoint; -// Video controls -var SET_VIDEO_PAUSE = exports.SET_VIDEO_PAUSE = 'SET_VIDEO_PAUSE'; + var newFetching = Object.assign({}, state.fetching); -// Media controls -var MEDIA_PLAY = exports.MEDIA_PLAY = 'MEDIA_PLAY'; -var MEDIA_PAUSE = exports.MEDIA_PAUSE = 'MEDIA_PAUSE'; -var MEDIA_POSITION = exports.MEDIA_POSITION = 'MEDIA_POSITION'; + newFetching[outpoint] = true; + + return Object.assign({}, state, { + fetching: newFetching + }); +}; + +reducers[ACTIONS.FETCH_FILE_INFO_COMPLETED] = function (state, action) { + var _action$data = action.data, + fileInfo = _action$data.fileInfo, + outpoint = _action$data.outpoint; + + + var newByOutpoint = Object.assign({}, state.byOutpoint); + var newFetching = Object.assign({}, state.fetching); + + newByOutpoint[outpoint] = fileInfo; + delete newFetching[outpoint]; + + return Object.assign({}, state, { + byOutpoint: newByOutpoint, + fetching: newFetching + }); +}; + +reducers[ACTIONS.DOWNLOADING_STARTED] = function (state, action) { + var _action$data2 = action.data, + uri = _action$data2.uri, + outpoint = _action$data2.outpoint, + fileInfo = _action$data2.fileInfo; + + + var newByOutpoint = Object.assign({}, state.byOutpoint); + var newDownloading = Object.assign({}, state.downloadingByOutpoint); + var newLoading = Object.assign({}, state.urisLoading); + + newDownloading[outpoint] = true; + newByOutpoint[outpoint] = fileInfo; + delete newLoading[uri]; + + return Object.assign({}, state, { + downloadingByOutpoint: newDownloading, + urisLoading: newLoading, + byOutpoint: newByOutpoint + }); +}; + +reducers[ACTIONS.DOWNLOADING_PROGRESSED] = function (state, action) { + var _action$data3 = action.data, + outpoint = _action$data3.outpoint, + fileInfo = _action$data3.fileInfo; + + + var newByOutpoint = Object.assign({}, state.byOutpoint); + var newDownloading = Object.assign({}, state.downloadingByOutpoint); + + newByOutpoint[outpoint] = fileInfo; + newDownloading[outpoint] = true; + + return Object.assign({}, state, { + byOutpoint: newByOutpoint, + downloadingByOutpoint: newDownloading + }); +}; + +reducers[ACTIONS.DOWNLOADING_COMPLETED] = function (state, action) { + var _action$data4 = action.data, + outpoint = _action$data4.outpoint, + fileInfo = _action$data4.fileInfo; + + + var newByOutpoint = Object.assign({}, state.byOutpoint); + var newDownloading = Object.assign({}, state.downloadingByOutpoint); + + newByOutpoint[outpoint] = fileInfo; + delete newDownloading[outpoint]; + + return Object.assign({}, state, { + byOutpoint: newByOutpoint, + downloadingByOutpoint: newDownloading + }); +}; + +reducers[ACTIONS.FILE_DELETE] = function (state, action) { + var outpoint = action.data.outpoint; + + + var newByOutpoint = Object.assign({}, state.byOutpoint); + var downloadingByOutpoint = Object.assign({}, state.downloadingByOutpoint); + + delete newByOutpoint[outpoint]; + delete downloadingByOutpoint[outpoint]; + + return Object.assign({}, state, { + byOutpoint: newByOutpoint, + downloadingByOutpoint: downloadingByOutpoint + }); +}; + +reducers[ACTIONS.LOADING_VIDEO_STARTED] = function (state, action) { + var uri = action.data.uri; + + + var newLoading = Object.assign({}, state.urisLoading); + + newLoading[uri] = true; + + return Object.assign({}, state, { + urisLoading: newLoading + }); +}; + +reducers[ACTIONS.LOADING_VIDEO_FAILED] = function (state, action) { + var uri = action.data.uri; + + + var newLoading = Object.assign({}, state.urisLoading); + + delete newLoading[uri]; + + return Object.assign({}, state, { + urisLoading: newLoading + }); +}; + +reducers[ACTIONS.FETCH_DATE] = function (state, action) { + var time = action.data.time; + + if (time) { + return Object.assign({}, state, { + publishedDate: time + }); + } + return null; +}; + +function fileInfoReducer() { + var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultState; + var action = arguments[1]; + + var handler = reducers[action.type]; + if (handler) return handler(state, action); + return state; +} + +/***/ }), +/* 24 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.searchReducer = searchReducer; + +var _action_types = __webpack_require__(0); + +var ACTIONS = _interopRequireWildcard(_action_types); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var reducers = {}; +var defaultState = { + urisByQuery: {}, + searching: false +}; + +reducers[ACTIONS.SEARCH_STARTED] = function (state) { + return Object.assign({}, state, { + searching: true + }); +}; + +reducers[ACTIONS.SEARCH_COMPLETED] = function (state, action) { + var _action$data = action.data, + query = _action$data.query, + uris = _action$data.uris; + + + return Object.assign({}, state, { + searching: false, + urisByQuery: Object.assign({}, state.urisByQuery, _defineProperty({}, query, uris)) + }); +}; + +reducers[ACTIONS.SEARCH_CANCELLED] = function (state) { + return Object.assign({}, state, { + searching: false + }); +}; + +function searchReducer() { + var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultState; + var action = arguments[1]; + + var handler = reducers[action.type]; + if (handler) return handler(state, action); + return state; +} + +/***/ }), +/* 25 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.walletReducer = walletReducer; + +var _action_types = __webpack_require__(0); + +var ACTIONS = _interopRequireWildcard(_action_types); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +var reducers = {}; +var receiveAddress = localStorage.getItem('receiveAddress'); +var buildDraftTransaction = function buildDraftTransaction() { + return { + amount: undefined, + address: undefined + }; +}; + +var defaultState = { + balance: undefined, + blocks: {}, + transactions: {}, + fetchingTransactions: false, + receiveAddress: receiveAddress, + gettingNewAddress: false, + draftTransaction: buildDraftTransaction(), + sendingSupport: false +}; + +reducers[ACTIONS.FETCH_TRANSACTIONS_STARTED] = function (state) { + return Object.assign({}, state, { + fetchingTransactions: true + }); +}; + +reducers[ACTIONS.FETCH_TRANSACTIONS_COMPLETED] = function (state, action) { + var byId = Object.assign({}, state.transactions); + + var transactions = action.data.transactions; + + + transactions.forEach(function (transaction) { + byId[transaction.txid] = transaction; + }); + + return Object.assign({}, state, { + transactions: byId, + fetchingTransactions: false + }); +}; + +reducers[ACTIONS.GET_NEW_ADDRESS_STARTED] = function (state) { + return Object.assign({}, state, { + gettingNewAddress: true + }); +}; + +reducers[ACTIONS.GET_NEW_ADDRESS_COMPLETED] = function (state, action) { + var address = action.data.address; + + + localStorage.setItem('receiveAddress', address); + return Object.assign({}, state, { + gettingNewAddress: false, + receiveAddress: address + }); +}; + +reducers[ACTIONS.UPDATE_BALANCE] = function (state, action) { + return Object.assign({}, state, { + balance: action.data.balance + }); +}; + +reducers[ACTIONS.CHECK_ADDRESS_IS_MINE_STARTED] = function (state) { + return Object.assign({}, state, { + checkingAddressOwnership: true + }); +}; + +reducers[ACTIONS.CHECK_ADDRESS_IS_MINE_COMPLETED] = function (state) { + return Object.assign({}, state, { + checkingAddressOwnership: false + }); +}; + +reducers[ACTIONS.SET_DRAFT_TRANSACTION_AMOUNT] = function (state, action) { + var oldDraft = state.draftTransaction; + var newDraft = Object.assign({}, oldDraft, { + amount: parseFloat(action.data.amount) + }); + + return Object.assign({}, state, { + draftTransaction: newDraft + }); +}; + +reducers[ACTIONS.SET_DRAFT_TRANSACTION_ADDRESS] = function (state, action) { + var oldDraft = state.draftTransaction; + var newDraft = Object.assign({}, oldDraft, { + address: action.data.address + }); + + return Object.assign({}, state, { + draftTransaction: newDraft + }); +}; + +reducers[ACTIONS.SEND_TRANSACTION_STARTED] = function (state) { + var newDraftTransaction = Object.assign({}, state.draftTransaction, { + sending: true + }); + + return Object.assign({}, state, { + draftTransaction: newDraftTransaction + }); +}; + +reducers[ACTIONS.SEND_TRANSACTION_COMPLETED] = function (state) { + return Object.assign({}, state, { + draftTransaction: buildDraftTransaction() + }); +}; + +reducers[ACTIONS.SEND_TRANSACTION_FAILED] = function (state, action) { + var newDraftTransaction = Object.assign({}, state.draftTransaction, { + sending: false, + error: action.data.error + }); + + return Object.assign({}, state, { + draftTransaction: newDraftTransaction + }); +}; + +reducers[ACTIONS.SUPPORT_TRANSACTION_STARTED] = function (state) { + return Object.assign({}, state, { + sendingSupport: true + }); +}; + +reducers[ACTIONS.SUPPORT_TRANSACTION_COMPLETED] = function (state) { + return Object.assign({}, state, { + sendingSupport: false + }); +}; + +reducers[ACTIONS.SUPPORT_TRANSACTION_FAILED] = function (state, action) { + return Object.assign({}, state, { + error: action.data.error, + sendingSupport: false + }); +}; + +reducers[ACTIONS.FETCH_BLOCK_SUCCESS] = function (state, action) { + var _action$data = action.data, + block = _action$data.block, + height = _action$data.block.height; + + var blocks = Object.assign({}, state.blocks); + + blocks[height] = block; + + return Object.assign({}, state, { blocks: blocks }); +}; + +function walletReducer() { + var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultState; + var action = arguments[1]; + + var handler = reducers[action.type]; + if (handler) return handler(state, action); + return state; +} + +/***/ }), +/* 26 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.makeSelectFetchingCostInfoForUri = exports.selectFetchingCostInfo = exports.selectCostForCurrentPageUri = exports.makeSelectCostInfoForUri = exports.selectAllCostInfoByUri = exports.selectState = undefined; + +var _reselect = __webpack_require__(4); + +var _navigation = __webpack_require__(3); + +var selectState = exports.selectState = function selectState(state) { + return state.costInfo || {}; +}; + +var selectAllCostInfoByUri = exports.selectAllCostInfoByUri = (0, _reselect.createSelector)(selectState, function (state) { + return state.byUri || {}; +}); + +var makeSelectCostInfoForUri = exports.makeSelectCostInfoForUri = function makeSelectCostInfoForUri(uri) { + return (0, _reselect.createSelector)(selectAllCostInfoByUri, function (costInfos) { + return costInfos && costInfos[uri]; + }); +}; + +var selectCostForCurrentPageUri = exports.selectCostForCurrentPageUri = (0, _reselect.createSelector)(selectAllCostInfoByUri, _navigation.selectCurrentParams, function (costInfo, params) { + return params.uri && costInfo[params.uri] ? costInfo[params.uri].cost : undefined; +}); + +var selectFetchingCostInfo = exports.selectFetchingCostInfo = (0, _reselect.createSelector)(selectState, function (state) { + return state.fetching || {}; +}); + +var makeSelectFetchingCostInfoForUri = exports.makeSelectFetchingCostInfoForUri = function makeSelectFetchingCostInfoForUri(uri) { + return (0, _reselect.createSelector)(selectFetchingCostInfo, function (fetchingByUri) { + return fetchingByUri && fetchingByUri[uri]; + }); +}; + +/***/ }), +/* 27 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.selectWunderBarIcon = exports.selectWunderBarAddress = exports.makeSelectSearchUris = exports.selectSearchUrisByQuery = exports.selectIsSearching = exports.selectSearchQuery = exports.selectState = undefined; + +var _navigation = __webpack_require__(3); + +var _reselect = __webpack_require__(4); + +var selectState = exports.selectState = function selectState(state) { + return state.search || {}; +}; + +var selectSearchQuery = exports.selectSearchQuery = (0, _reselect.createSelector)(_navigation.selectCurrentPage, _navigation.selectCurrentParams, function (page, params) { + return page === 'search' ? params && params.query : null; +}); + +var selectIsSearching = exports.selectIsSearching = (0, _reselect.createSelector)(selectState, function (state) { + return state.searching; +}); + +var selectSearchUrisByQuery = exports.selectSearchUrisByQuery = (0, _reselect.createSelector)(selectState, function (state) { + return state.urisByQuery; +}); + +var makeSelectSearchUris = exports.makeSelectSearchUris = function makeSelectSearchUris(query) { + return ( + // replace statement below is kind of ugly, and repeated in doSearch action + (0, _reselect.createSelector)(selectSearchUrisByQuery, function (byQuery) { + return byQuery[query ? query.replace(/^lbry:\/\//i, '') : query]; + }) + ); +}; + +var selectWunderBarAddress = exports.selectWunderBarAddress = (0, _reselect.createSelector)(_navigation.selectCurrentPage, _navigation.selectPageTitle, selectSearchQuery, function (page, title, query) { + return page !== 'search' ? title : query || title; +}); + +var selectWunderBarIcon = exports.selectWunderBarIcon = (0, _reselect.createSelector)(_navigation.selectCurrentPage, _navigation.selectCurrentParams, function (page, params) { + switch (page) { + case 'auth': + return 'icon-user'; + case 'settings': + return 'icon-gear'; + case 'help': + return 'icon-question'; + case 'report': + return 'icon-file'; + case 'downloaded': + return 'icon-folder'; + case 'published': + return 'icon-folder'; + case 'history': + return 'icon-history'; + case 'send': + return 'icon-send'; + case 'rewards': + return 'icon-rocket'; + case 'invite': + return 'icon-envelope-open'; + case 'getcredits': + return 'icon-shopping-cart'; + case 'wallet': + case 'backup': + return 'icon-bank'; + case 'show': + return 'icon-file'; + case 'publish': + return params.id ? __('icon-pencil') : __('icon-upload'); + case 'developer': + return 'icon-code'; + case 'discover': + case 'search': + return 'icon-search'; + case 'subscriptions': + return 'icon-th-list'; + default: + return 'icon-file'; + } +}); /***/ }) -/******/ ]); \ No newline at end of file +/******/ ]); +}); \ No newline at end of file diff --git a/src/index.js b/src/index.js index 03af8ef..3047082 100644 --- a/src/index.js +++ b/src/index.js @@ -1,4 +1,77 @@ -export { Lbry } from 'lbry'; -export { LbryApi } from 'lbryapi'; +// common +import Lbry from 'lbry'; +import LbryApi from 'lbryapi'; +import Lbryuri from 'lbryuri'; +export { Lbry, LbryApi, Lbryuri }; -export { costInfoReducer } from 'redux/reducers/cost_info'; \ No newline at end of file +// actions +export { doFetchClaimListMine, doAbandonClaim, doResolveUris, doResolveUri } from 'redux/actions/claims'; +export { doFetchCostInfoForUri } from 'redux/actions/cost_info'; +export { doFetchFileInfo, doFileList, doFetchFileInfosAndPublishedClaims } from 'redux/actions/file_info'; +export { doSearch } from 'redux/actions/search'; + +// reducers +export { claimsReducer } from 'redux/reducers/claims'; +export { costInfoReducer } from 'redux/reducers/cost_info'; +export { fileInfoReducer } from 'redux/reducers/file_info'; +export { searchReducer } from 'redux/reducers/search'; +export { walletReducer } from 'redux/reducers/wallet'; + +// selectors +export { + makeSelectClaimForUri, + makeSelectClaimIsMine, + makeSelectFetchingChannelClaims, + makeSelectClaimsInChannelForCurrentPage, + makeSelectMetadataForUri, + makeSelectTitleForUri, + makeSelectContentTypeForUri, + makeSelectIsUriResolving, + selectClaimsById, + selectClaimsByUri, + selectAllClaimsByChannel, + selectMyClaimsRaw, + selectAbandoningIds, + selectMyActiveClaims, + selectAllFetchingChannelClaims, + selectIsFetchingClaimListMine, + selectPendingClaims, + selectMyClaims, + selectMyClaimsWithoutChannels, + selectAllMyClaimsByOutpoint, + selectMyClaimsOutpoints, + selectFetchingMyChannels, + selectMyChannelClaims, + selectResolvingUris +} from 'redux/selectors/claims'; + +export { + makeSelectFetchingCostInfoForUri, + makeSelectCostInfoForUri, + selectAllCostInfoByUri, + selectCostForCurrentPageUri, + selectFetchingCostInfo +} from 'redux/selectors/cost_info'; + +export { + selectFileInfosByOutpoint, + selectIsFetchingFileList, + selectIsFetchingFileListDownloadedOrPublished, + makeSelectFileInfoForUri, + selectDownloadingByOutpoint, + makeSelectDownloadingForUri, + selectUrisLoading, + makeSelectLoadingForUri, + selectFileInfosDownloaded, + selectDownloadingFileInfos, + selectTotalDownloadProgress +} from 'redux/selectors/file_info'; + +export { + makeSelectSearchUris, + selectSearchQuery, + selectIsSearching, + selectSearchUrisByQuery, + selectWunderBarAddress, + selectWunderBarIcon +} from 'redux/selectors/search'; diff --git a/src/lbry.js b/src/lbry.js index 1a3b50f..4ce3055 100644 --- a/src/lbry.js +++ b/src/lbry.js @@ -12,19 +12,6 @@ function apiCall(method, params, resolve, reject) { return jsonrpc.call(Lbry.daemonConnectionString, method, params, resolve, reject, reject); } -const lbryProxy = new Proxy(Lbry, { - get(target, name) { - if (name in target) { - return target[name]; - } - - return (params = {}) => - new Promise((resolve, reject) => { - apiCall(name, params, resolve, reject); - }); - }, -}); - function getLocal(key, fallback = undefined) { const itemRaw = localStorage.getItem(key); return itemRaw === null ? fallback : JSON.parse(itemRaw); @@ -275,5 +262,18 @@ Lbry.resolve = (params = {}) => reject ); }); + +const lbryProxy = new Proxy(Lbry, { + get(target, name) { + if (name in target) { + return target[name]; + } + + return (params = {}) => + new Promise((resolve, reject) => { + apiCall(name, params, resolve, reject); + }); + }, +}); export default lbryProxy; diff --git a/src/lbryapi.js b/src/lbryapi.js index 5cbcf06..8f980c3 100644 --- a/src/lbryapi.js +++ b/src/lbryapi.js @@ -2,6 +2,7 @@ import Lbry from 'lbry'; import querystring from 'querystring'; const LbryApi = { + enabled: true, exchangePromise: null, exchangeLastFetched: null, }; @@ -31,7 +32,7 @@ LbryApi.getExchangeRates = () => { }; LbryApi.call = (resource, action, params = {}, method = 'get') => { - if (!Lbryio.enabled) { + if (!LbryApi.enabled) { console.log(__('Internal API disabled')); return Promise.reject(new Error(__('LBRY internal API is disabled'))); } diff --git a/src/lbryuri.js b/src/lbryuri.js new file mode 100644 index 0000000..f7c1a31 --- /dev/null +++ b/src/lbryuri.js @@ -0,0 +1,238 @@ +const CHANNEL_NAME_MIN_LEN = 1; +const CLAIM_ID_MAX_LEN = 40; + +const Lbryuri = {}; + +Lbryuri.REGEXP_INVALID_URI = /[^A-Za-z0-9-]/g; +Lbryuri.REGEXP_ADDRESS = /^b(?=[^0OIl]{32,33})[0-9A-Za-z]{32,33}$/; + +/** + * Parses a LBRY name into its component parts. Throws errors with user-friendly + * messages for invalid names. + * + * N.B. that "name" indicates the value in the name position of the URI. For + * claims for channel content, this will actually be the channel name, and + * the content name is in the path (e.g. lbry://@channel/content) + * + * In most situations, you'll want to use the contentName and channelName keys + * and ignore the name key. + * + * Returns a dictionary with keys: + * - name (string): The value in the "name" position in the URI. Note that this + * could be either content name or channel name; see above. + * - path (string, if persent) + * - claimSequence (int, if present) + * - bidPosition (int, if present) + * - claimId (string, if present) + * - isChannel (boolean) + * - contentName (string): For anon claims, the name; for channel claims, the path + * - channelName (string, if present): Channel name without @ + */ +Lbryuri.parse = (uri, requireProto = false) => { + // Break into components. Empty sub-matches are converted to null + const componentsRegex = new RegExp( + '^((?:lbry://)?)' + // protocol + '([^:$#/]*)' + // name (stops at the first separator or end) + '([:$#]?)([^/]*)' + // modifier separator, modifier (stops at the first path separator or end) + '(/?)(.*)' // path separator, path + ); + const [proto, name, modSep, modVal, pathSep, path] = componentsRegex + .exec(uri) + .slice(1) + .map(match => match || null); + + let contentName; + + // Validate protocol + if (requireProto && !proto) { + throw new Error(__('LBRY URIs must include a protocol prefix (lbry://).')); + } + + // Validate and process name + if (!name) { + throw new Error(__('URI does not include name.')); + } + + const isChannel = name.startsWith('@'); + const channelName = isChannel ? name.slice(1) : name; + + if (isChannel) { + if (!channelName) { + throw new Error(__('No channel name after @.')); + } + + if (channelName.length < CHANNEL_NAME_MIN_LEN) { + throw new Error(__(`Channel names must be at least %s characters.`, CHANNEL_NAME_MIN_LEN)); + } + + contentName = path; + } + + const nameBadChars = (channelName || name).match(Lbryuri.REGEXP_INVALID_URI); + if (nameBadChars) { + throw new Error( + __( + `Invalid character %s in name: %s.`, + nameBadChars.length === 1 ? '' : 's', + nameBadChars.join(', ') + ) + ); + } + + // Validate and process modifier (claim ID, bid position or claim sequence) + let claimId; + let claimSequence; + let bidPosition; + if (modSep) { + if (!modVal) { + throw new Error(__(`No modifier provided after separator %s.`, modSep)); + } + + if (modSep === '#') { + claimId = modVal; + } else if (modSep === ':') { + claimSequence = modVal; + } else if (modSep === '$') { + bidPosition = modVal; + } + } + + if ( + claimId && + (claimId.length > CLAIM_ID_MAX_LEN || !claimId.match(/^[0-9a-f]+$/)) && + !claimId.match(/^pending/) // ought to be dropped when savePendingPublish drops hack + ) { + throw new Error(__(`Invalid claim ID %s.`, claimId)); + } + + if (claimSequence && !claimSequence.match(/^-?[1-9][0-9]*$/)) { + throw new Error(__('Claim sequence must be a number.')); + } + + if (bidPosition && !bidPosition.match(/^-?[1-9][0-9]*$/)) { + throw new Error(__('Bid position must be a number.')); + } + + // Validate and process path + if (path) { + if (!isChannel) { + throw new Error(__('Only channel URIs may have a path.')); + } + + const pathBadChars = path.match(Lbryuri.REGEXP_INVALID_URI); + if (pathBadChars) { + throw new Error(__(`Invalid character in path: %s`, pathBadChars.join(', '))); + } + + contentName = path; + } else if (pathSep) { + throw new Error(__('No path provided after /')); + } + + return { + name, + path, + isChannel, + ...(contentName ? { contentName } : {}), + ...(channelName ? { channelName } : {}), + ...(claimSequence ? { claimSequence: parseInt(claimSequence, 10) } : {}), + ...(bidPosition ? { bidPosition: parseInt(bidPosition, 10) } : {}), + ...(claimId ? { claimId } : {}), + ...(path ? { path } : {}), + }; +}; + +/** + * Takes an object in the same format returned by lbryuri.parse() and builds a URI. + * + * The channelName key will accept names with or without the @ prefix. + */ +Lbryuri.build = (uriObj, includeProto = true) => { + const { claimId, claimSequence, bidPosition, contentName, channelName } = uriObj; + + let { name, path } = uriObj; + + if (channelName) { + const channelNameFormatted = channelName.startsWith('@') ? channelName : `@${channelName}`; + if (!name) { + name = channelNameFormatted; + } else if (name !== channelNameFormatted) { + throw new Error( + __( + 'Received a channel content URI, but name and channelName do not match. "name" represents the value in the name position of the URI (lbry://name...), which for channel content will be the channel name. In most cases, to construct a channel URI you should just pass channelName and contentName.' + ) + ); + } + } + + if (contentName) { + if (!name) { + name = contentName; + } else if (!path) { + path = contentName; + } + if (path && path !== contentName) { + throw new Error( + __( + 'Path and contentName do not match. Only one is required; most likely you wanted contentName.' + ) + ); + } + } + + return ( + (includeProto ? 'lbry://' : '') + + name + + (claimId ? `#${claimId}` : '') + + (claimSequence ? `:${claimSequence}` : '') + + (bidPosition ? `${bidPosition}` : '') + + (path ? `/${path}` : '') + ); +}; + +/* Takes a parseable LBRY URI and converts it to standard, canonical format (currently this just + * consists of adding the lbry:// prefix if needed) */ +Lbryuri.normalize = uri => { + if (uri.match(/pending_claim/)) return uri; + + const { name, path, bidPosition, claimSequence, claimId } = Lbryuri.parse(uri); + return Lbryuri.build({ name, path, claimSequence, bidPosition, claimId }); +}; + +Lbryuri.isValid = uri => { + let parts; + try { + parts = Lbryuri.parse(Lbryuri.normalize(uri)); + } catch (error) { + return false; + } + return parts && parts.name; +}; + +Lbryuri.isValidName = (name, checkCase = true) => { + const regexp = new RegExp('^[a-z0-9-]+$', checkCase ? '' : 'i'); + return regexp.test(name); +}; + +Lbryuri.isClaimable = uri => { + let parts; + try { + parts = Lbryuri.parse(Lbryuri.normalize(uri)); + } catch (error) { + return false; + } + return ( + parts && + parts.name && + !parts.claimId && + !parts.bidPosition && + !parts.claimSequence && + !parts.isChannel && + !parts.path + ); +}; + +if (window) { + window.lbryuri = Lbryuri; +} +export default Lbryuri; diff --git a/src/redux/actions/claims.js b/src/redux/actions/claims.js new file mode 100644 index 0000000..5da8010 --- /dev/null +++ b/src/redux/actions/claims.js @@ -0,0 +1,107 @@ +import * as ACTIONS from 'constants/action_types'; +import Lbry from 'lbry'; +import Lbryuri from 'lbryuri'; +import { selectResolvingUris } from 'redux/selectors/claims'; + +export function doResolveUris(uris) { + return (dispatch, getState) => { + const normalizedUris = uris.map(Lbryuri.normalize); + const state = getState(); + + // Filter out URIs that are already resolving + const resolvingUris = selectResolvingUris(state); + const urisToResolve = normalizedUris.filter(uri => !resolvingUris.includes(uri)); + + if (urisToResolve.length === 0) { + return; + } + + dispatch({ + type: ACTIONS.RESOLVE_URIS_STARTED, + data: { uris: normalizedUris }, + }); + + const resolveInfo = {}; + Lbry.resolve({ uris: urisToResolve }).then(result => { + Object.entries(result).forEach(([uri, uriResolveInfo]) => { + const fallbackResolveInfo = { + claim: null, + claimsInChannel: null, + certificate: null, + }; + + const { claim, certificate, claims_in_channel: claimsInChannel } = + uriResolveInfo && !uriResolveInfo.error ? uriResolveInfo : fallbackResolveInfo; + + resolveInfo[uri] = { claim, certificate, claimsInChannel }; + }); + + dispatch({ + type: ACTIONS.RESOLVE_URIS_COMPLETED, + data: { resolveInfo }, + }); + }); + }; +} + +export function doResolveUri(uri) { + return doResolveUris([uri]); +} + +export function doFetchClaimListMine() { + return dispatch => { + dispatch({ + type: ACTIONS.FETCH_CLAIM_LIST_MINE_STARTED, + }); + + Lbry.claim_list_mine().then(claims => { + dispatch({ + type: ACTIONS.FETCH_CLAIM_LIST_MINE_COMPLETED, + data: { + claims, + }, + }); + }); + }; +} + +export function doAbandonClaim(txid, nout) { + return (dispatch, getState) => { + const state = getState(); + const myClaims = selectMyClaimsRaw(state); + const { claim_id: claimId, name } = myClaims.find( + claim => claim.txid === txid && claim.nout === nout + ); + + dispatch({ + type: ACTIONS.ABANDON_CLAIM_STARTED, + data: { + claimId, + }, + }); + + const errorCallback = () => { + dispatch(doOpenModal(MODALS.TRANSACTION_FAILED)); + }; + + const successCallback = results => { + if (results.txid) { + dispatch({ + type: ACTIONS.ABANDON_CLAIM_SUCCEEDED, + data: { + claimId, + }, + }); + dispatch(doResolveUri(Lbryuri.build({ name, claimId }))); + dispatch(doFetchClaimListMine()); + } else { + dispatch(doOpenModal(MODALS.TRANSACTION_FAILED)); + } + }; + + Lbry.claim_abandon({ + txid, + nout, + }).then(successCallback, errorCallback); + }; +} \ No newline at end of file diff --git a/src/redux/actions/file_info.js b/src/redux/actions/file_info.js new file mode 100644 index 0000000..25089d9 --- /dev/null +++ b/src/redux/actions/file_info.js @@ -0,0 +1,66 @@ +import * as ACTIONS from 'constants/action_types'; +import Lbry from 'lbry'; +import { doFetchClaimListMine } from 'redux/actions/claims'; +import { selectClaimsByUri, selectIsFetchingClaimListMine } from 'redux/selectors/claims'; +import { selectIsFetchingFileList, selectUrisLoading } from 'redux/selectors/file_info'; + +export function doFetchFileInfo(uri) { + return (dispatch, getState) => { + const state = getState(); + const claim = selectClaimsByUri(state)[uri]; + const outpoint = claim ? `${claim.txid}:${claim.nout}` : null; + const alreadyFetching = !!selectUrisLoading(state)[uri]; + + if (!alreadyFetching) { + dispatch({ + type: ACTIONS.FETCH_FILE_INFO_STARTED, + data: { + outpoint, + }, + }); + + Lbry.file_list({ outpoint, full_status: true }).then(fileInfos => { + dispatch({ + type: ACTIONS.FETCH_FILE_INFO_COMPLETED, + data: { + outpoint, + fileInfo: fileInfos && fileInfos.length ? fileInfos[0] : null, + }, + }); + }); + } + }; +} + +export function doFileList() { + return (dispatch, getState) => { + const state = getState(); + const isFetching = selectIsFetchingFileList(state); + + if (!isFetching) { + dispatch({ + type: ACTIONS.FILE_LIST_STARTED, + }); + + Lbry.file_list().then(fileInfos => { + dispatch({ + type: ACTIONS.FILE_LIST_SUCCEEDED, + data: { + fileInfos, + }, + }); + }); + } + }; +} + +export function doFetchFileInfosAndPublishedClaims() { + return (dispatch, getState) => { + const state = getState(); + const isFetchingClaimListMine = selectIsFetchingClaimListMine(state); + const isFetchingFileInfo = selectIsFetchingFileList(state); + + if (!isFetchingClaimListMine) dispatch(doFetchClaimListMine()); + if (!isFetchingFileInfo) dispatch(doFileList()); + }; +} diff --git a/src/redux/actions/navigation.js b/src/redux/actions/navigation.js new file mode 100644 index 0000000..78e8743 --- /dev/null +++ b/src/redux/actions/navigation.js @@ -0,0 +1,64 @@ +import * as ACTIONS from 'constants/action_types'; +import { selectHistoryIndex, selectHistoryStack } from 'redux/selectors/navigation'; +import { toQueryString } from 'util/query_params'; + +export function doNavigate(path, params = {}, options = {}) { + return dispatch => { + if (!path) { + return; + } + + let url = path; + if (params && Object.values(params).length) { + url += `?${toQueryString(params)}`; + } + + const { scrollY } = options; + + dispatch({ + type: ACTIONS.HISTORY_NAVIGATE, + data: { url, index: options.index, scrollY }, + }); + }; +} + +export function doAuthNavigate(pathAfterAuth = null, params = {}) { + return dispatch => { + if (pathAfterAuth) { + dispatch({ + type: ACTIONS.CHANGE_AFTER_AUTH_PATH, + data: { + path: `${pathAfterAuth}?${toQueryString(params)}`, + }, + }); + } + dispatch(doNavigate('/auth')); + }; +} + +export function doHistoryTraverse(dispatch, state, modifier) { + const stack = selectHistoryStack(state); + const index = selectHistoryIndex(state) + modifier; + + if (index >= 0 && index < stack.length) { + const historyItem = stack[index]; + dispatch(doNavigate(historyItem.path, {}, { scrollY: historyItem.scrollY, index })); + } +} + +export function doHistoryBack() { + return (dispatch, getState) => doHistoryTraverse(dispatch, getState(), -1); +} + +export function doHistoryForward() { + return (dispatch, getState) => doHistoryTraverse(dispatch, getState(), 1); +} + +export function doRecordScroll(scroll) { + return dispatch => { + dispatch({ + type: ACTIONS.WINDOW_SCROLLED, + data: { scrollY: scroll }, + }); + }; +} diff --git a/src/redux/actions/search.js b/src/redux/actions/search.js new file mode 100644 index 0000000..a98d7c7 --- /dev/null +++ b/src/redux/actions/search.js @@ -0,0 +1,67 @@ +import * as ACTIONS from 'constants/action_types'; +import Lbryuri from 'lbryuri'; +import { doResolveUri } from 'redux/actions/claims'; +import { doNavigate } from 'redux/actions/navigation'; +import { selectCurrentPage } from 'redux/selectors/navigation'; +import batchActions from 'util/batchActions'; + +// eslint-disable-next-line import/prefer-default-export +export function doSearch(rawQuery) { + return (dispatch, getState) => { + const state = getState(); + const page = selectCurrentPage(state); + + const query = rawQuery.replace(/^lbry:\/\//i, ''); + + if (!query) { + dispatch({ + type: ACTIONS.SEARCH_CANCELLED, + }); + return; + } + + dispatch({ + type: ACTIONS.SEARCH_STARTED, + data: { query }, + }); + + if (page !== 'search') { + dispatch(doNavigate('search', { query })); + } else { + fetch(`https://lighthouse.lbry.io/search?s=${query}`) + .then( + response => + response.status === 200 + ? Promise.resolve(response.json()) + : Promise.reject(new Error(response.statusText)) + ) + .then(data => { + const uris = []; + const actions = []; + + data.forEach(result => { + const uri = Lbryuri.build({ + name: result.name, + claimId: result.claimId, + }); + actions.push(doResolveUri(uri)); + uris.push(uri); + }); + + actions.push({ + type: ACTIONS.SEARCH_COMPLETED, + data: { + query, + uris, + }, + }); + dispatch(batchActions(...actions)); + }) + .catch(() => { + dispatch({ + type: ACTIONS.SEARCH_CANCELLED, + }); + }); + } + }; +} diff --git a/src/redux/actions/wallet.js b/src/redux/actions/wallet.js new file mode 100644 index 0000000..df2faeb --- /dev/null +++ b/src/redux/actions/wallet.js @@ -0,0 +1,207 @@ +import * as ACTIONS from 'constants/action_types'; +import * as MODALS from 'constants/modal_types'; +import Lbry from 'lbry'; +import { doOpenModal, doShowSnackBar } from 'redux/actions/app'; +import { doNavigate } from 'redux/actions/navigation'; +import { + selectBalance, + selectDraftTransaction, + selectDraftTransactionAmount, +} from 'redux/selectors/wallet'; + +export function doUpdateBalance() { + return dispatch => { + Lbry.wallet_balance().then(balance => + dispatch({ + type: ACTIONS.UPDATE_BALANCE, + data: { + balance, + }, + }) + ); + }; +} + +export function doBalanceSubscribe() { + return dispatch => { + dispatch(doUpdateBalance()); + setInterval(() => dispatch(doUpdateBalance()), 5000); + }; +} + +export function doFetchTransactions() { + return dispatch => { + dispatch({ + type: ACTIONS.FETCH_TRANSACTIONS_STARTED, + }); + + Lbry.transaction_list({ include_tip_info: true }).then(results => { + dispatch({ + type: ACTIONS.FETCH_TRANSACTIONS_COMPLETED, + data: { + transactions: results, + }, + }); + }); + }; +} + +export function doFetchBlock(height) { + return dispatch => { + Lbry.block_show({ height }).then(block => { + dispatch({ + type: ACTIONS.FETCH_BLOCK_SUCCESS, + data: { block }, + }); + }); + }; +} + +export function doGetNewAddress() { + return dispatch => { + dispatch({ + type: ACTIONS.GET_NEW_ADDRESS_STARTED, + }); + + Lbry.wallet_new_address().then(address => { + localStorage.setItem('wallet_address', address); + dispatch({ + type: ACTIONS.GET_NEW_ADDRESS_COMPLETED, + data: { address }, + }); + }); + }; +} + +export function doCheckAddressIsMine(address) { + return dispatch => { + dispatch({ + type: ACTIONS.CHECK_ADDRESS_IS_MINE_STARTED, + }); + + Lbry.wallet_is_address_mine({ address }).then(isMine => { + if (!isMine) dispatch(doGetNewAddress()); + + dispatch({ + type: ACTIONS.CHECK_ADDRESS_IS_MINE_COMPLETED, + }); + }); + }; +} + +export function doSendDraftTransaction() { + return (dispatch, getState) => { + const state = getState(); + const draftTx = selectDraftTransaction(state); + const balance = selectBalance(state); + const amount = selectDraftTransactionAmount(state); + + if (balance - amount <= 0) { + dispatch(doOpenModal(MODALS.INSUFFICIENT_CREDITS)); + return; + } + + dispatch({ + type: ACTIONS.SEND_TRANSACTION_STARTED, + }); + + const successCallback = results => { + if (results === true) { + dispatch({ + type: ACTIONS.SEND_TRANSACTION_COMPLETED, + }); + dispatch( + doShowSnackBar({ + message: __(`You sent ${amount} LBC`), + linkText: __('History'), + linkTarget: __('/wallet'), + }) + ); + } else { + dispatch({ + type: ACTIONS.SEND_TRANSACTION_FAILED, + data: { error: results }, + }); + dispatch(doOpenModal(MODALS.TRANSACTION_FAILED)); + } + }; + + const errorCallback = error => { + dispatch({ + type: ACTIONS.SEND_TRANSACTION_FAILED, + data: { error: error.message }, + }); + dispatch(doOpenModal(MODALS.TRANSACTION_FAILED)); + }; + + Lbry.wallet_send({ + amount: draftTx.amount, + address: draftTx.address, + }).then(successCallback, errorCallback); + }; +} + +export function doSetDraftTransactionAmount(amount) { + return { + type: ACTIONS.SET_DRAFT_TRANSACTION_AMOUNT, + data: { amount }, + }; +} + +export function doSetDraftTransactionAddress(address) { + return { + type: ACTIONS.SET_DRAFT_TRANSACTION_ADDRESS, + data: { address }, + }; +} + +export function doSendSupport(amount, claimId, uri) { + return (dispatch, getState) => { + const state = getState(); + const balance = selectBalance(state); + + if (balance - amount <= 0) { + dispatch(doOpenModal(MODALS.INSUFFICIENT_CREDITS)); + return; + } + + dispatch({ + type: ACTIONS.SUPPORT_TRANSACTION_STARTED, + }); + + const successCallback = results => { + if (results.txid) { + dispatch({ + type: ACTIONS.SUPPORT_TRANSACTION_COMPLETED, + }); + dispatch( + doShowSnackBar({ + message: __(`You sent ${amount} LBC as support, Mahalo!`), + linkText: __('History'), + linkTarget: __('/wallet'), + }) + ); + dispatch(doNavigate('/show', { uri })); + } else { + dispatch({ + type: ACTIONS.SUPPORT_TRANSACTION_FAILED, + data: { error: results.code }, + }); + dispatch(doOpenModal(MODALS.TRANSACTION_FAILED)); + } + }; + + const errorCallback = error => { + dispatch({ + type: ACTIONS.SUPPORT_TRANSACTION_FAILED, + data: { error: error.code }, + }); + dispatch(doOpenModal(MODALS.TRANSACTION_FAILED)); + }; + + Lbry.wallet_send({ + claim_id: claimId, + amount, + }).then(successCallback, errorCallback); + }; +} diff --git a/src/redux/reducers/claims.js b/src/redux/reducers/claims.js new file mode 100644 index 0000000..4cba2f6 --- /dev/null +++ b/src/redux/reducers/claims.js @@ -0,0 +1,183 @@ +import * as ACTIONS from 'constants/action_types'; + +const reducers = {}; + +const defaultState = {}; + +reducers[ACTIONS.RESOLVE_URIS_COMPLETED] = (state, action) => { + const { resolveInfo } = action.data; + const byUri = Object.assign({}, state.claimsByUri); + const byId = Object.assign({}, state.byId); + + Object.entries(resolveInfo).forEach(([uri, { certificate, claim }]) => { + if (claim) { + byId[claim.claim_id] = claim; + byUri[uri] = claim.claim_id; + } else if (claim === undefined && certificate !== undefined) { + byId[certificate.claim_id] = certificate; + // Don't point URI at the channel certificate unless it actually is + // a channel URI. This is brittle. + if (!uri.split(certificate.name)[1].match(/\//)) { + byUri[uri] = certificate.claim_id; + } else { + byUri[uri] = null; + } + } else { + byUri[uri] = null; + } + }); + + return Object.assign({}, state, { + byId, + claimsByUri: byUri, + }); +}; + +reducers[ACTIONS.FETCH_CLAIM_LIST_MINE_STARTED] = state => + Object.assign({}, state, { + isFetchingClaimListMine: true, + }); + +reducers[ACTIONS.FETCH_CLAIM_LIST_MINE_COMPLETED] = (state, action) => { + const { claims } = action.data; + const byId = Object.assign({}, state.byId); + const pendingById = Object.assign({}, state.pendingById); + + claims.filter(claim => claim.category && claim.category.match(/claim/)).forEach(claim => { + byId[claim.claim_id] = claim; + + const pending = Object.values(pendingById).find( + pendingClaim => + pendingClaim.name === claim.name && pendingClaim.channel_name === claim.channel_name + ); + + if (pending) { + delete pendingById[pending.claim_id]; + } + }); + + // Remove old timed out pending publishes + Object.values(pendingById) + .filter(pendingClaim => Date.now() - pendingClaim.time >= 20 * 60 * 1000) + .forEach(pendingClaim => { + delete pendingById[pendingClaim.claim_id]; + }); + + return Object.assign({}, state, { + isFetchingClaimListMine: false, + myClaims: claims, + byId, + pendingById, + }); +}; + +reducers[ACTIONS.FETCH_CHANNEL_LIST_MINE_STARTED] = state => + Object.assign({}, state, { fetchingMyChannels: true }); + +reducers[ACTIONS.FETCH_CHANNEL_LIST_MINE_COMPLETED] = (state, action) => { + const { claims } = action.data; + const myChannelClaims = new Set(state.myChannelClaims); + const byId = Object.assign({}, state.byId); + + claims.forEach(claim => { + myChannelClaims.add(claim.claim_id); + byId[claims.claim_id] = claim; + }); + + return Object.assign({}, state, { + byId, + fetchingMyChannels: false, + myChannelClaims, + }); +}; + +reducers[ACTIONS.FETCH_CHANNEL_CLAIMS_STARTED] = (state, action) => { + const { uri, page } = action.data; + const fetchingChannelClaims = Object.assign({}, state.fetchingChannelClaims); + + fetchingChannelClaims[uri] = page; + + return Object.assign({}, state, { + fetchingChannelClaims, + }); +}; + +reducers[ACTIONS.FETCH_CHANNEL_CLAIMS_COMPLETED] = (state, action) => { + const { uri, claims, page } = action.data; + + const claimsByChannel = Object.assign({}, state.claimsByChannel); + const byChannel = Object.assign({}, claimsByChannel[uri]); + const allClaimIds = new Set(byChannel.all); + const currentPageClaimIds = []; + const byId = Object.assign({}, state.byId); + const fetchingChannelClaims = Object.assign({}, state.fetchingChannelClaims); + + if (claims !== undefined) { + claims.forEach(claim => { + allClaimIds.add(claim.claim_id); + currentPageClaimIds.push(claim.claim_id); + byId[claim.claim_id] = claim; + }); + } + + byChannel.all = allClaimIds; + byChannel[page] = currentPageClaimIds; + claimsByChannel[uri] = byChannel; + delete fetchingChannelClaims[uri]; + + return Object.assign({}, state, { + claimsByChannel, + byId, + fetchingChannelClaims, + }); +}; + +reducers[ACTIONS.ABANDON_CLAIM_STARTED] = (state, action) => { + const { claimId } = action.data; + const abandoningById = Object.assign({}, state.abandoningById); + + abandoningById[claimId] = true; + + return Object.assign({}, state, { + abandoningById, + }); +}; + +reducers[ACTIONS.ABANDON_CLAIM_SUCCEEDED] = (state, action) => { + const { claimId } = action.data; + const byId = Object.assign({}, state.byId); + const claimsByUri = Object.assign({}, state.claimsByUri); + + Object.keys(claimsByUri).forEach(uri => { + if (claimsByUri[uri] === claimId) { + delete claimsByUri[uri]; + } + }); + + delete byId[claimId]; + + return Object.assign({}, state, { + byId, + claimsByUri, + }); +}; + +reducers[ACTIONS.CREATE_CHANNEL_COMPLETED] = (state, action) => { + const { channelClaim } = action.data; + const byId = Object.assign({}, state.byId); + const myChannelClaims = new Set(state.myChannelClaims); + + byId[channelClaim.claim_id] = channelClaim; + myChannelClaims.add(channelClaim.claim_id); + + return Object.assign({}, state, { + byId, + myChannelClaims, + }); +}; + +export function claimsReducer(state = defaultState, action) { + const handler = reducers[action.type]; + if (handler) return handler(state, action); + return state; +} diff --git a/src/redux/reducers/cost_info.js b/src/redux/reducers/cost_info.js index 4137bb8..5d738ce 100644 --- a/src/redux/reducers/cost_info.js +++ b/src/redux/reducers/cost_info.js @@ -27,7 +27,7 @@ reducers[ACTIONS.FETCH_COST_INFO_COMPLETED] = (state, action) => { }); }; -export default function reducer(state = defaultState, action) { +export function costInfoReducer(state = defaultState, action) { const handler = reducers[action.type]; if (handler) return handler(state, action); return state; diff --git a/src/redux/reducers/file_info.js b/src/redux/reducers/file_info.js new file mode 100644 index 0000000..c26734c --- /dev/null +++ b/src/redux/reducers/file_info.js @@ -0,0 +1,156 @@ +import * as ACTIONS from 'constants/action_types'; + +const reducers = {}; +const defaultState = {}; + +reducers[ACTIONS.FILE_LIST_STARTED] = state => + Object.assign({}, state, { + isFetchingFileList: true, + }); + +reducers[ACTIONS.FILE_LIST_SUCCEEDED] = (state, action) => { + const { fileInfos } = action.data; + const newByOutpoint = Object.assign({}, state.byOutpoint); + const pendingByOutpoint = Object.assign({}, state.pendingByOutpoint); + + fileInfos.forEach(fileInfo => { + const { outpoint } = fileInfo; + + if (outpoint) newByOutpoint[fileInfo.outpoint] = fileInfo; + }); + + return Object.assign({}, state, { + isFetchingFileList: false, + byOutpoint: newByOutpoint, + pendingByOutpoint, + }); +}; + +reducers[ACTIONS.FETCH_FILE_INFO_STARTED] = (state, action) => { + const { outpoint } = action.data; + const newFetching = Object.assign({}, state.fetching); + + newFetching[outpoint] = true; + + return Object.assign({}, state, { + fetching: newFetching, + }); +}; + +reducers[ACTIONS.FETCH_FILE_INFO_COMPLETED] = (state, action) => { + const { fileInfo, outpoint } = action.data; + + const newByOutpoint = Object.assign({}, state.byOutpoint); + const newFetching = Object.assign({}, state.fetching); + + newByOutpoint[outpoint] = fileInfo; + delete newFetching[outpoint]; + + return Object.assign({}, state, { + byOutpoint: newByOutpoint, + fetching: newFetching, + }); +}; + +reducers[ACTIONS.DOWNLOADING_STARTED] = (state, action) => { + const { uri, outpoint, fileInfo } = action.data; + + const newByOutpoint = Object.assign({}, state.byOutpoint); + const newDownloading = Object.assign({}, state.downloadingByOutpoint); + const newLoading = Object.assign({}, state.urisLoading); + + newDownloading[outpoint] = true; + newByOutpoint[outpoint] = fileInfo; + delete newLoading[uri]; + + return Object.assign({}, state, { + downloadingByOutpoint: newDownloading, + urisLoading: newLoading, + byOutpoint: newByOutpoint, + }); +}; + +reducers[ACTIONS.DOWNLOADING_PROGRESSED] = (state, action) => { + const { outpoint, fileInfo } = action.data; + + const newByOutpoint = Object.assign({}, state.byOutpoint); + const newDownloading = Object.assign({}, state.downloadingByOutpoint); + + newByOutpoint[outpoint] = fileInfo; + newDownloading[outpoint] = true; + + return Object.assign({}, state, { + byOutpoint: newByOutpoint, + downloadingByOutpoint: newDownloading, + }); +}; + +reducers[ACTIONS.DOWNLOADING_COMPLETED] = (state, action) => { + const { outpoint, fileInfo } = action.data; + + const newByOutpoint = Object.assign({}, state.byOutpoint); + const newDownloading = Object.assign({}, state.downloadingByOutpoint); + + newByOutpoint[outpoint] = fileInfo; + delete newDownloading[outpoint]; + + return Object.assign({}, state, { + byOutpoint: newByOutpoint, + downloadingByOutpoint: newDownloading, + }); +}; + +reducers[ACTIONS.FILE_DELETE] = (state, action) => { + const { outpoint } = action.data; + + const newByOutpoint = Object.assign({}, state.byOutpoint); + const downloadingByOutpoint = Object.assign({}, state.downloadingByOutpoint); + + delete newByOutpoint[outpoint]; + delete downloadingByOutpoint[outpoint]; + + return Object.assign({}, state, { + byOutpoint: newByOutpoint, + downloadingByOutpoint, + }); +}; + +reducers[ACTIONS.LOADING_VIDEO_STARTED] = (state, action) => { + const { uri } = action.data; + + const newLoading = Object.assign({}, state.urisLoading); + + newLoading[uri] = true; + + return Object.assign({}, state, { + urisLoading: newLoading, + }); +}; + +reducers[ACTIONS.LOADING_VIDEO_FAILED] = (state, action) => { + const { uri } = action.data; + + const newLoading = Object.assign({}, state.urisLoading); + + delete newLoading[uri]; + + return Object.assign({}, state, { + urisLoading: newLoading, + }); +}; + +reducers[ACTIONS.FETCH_DATE] = (state, action) => { + const { time } = action.data; + if (time) { + return Object.assign({}, state, { + publishedDate: time, + }); + } + return null; +}; + +export function fileInfoReducer(state = defaultState, action) { + const handler = reducers[action.type]; + if (handler) return handler(state, action); + return state; +} diff --git a/src/redux/reducers/search.js b/src/redux/reducers/search.js new file mode 100644 index 0000000..cddf8fc --- /dev/null +++ b/src/redux/reducers/search.js @@ -0,0 +1,32 @@ +import * as ACTIONS from 'constants/action_types'; + +const reducers = {}; +const defaultState = { + urisByQuery: {}, + searching: false, +}; + +reducers[ACTIONS.SEARCH_STARTED] = state => + Object.assign({}, state, { + searching: true, + }); + +reducers[ACTIONS.SEARCH_COMPLETED] = (state, action) => { + const { query, uris } = action.data; + + return Object.assign({}, state, { + searching: false, + urisByQuery: Object.assign({}, state.urisByQuery, { [query]: uris }), + }); +}; + +reducers[ACTIONS.SEARCH_CANCELLED] = state => + Object.assign({}, state, { + searching: false, + }); + +export function searchReducer(state = defaultState, action) { + const handler = reducers[action.type]; + if (handler) return handler(state, action); + return state; +} diff --git a/src/redux/reducers/wallet.js b/src/redux/reducers/wallet.js new file mode 100644 index 0000000..9237178 --- /dev/null +++ b/src/redux/reducers/wallet.js @@ -0,0 +1,148 @@ +import * as ACTIONS from 'constants/action_types'; + +const reducers = {}; +const receiveAddress = localStorage.getItem('receiveAddress'); +const buildDraftTransaction = () => ({ + amount: undefined, + address: undefined, +}); + +const defaultState = { + balance: undefined, + blocks: {}, + transactions: {}, + fetchingTransactions: false, + receiveAddress, + gettingNewAddress: false, + draftTransaction: buildDraftTransaction(), + sendingSupport: false, +}; + +reducers[ACTIONS.FETCH_TRANSACTIONS_STARTED] = state => + Object.assign({}, state, { + fetchingTransactions: true, + }); + +reducers[ACTIONS.FETCH_TRANSACTIONS_COMPLETED] = (state, action) => { + const byId = Object.assign({}, state.transactions); + + const { transactions } = action.data; + + transactions.forEach(transaction => { + byId[transaction.txid] = transaction; + }); + + return Object.assign({}, state, { + transactions: byId, + fetchingTransactions: false, + }); +}; + +reducers[ACTIONS.GET_NEW_ADDRESS_STARTED] = state => + Object.assign({}, state, { + gettingNewAddress: true, + }); + +reducers[ACTIONS.GET_NEW_ADDRESS_COMPLETED] = (state, action) => { + const { address } = action.data; + + localStorage.setItem('receiveAddress', address); + return Object.assign({}, state, { + gettingNewAddress: false, + receiveAddress: address, + }); +}; + +reducers[ACTIONS.UPDATE_BALANCE] = (state, action) => + Object.assign({}, state, { + balance: action.data.balance, + }); + +reducers[ACTIONS.CHECK_ADDRESS_IS_MINE_STARTED] = state => + Object.assign({}, state, { + checkingAddressOwnership: true, + }); + +reducers[ACTIONS.CHECK_ADDRESS_IS_MINE_COMPLETED] = state => + Object.assign({}, state, { + checkingAddressOwnership: false, + }); + +reducers[ACTIONS.SET_DRAFT_TRANSACTION_AMOUNT] = (state, action) => { + const oldDraft = state.draftTransaction; + const newDraft = Object.assign({}, oldDraft, { + amount: parseFloat(action.data.amount), + }); + + return Object.assign({}, state, { + draftTransaction: newDraft, + }); +}; + +reducers[ACTIONS.SET_DRAFT_TRANSACTION_ADDRESS] = (state, action) => { + const oldDraft = state.draftTransaction; + const newDraft = Object.assign({}, oldDraft, { + address: action.data.address, + }); + + return Object.assign({}, state, { + draftTransaction: newDraft, + }); +}; + +reducers[ACTIONS.SEND_TRANSACTION_STARTED] = state => { + const newDraftTransaction = Object.assign({}, state.draftTransaction, { + sending: true, + }); + + return Object.assign({}, state, { + draftTransaction: newDraftTransaction, + }); +}; + +reducers[ACTIONS.SEND_TRANSACTION_COMPLETED] = state => + Object.assign({}, state, { + draftTransaction: buildDraftTransaction(), + }); + +reducers[ACTIONS.SEND_TRANSACTION_FAILED] = (state, action) => { + const newDraftTransaction = Object.assign({}, state.draftTransaction, { + sending: false, + error: action.data.error, + }); + + return Object.assign({}, state, { + draftTransaction: newDraftTransaction, + }); +}; + +reducers[ACTIONS.SUPPORT_TRANSACTION_STARTED] = state => + Object.assign({}, state, { + sendingSupport: true, + }); + +reducers[ACTIONS.SUPPORT_TRANSACTION_COMPLETED] = state => + Object.assign({}, state, { + sendingSupport: false, + }); + +reducers[ACTIONS.SUPPORT_TRANSACTION_FAILED] = (state, action) => + Object.assign({}, state, { + error: action.data.error, + sendingSupport: false, + }); + +reducers[ACTIONS.FETCH_BLOCK_SUCCESS] = (state, action) => { + const { block, block: { height } } = action.data; + const blocks = Object.assign({}, state.blocks); + + blocks[height] = block; + + return Object.assign({}, state, { blocks }); +}; + +export function walletReducer(state = defaultState, action) { + const handler = reducers[action.type]; + if (handler) return handler(state, action); + return state; +} diff --git a/src/redux/selectors/claims.js b/src/redux/selectors/claims.js index 5610880..b85e282 100644 --- a/src/redux/selectors/claims.js +++ b/src/redux/selectors/claims.js @@ -1,3 +1,5 @@ +import Lbryuri from 'lbryuri'; +import { makeSelectCurrentParam } from 'redux/selectors/navigation'; import { createSelector } from 'reselect'; const selectState = state => state.claims || {}; @@ -22,4 +24,159 @@ export const selectClaimsByUri = createSelector(selectState, selectClaimsById, ( }); return claims; -}); \ No newline at end of file +}); + +export const selectAllClaimsByChannel = createSelector( + selectState, + state => state.claimsByChannel || {} +); + +export const makeSelectClaimForUri = uri => + createSelector(selectClaimsByUri, claims => claims && claims[Lbryuri.normalize(uri)]); + +export const selectMyClaimsRaw = createSelector(selectState, state => state.myClaims); + +export const selectAbandoningIds = createSelector(selectState, state => + Object.keys(state.abandoningById || {}) +); + +export const selectMyActiveClaims = createSelector( + selectMyClaimsRaw, + selectAbandoningIds, + (claims, abandoningIds) => + new Set( + claims && + claims + .map(claim => claim.claim_id) + .filter(claimId => Object.keys(abandoningIds).indexOf(claimId) === -1) + ) +); + +export const makeSelectClaimIsMine = rawUri => { + const uri = Lbryuri.normalize(rawUri); + return createSelector( + selectClaimsByUri, + selectMyActiveClaims, + (claims, myClaims) => + claims && claims[uri] && claims[uri].claim_id && myClaims.has(claims[uri].claim_id) + ); +}; + +export const selectAllFetchingChannelClaims = createSelector( + selectState, + state => state.fetchingChannelClaims || {} +); + +export const makeSelectFetchingChannelClaims = uri => + createSelector(selectAllFetchingChannelClaims, fetching => fetching && fetching[uri]); + +export const makeSelectClaimsInChannelForCurrentPage = uri => { + const pageSelector = makeSelectCurrentParam('page'); + + return createSelector( + selectClaimsById, + selectAllClaimsByChannel, + pageSelector, + (byId, allClaims, page) => { + const byChannel = allClaims[uri] || {}; + const claimIds = byChannel[page || 1]; + + if (!claimIds) return claimIds; + + return claimIds.map(claimId => byId[claimId]); + } + ); +}; + +export const makeSelectMetadataForUri = uri => + createSelector(makeSelectClaimForUri(uri), claim => { + const metadata = claim && claim.value && claim.value.stream && claim.value.stream.metadata; + + return metadata || (claim === undefined ? undefined : null); + }); + +export const makeSelectTitleForUri = uri => + createSelector(makeSelectMetadataForUri(uri), metadata => metadata && metadata.title); + +export const makeSelectContentTypeForUri = uri => + createSelector(makeSelectClaimForUri(uri), claim => { + const source = claim && claim.value && claim.value.stream && claim.value.stream.source; + return source ? source.contentType : undefined; + }); + +export const selectIsFetchingClaimListMine = createSelector( + selectState, + state => state.isFetchingClaimListMine +); + +export const selectPendingClaims = createSelector(selectState, state => + Object.values(state.pendingById || {}) +); + +export const selectMyClaims = createSelector( + selectMyActiveClaims, + selectClaimsById, + selectAbandoningIds, + selectPendingClaims, + (myClaimIds, byId, abandoningIds, pendingClaims) => { + const claims = []; + + myClaimIds.forEach(id => { + const claim = byId[id]; + + if (claim && abandoningIds.indexOf(id) === -1) claims.push(claim); + }); + + return [...claims, ...pendingClaims]; + } +); + +export const selectMyClaimsWithoutChannels = createSelector(selectMyClaims, myClaims => + myClaims.filter(claim => !claim.name.match(/^@/)) +); + +export const selectAllMyClaimsByOutpoint = createSelector( + selectMyClaimsRaw, + claims => + new Set(claims && claims.length ? claims.map(claim => `${claim.txid}:${claim.nout}`) : null) +); + +export const selectMyClaimsOutpoints = createSelector(selectMyClaims, myClaims => { + const outpoints = []; + + myClaims.forEach(claim => outpoints.push(`${claim.txid}:${claim.nout}`)); + + return outpoints; +}); + +export const selectFetchingMyChannels = createSelector( + selectState, + state => state.fetchingMyChannels +); + +export const selectMyChannelClaims = createSelector( + selectState, + selectClaimsById, + (state, byId) => { + const ids = state.myChannelClaims || []; + const claims = []; + + ids.forEach(id => { + if (byId[id]) { + // I'm not sure why this check is necessary, but it ought to be a quick fix for https://github.com/lbryio/lbry-app/issues/544 + claims.push(byId[id]); + } + }); + + return claims; + } +); + +export const selectResolvingUris = createSelector(selectState, state => state.resolvingUris || []); + +export const makeSelectIsUriResolving = uri => + createSelector( + selectResolvingUris, + resolvingUris => resolvingUris && resolvingUris.indexOf(uri) !== -1 + ); + diff --git a/src/redux/selectors/cost_info.js b/src/redux/selectors/cost_info.js index bcfb5a6..04d5b09 100644 --- a/src/redux/selectors/cost_info.js +++ b/src/redux/selectors/cost_info.js @@ -1,5 +1,5 @@ import { createSelector } from 'reselect'; -//import { selectCurrentParams } from 'redux/selectors/navigation'; +import { selectCurrentParams } from 'redux/selectors/navigation'; export const selectState = state => state.costInfo || {}; @@ -10,7 +10,7 @@ export const makeSelectCostInfoForUri = uri => export const selectCostForCurrentPageUri = createSelector( selectAllCostInfoByUri, - {}/*selectCurrentParams*/, + selectCurrentParams, (costInfo, params) => (params.uri && costInfo[params.uri] ? costInfo[params.uri].cost : undefined) ); diff --git a/src/redux/selectors/file_info.js b/src/redux/selectors/file_info.js new file mode 100644 index 0000000..f760bb3 --- /dev/null +++ b/src/redux/selectors/file_info.js @@ -0,0 +1,106 @@ +import { + selectClaimsByUri, + selectIsFetchingClaimListMine, + selectMyClaims, +} from 'redux/selectors/claims'; +import { createSelector } from 'reselect'; + +export const selectState = state => state.fileInfo || {}; + +export const selectFileInfosByOutpoint = createSelector( + selectState, + state => state.byOutpoint || {} +); + +export const selectIsFetchingFileList = createSelector( + selectState, + state => state.isFetchingFileList +); + +export const selectIsFetchingFileListDownloadedOrPublished = createSelector( + selectIsFetchingFileList, + selectIsFetchingClaimListMine, + (isFetchingFileList, isFetchingClaimListMine) => isFetchingFileList || isFetchingClaimListMine +); + +export const makeSelectFileInfoForUri = uri => + createSelector(selectClaimsByUri, selectFileInfosByOutpoint, (claims, byOutpoint) => { + const claim = claims[uri]; + const outpoint = claim ? `${claim.txid}:${claim.nout}` : undefined; + + return outpoint ? byOutpoint[outpoint] : undefined; + }); + +export const selectDownloadingByOutpoint = createSelector( + selectState, + state => state.downloadingByOutpoint || {} +); + +export const makeSelectDownloadingForUri = uri => + createSelector( + selectDownloadingByOutpoint, + makeSelectFileInfoForUri(uri), + (byOutpoint, fileInfo) => { + if (!fileInfo) return false; + return byOutpoint[fileInfo.outpoint]; + } + ); + +export const selectUrisLoading = createSelector(selectState, state => state.urisLoading || {}); + +export const makeSelectLoadingForUri = uri => + createSelector(selectUrisLoading, byUri => byUri && byUri[uri]); + +export const selectFileInfosDownloaded = createSelector( + selectFileInfosByOutpoint, + selectMyClaims, + (byOutpoint, myClaims) => + Object.values(byOutpoint).filter(fileInfo => { + const myClaimIds = myClaims.map(claim => claim.claim_id); + + return ( + fileInfo && + myClaimIds.indexOf(fileInfo.claim_id) === -1 && + (fileInfo.completed || fileInfo.written_bytes) + ); + }) +); + +// export const selectFileInfoForUri = (state, props) => { +// const claims = selectClaimsByUri(state), +// claim = claims[props.uri], +// fileInfos = selectAllFileInfos(state), +// outpoint = claim ? `${claim.txid}:${claim.nout}` : undefined; + +// return outpoint && fileInfos ? fileInfos[outpoint] : undefined; +// }; + +export const selectDownloadingFileInfos = createSelector( + selectDownloadingByOutpoint, + selectFileInfosByOutpoint, + (downloadingByOutpoint, fileInfosByOutpoint) => { + const outpoints = Object.keys(downloadingByOutpoint); + const fileInfos = []; + + outpoints.forEach(outpoint => { + const fileInfo = fileInfosByOutpoint[outpoint]; + + if (fileInfo) fileInfos.push(fileInfo); + }); + + return fileInfos; + } +); + +export const selectTotalDownloadProgress = createSelector(selectDownloadingFileInfos, fileInfos => { + const progress = []; + + fileInfos.forEach(fileInfo => { + progress.push(fileInfo.written_bytes / fileInfo.total_bytes * 100); + }); + + const totalProgress = progress.reduce((a, b) => a + b, 0); + + if (fileInfos.length > 0) return totalProgress / fileInfos.length / 100.0; + return -1; +}); diff --git a/src/redux/selectors/navigation.js b/src/redux/selectors/navigation.js new file mode 100644 index 0000000..dc0b507 --- /dev/null +++ b/src/redux/selectors/navigation.js @@ -0,0 +1,139 @@ +import { createSelector } from 'reselect'; +import { parseQueryParams, toQueryString } from 'util/query_params'; +import Lbryuri from 'lbryuri'; + +export const selectState = state => state.navigation || {}; + +export const selectCurrentPath = createSelector(selectState, state => state.currentPath); + +export const computePageFromPath = path => path.replace(/^\//, '').split('?')[0]; + +export const selectCurrentPage = createSelector(selectCurrentPath, path => + computePageFromPath(path) +); + +export const selectCurrentParams = createSelector(selectCurrentPath, path => { + if (path === undefined) return {}; + if (!path.match(/\?/)) return {}; + + return parseQueryParams(path.split('?')[1]); +}); + +export const makeSelectCurrentParam = param => + createSelector(selectCurrentParams, params => (params ? params[param] : undefined)); + +export const selectHeaderLinks = createSelector(selectCurrentPage, page => { + // This contains intentional fall throughs + switch (page) { + case 'wallet': + case 'history': + case 'send': + case 'getcredits': + case 'invite': + case 'rewards': + case 'backup': + return { + wallet: __('Overview'), + getcredits: __('Get Credits'), + send: __('Send / Receive'), + rewards: __('Rewards'), + invite: __('Invites'), + history: __('History'), + }; + case 'downloaded': + case 'published': + return { + downloaded: __('Downloaded'), + published: __('Published'), + }; + case 'settings': + case 'help': + return { + settings: __('Settings'), + help: __('Help'), + }; + case 'discover': + case 'subscriptions': + return { + discover: __('Discover'), + subscriptions: __('Subscriptions'), + }; + default: + return null; + } +}); + +export const selectPageTitle = createSelector( + selectCurrentPage, + selectCurrentParams, + (page, params) => { + switch (page) { + case 'settings': + return __('Settings'); + case 'report': + return __('Report'); + case 'wallet': + return __('Wallet'); + case 'send': + return __('Send or Receive LBRY Credits'); + case 'getcredits': + return __('Get LBRY Credits'); + case 'backup': + return __('Backup Your Wallet'); + case 'rewards': + return __('Rewards'); + case 'invite': + return __('Invites'); + case 'start': + return __('Start'); + case 'publish': + return params.id ? __('Edit') : __('Publish'); + case 'help': + return __('Help'); + case 'developer': + return __('Developer'); + case 'show': { + const parts = [Lbryuri.normalize(params.uri)]; + // If the params has any keys other than "uri" + if (Object.keys(params).length > 1) { + parts.push(toQueryString(Object.assign({}, params, { uri: null }))); + } + return parts.join('?'); + } + case 'downloaded': + return __('Downloads & Purchases'); + case 'published': + return __('Publications'); + case 'search': + return params.query ? __('Search results for %s', params.query) : __('Search'); + case 'subscriptions': + return __('Your Subscriptions'); + case 'discover': + case false: + case null: + case '': + return ''; + default: + return page[0].toUpperCase() + (page.length > 0 ? page.substr(1) : ''); + } + } +); + +export const selectPathAfterAuth = createSelector(selectState, state => state.pathAfterAuth); + +export const selectIsBackDisabled = createSelector(selectState, state => state.index === 0); + +export const selectIsForwardDisabled = createSelector( + selectState, + state => state.index === state.stack.length - 1 +); + +export const selectHistoryIndex = createSelector(selectState, state => state.index); + +export const selectHistoryStack = createSelector(selectState, state => state.stack); + +// returns current page attributes (scrollY, path) +export const selectActiveHistoryEntry = createSelector( + selectState, + state => state.stack[state.index] +); diff --git a/src/redux/selectors/search.js b/src/redux/selectors/search.js new file mode 100644 index 0000000..4e49f47 --- /dev/null +++ b/src/redux/selectors/search.js @@ -0,0 +1,79 @@ +import { + selectCurrentPage, + selectCurrentParams, + selectPageTitle, +} from 'redux/selectors/navigation'; +import { createSelector } from 'reselect'; + +export const selectState = state => state.search || {}; + +export const selectSearchQuery = createSelector( + selectCurrentPage, + selectCurrentParams, + (page, params) => (page === 'search' ? params && params.query : null) +); + +export const selectIsSearching = createSelector(selectState, state => state.searching); + +export const selectSearchUrisByQuery = createSelector(selectState, state => state.urisByQuery); + +export const makeSelectSearchUris = query => + // replace statement below is kind of ugly, and repeated in doSearch action + createSelector( + selectSearchUrisByQuery, + byQuery => byQuery[query ? query.replace(/^lbry:\/\//i, '') : query] + ); + +export const selectWunderBarAddress = createSelector( + selectCurrentPage, + selectPageTitle, + selectSearchQuery, + (page, title, query) => (page !== 'search' ? title : query || title) +); + +export const selectWunderBarIcon = createSelector( + selectCurrentPage, + selectCurrentParams, + (page, params) => { + switch (page) { + case 'auth': + return 'icon-user'; + case 'settings': + return 'icon-gear'; + case 'help': + return 'icon-question'; + case 'report': + return 'icon-file'; + case 'downloaded': + return 'icon-folder'; + case 'published': + return 'icon-folder'; + case 'history': + return 'icon-history'; + case 'send': + return 'icon-send'; + case 'rewards': + return 'icon-rocket'; + case 'invite': + return 'icon-envelope-open'; + case 'getcredits': + return 'icon-shopping-cart'; + case 'wallet': + case 'backup': + return 'icon-bank'; + case 'show': + return 'icon-file'; + case 'publish': + return params.id ? __('icon-pencil') : __('icon-upload'); + case 'developer': + return 'icon-code'; + case 'discover': + case 'search': + return 'icon-search'; + case 'subscriptions': + return 'icon-th-list'; + default: + return 'icon-file'; + } + } +); diff --git a/src/redux/selectors/wallet.js b/src/redux/selectors/wallet.js new file mode 100644 index 0000000..bddedb8 --- /dev/null +++ b/src/redux/selectors/wallet.js @@ -0,0 +1,125 @@ +import { createSelector } from 'reselect'; + +export const selectState = state => state.wallet || {}; + +export const selectBalance = createSelector(selectState, state => state.balance); + +export const selectTransactionsById = createSelector(selectState, state => state.transactions); + +export const selectTransactionItems = createSelector(selectTransactionsById, byId => { + const items = []; + + Object.keys(byId).forEach(txid => { + const tx = byId[txid]; + + // ignore dust/fees + // it is fee only txn if all infos are also empty + if ( + Math.abs(tx.value) === Math.abs(tx.fee) && + tx.claim_info.length === 0 && + tx.support_info.length === 0 && + tx.update_info.length === 0 + ) { + return; + } + + const append = []; + + append.push( + ...tx.claim_info.map(item => + Object.assign({}, tx, item, { + type: item.claim_name[0] === '@' ? 'channel' : 'publish', + }) + ) + ); + append.push( + ...tx.support_info.map(item => + Object.assign({}, tx, item, { + type: !item.is_tip ? 'support' : 'tip', + }) + ) + ); + append.push(...tx.update_info.map(item => Object.assign({}, tx, item, { type: 'update' }))); + + if (!append.length) { + append.push( + Object.assign({}, tx, { + type: tx.value < 0 ? 'spend' : 'receive', + }) + ); + } + + items.push( + ...append.map(item => { + // value on transaction, amount on outpoint + // amount is always positive, but should match sign of value + const amount = parseFloat(item.balance_delta ? item.balance_delta : item.value); + + return { + txid, + date: tx.timestamp ? new Date(Number(tx.timestamp) * 1000) : null, + amount, + fee: amount < 0 ? -1 * tx.fee / append.length : 0, + claim_id: item.claim_id, + claim_name: item.claim_name, + type: item.type || 'send', + nout: item.nout, + }; + }) + ); + }); + return items.reverse(); +}); + +export const selectRecentTransactions = createSelector(selectTransactionItems, transactions => { + const threshold = new Date(); + threshold.setDate(threshold.getDate() - 7); + return transactions.filter(transaction => transaction.date > threshold); +}); + +export const selectHasTransactions = createSelector( + selectTransactionItems, + transactions => transactions && transactions.length > 0 +); + +export const selectIsFetchingTransactions = createSelector( + selectState, + state => state.fetchingTransactions +); + +export const selectIsSendingSupport = createSelector(selectState, state => state.sendingSupport); + +export const selectReceiveAddress = createSelector(selectState, state => state.receiveAddress); + +export const selectGettingNewAddress = createSelector( + selectState, + state => state.gettingNewAddress +); + +export const selectDraftTransaction = createSelector( + selectState, + state => state.draftTransaction || {} +); + +export const selectDraftTransactionAmount = createSelector( + selectDraftTransaction, + draft => draft.amount +); + +export const selectDraftTransactionAddress = createSelector( + selectDraftTransaction, + draft => draft.address +); + +export const selectDraftTransactionError = createSelector( + selectDraftTransaction, + draft => draft.error +); + +export const selectBlocks = createSelector(selectState, state => state.blocks); + +export const makeSelectBlockDate = block => + createSelector( + selectBlocks, + blocks => (blocks && blocks[block] ? new Date(blocks[block].time * 1000) : undefined) + ); diff --git a/src/util/batchActions.js b/src/util/batchActions.js new file mode 100644 index 0000000..4bc4eee --- /dev/null +++ b/src/util/batchActions.js @@ -0,0 +1,9 @@ +// https://github.com/reactjs/redux/issues/911 +function batchActions(...actions) { + return { + type: 'BATCH_ACTIONS', + actions, + }; +} + +export default batchActions; diff --git a/src/util/query_params.js b/src/util/query_params.js new file mode 100644 index 0000000..e7f04d1 --- /dev/null +++ b/src/util/query_params.js @@ -0,0 +1,28 @@ +export function parseQueryParams(queryString) { + if (queryString === '') return {}; + const parts = queryString + .split('?') + .pop() + .split('&') + .map(p => p.split('=')); + + const params = {}; + parts.forEach(array => { + const [first, second] = array; + params[first] = second; + }); + return params; +} + +export function toQueryString(params) { + if (!params) return ''; + + const parts = []; + Object.keys(params).forEach(key => { + if (Object.prototype.hasOwnProperty.call(params, key) && params[key]) { + parts.push(`${key}=${params[key]}`); + } + }); + + return parts.join('&'); +} diff --git a/webpack.config.js b/webpack.config.js index 3c8c34b..1bb41cf 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -4,7 +4,7 @@ module.exports = { output: { path: path.resolve(__dirname, 'build'), filename: 'index.js', - libraryTarget: 'commonjs2' + libraryTarget: 'umd' }, module: { rules: [ -- 2.45.3 From 89104793bbcabc92f9f5503439db0fc61e076848 Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Wed, 17 Jan 2018 13:24:35 +0100 Subject: [PATCH 02/41] added a few common app actions, and wallet actions and selectors --- build/index.js | 2409 ++++++++++++++++++++++++-------------- src/index.js | 40 +- src/redux/actions/app.js | 24 + 3 files changed, 1572 insertions(+), 901 deletions(-) create mode 100644 src/redux/actions/app.js diff --git a/build/index.js b/build/index.js index f90f0a5..c30743a 100644 --- a/build/index.js +++ b/build/index.js @@ -70,7 +70,7 @@ return /******/ (function(modules) { // webpackBootstrap /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 10); +/******/ return __webpack_require__(__webpack_require__.s = 12); /******/ }) /************************************************************************/ /******/ ([ @@ -255,615 +255,6 @@ var MEDIA_POSITION = exports.MEDIA_POSITION = 'MEDIA_POSITION'; "use strict"; -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; - -var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); - -var CHANNEL_NAME_MIN_LEN = 1; -var CLAIM_ID_MAX_LEN = 40; - -var Lbryuri = {}; - -Lbryuri.REGEXP_INVALID_URI = /[^A-Za-z0-9-]/g; -Lbryuri.REGEXP_ADDRESS = /^b(?=[^0OIl]{32,33})[0-9A-Za-z]{32,33}$/; - -/** - * Parses a LBRY name into its component parts. Throws errors with user-friendly - * messages for invalid names. - * - * N.B. that "name" indicates the value in the name position of the URI. For - * claims for channel content, this will actually be the channel name, and - * the content name is in the path (e.g. lbry://@channel/content) - * - * In most situations, you'll want to use the contentName and channelName keys - * and ignore the name key. - * - * Returns a dictionary with keys: - * - name (string): The value in the "name" position in the URI. Note that this - * could be either content name or channel name; see above. - * - path (string, if persent) - * - claimSequence (int, if present) - * - bidPosition (int, if present) - * - claimId (string, if present) - * - isChannel (boolean) - * - contentName (string): For anon claims, the name; for channel claims, the path - * - channelName (string, if present): Channel name without @ - */ -Lbryuri.parse = function (uri) { - var requireProto = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - - // Break into components. Empty sub-matches are converted to null - var componentsRegex = new RegExp('^((?:lbry://)?)' + // protocol - '([^:$#/]*)' + // name (stops at the first separator or end) - '([:$#]?)([^/]*)' + // modifier separator, modifier (stops at the first path separator or end) - '(/?)(.*)' // path separator, path - ); - - var _componentsRegex$exec = componentsRegex.exec(uri).slice(1).map(function (match) { - return match || null; - }), - _componentsRegex$exec2 = _slicedToArray(_componentsRegex$exec, 6), - proto = _componentsRegex$exec2[0], - name = _componentsRegex$exec2[1], - modSep = _componentsRegex$exec2[2], - modVal = _componentsRegex$exec2[3], - pathSep = _componentsRegex$exec2[4], - path = _componentsRegex$exec2[5]; - - var contentName = void 0; - - // Validate protocol - if (requireProto && !proto) { - throw new Error(__('LBRY URIs must include a protocol prefix (lbry://).')); - } - - // Validate and process name - if (!name) { - throw new Error(__('URI does not include name.')); - } - - var isChannel = name.startsWith('@'); - var channelName = isChannel ? name.slice(1) : name; - - if (isChannel) { - if (!channelName) { - throw new Error(__('No channel name after @.')); - } - - if (channelName.length < CHANNEL_NAME_MIN_LEN) { - throw new Error(__('Channel names must be at least %s characters.', CHANNEL_NAME_MIN_LEN)); - } - - contentName = path; - } - - var nameBadChars = (channelName || name).match(Lbryuri.REGEXP_INVALID_URI); - if (nameBadChars) { - throw new Error(__('Invalid character %s in name: %s.', nameBadChars.length === 1 ? '' : 's', nameBadChars.join(', '))); - } - - // Validate and process modifier (claim ID, bid position or claim sequence) - var claimId = void 0; - var claimSequence = void 0; - var bidPosition = void 0; - if (modSep) { - if (!modVal) { - throw new Error(__('No modifier provided after separator %s.', modSep)); - } - - if (modSep === '#') { - claimId = modVal; - } else if (modSep === ':') { - claimSequence = modVal; - } else if (modSep === '$') { - bidPosition = modVal; - } - } - - if (claimId && (claimId.length > CLAIM_ID_MAX_LEN || !claimId.match(/^[0-9a-f]+$/)) && !claimId.match(/^pending/) // ought to be dropped when savePendingPublish drops hack - ) { - throw new Error(__('Invalid claim ID %s.', claimId)); - } - - if (claimSequence && !claimSequence.match(/^-?[1-9][0-9]*$/)) { - throw new Error(__('Claim sequence must be a number.')); - } - - if (bidPosition && !bidPosition.match(/^-?[1-9][0-9]*$/)) { - throw new Error(__('Bid position must be a number.')); - } - - // Validate and process path - if (path) { - if (!isChannel) { - throw new Error(__('Only channel URIs may have a path.')); - } - - var pathBadChars = path.match(Lbryuri.REGEXP_INVALID_URI); - if (pathBadChars) { - throw new Error(__('Invalid character in path: %s', pathBadChars.join(', '))); - } - - contentName = path; - } else if (pathSep) { - throw new Error(__('No path provided after /')); - } - - return _extends({ - name: name, - path: path, - isChannel: isChannel - }, contentName ? { contentName: contentName } : {}, channelName ? { channelName: channelName } : {}, claimSequence ? { claimSequence: parseInt(claimSequence, 10) } : {}, bidPosition ? { bidPosition: parseInt(bidPosition, 10) } : {}, claimId ? { claimId: claimId } : {}, path ? { path: path } : {}); -}; - -/** - * Takes an object in the same format returned by lbryuri.parse() and builds a URI. - * - * The channelName key will accept names with or without the @ prefix. - */ -Lbryuri.build = function (uriObj) { - var includeProto = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; - var claimId = uriObj.claimId, - claimSequence = uriObj.claimSequence, - bidPosition = uriObj.bidPosition, - contentName = uriObj.contentName, - channelName = uriObj.channelName; - var name = uriObj.name, - path = uriObj.path; - - - if (channelName) { - var channelNameFormatted = channelName.startsWith('@') ? channelName : '@' + channelName; - if (!name) { - name = channelNameFormatted; - } else if (name !== channelNameFormatted) { - throw new Error(__('Received a channel content URI, but name and channelName do not match. "name" represents the value in the name position of the URI (lbry://name...), which for channel content will be the channel name. In most cases, to construct a channel URI you should just pass channelName and contentName.')); - } - } - - if (contentName) { - if (!name) { - name = contentName; - } else if (!path) { - path = contentName; - } - if (path && path !== contentName) { - throw new Error(__('Path and contentName do not match. Only one is required; most likely you wanted contentName.')); - } - } - - return (includeProto ? 'lbry://' : '') + name + (claimId ? '#' + claimId : '') + (claimSequence ? ':' + claimSequence : '') + (bidPosition ? '' + bidPosition : '') + (path ? '/' + path : ''); -}; - -/* Takes a parseable LBRY URI and converts it to standard, canonical format (currently this just - * consists of adding the lbry:// prefix if needed) */ -Lbryuri.normalize = function (uri) { - if (uri.match(/pending_claim/)) return uri; - - var _Lbryuri$parse = Lbryuri.parse(uri), - name = _Lbryuri$parse.name, - path = _Lbryuri$parse.path, - bidPosition = _Lbryuri$parse.bidPosition, - claimSequence = _Lbryuri$parse.claimSequence, - claimId = _Lbryuri$parse.claimId; - - return Lbryuri.build({ name: name, path: path, claimSequence: claimSequence, bidPosition: bidPosition, claimId: claimId }); -}; - -Lbryuri.isValid = function (uri) { - var parts = void 0; - try { - parts = Lbryuri.parse(Lbryuri.normalize(uri)); - } catch (error) { - return false; - } - return parts && parts.name; -}; - -Lbryuri.isValidName = function (name) { - var checkCase = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; - - var regexp = new RegExp('^[a-z0-9-]+$', checkCase ? '' : 'i'); - return regexp.test(name); -}; - -Lbryuri.isClaimable = function (uri) { - var parts = void 0; - try { - parts = Lbryuri.parse(Lbryuri.normalize(uri)); - } catch (error) { - return false; - } - return parts && parts.name && !parts.claimId && !parts.bidPosition && !parts.claimSequence && !parts.isChannel && !parts.path; -}; - -if (window) { - window.lbryuri = Lbryuri; -} -exports.default = Lbryuri; - -/***/ }), -/* 2 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.makeSelectIsUriResolving = exports.selectResolvingUris = exports.selectMyChannelClaims = exports.selectFetchingMyChannels = exports.selectMyClaimsOutpoints = exports.selectAllMyClaimsByOutpoint = exports.selectMyClaimsWithoutChannels = exports.selectMyClaims = exports.selectPendingClaims = exports.selectIsFetchingClaimListMine = exports.makeSelectContentTypeForUri = exports.makeSelectTitleForUri = exports.makeSelectMetadataForUri = exports.makeSelectClaimsInChannelForCurrentPage = exports.makeSelectFetchingChannelClaims = exports.selectAllFetchingChannelClaims = exports.makeSelectClaimIsMine = exports.selectMyActiveClaims = exports.selectAbandoningIds = exports.selectMyClaimsRaw = exports.makeSelectClaimForUri = exports.selectAllClaimsByChannel = exports.selectClaimsByUri = exports.selectClaimsById = undefined; - -var _lbryuri = __webpack_require__(1); - -var _lbryuri2 = _interopRequireDefault(_lbryuri); - -var _navigation = __webpack_require__(3); - -var _reselect = __webpack_require__(4); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } - -var selectState = function selectState(state) { - return state.claims || {}; -}; - -var selectClaimsById = exports.selectClaimsById = (0, _reselect.createSelector)(selectState, function (state) { - return state.byId || {}; -}); - -var selectClaimsByUri = exports.selectClaimsByUri = (0, _reselect.createSelector)(selectState, selectClaimsById, function (state, byId) { - var byUri = state.claimsByUri || {}; - var claims = {}; - - Object.keys(byUri).forEach(function (uri) { - var claimId = byUri[uri]; - - // NOTE returning a null claim allows us to differentiate between an - // undefined (never fetched claim) and one which just doesn't exist. Not - // the cleanest solution but couldn't think of anything better right now - if (claimId === null) { - claims[uri] = null; - } else { - claims[uri] = byId[claimId]; - } - }); - - return claims; -}); - -var selectAllClaimsByChannel = exports.selectAllClaimsByChannel = (0, _reselect.createSelector)(selectState, function (state) { - return state.claimsByChannel || {}; -}); - -var makeSelectClaimForUri = exports.makeSelectClaimForUri = function makeSelectClaimForUri(uri) { - return (0, _reselect.createSelector)(selectClaimsByUri, function (claims) { - return claims && claims[_lbryuri2.default.normalize(uri)]; - }); -}; - -var selectMyClaimsRaw = exports.selectMyClaimsRaw = (0, _reselect.createSelector)(selectState, function (state) { - return state.myClaims; -}); - -var selectAbandoningIds = exports.selectAbandoningIds = (0, _reselect.createSelector)(selectState, function (state) { - return Object.keys(state.abandoningById || {}); -}); - -var selectMyActiveClaims = exports.selectMyActiveClaims = (0, _reselect.createSelector)(selectMyClaimsRaw, selectAbandoningIds, function (claims, abandoningIds) { - return new Set(claims && claims.map(function (claim) { - return claim.claim_id; - }).filter(function (claimId) { - return Object.keys(abandoningIds).indexOf(claimId) === -1; - })); -}); - -var makeSelectClaimIsMine = exports.makeSelectClaimIsMine = function makeSelectClaimIsMine(rawUri) { - var uri = _lbryuri2.default.normalize(rawUri); - return (0, _reselect.createSelector)(selectClaimsByUri, selectMyActiveClaims, function (claims, myClaims) { - return claims && claims[uri] && claims[uri].claim_id && myClaims.has(claims[uri].claim_id); - }); -}; - -var selectAllFetchingChannelClaims = exports.selectAllFetchingChannelClaims = (0, _reselect.createSelector)(selectState, function (state) { - return state.fetchingChannelClaims || {}; -}); - -var makeSelectFetchingChannelClaims = exports.makeSelectFetchingChannelClaims = function makeSelectFetchingChannelClaims(uri) { - return (0, _reselect.createSelector)(selectAllFetchingChannelClaims, function (fetching) { - return fetching && fetching[uri]; - }); -}; - -var makeSelectClaimsInChannelForCurrentPage = exports.makeSelectClaimsInChannelForCurrentPage = function makeSelectClaimsInChannelForCurrentPage(uri) { - var pageSelector = (0, _navigation.makeSelectCurrentParam)('page'); - - return (0, _reselect.createSelector)(selectClaimsById, selectAllClaimsByChannel, pageSelector, function (byId, allClaims, page) { - var byChannel = allClaims[uri] || {}; - var claimIds = byChannel[page || 1]; - - if (!claimIds) return claimIds; - - return claimIds.map(function (claimId) { - return byId[claimId]; - }); - }); -}; - -var makeSelectMetadataForUri = exports.makeSelectMetadataForUri = function makeSelectMetadataForUri(uri) { - return (0, _reselect.createSelector)(makeSelectClaimForUri(uri), function (claim) { - var metadata = claim && claim.value && claim.value.stream && claim.value.stream.metadata; - - return metadata || (claim === undefined ? undefined : null); - }); -}; - -var makeSelectTitleForUri = exports.makeSelectTitleForUri = function makeSelectTitleForUri(uri) { - return (0, _reselect.createSelector)(makeSelectMetadataForUri(uri), function (metadata) { - return metadata && metadata.title; - }); -}; - -var makeSelectContentTypeForUri = exports.makeSelectContentTypeForUri = function makeSelectContentTypeForUri(uri) { - return (0, _reselect.createSelector)(makeSelectClaimForUri(uri), function (claim) { - var source = claim && claim.value && claim.value.stream && claim.value.stream.source; - return source ? source.contentType : undefined; - }); -}; - -var selectIsFetchingClaimListMine = exports.selectIsFetchingClaimListMine = (0, _reselect.createSelector)(selectState, function (state) { - return state.isFetchingClaimListMine; -}); - -var selectPendingClaims = exports.selectPendingClaims = (0, _reselect.createSelector)(selectState, function (state) { - return Object.values(state.pendingById || {}); -}); - -var selectMyClaims = exports.selectMyClaims = (0, _reselect.createSelector)(selectMyActiveClaims, selectClaimsById, selectAbandoningIds, selectPendingClaims, function (myClaimIds, byId, abandoningIds, pendingClaims) { - var claims = []; - - myClaimIds.forEach(function (id) { - var claim = byId[id]; - - if (claim && abandoningIds.indexOf(id) === -1) claims.push(claim); - }); - - return [].concat(claims, _toConsumableArray(pendingClaims)); -}); - -var selectMyClaimsWithoutChannels = exports.selectMyClaimsWithoutChannels = (0, _reselect.createSelector)(selectMyClaims, function (myClaims) { - return myClaims.filter(function (claim) { - return !claim.name.match(/^@/); - }); -}); - -var selectAllMyClaimsByOutpoint = exports.selectAllMyClaimsByOutpoint = (0, _reselect.createSelector)(selectMyClaimsRaw, function (claims) { - return new Set(claims && claims.length ? claims.map(function (claim) { - return claim.txid + ':' + claim.nout; - }) : null); -}); - -var selectMyClaimsOutpoints = exports.selectMyClaimsOutpoints = (0, _reselect.createSelector)(selectMyClaims, function (myClaims) { - var outpoints = []; - - myClaims.forEach(function (claim) { - return outpoints.push(claim.txid + ':' + claim.nout); - }); - - return outpoints; -}); - -var selectFetchingMyChannels = exports.selectFetchingMyChannels = (0, _reselect.createSelector)(selectState, function (state) { - return state.fetchingMyChannels; -}); - -var selectMyChannelClaims = exports.selectMyChannelClaims = (0, _reselect.createSelector)(selectState, selectClaimsById, function (state, byId) { - var ids = state.myChannelClaims || []; - var claims = []; - - ids.forEach(function (id) { - if (byId[id]) { - // I'm not sure why this check is necessary, but it ought to be a quick fix for https://github.com/lbryio/lbry-app/issues/544 - claims.push(byId[id]); - } - }); - - return claims; -}); - -var selectResolvingUris = exports.selectResolvingUris = (0, _reselect.createSelector)(selectState, function (state) { - return state.resolvingUris || []; -}); - -var makeSelectIsUriResolving = exports.makeSelectIsUriResolving = function makeSelectIsUriResolving(uri) { - return (0, _reselect.createSelector)(selectResolvingUris, function (resolvingUris) { - return resolvingUris && resolvingUris.indexOf(uri) !== -1; - }); -}; - -/***/ }), -/* 3 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.selectActiveHistoryEntry = exports.selectHistoryStack = exports.selectHistoryIndex = exports.selectIsForwardDisabled = exports.selectIsBackDisabled = exports.selectPathAfterAuth = exports.selectPageTitle = exports.selectHeaderLinks = exports.makeSelectCurrentParam = exports.selectCurrentParams = exports.selectCurrentPage = exports.computePageFromPath = exports.selectCurrentPath = exports.selectState = undefined; - -var _reselect = __webpack_require__(4); - -var _query_params = __webpack_require__(7); - -var _lbryuri = __webpack_require__(1); - -var _lbryuri2 = _interopRequireDefault(_lbryuri); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var selectState = exports.selectState = function selectState(state) { - return state.navigation || {}; -}; - -var selectCurrentPath = exports.selectCurrentPath = (0, _reselect.createSelector)(selectState, function (state) { - return state.currentPath; -}); - -var computePageFromPath = exports.computePageFromPath = function computePageFromPath(path) { - return path.replace(/^\//, '').split('?')[0]; -}; - -var selectCurrentPage = exports.selectCurrentPage = (0, _reselect.createSelector)(selectCurrentPath, function (path) { - return computePageFromPath(path); -}); - -var selectCurrentParams = exports.selectCurrentParams = (0, _reselect.createSelector)(selectCurrentPath, function (path) { - if (path === undefined) return {}; - if (!path.match(/\?/)) return {}; - - return (0, _query_params.parseQueryParams)(path.split('?')[1]); -}); - -var makeSelectCurrentParam = exports.makeSelectCurrentParam = function makeSelectCurrentParam(param) { - return (0, _reselect.createSelector)(selectCurrentParams, function (params) { - return params ? params[param] : undefined; - }); -}; - -var selectHeaderLinks = exports.selectHeaderLinks = (0, _reselect.createSelector)(selectCurrentPage, function (page) { - // This contains intentional fall throughs - switch (page) { - case 'wallet': - case 'history': - case 'send': - case 'getcredits': - case 'invite': - case 'rewards': - case 'backup': - return { - wallet: __('Overview'), - getcredits: __('Get Credits'), - send: __('Send / Receive'), - rewards: __('Rewards'), - invite: __('Invites'), - history: __('History') - }; - case 'downloaded': - case 'published': - return { - downloaded: __('Downloaded'), - published: __('Published') - }; - case 'settings': - case 'help': - return { - settings: __('Settings'), - help: __('Help') - }; - case 'discover': - case 'subscriptions': - return { - discover: __('Discover'), - subscriptions: __('Subscriptions') - }; - default: - return null; - } -}); - -var selectPageTitle = exports.selectPageTitle = (0, _reselect.createSelector)(selectCurrentPage, selectCurrentParams, function (page, params) { - switch (page) { - case 'settings': - return __('Settings'); - case 'report': - return __('Report'); - case 'wallet': - return __('Wallet'); - case 'send': - return __('Send or Receive LBRY Credits'); - case 'getcredits': - return __('Get LBRY Credits'); - case 'backup': - return __('Backup Your Wallet'); - case 'rewards': - return __('Rewards'); - case 'invite': - return __('Invites'); - case 'start': - return __('Start'); - case 'publish': - return params.id ? __('Edit') : __('Publish'); - case 'help': - return __('Help'); - case 'developer': - return __('Developer'); - case 'show': - { - var parts = [_lbryuri2.default.normalize(params.uri)]; - // If the params has any keys other than "uri" - if (Object.keys(params).length > 1) { - parts.push((0, _query_params.toQueryString)(Object.assign({}, params, { uri: null }))); - } - return parts.join('?'); - } - case 'downloaded': - return __('Downloads & Purchases'); - case 'published': - return __('Publications'); - case 'search': - return params.query ? __('Search results for %s', params.query) : __('Search'); - case 'subscriptions': - return __('Your Subscriptions'); - case 'discover': - case false: - case null: - case '': - return ''; - default: - return page[0].toUpperCase() + (page.length > 0 ? page.substr(1) : ''); - } -}); - -var selectPathAfterAuth = exports.selectPathAfterAuth = (0, _reselect.createSelector)(selectState, function (state) { - return state.pathAfterAuth; -}); - -var selectIsBackDisabled = exports.selectIsBackDisabled = (0, _reselect.createSelector)(selectState, function (state) { - return state.index === 0; -}); - -var selectIsForwardDisabled = exports.selectIsForwardDisabled = (0, _reselect.createSelector)(selectState, function (state) { - return state.index === state.stack.length - 1; -}); - -var selectHistoryIndex = exports.selectHistoryIndex = (0, _reselect.createSelector)(selectState, function (state) { - return state.index; -}); - -var selectHistoryStack = exports.selectHistoryStack = (0, _reselect.createSelector)(selectState, function (state) { - return state.stack; -}); - -// returns current page attributes (scrollY, path) -var selectActiveHistoryEntry = exports.selectActiveHistoryEntry = (0, _reselect.createSelector)(selectState, function (state) { - return state.stack[state.index]; -}); - -/***/ }), -/* 4 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - exports.__esModule = true; exports.defaultMemoize = defaultMemoize; exports.createSelectorCreator = createSelectorCreator; @@ -989,7 +380,7 @@ function createStructuredSelector(selectors) { } /***/ }), -/* 5 */ +/* 2 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -999,7 +390,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); -var _jsonrpc = __webpack_require__(11); +var _jsonrpc = __webpack_require__(13); var _jsonrpc2 = _interopRequireDefault(_jsonrpc); @@ -1298,6 +689,615 @@ var lbryProxy = new Proxy(Lbry, { exports.default = lbryProxy; +/***/ }), +/* 3 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); + +var CHANNEL_NAME_MIN_LEN = 1; +var CLAIM_ID_MAX_LEN = 40; + +var Lbryuri = {}; + +Lbryuri.REGEXP_INVALID_URI = /[^A-Za-z0-9-]/g; +Lbryuri.REGEXP_ADDRESS = /^b(?=[^0OIl]{32,33})[0-9A-Za-z]{32,33}$/; + +/** + * Parses a LBRY name into its component parts. Throws errors with user-friendly + * messages for invalid names. + * + * N.B. that "name" indicates the value in the name position of the URI. For + * claims for channel content, this will actually be the channel name, and + * the content name is in the path (e.g. lbry://@channel/content) + * + * In most situations, you'll want to use the contentName and channelName keys + * and ignore the name key. + * + * Returns a dictionary with keys: + * - name (string): The value in the "name" position in the URI. Note that this + * could be either content name or channel name; see above. + * - path (string, if persent) + * - claimSequence (int, if present) + * - bidPosition (int, if present) + * - claimId (string, if present) + * - isChannel (boolean) + * - contentName (string): For anon claims, the name; for channel claims, the path + * - channelName (string, if present): Channel name without @ + */ +Lbryuri.parse = function (uri) { + var requireProto = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + // Break into components. Empty sub-matches are converted to null + var componentsRegex = new RegExp('^((?:lbry://)?)' + // protocol + '([^:$#/]*)' + // name (stops at the first separator or end) + '([:$#]?)([^/]*)' + // modifier separator, modifier (stops at the first path separator or end) + '(/?)(.*)' // path separator, path + ); + + var _componentsRegex$exec = componentsRegex.exec(uri).slice(1).map(function (match) { + return match || null; + }), + _componentsRegex$exec2 = _slicedToArray(_componentsRegex$exec, 6), + proto = _componentsRegex$exec2[0], + name = _componentsRegex$exec2[1], + modSep = _componentsRegex$exec2[2], + modVal = _componentsRegex$exec2[3], + pathSep = _componentsRegex$exec2[4], + path = _componentsRegex$exec2[5]; + + var contentName = void 0; + + // Validate protocol + if (requireProto && !proto) { + throw new Error(__('LBRY URIs must include a protocol prefix (lbry://).')); + } + + // Validate and process name + if (!name) { + throw new Error(__('URI does not include name.')); + } + + var isChannel = name.startsWith('@'); + var channelName = isChannel ? name.slice(1) : name; + + if (isChannel) { + if (!channelName) { + throw new Error(__('No channel name after @.')); + } + + if (channelName.length < CHANNEL_NAME_MIN_LEN) { + throw new Error(__('Channel names must be at least %s characters.', CHANNEL_NAME_MIN_LEN)); + } + + contentName = path; + } + + var nameBadChars = (channelName || name).match(Lbryuri.REGEXP_INVALID_URI); + if (nameBadChars) { + throw new Error(__('Invalid character %s in name: %s.', nameBadChars.length === 1 ? '' : 's', nameBadChars.join(', '))); + } + + // Validate and process modifier (claim ID, bid position or claim sequence) + var claimId = void 0; + var claimSequence = void 0; + var bidPosition = void 0; + if (modSep) { + if (!modVal) { + throw new Error(__('No modifier provided after separator %s.', modSep)); + } + + if (modSep === '#') { + claimId = modVal; + } else if (modSep === ':') { + claimSequence = modVal; + } else if (modSep === '$') { + bidPosition = modVal; + } + } + + if (claimId && (claimId.length > CLAIM_ID_MAX_LEN || !claimId.match(/^[0-9a-f]+$/)) && !claimId.match(/^pending/) // ought to be dropped when savePendingPublish drops hack + ) { + throw new Error(__('Invalid claim ID %s.', claimId)); + } + + if (claimSequence && !claimSequence.match(/^-?[1-9][0-9]*$/)) { + throw new Error(__('Claim sequence must be a number.')); + } + + if (bidPosition && !bidPosition.match(/^-?[1-9][0-9]*$/)) { + throw new Error(__('Bid position must be a number.')); + } + + // Validate and process path + if (path) { + if (!isChannel) { + throw new Error(__('Only channel URIs may have a path.')); + } + + var pathBadChars = path.match(Lbryuri.REGEXP_INVALID_URI); + if (pathBadChars) { + throw new Error(__('Invalid character in path: %s', pathBadChars.join(', '))); + } + + contentName = path; + } else if (pathSep) { + throw new Error(__('No path provided after /')); + } + + return _extends({ + name: name, + path: path, + isChannel: isChannel + }, contentName ? { contentName: contentName } : {}, channelName ? { channelName: channelName } : {}, claimSequence ? { claimSequence: parseInt(claimSequence, 10) } : {}, bidPosition ? { bidPosition: parseInt(bidPosition, 10) } : {}, claimId ? { claimId: claimId } : {}, path ? { path: path } : {}); +}; + +/** + * Takes an object in the same format returned by lbryuri.parse() and builds a URI. + * + * The channelName key will accept names with or without the @ prefix. + */ +Lbryuri.build = function (uriObj) { + var includeProto = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + var claimId = uriObj.claimId, + claimSequence = uriObj.claimSequence, + bidPosition = uriObj.bidPosition, + contentName = uriObj.contentName, + channelName = uriObj.channelName; + var name = uriObj.name, + path = uriObj.path; + + + if (channelName) { + var channelNameFormatted = channelName.startsWith('@') ? channelName : '@' + channelName; + if (!name) { + name = channelNameFormatted; + } else if (name !== channelNameFormatted) { + throw new Error(__('Received a channel content URI, but name and channelName do not match. "name" represents the value in the name position of the URI (lbry://name...), which for channel content will be the channel name. In most cases, to construct a channel URI you should just pass channelName and contentName.')); + } + } + + if (contentName) { + if (!name) { + name = contentName; + } else if (!path) { + path = contentName; + } + if (path && path !== contentName) { + throw new Error(__('Path and contentName do not match. Only one is required; most likely you wanted contentName.')); + } + } + + return (includeProto ? 'lbry://' : '') + name + (claimId ? '#' + claimId : '') + (claimSequence ? ':' + claimSequence : '') + (bidPosition ? '' + bidPosition : '') + (path ? '/' + path : ''); +}; + +/* Takes a parseable LBRY URI and converts it to standard, canonical format (currently this just + * consists of adding the lbry:// prefix if needed) */ +Lbryuri.normalize = function (uri) { + if (uri.match(/pending_claim/)) return uri; + + var _Lbryuri$parse = Lbryuri.parse(uri), + name = _Lbryuri$parse.name, + path = _Lbryuri$parse.path, + bidPosition = _Lbryuri$parse.bidPosition, + claimSequence = _Lbryuri$parse.claimSequence, + claimId = _Lbryuri$parse.claimId; + + return Lbryuri.build({ name: name, path: path, claimSequence: claimSequence, bidPosition: bidPosition, claimId: claimId }); +}; + +Lbryuri.isValid = function (uri) { + var parts = void 0; + try { + parts = Lbryuri.parse(Lbryuri.normalize(uri)); + } catch (error) { + return false; + } + return parts && parts.name; +}; + +Lbryuri.isValidName = function (name) { + var checkCase = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + + var regexp = new RegExp('^[a-z0-9-]+$', checkCase ? '' : 'i'); + return regexp.test(name); +}; + +Lbryuri.isClaimable = function (uri) { + var parts = void 0; + try { + parts = Lbryuri.parse(Lbryuri.normalize(uri)); + } catch (error) { + return false; + } + return parts && parts.name && !parts.claimId && !parts.bidPosition && !parts.claimSequence && !parts.isChannel && !parts.path; +}; + +if (window) { + window.lbryuri = Lbryuri; +} +exports.default = Lbryuri; + +/***/ }), +/* 4 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.makeSelectIsUriResolving = exports.selectResolvingUris = exports.selectMyChannelClaims = exports.selectFetchingMyChannels = exports.selectMyClaimsOutpoints = exports.selectAllMyClaimsByOutpoint = exports.selectMyClaimsWithoutChannels = exports.selectMyClaims = exports.selectPendingClaims = exports.selectIsFetchingClaimListMine = exports.makeSelectContentTypeForUri = exports.makeSelectTitleForUri = exports.makeSelectMetadataForUri = exports.makeSelectClaimsInChannelForCurrentPage = exports.makeSelectFetchingChannelClaims = exports.selectAllFetchingChannelClaims = exports.makeSelectClaimIsMine = exports.selectMyActiveClaims = exports.selectAbandoningIds = exports.selectMyClaimsRaw = exports.makeSelectClaimForUri = exports.selectAllClaimsByChannel = exports.selectClaimsByUri = exports.selectClaimsById = undefined; + +var _lbryuri = __webpack_require__(3); + +var _lbryuri2 = _interopRequireDefault(_lbryuri); + +var _navigation = __webpack_require__(5); + +var _reselect = __webpack_require__(1); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } + +var selectState = function selectState(state) { + return state.claims || {}; +}; + +var selectClaimsById = exports.selectClaimsById = (0, _reselect.createSelector)(selectState, function (state) { + return state.byId || {}; +}); + +var selectClaimsByUri = exports.selectClaimsByUri = (0, _reselect.createSelector)(selectState, selectClaimsById, function (state, byId) { + var byUri = state.claimsByUri || {}; + var claims = {}; + + Object.keys(byUri).forEach(function (uri) { + var claimId = byUri[uri]; + + // NOTE returning a null claim allows us to differentiate between an + // undefined (never fetched claim) and one which just doesn't exist. Not + // the cleanest solution but couldn't think of anything better right now + if (claimId === null) { + claims[uri] = null; + } else { + claims[uri] = byId[claimId]; + } + }); + + return claims; +}); + +var selectAllClaimsByChannel = exports.selectAllClaimsByChannel = (0, _reselect.createSelector)(selectState, function (state) { + return state.claimsByChannel || {}; +}); + +var makeSelectClaimForUri = exports.makeSelectClaimForUri = function makeSelectClaimForUri(uri) { + return (0, _reselect.createSelector)(selectClaimsByUri, function (claims) { + return claims && claims[_lbryuri2.default.normalize(uri)]; + }); +}; + +var selectMyClaimsRaw = exports.selectMyClaimsRaw = (0, _reselect.createSelector)(selectState, function (state) { + return state.myClaims; +}); + +var selectAbandoningIds = exports.selectAbandoningIds = (0, _reselect.createSelector)(selectState, function (state) { + return Object.keys(state.abandoningById || {}); +}); + +var selectMyActiveClaims = exports.selectMyActiveClaims = (0, _reselect.createSelector)(selectMyClaimsRaw, selectAbandoningIds, function (claims, abandoningIds) { + return new Set(claims && claims.map(function (claim) { + return claim.claim_id; + }).filter(function (claimId) { + return Object.keys(abandoningIds).indexOf(claimId) === -1; + })); +}); + +var makeSelectClaimIsMine = exports.makeSelectClaimIsMine = function makeSelectClaimIsMine(rawUri) { + var uri = _lbryuri2.default.normalize(rawUri); + return (0, _reselect.createSelector)(selectClaimsByUri, selectMyActiveClaims, function (claims, myClaims) { + return claims && claims[uri] && claims[uri].claim_id && myClaims.has(claims[uri].claim_id); + }); +}; + +var selectAllFetchingChannelClaims = exports.selectAllFetchingChannelClaims = (0, _reselect.createSelector)(selectState, function (state) { + return state.fetchingChannelClaims || {}; +}); + +var makeSelectFetchingChannelClaims = exports.makeSelectFetchingChannelClaims = function makeSelectFetchingChannelClaims(uri) { + return (0, _reselect.createSelector)(selectAllFetchingChannelClaims, function (fetching) { + return fetching && fetching[uri]; + }); +}; + +var makeSelectClaimsInChannelForCurrentPage = exports.makeSelectClaimsInChannelForCurrentPage = function makeSelectClaimsInChannelForCurrentPage(uri) { + var pageSelector = (0, _navigation.makeSelectCurrentParam)('page'); + + return (0, _reselect.createSelector)(selectClaimsById, selectAllClaimsByChannel, pageSelector, function (byId, allClaims, page) { + var byChannel = allClaims[uri] || {}; + var claimIds = byChannel[page || 1]; + + if (!claimIds) return claimIds; + + return claimIds.map(function (claimId) { + return byId[claimId]; + }); + }); +}; + +var makeSelectMetadataForUri = exports.makeSelectMetadataForUri = function makeSelectMetadataForUri(uri) { + return (0, _reselect.createSelector)(makeSelectClaimForUri(uri), function (claim) { + var metadata = claim && claim.value && claim.value.stream && claim.value.stream.metadata; + + return metadata || (claim === undefined ? undefined : null); + }); +}; + +var makeSelectTitleForUri = exports.makeSelectTitleForUri = function makeSelectTitleForUri(uri) { + return (0, _reselect.createSelector)(makeSelectMetadataForUri(uri), function (metadata) { + return metadata && metadata.title; + }); +}; + +var makeSelectContentTypeForUri = exports.makeSelectContentTypeForUri = function makeSelectContentTypeForUri(uri) { + return (0, _reselect.createSelector)(makeSelectClaimForUri(uri), function (claim) { + var source = claim && claim.value && claim.value.stream && claim.value.stream.source; + return source ? source.contentType : undefined; + }); +}; + +var selectIsFetchingClaimListMine = exports.selectIsFetchingClaimListMine = (0, _reselect.createSelector)(selectState, function (state) { + return state.isFetchingClaimListMine; +}); + +var selectPendingClaims = exports.selectPendingClaims = (0, _reselect.createSelector)(selectState, function (state) { + return Object.values(state.pendingById || {}); +}); + +var selectMyClaims = exports.selectMyClaims = (0, _reselect.createSelector)(selectMyActiveClaims, selectClaimsById, selectAbandoningIds, selectPendingClaims, function (myClaimIds, byId, abandoningIds, pendingClaims) { + var claims = []; + + myClaimIds.forEach(function (id) { + var claim = byId[id]; + + if (claim && abandoningIds.indexOf(id) === -1) claims.push(claim); + }); + + return [].concat(claims, _toConsumableArray(pendingClaims)); +}); + +var selectMyClaimsWithoutChannels = exports.selectMyClaimsWithoutChannels = (0, _reselect.createSelector)(selectMyClaims, function (myClaims) { + return myClaims.filter(function (claim) { + return !claim.name.match(/^@/); + }); +}); + +var selectAllMyClaimsByOutpoint = exports.selectAllMyClaimsByOutpoint = (0, _reselect.createSelector)(selectMyClaimsRaw, function (claims) { + return new Set(claims && claims.length ? claims.map(function (claim) { + return claim.txid + ':' + claim.nout; + }) : null); +}); + +var selectMyClaimsOutpoints = exports.selectMyClaimsOutpoints = (0, _reselect.createSelector)(selectMyClaims, function (myClaims) { + var outpoints = []; + + myClaims.forEach(function (claim) { + return outpoints.push(claim.txid + ':' + claim.nout); + }); + + return outpoints; +}); + +var selectFetchingMyChannels = exports.selectFetchingMyChannels = (0, _reselect.createSelector)(selectState, function (state) { + return state.fetchingMyChannels; +}); + +var selectMyChannelClaims = exports.selectMyChannelClaims = (0, _reselect.createSelector)(selectState, selectClaimsById, function (state, byId) { + var ids = state.myChannelClaims || []; + var claims = []; + + ids.forEach(function (id) { + if (byId[id]) { + // I'm not sure why this check is necessary, but it ought to be a quick fix for https://github.com/lbryio/lbry-app/issues/544 + claims.push(byId[id]); + } + }); + + return claims; +}); + +var selectResolvingUris = exports.selectResolvingUris = (0, _reselect.createSelector)(selectState, function (state) { + return state.resolvingUris || []; +}); + +var makeSelectIsUriResolving = exports.makeSelectIsUriResolving = function makeSelectIsUriResolving(uri) { + return (0, _reselect.createSelector)(selectResolvingUris, function (resolvingUris) { + return resolvingUris && resolvingUris.indexOf(uri) !== -1; + }); +}; + +/***/ }), +/* 5 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.selectActiveHistoryEntry = exports.selectHistoryStack = exports.selectHistoryIndex = exports.selectIsForwardDisabled = exports.selectIsBackDisabled = exports.selectPathAfterAuth = exports.selectPageTitle = exports.selectHeaderLinks = exports.makeSelectCurrentParam = exports.selectCurrentParams = exports.selectCurrentPage = exports.computePageFromPath = exports.selectCurrentPath = exports.selectState = undefined; + +var _reselect = __webpack_require__(1); + +var _query_params = __webpack_require__(8); + +var _lbryuri = __webpack_require__(3); + +var _lbryuri2 = _interopRequireDefault(_lbryuri); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var selectState = exports.selectState = function selectState(state) { + return state.navigation || {}; +}; + +var selectCurrentPath = exports.selectCurrentPath = (0, _reselect.createSelector)(selectState, function (state) { + return state.currentPath; +}); + +var computePageFromPath = exports.computePageFromPath = function computePageFromPath(path) { + return path.replace(/^\//, '').split('?')[0]; +}; + +var selectCurrentPage = exports.selectCurrentPage = (0, _reselect.createSelector)(selectCurrentPath, function (path) { + return computePageFromPath(path); +}); + +var selectCurrentParams = exports.selectCurrentParams = (0, _reselect.createSelector)(selectCurrentPath, function (path) { + if (path === undefined) return {}; + if (!path.match(/\?/)) return {}; + + return (0, _query_params.parseQueryParams)(path.split('?')[1]); +}); + +var makeSelectCurrentParam = exports.makeSelectCurrentParam = function makeSelectCurrentParam(param) { + return (0, _reselect.createSelector)(selectCurrentParams, function (params) { + return params ? params[param] : undefined; + }); +}; + +var selectHeaderLinks = exports.selectHeaderLinks = (0, _reselect.createSelector)(selectCurrentPage, function (page) { + // This contains intentional fall throughs + switch (page) { + case 'wallet': + case 'history': + case 'send': + case 'getcredits': + case 'invite': + case 'rewards': + case 'backup': + return { + wallet: __('Overview'), + getcredits: __('Get Credits'), + send: __('Send / Receive'), + rewards: __('Rewards'), + invite: __('Invites'), + history: __('History') + }; + case 'downloaded': + case 'published': + return { + downloaded: __('Downloaded'), + published: __('Published') + }; + case 'settings': + case 'help': + return { + settings: __('Settings'), + help: __('Help') + }; + case 'discover': + case 'subscriptions': + return { + discover: __('Discover'), + subscriptions: __('Subscriptions') + }; + default: + return null; + } +}); + +var selectPageTitle = exports.selectPageTitle = (0, _reselect.createSelector)(selectCurrentPage, selectCurrentParams, function (page, params) { + switch (page) { + case 'settings': + return __('Settings'); + case 'report': + return __('Report'); + case 'wallet': + return __('Wallet'); + case 'send': + return __('Send or Receive LBRY Credits'); + case 'getcredits': + return __('Get LBRY Credits'); + case 'backup': + return __('Backup Your Wallet'); + case 'rewards': + return __('Rewards'); + case 'invite': + return __('Invites'); + case 'start': + return __('Start'); + case 'publish': + return params.id ? __('Edit') : __('Publish'); + case 'help': + return __('Help'); + case 'developer': + return __('Developer'); + case 'show': + { + var parts = [_lbryuri2.default.normalize(params.uri)]; + // If the params has any keys other than "uri" + if (Object.keys(params).length > 1) { + parts.push((0, _query_params.toQueryString)(Object.assign({}, params, { uri: null }))); + } + return parts.join('?'); + } + case 'downloaded': + return __('Downloads & Purchases'); + case 'published': + return __('Publications'); + case 'search': + return params.query ? __('Search results for %s', params.query) : __('Search'); + case 'subscriptions': + return __('Your Subscriptions'); + case 'discover': + case false: + case null: + case '': + return ''; + default: + return page[0].toUpperCase() + (page.length > 0 ? page.substr(1) : ''); + } +}); + +var selectPathAfterAuth = exports.selectPathAfterAuth = (0, _reselect.createSelector)(selectState, function (state) { + return state.pathAfterAuth; +}); + +var selectIsBackDisabled = exports.selectIsBackDisabled = (0, _reselect.createSelector)(selectState, function (state) { + return state.index === 0; +}); + +var selectIsForwardDisabled = exports.selectIsForwardDisabled = (0, _reselect.createSelector)(selectState, function (state) { + return state.index === state.stack.length - 1; +}); + +var selectHistoryIndex = exports.selectHistoryIndex = (0, _reselect.createSelector)(selectState, function (state) { + return state.index; +}); + +var selectHistoryStack = exports.selectHistoryStack = (0, _reselect.createSelector)(selectState, function (state) { + return state.stack; +}); + +// returns current page attributes (scrollY, path) +var selectActiveHistoryEntry = exports.selectActiveHistoryEntry = (0, _reselect.createSelector)(selectState, function (state) { + return state.stack[state.index]; +}); + /***/ }), /* 6 */ /***/ (function(module, exports, __webpack_require__) { @@ -1320,15 +1320,15 @@ var _action_types = __webpack_require__(0); var ACTIONS = _interopRequireWildcard(_action_types); -var _lbry = __webpack_require__(5); +var _lbry = __webpack_require__(2); var _lbry2 = _interopRequireDefault(_lbry); -var _lbryuri = __webpack_require__(1); +var _lbryuri = __webpack_require__(3); var _lbryuri2 = _interopRequireDefault(_lbryuri); -var _claims = __webpack_require__(2); +var _claims = __webpack_require__(4); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -1455,6 +1455,51 @@ function doAbandonClaim(txid, nout) { "use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.doOpenModal = doOpenModal; +exports.doCloseModal = doCloseModal; +exports.doShowSnackBar = doShowSnackBar; + +var _action_types = __webpack_require__(0); + +var ACTIONS = _interopRequireWildcard(_action_types); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function doOpenModal(modal) { + var modalProps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + return { + type: ACTIONS.OPEN_MODAL, + data: { + modal: modal, + modalProps: modalProps + } + }; +} + +function doCloseModal() { + return { + type: ACTIONS.CLOSE_MODAL + }; +} + +function doShowSnackBar(data) { + return { + type: ACTIONS.SHOW_SNACKBAR, + data: data + }; +} + +/***/ }), +/* 8 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + Object.defineProperty(exports, "__esModule", { value: true }); @@ -1493,117 +1538,6 @@ function toQueryString(params) { return parts.join('&'); } -/***/ }), -/* 8 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/* WEBPACK VAR INJECTION */(function(process) { - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; - -var _lbry = __webpack_require__(5); - -var _lbry2 = _interopRequireDefault(_lbry); - -var _querystring = __webpack_require__(14); - -var _querystring2 = _interopRequireDefault(_querystring); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var LbryApi = { - enabled: true, - exchangePromise: null, - exchangeLastFetched: null -}; - -var CONNECTION_STRING = process.env.LBRY_APP_API_URL ? process.env.LBRY_APP_API_URL.replace(/\/*$/, '/') // exactly one slash at the end -: 'https://api.lbry.io/'; - -var EXCHANGE_RATE_TIMEOUT = 20 * 60 * 1000; - -LbryApi.getExchangeRates = function () { - if (!LbryApi.exchangeLastFetched || Date.now() - LbryApi.exchangeLastFetched > EXCHANGE_RATE_TIMEOUT) { - LbryApi.exchangePromise = new Promise(function (resolve, reject) { - LbryApi.call('lbc', 'exchange_rate', {}, 'get', true).then(function (_ref) { - var LBC_USD = _ref.lbc_usd, - LBC_BTC = _ref.lbc_btc, - BTC_USD = _ref.btc_usd; - - var rates = { LBC_USD: LBC_USD, LBC_BTC: LBC_BTC, BTC_USD: BTC_USD }; - resolve(rates); - }).catch(reject); - }); - LbryApi.exchangeLastFetched = Date.now(); - } - return LbryApi.exchangePromise; -}; - -LbryApi.call = function (resource, action) { - var params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; - var method = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'get'; - - if (!LbryApi.enabled) { - console.log(__('Internal API disabled')); - return Promise.reject(new Error(__('LBRY internal API is disabled'))); - } - - if (!(method === 'get' || method === 'post')) { - return Promise.reject(new Error(__('Invalid method'))); - } - - function checkAndParse(response) { - if (response.status >= 200 && response.status < 300) { - return response.json(); - } - return response.json().then(function (json) { - var error = void 0; - if (json.error) { - error = new Error(json.error); - } else { - error = new Error('Unknown API error signature'); - } - error.response = response; // This is primarily a hack used in actions/user.js - return Promise.reject(error); - }); - } - - function makeRequest(url, options) { - return fetch(url, options).then(checkAndParse); - } - - var fullParams = _extends({}, params); - var qs = _querystring2.default.stringify(fullParams); - var url = '' + CONNECTION_STRING + resource + '/' + action + '?' + qs; - - var options = { - method: 'GET' - }; - - if (method === 'post') { - options = { - method: 'POST', - headers: { - 'Content-Type': 'application/x-www-form-urlencoded' - }, - body: qs - }; - url = '' + CONNECTION_STRING + resource + '/' + action; - } - - return makeRequest(url, options).then(function (response) { - return response.data; - }); -}; - -exports.default = LbryApi; -/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(13))) - /***/ }), /* 9 */ /***/ (function(module, exports, __webpack_require__) { @@ -1616,9 +1550,9 @@ Object.defineProperty(exports, "__esModule", { }); exports.selectTotalDownloadProgress = exports.selectDownloadingFileInfos = exports.selectFileInfosDownloaded = exports.makeSelectLoadingForUri = exports.selectUrisLoading = exports.makeSelectDownloadingForUri = exports.selectDownloadingByOutpoint = exports.makeSelectFileInfoForUri = exports.selectIsFetchingFileListDownloadedOrPublished = exports.selectIsFetchingFileList = exports.selectFileInfosByOutpoint = exports.selectState = undefined; -var _claims = __webpack_require__(2); +var _claims = __webpack_require__(4); -var _reselect = __webpack_require__(4); +var _reselect = __webpack_require__(1); var selectState = exports.selectState = function selectState(state) { return state.fileInfo || {}; @@ -1723,7 +1657,263 @@ var selectTotalDownloadProgress = exports.selectTotalDownloadProgress = (0, _res Object.defineProperty(exports, "__esModule", { value: true }); -exports.selectWunderBarIcon = exports.selectWunderBarAddress = exports.selectSearchUrisByQuery = exports.selectIsSearching = exports.selectSearchQuery = exports.makeSelectSearchUris = exports.selectTotalDownloadProgress = exports.selectDownloadingFileInfos = exports.selectFileInfosDownloaded = exports.makeSelectLoadingForUri = exports.selectUrisLoading = exports.makeSelectDownloadingForUri = exports.selectDownloadingByOutpoint = exports.makeSelectFileInfoForUri = exports.selectIsFetchingFileListDownloadedOrPublished = exports.selectIsFetchingFileList = exports.selectFileInfosByOutpoint = exports.selectFetchingCostInfo = exports.selectCostForCurrentPageUri = exports.selectAllCostInfoByUri = exports.makeSelectCostInfoForUri = exports.makeSelectFetchingCostInfoForUri = exports.selectResolvingUris = exports.selectMyChannelClaims = exports.selectFetchingMyChannels = exports.selectMyClaimsOutpoints = exports.selectAllMyClaimsByOutpoint = exports.selectMyClaimsWithoutChannels = exports.selectMyClaims = exports.selectPendingClaims = exports.selectIsFetchingClaimListMine = exports.selectAllFetchingChannelClaims = exports.selectMyActiveClaims = exports.selectAbandoningIds = exports.selectMyClaimsRaw = exports.selectAllClaimsByChannel = exports.selectClaimsByUri = exports.selectClaimsById = exports.makeSelectIsUriResolving = exports.makeSelectContentTypeForUri = exports.makeSelectTitleForUri = exports.makeSelectMetadataForUri = exports.makeSelectClaimsInChannelForCurrentPage = exports.makeSelectFetchingChannelClaims = exports.makeSelectClaimIsMine = exports.makeSelectClaimForUri = exports.walletReducer = exports.searchReducer = exports.fileInfoReducer = exports.costInfoReducer = exports.claimsReducer = exports.doSearch = exports.doFetchFileInfosAndPublishedClaims = exports.doFileList = exports.doFetchFileInfo = exports.doFetchCostInfoForUri = exports.doResolveUri = exports.doResolveUris = exports.doAbandonClaim = exports.doFetchClaimListMine = exports.Lbryuri = exports.LbryApi = exports.Lbry = undefined; +exports.doNavigate = doNavigate; +exports.doAuthNavigate = doAuthNavigate; +exports.doHistoryTraverse = doHistoryTraverse; +exports.doHistoryBack = doHistoryBack; +exports.doHistoryForward = doHistoryForward; +exports.doRecordScroll = doRecordScroll; + +var _action_types = __webpack_require__(0); + +var ACTIONS = _interopRequireWildcard(_action_types); + +var _navigation = __webpack_require__(5); + +var _query_params = __webpack_require__(8); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function doNavigate(path) { + var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + + return function (dispatch) { + if (!path) { + return; + } + + var url = path; + if (params && Object.values(params).length) { + url += '?' + (0, _query_params.toQueryString)(params); + } + + var scrollY = options.scrollY; + + + dispatch({ + type: ACTIONS.HISTORY_NAVIGATE, + data: { url: url, index: options.index, scrollY: scrollY } + }); + }; +} + +function doAuthNavigate() { + var pathAfterAuth = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + return function (dispatch) { + if (pathAfterAuth) { + dispatch({ + type: ACTIONS.CHANGE_AFTER_AUTH_PATH, + data: { + path: pathAfterAuth + '?' + (0, _query_params.toQueryString)(params) + } + }); + } + dispatch(doNavigate('/auth')); + }; +} + +function doHistoryTraverse(dispatch, state, modifier) { + var stack = (0, _navigation.selectHistoryStack)(state); + var index = (0, _navigation.selectHistoryIndex)(state) + modifier; + + if (index >= 0 && index < stack.length) { + var historyItem = stack[index]; + dispatch(doNavigate(historyItem.path, {}, { scrollY: historyItem.scrollY, index: index })); + } +} + +function doHistoryBack() { + return function (dispatch, getState) { + return doHistoryTraverse(dispatch, getState(), -1); + }; +} + +function doHistoryForward() { + return function (dispatch, getState) { + return doHistoryTraverse(dispatch, getState(), 1); + }; +} + +function doRecordScroll(scroll) { + return function (dispatch) { + dispatch({ + type: ACTIONS.WINDOW_SCROLLED, + data: { scrollY: scroll } + }); + }; +} + +/***/ }), +/* 11 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.makeSelectBlockDate = exports.selectBlocks = exports.selectDraftTransactionError = exports.selectDraftTransactionAddress = exports.selectDraftTransactionAmount = exports.selectDraftTransaction = exports.selectGettingNewAddress = exports.selectReceiveAddress = exports.selectIsSendingSupport = exports.selectIsFetchingTransactions = exports.selectHasTransactions = exports.selectRecentTransactions = exports.selectTransactionItems = exports.selectTransactionsById = exports.selectBalance = exports.selectState = undefined; + +var _reselect = __webpack_require__(1); + +function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } + +var selectState = exports.selectState = function selectState(state) { + return state.wallet || {}; +}; + +var selectBalance = exports.selectBalance = (0, _reselect.createSelector)(selectState, function (state) { + return state.balance; +}); + +var selectTransactionsById = exports.selectTransactionsById = (0, _reselect.createSelector)(selectState, function (state) { + return state.transactions; +}); + +var selectTransactionItems = exports.selectTransactionItems = (0, _reselect.createSelector)(selectTransactionsById, function (byId) { + var items = []; + + Object.keys(byId).forEach(function (txid) { + var tx = byId[txid]; + + // ignore dust/fees + // it is fee only txn if all infos are also empty + if (Math.abs(tx.value) === Math.abs(tx.fee) && tx.claim_info.length === 0 && tx.support_info.length === 0 && tx.update_info.length === 0) { + return; + } + + var append = []; + + append.push.apply(append, _toConsumableArray(tx.claim_info.map(function (item) { + return Object.assign({}, tx, item, { + type: item.claim_name[0] === '@' ? 'channel' : 'publish' + }); + }))); + append.push.apply(append, _toConsumableArray(tx.support_info.map(function (item) { + return Object.assign({}, tx, item, { + type: !item.is_tip ? 'support' : 'tip' + }); + }))); + append.push.apply(append, _toConsumableArray(tx.update_info.map(function (item) { + return Object.assign({}, tx, item, { type: 'update' }); + }))); + + if (!append.length) { + append.push(Object.assign({}, tx, { + type: tx.value < 0 ? 'spend' : 'receive' + })); + } + + items.push.apply(items, _toConsumableArray(append.map(function (item) { + // value on transaction, amount on outpoint + // amount is always positive, but should match sign of value + var amount = parseFloat(item.balance_delta ? item.balance_delta : item.value); + + return { + txid: txid, + date: tx.timestamp ? new Date(Number(tx.timestamp) * 1000) : null, + amount: amount, + fee: amount < 0 ? -1 * tx.fee / append.length : 0, + claim_id: item.claim_id, + claim_name: item.claim_name, + type: item.type || 'send', + nout: item.nout + }; + }))); + }); + return items.reverse(); +}); + +var selectRecentTransactions = exports.selectRecentTransactions = (0, _reselect.createSelector)(selectTransactionItems, function (transactions) { + var threshold = new Date(); + threshold.setDate(threshold.getDate() - 7); + return transactions.filter(function (transaction) { + return transaction.date > threshold; + }); +}); + +var selectHasTransactions = exports.selectHasTransactions = (0, _reselect.createSelector)(selectTransactionItems, function (transactions) { + return transactions && transactions.length > 0; +}); + +var selectIsFetchingTransactions = exports.selectIsFetchingTransactions = (0, _reselect.createSelector)(selectState, function (state) { + return state.fetchingTransactions; +}); + +var selectIsSendingSupport = exports.selectIsSendingSupport = (0, _reselect.createSelector)(selectState, function (state) { + return state.sendingSupport; +}); + +var selectReceiveAddress = exports.selectReceiveAddress = (0, _reselect.createSelector)(selectState, function (state) { + return state.receiveAddress; +}); + +var selectGettingNewAddress = exports.selectGettingNewAddress = (0, _reselect.createSelector)(selectState, function (state) { + return state.gettingNewAddress; +}); + +var selectDraftTransaction = exports.selectDraftTransaction = (0, _reselect.createSelector)(selectState, function (state) { + return state.draftTransaction || {}; +}); + +var selectDraftTransactionAmount = exports.selectDraftTransactionAmount = (0, _reselect.createSelector)(selectDraftTransaction, function (draft) { + return draft.amount; +}); + +var selectDraftTransactionAddress = exports.selectDraftTransactionAddress = (0, _reselect.createSelector)(selectDraftTransaction, function (draft) { + return draft.address; +}); + +var selectDraftTransactionError = exports.selectDraftTransactionError = (0, _reselect.createSelector)(selectDraftTransaction, function (draft) { + return draft.error; +}); + +var selectBlocks = exports.selectBlocks = (0, _reselect.createSelector)(selectState, function (state) { + return state.blocks; +}); + +var makeSelectBlockDate = exports.makeSelectBlockDate = function makeSelectBlockDate(block) { + return (0, _reselect.createSelector)(selectBlocks, function (blocks) { + return blocks && blocks[block] ? new Date(blocks[block].time * 1000) : undefined; + }); +}; + +/***/ }), +/* 12 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.selectBlocks = exports.selectDraftTransactionError = exports.selectDraftTransactionAddress = exports.selectDraftTransactionAmount = exports.selectDraftTransaction = exports.selectGettingNewAddress = exports.selectReceiveAddress = exports.selectIsSendingSupport = exports.selectIsFetchingTransactions = exports.selectHasTransactions = exports.selectRecentTransactions = exports.selectTransactionItems = exports.selectTransactionsById = exports.selectBalance = exports.makeSelectBlockDate = exports.selectWunderBarIcon = exports.selectWunderBarAddress = exports.selectSearchUrisByQuery = exports.selectIsSearching = exports.selectSearchQuery = exports.makeSelectSearchUris = exports.selectTotalDownloadProgress = exports.selectDownloadingFileInfos = exports.selectFileInfosDownloaded = exports.selectUrisLoading = exports.selectDownloadingByOutpoint = exports.selectIsFetchingFileListDownloadedOrPublished = exports.selectIsFetchingFileList = exports.selectFileInfosByOutpoint = exports.makeSelectLoadingForUri = exports.makeSelectDownloadingForUri = exports.makeSelectFileInfoForUri = exports.selectFetchingCostInfo = exports.selectCostForCurrentPageUri = exports.selectAllCostInfoByUri = exports.makeSelectCostInfoForUri = exports.makeSelectFetchingCostInfoForUri = exports.selectResolvingUris = exports.selectMyChannelClaims = exports.selectFetchingMyChannels = exports.selectMyClaimsOutpoints = exports.selectAllMyClaimsByOutpoint = exports.selectMyClaimsWithoutChannels = exports.selectMyClaims = exports.selectPendingClaims = exports.selectIsFetchingClaimListMine = exports.selectAllFetchingChannelClaims = exports.selectMyActiveClaims = exports.selectAbandoningIds = exports.selectMyClaimsRaw = exports.selectAllClaimsByChannel = exports.selectClaimsByUri = exports.selectClaimsById = exports.makeSelectIsUriResolving = exports.makeSelectContentTypeForUri = exports.makeSelectTitleForUri = exports.makeSelectMetadataForUri = exports.makeSelectClaimsInChannelForCurrentPage = exports.makeSelectFetchingChannelClaims = exports.makeSelectClaimIsMine = exports.makeSelectClaimForUri = exports.walletReducer = exports.searchReducer = exports.fileInfoReducer = exports.costInfoReducer = exports.claimsReducer = exports.doSendSupport = exports.doSetDraftTransactionAddress = exports.doSetDraftTransactionAmount = exports.doSendDraftTransaction = exports.doCheckAddressIsMine = exports.doGetNewAddress = exports.doFetchBlock = exports.doFetchTransactions = exports.doBalanceSubscribe = exports.doUpdateBalance = exports.doSearch = exports.doFetchFileInfosAndPublishedClaims = exports.doFileList = exports.doFetchFileInfo = exports.doFetchCostInfoForUri = exports.doResolveUri = exports.doResolveUris = exports.doAbandonClaim = exports.doFetchClaimListMine = exports.doShowSnackBar = exports.doCloseModal = exports.doOpenModal = exports.Lbryuri = exports.Lbry = undefined; + +var _app = __webpack_require__(7); + +Object.defineProperty(exports, 'doOpenModal', { + enumerable: true, + get: function get() { + return _app.doOpenModal; + } +}); +Object.defineProperty(exports, 'doCloseModal', { + enumerable: true, + get: function get() { + return _app.doCloseModal; + } +}); +Object.defineProperty(exports, 'doShowSnackBar', { + enumerable: true, + get: function get() { + return _app.doShowSnackBar; + } +}); var _claims = __webpack_require__(6); @@ -1752,7 +1942,7 @@ Object.defineProperty(exports, 'doResolveUri', { } }); -var _cost_info = __webpack_require__(12); +var _cost_info = __webpack_require__(14); Object.defineProperty(exports, 'doFetchCostInfoForUri', { enumerable: true, @@ -1761,7 +1951,7 @@ Object.defineProperty(exports, 'doFetchCostInfoForUri', { } }); -var _file_info = __webpack_require__(17); +var _file_info = __webpack_require__(20); Object.defineProperty(exports, 'doFetchFileInfo', { enumerable: true, @@ -1782,7 +1972,7 @@ Object.defineProperty(exports, 'doFetchFileInfosAndPublishedClaims', { } }); -var _search = __webpack_require__(18); +var _search = __webpack_require__(21); Object.defineProperty(exports, 'doSearch', { enumerable: true, @@ -1791,7 +1981,70 @@ Object.defineProperty(exports, 'doSearch', { } }); -var _claims2 = __webpack_require__(21); +var _wallet = __webpack_require__(23); + +Object.defineProperty(exports, 'doUpdateBalance', { + enumerable: true, + get: function get() { + return _wallet.doUpdateBalance; + } +}); +Object.defineProperty(exports, 'doBalanceSubscribe', { + enumerable: true, + get: function get() { + return _wallet.doBalanceSubscribe; + } +}); +Object.defineProperty(exports, 'doFetchTransactions', { + enumerable: true, + get: function get() { + return _wallet.doFetchTransactions; + } +}); +Object.defineProperty(exports, 'doFetchBlock', { + enumerable: true, + get: function get() { + return _wallet.doFetchBlock; + } +}); +Object.defineProperty(exports, 'doGetNewAddress', { + enumerable: true, + get: function get() { + return _wallet.doGetNewAddress; + } +}); +Object.defineProperty(exports, 'doCheckAddressIsMine', { + enumerable: true, + get: function get() { + return _wallet.doCheckAddressIsMine; + } +}); +Object.defineProperty(exports, 'doSendDraftTransaction', { + enumerable: true, + get: function get() { + return _wallet.doSendDraftTransaction; + } +}); +Object.defineProperty(exports, 'doSetDraftTransactionAmount', { + enumerable: true, + get: function get() { + return _wallet.doSetDraftTransactionAmount; + } +}); +Object.defineProperty(exports, 'doSetDraftTransactionAddress', { + enumerable: true, + get: function get() { + return _wallet.doSetDraftTransactionAddress; + } +}); +Object.defineProperty(exports, 'doSendSupport', { + enumerable: true, + get: function get() { + return _wallet.doSendSupport; + } +}); + +var _claims2 = __webpack_require__(25); Object.defineProperty(exports, 'claimsReducer', { enumerable: true, @@ -1800,7 +2053,7 @@ Object.defineProperty(exports, 'claimsReducer', { } }); -var _cost_info2 = __webpack_require__(22); +var _cost_info2 = __webpack_require__(26); Object.defineProperty(exports, 'costInfoReducer', { enumerable: true, @@ -1809,7 +2062,7 @@ Object.defineProperty(exports, 'costInfoReducer', { } }); -var _file_info2 = __webpack_require__(23); +var _file_info2 = __webpack_require__(27); Object.defineProperty(exports, 'fileInfoReducer', { enumerable: true, @@ -1818,7 +2071,7 @@ Object.defineProperty(exports, 'fileInfoReducer', { } }); -var _search2 = __webpack_require__(24); +var _search2 = __webpack_require__(28); Object.defineProperty(exports, 'searchReducer', { enumerable: true, @@ -1827,16 +2080,16 @@ Object.defineProperty(exports, 'searchReducer', { } }); -var _wallet = __webpack_require__(25); +var _wallet2 = __webpack_require__(29); Object.defineProperty(exports, 'walletReducer', { enumerable: true, get: function get() { - return _wallet.walletReducer; + return _wallet2.walletReducer; } }); -var _claims3 = __webpack_require__(2); +var _claims3 = __webpack_require__(4); Object.defineProperty(exports, 'makeSelectClaimForUri', { enumerable: true, @@ -1983,7 +2236,7 @@ Object.defineProperty(exports, 'selectResolvingUris', { } }); -var _cost_info3 = __webpack_require__(26); +var _cost_info3 = __webpack_require__(30); Object.defineProperty(exports, 'makeSelectFetchingCostInfoForUri', { enumerable: true, @@ -2018,6 +2271,24 @@ Object.defineProperty(exports, 'selectFetchingCostInfo', { var _file_info3 = __webpack_require__(9); +Object.defineProperty(exports, 'makeSelectFileInfoForUri', { + enumerable: true, + get: function get() { + return _file_info3.makeSelectFileInfoForUri; + } +}); +Object.defineProperty(exports, 'makeSelectDownloadingForUri', { + enumerable: true, + get: function get() { + return _file_info3.makeSelectDownloadingForUri; + } +}); +Object.defineProperty(exports, 'makeSelectLoadingForUri', { + enumerable: true, + get: function get() { + return _file_info3.makeSelectLoadingForUri; + } +}); Object.defineProperty(exports, 'selectFileInfosByOutpoint', { enumerable: true, get: function get() { @@ -2036,36 +2307,18 @@ Object.defineProperty(exports, 'selectIsFetchingFileListDownloadedOrPublished', return _file_info3.selectIsFetchingFileListDownloadedOrPublished; } }); -Object.defineProperty(exports, 'makeSelectFileInfoForUri', { - enumerable: true, - get: function get() { - return _file_info3.makeSelectFileInfoForUri; - } -}); Object.defineProperty(exports, 'selectDownloadingByOutpoint', { enumerable: true, get: function get() { return _file_info3.selectDownloadingByOutpoint; } }); -Object.defineProperty(exports, 'makeSelectDownloadingForUri', { - enumerable: true, - get: function get() { - return _file_info3.makeSelectDownloadingForUri; - } -}); Object.defineProperty(exports, 'selectUrisLoading', { enumerable: true, get: function get() { return _file_info3.selectUrisLoading; } }); -Object.defineProperty(exports, 'makeSelectLoadingForUri', { - enumerable: true, - get: function get() { - return _file_info3.makeSelectLoadingForUri; - } -}); Object.defineProperty(exports, 'selectFileInfosDownloaded', { enumerable: true, get: function get() { @@ -2085,7 +2338,7 @@ Object.defineProperty(exports, 'selectTotalDownloadProgress', { } }); -var _search3 = __webpack_require__(27); +var _search3 = __webpack_require__(31); Object.defineProperty(exports, 'makeSelectSearchUris', { enumerable: true, @@ -2124,29 +2377,117 @@ Object.defineProperty(exports, 'selectWunderBarIcon', { } }); -var _lbry = __webpack_require__(5); +var _wallet3 = __webpack_require__(11); + +Object.defineProperty(exports, 'makeSelectBlockDate', { + enumerable: true, + get: function get() { + return _wallet3.makeSelectBlockDate; + } +}); +Object.defineProperty(exports, 'selectBalance', { + enumerable: true, + get: function get() { + return _wallet3.selectBalance; + } +}); +Object.defineProperty(exports, 'selectTransactionsById', { + enumerable: true, + get: function get() { + return _wallet3.selectTransactionsById; + } +}); +Object.defineProperty(exports, 'selectTransactionItems', { + enumerable: true, + get: function get() { + return _wallet3.selectTransactionItems; + } +}); +Object.defineProperty(exports, 'selectRecentTransactions', { + enumerable: true, + get: function get() { + return _wallet3.selectRecentTransactions; + } +}); +Object.defineProperty(exports, 'selectHasTransactions', { + enumerable: true, + get: function get() { + return _wallet3.selectHasTransactions; + } +}); +Object.defineProperty(exports, 'selectIsFetchingTransactions', { + enumerable: true, + get: function get() { + return _wallet3.selectIsFetchingTransactions; + } +}); +Object.defineProperty(exports, 'selectIsSendingSupport', { + enumerable: true, + get: function get() { + return _wallet3.selectIsSendingSupport; + } +}); +Object.defineProperty(exports, 'selectReceiveAddress', { + enumerable: true, + get: function get() { + return _wallet3.selectReceiveAddress; + } +}); +Object.defineProperty(exports, 'selectGettingNewAddress', { + enumerable: true, + get: function get() { + return _wallet3.selectGettingNewAddress; + } +}); +Object.defineProperty(exports, 'selectDraftTransaction', { + enumerable: true, + get: function get() { + return _wallet3.selectDraftTransaction; + } +}); +Object.defineProperty(exports, 'selectDraftTransactionAmount', { + enumerable: true, + get: function get() { + return _wallet3.selectDraftTransactionAmount; + } +}); +Object.defineProperty(exports, 'selectDraftTransactionAddress', { + enumerable: true, + get: function get() { + return _wallet3.selectDraftTransactionAddress; + } +}); +Object.defineProperty(exports, 'selectDraftTransactionError', { + enumerable: true, + get: function get() { + return _wallet3.selectDraftTransactionError; + } +}); +Object.defineProperty(exports, 'selectBlocks', { + enumerable: true, + get: function get() { + return _wallet3.selectBlocks; + } +}); + +var _lbry = __webpack_require__(2); var _lbry2 = _interopRequireDefault(_lbry); -var _lbryapi = __webpack_require__(8); - -var _lbryapi2 = _interopRequireDefault(_lbryapi); - -var _lbryuri = __webpack_require__(1); +var _lbryuri = __webpack_require__(3); var _lbryuri2 = _interopRequireDefault(_lbryuri); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +// common exports.Lbry = _lbry2.default; -exports.LbryApi = _lbryapi2.default; exports.Lbryuri = _lbryuri2.default; // actions -// common /***/ }), -/* 11 */ +/* 13 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2233,7 +2574,7 @@ jsonrpc.call = function (connectionString, method, params, callback, errorCallba exports.default = jsonrpc; /***/ }), -/* 12 */ +/* 14 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2248,11 +2589,11 @@ var _action_types = __webpack_require__(0); var ACTIONS = _interopRequireWildcard(_action_types); -var _lbryapi = __webpack_require__(8); +var _lbryapi = __webpack_require__(15); var _lbryapi2 = _interopRequireDefault(_lbryapi); -var _claims = __webpack_require__(2); +var _claims = __webpack_require__(4); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -2293,7 +2634,118 @@ function doFetchCostInfoForUri(uri) { } /***/ }), -/* 13 */ +/* 15 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(process) { + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +var _lbry = __webpack_require__(2); + +var _lbry2 = _interopRequireDefault(_lbry); + +var _querystring = __webpack_require__(17); + +var _querystring2 = _interopRequireDefault(_querystring); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var LbryApi = { + enabled: true, + exchangePromise: null, + exchangeLastFetched: null +}; + +var CONNECTION_STRING = process.env.LBRY_APP_API_URL ? process.env.LBRY_APP_API_URL.replace(/\/*$/, '/') // exactly one slash at the end +: 'https://api.lbry.io/'; + +var EXCHANGE_RATE_TIMEOUT = 20 * 60 * 1000; + +LbryApi.getExchangeRates = function () { + if (!LbryApi.exchangeLastFetched || Date.now() - LbryApi.exchangeLastFetched > EXCHANGE_RATE_TIMEOUT) { + LbryApi.exchangePromise = new Promise(function (resolve, reject) { + LbryApi.call('lbc', 'exchange_rate', {}, 'get', true).then(function (_ref) { + var LBC_USD = _ref.lbc_usd, + LBC_BTC = _ref.lbc_btc, + BTC_USD = _ref.btc_usd; + + var rates = { LBC_USD: LBC_USD, LBC_BTC: LBC_BTC, BTC_USD: BTC_USD }; + resolve(rates); + }).catch(reject); + }); + LbryApi.exchangeLastFetched = Date.now(); + } + return LbryApi.exchangePromise; +}; + +LbryApi.call = function (resource, action) { + var params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + var method = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'get'; + + if (!LbryApi.enabled) { + console.log(__('Internal API disabled')); + return Promise.reject(new Error(__('LBRY internal API is disabled'))); + } + + if (!(method === 'get' || method === 'post')) { + return Promise.reject(new Error(__('Invalid method'))); + } + + function checkAndParse(response) { + if (response.status >= 200 && response.status < 300) { + return response.json(); + } + return response.json().then(function (json) { + var error = void 0; + if (json.error) { + error = new Error(json.error); + } else { + error = new Error('Unknown API error signature'); + } + error.response = response; // This is primarily a hack used in actions/user.js + return Promise.reject(error); + }); + } + + function makeRequest(url, options) { + return fetch(url, options).then(checkAndParse); + } + + var fullParams = _extends({}, params); + var qs = _querystring2.default.stringify(fullParams); + var url = '' + CONNECTION_STRING + resource + '/' + action + '?' + qs; + + var options = { + method: 'GET' + }; + + if (method === 'post') { + options = { + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded' + }, + body: qs + }; + url = '' + CONNECTION_STRING + resource + '/' + action; + } + + return makeRequest(url, options).then(function (response) { + return response.data; + }); +}; + +exports.default = LbryApi; +/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(16))) + +/***/ }), +/* 16 */ /***/ (function(module, exports) { // shim for using process in browser @@ -2483,18 +2935,18 @@ process.umask = function() { return 0; }; /***/ }), -/* 14 */ +/* 17 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -exports.decode = exports.parse = __webpack_require__(15); -exports.encode = exports.stringify = __webpack_require__(16); +exports.decode = exports.parse = __webpack_require__(18); +exports.encode = exports.stringify = __webpack_require__(19); /***/ }), -/* 15 */ +/* 18 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2585,7 +3037,7 @@ var isArray = Array.isArray || function (xs) { /***/ }), -/* 16 */ +/* 19 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2677,7 +3129,7 @@ var objectKeys = Object.keys || function (obj) { /***/ }), -/* 17 */ +/* 20 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2694,13 +3146,13 @@ var _action_types = __webpack_require__(0); var ACTIONS = _interopRequireWildcard(_action_types); -var _lbry = __webpack_require__(5); +var _lbry = __webpack_require__(2); var _lbry2 = _interopRequireDefault(_lbry); var _claims = __webpack_require__(6); -var _claims2 = __webpack_require__(2); +var _claims2 = __webpack_require__(4); var _file_info = __webpack_require__(9); @@ -2770,7 +3222,7 @@ function doFetchFileInfosAndPublishedClaims() { } /***/ }), -/* 18 */ +/* 21 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2785,17 +3237,17 @@ var _action_types = __webpack_require__(0); var ACTIONS = _interopRequireWildcard(_action_types); -var _lbryuri = __webpack_require__(1); +var _lbryuri = __webpack_require__(3); var _lbryuri2 = _interopRequireDefault(_lbryuri); var _claims = __webpack_require__(6); -var _navigation = __webpack_require__(19); +var _navigation = __webpack_require__(10); -var _navigation2 = __webpack_require__(3); +var _navigation2 = __webpack_require__(5); -var _batchActions = __webpack_require__(20); +var _batchActions = __webpack_require__(22); var _batchActions2 = _interopRequireDefault(_batchActions); @@ -2859,106 +3311,7 @@ function doSearch(rawQuery) { } /***/ }), -/* 19 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.doNavigate = doNavigate; -exports.doAuthNavigate = doAuthNavigate; -exports.doHistoryTraverse = doHistoryTraverse; -exports.doHistoryBack = doHistoryBack; -exports.doHistoryForward = doHistoryForward; -exports.doRecordScroll = doRecordScroll; - -var _action_types = __webpack_require__(0); - -var ACTIONS = _interopRequireWildcard(_action_types); - -var _navigation = __webpack_require__(3); - -var _query_params = __webpack_require__(7); - -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - -function doNavigate(path) { - var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; - - return function (dispatch) { - if (!path) { - return; - } - - var url = path; - if (params && Object.values(params).length) { - url += '?' + (0, _query_params.toQueryString)(params); - } - - var scrollY = options.scrollY; - - - dispatch({ - type: ACTIONS.HISTORY_NAVIGATE, - data: { url: url, index: options.index, scrollY: scrollY } - }); - }; -} - -function doAuthNavigate() { - var pathAfterAuth = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; - var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - - return function (dispatch) { - if (pathAfterAuth) { - dispatch({ - type: ACTIONS.CHANGE_AFTER_AUTH_PATH, - data: { - path: pathAfterAuth + '?' + (0, _query_params.toQueryString)(params) - } - }); - } - dispatch(doNavigate('/auth')); - }; -} - -function doHistoryTraverse(dispatch, state, modifier) { - var stack = (0, _navigation.selectHistoryStack)(state); - var index = (0, _navigation.selectHistoryIndex)(state) + modifier; - - if (index >= 0 && index < stack.length) { - var historyItem = stack[index]; - dispatch(doNavigate(historyItem.path, {}, { scrollY: historyItem.scrollY, index: index })); - } -} - -function doHistoryBack() { - return function (dispatch, getState) { - return doHistoryTraverse(dispatch, getState(), -1); - }; -} - -function doHistoryForward() { - return function (dispatch, getState) { - return doHistoryTraverse(dispatch, getState(), 1); - }; -} - -function doRecordScroll(scroll) { - return function (dispatch) { - dispatch({ - type: ACTIONS.WINDOW_SCROLLED, - data: { scrollY: scroll } - }); - }; -} - -/***/ }), -/* 20 */ +/* 22 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2982,7 +3335,271 @@ function batchActions() { exports.default = batchActions; /***/ }), -/* 21 */ +/* 23 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.doUpdateBalance = doUpdateBalance; +exports.doBalanceSubscribe = doBalanceSubscribe; +exports.doFetchTransactions = doFetchTransactions; +exports.doFetchBlock = doFetchBlock; +exports.doGetNewAddress = doGetNewAddress; +exports.doCheckAddressIsMine = doCheckAddressIsMine; +exports.doSendDraftTransaction = doSendDraftTransaction; +exports.doSetDraftTransactionAmount = doSetDraftTransactionAmount; +exports.doSetDraftTransactionAddress = doSetDraftTransactionAddress; +exports.doSendSupport = doSendSupport; + +var _action_types = __webpack_require__(0); + +var ACTIONS = _interopRequireWildcard(_action_types); + +var _modal_types = __webpack_require__(24); + +var MODALS = _interopRequireWildcard(_modal_types); + +var _lbry = __webpack_require__(2); + +var _lbry2 = _interopRequireDefault(_lbry); + +var _app = __webpack_require__(7); + +var _navigation = __webpack_require__(10); + +var _wallet = __webpack_require__(11); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function doUpdateBalance() { + return function (dispatch) { + _lbry2.default.wallet_balance().then(function (balance) { + return dispatch({ + type: ACTIONS.UPDATE_BALANCE, + data: { + balance: balance + } + }); + }); + }; +} + +function doBalanceSubscribe() { + return function (dispatch) { + dispatch(doUpdateBalance()); + setInterval(function () { + return dispatch(doUpdateBalance()); + }, 5000); + }; +} + +function doFetchTransactions() { + return function (dispatch) { + dispatch({ + type: ACTIONS.FETCH_TRANSACTIONS_STARTED + }); + + _lbry2.default.transaction_list({ include_tip_info: true }).then(function (results) { + dispatch({ + type: ACTIONS.FETCH_TRANSACTIONS_COMPLETED, + data: { + transactions: results + } + }); + }); + }; +} + +function doFetchBlock(height) { + return function (dispatch) { + _lbry2.default.block_show({ height: height }).then(function (block) { + dispatch({ + type: ACTIONS.FETCH_BLOCK_SUCCESS, + data: { block: block } + }); + }); + }; +} + +function doGetNewAddress() { + return function (dispatch) { + dispatch({ + type: ACTIONS.GET_NEW_ADDRESS_STARTED + }); + + _lbry2.default.wallet_new_address().then(function (address) { + localStorage.setItem('wallet_address', address); + dispatch({ + type: ACTIONS.GET_NEW_ADDRESS_COMPLETED, + data: { address: address } + }); + }); + }; +} + +function doCheckAddressIsMine(address) { + return function (dispatch) { + dispatch({ + type: ACTIONS.CHECK_ADDRESS_IS_MINE_STARTED + }); + + _lbry2.default.wallet_is_address_mine({ address: address }).then(function (isMine) { + if (!isMine) dispatch(doGetNewAddress()); + + dispatch({ + type: ACTIONS.CHECK_ADDRESS_IS_MINE_COMPLETED + }); + }); + }; +} + +function doSendDraftTransaction() { + return function (dispatch, getState) { + var state = getState(); + var draftTx = (0, _wallet.selectDraftTransaction)(state); + var balance = (0, _wallet.selectBalance)(state); + var amount = (0, _wallet.selectDraftTransactionAmount)(state); + + if (balance - amount <= 0) { + dispatch((0, _app.doOpenModal)(MODALS.INSUFFICIENT_CREDITS)); + return; + } + + dispatch({ + type: ACTIONS.SEND_TRANSACTION_STARTED + }); + + var successCallback = function successCallback(results) { + if (results === true) { + dispatch({ + type: ACTIONS.SEND_TRANSACTION_COMPLETED + }); + dispatch((0, _app.doShowSnackBar)({ + message: __('You sent ' + amount + ' LBC'), + linkText: __('History'), + linkTarget: __('/wallet') + })); + } else { + dispatch({ + type: ACTIONS.SEND_TRANSACTION_FAILED, + data: { error: results } + }); + dispatch((0, _app.doOpenModal)(MODALS.TRANSACTION_FAILED)); + } + }; + + var errorCallback = function errorCallback(error) { + dispatch({ + type: ACTIONS.SEND_TRANSACTION_FAILED, + data: { error: error.message } + }); + dispatch((0, _app.doOpenModal)(MODALS.TRANSACTION_FAILED)); + }; + + _lbry2.default.wallet_send({ + amount: draftTx.amount, + address: draftTx.address + }).then(successCallback, errorCallback); + }; +} + +function doSetDraftTransactionAmount(amount) { + return { + type: ACTIONS.SET_DRAFT_TRANSACTION_AMOUNT, + data: { amount: amount } + }; +} + +function doSetDraftTransactionAddress(address) { + return { + type: ACTIONS.SET_DRAFT_TRANSACTION_ADDRESS, + data: { address: address } + }; +} + +function doSendSupport(amount, claimId, uri) { + return function (dispatch, getState) { + var state = getState(); + var balance = (0, _wallet.selectBalance)(state); + + if (balance - amount <= 0) { + dispatch((0, _app.doOpenModal)(MODALS.INSUFFICIENT_CREDITS)); + return; + } + + dispatch({ + type: ACTIONS.SUPPORT_TRANSACTION_STARTED + }); + + var successCallback = function successCallback(results) { + if (results.txid) { + dispatch({ + type: ACTIONS.SUPPORT_TRANSACTION_COMPLETED + }); + dispatch((0, _app.doShowSnackBar)({ + message: __('You sent ' + amount + ' LBC as support, Mahalo!'), + linkText: __('History'), + linkTarget: __('/wallet') + })); + dispatch((0, _navigation.doNavigate)('/show', { uri: uri })); + } else { + dispatch({ + type: ACTIONS.SUPPORT_TRANSACTION_FAILED, + data: { error: results.code } + }); + dispatch((0, _app.doOpenModal)(MODALS.TRANSACTION_FAILED)); + } + }; + + var errorCallback = function errorCallback(error) { + dispatch({ + type: ACTIONS.SUPPORT_TRANSACTION_FAILED, + data: { error: error.code } + }); + dispatch((0, _app.doOpenModal)(MODALS.TRANSACTION_FAILED)); + }; + + _lbry2.default.wallet_send({ + claim_id: claimId, + amount: amount + }).then(successCallback, errorCallback); + }; +} + +/***/ }), +/* 24 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +var CONFIRM_FILE_REMOVE = exports.CONFIRM_FILE_REMOVE = 'confirmFileRemove'; +var INCOMPATIBLE_DAEMON = exports.INCOMPATIBLE_DAEMON = 'incompatibleDaemon'; +var FILE_TIMEOUT = exports.FILE_TIMEOUT = 'file_timeout'; +var DOWNLOADING = exports.DOWNLOADING = 'downloading'; +var ERROR = exports.ERROR = 'error'; +var INSUFFICIENT_CREDITS = exports.INSUFFICIENT_CREDITS = 'insufficient_credits'; +var UPGRADE = exports.UPGRADE = 'upgrade'; +var WELCOME = exports.WELCOME = 'welcome'; +var EMAIL_COLLECTION = exports.EMAIL_COLLECTION = 'email_collection'; +var FIRST_REWARD = exports.FIRST_REWARD = 'first_reward'; +var AUTHENTICATION_FAILURE = exports.AUTHENTICATION_FAILURE = 'auth_failure'; +var TRANSACTION_FAILED = exports.TRANSACTION_FAILED = 'transaction_failed'; +var REWARD_APPROVAL_REQUIRED = exports.REWARD_APPROVAL_REQUIRED = 'reward_approval_required'; +var AFFIRM_PURCHASE = exports.AFFIRM_PURCHASE = 'affirm_purchase'; +var CONFIRM_CLAIM_REVOKE = exports.CONFIRM_CLAIM_REVOKE = 'confirmClaimRevoke'; + +/***/ }), +/* 25 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3210,7 +3827,7 @@ function claimsReducer() { } /***/ }), -/* 22 */ +/* 26 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3268,7 +3885,7 @@ function costInfoReducer() { } /***/ }), -/* 23 */ +/* 27 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3465,7 +4082,7 @@ function fileInfoReducer() { } /***/ }), -/* 24 */ +/* 28 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3524,7 +4141,7 @@ function searchReducer() { } /***/ }), -/* 25 */ +/* 29 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3708,7 +4325,7 @@ function walletReducer() { } /***/ }), -/* 26 */ +/* 30 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3719,9 +4336,9 @@ Object.defineProperty(exports, "__esModule", { }); exports.makeSelectFetchingCostInfoForUri = exports.selectFetchingCostInfo = exports.selectCostForCurrentPageUri = exports.makeSelectCostInfoForUri = exports.selectAllCostInfoByUri = exports.selectState = undefined; -var _reselect = __webpack_require__(4); +var _reselect = __webpack_require__(1); -var _navigation = __webpack_require__(3); +var _navigation = __webpack_require__(5); var selectState = exports.selectState = function selectState(state) { return state.costInfo || {}; @@ -3752,7 +4369,7 @@ var makeSelectFetchingCostInfoForUri = exports.makeSelectFetchingCostInfoForUri }; /***/ }), -/* 27 */ +/* 31 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3763,9 +4380,9 @@ Object.defineProperty(exports, "__esModule", { }); exports.selectWunderBarIcon = exports.selectWunderBarAddress = exports.makeSelectSearchUris = exports.selectSearchUrisByQuery = exports.selectIsSearching = exports.selectSearchQuery = exports.selectState = undefined; -var _navigation = __webpack_require__(3); +var _navigation = __webpack_require__(5); -var _reselect = __webpack_require__(4); +var _reselect = __webpack_require__(1); var selectState = exports.selectState = function selectState(state) { return state.search || {}; diff --git a/src/index.js b/src/index.js index 3047082..847989c 100644 --- a/src/index.js +++ b/src/index.js @@ -1,14 +1,26 @@ // common import Lbry from 'lbry'; -import LbryApi from 'lbryapi'; import Lbryuri from 'lbryuri'; -export { Lbry, LbryApi, Lbryuri }; +export { Lbry, Lbryuri }; // actions +export { doOpenModal, doCloseModal, doShowSnackBar } from 'redux/actions/app'; export { doFetchClaimListMine, doAbandonClaim, doResolveUris, doResolveUri } from 'redux/actions/claims'; export { doFetchCostInfoForUri } from 'redux/actions/cost_info'; export { doFetchFileInfo, doFileList, doFetchFileInfosAndPublishedClaims } from 'redux/actions/file_info'; export { doSearch } from 'redux/actions/search'; +export { + doUpdateBalance, + doBalanceSubscribe, + doFetchTransactions, + doFetchBlock, + doGetNewAddress, + doCheckAddressIsMine, + doSendDraftTransaction, + doSetDraftTransactionAmount, + doSetDraftTransactionAddress, + doSendSupport +} from 'redux/actions/wallet'; // reducers export { claimsReducer } from 'redux/reducers/claims'; @@ -54,14 +66,14 @@ export { } from 'redux/selectors/cost_info'; export { + makeSelectFileInfoForUri, + makeSelectDownloadingForUri, + makeSelectLoadingForUri, selectFileInfosByOutpoint, selectIsFetchingFileList, selectIsFetchingFileListDownloadedOrPublished, - makeSelectFileInfoForUri, selectDownloadingByOutpoint, - makeSelectDownloadingForUri, selectUrisLoading, - makeSelectLoadingForUri, selectFileInfosDownloaded, selectDownloadingFileInfos, selectTotalDownloadProgress @@ -75,3 +87,21 @@ export { selectWunderBarAddress, selectWunderBarIcon } from 'redux/selectors/search'; + +export { + makeSelectBlockDate, + selectBalance, + selectTransactionsById, + selectTransactionItems, + selectRecentTransactions, + selectHasTransactions, + selectIsFetchingTransactions, + selectIsSendingSupport, + selectReceiveAddress, + selectGettingNewAddress, + selectDraftTransaction, + selectDraftTransactionAmount, + selectDraftTransactionAddress, + selectDraftTransactionError, + selectBlocks +} from 'redux/selectors/wallet'; diff --git a/src/redux/actions/app.js b/src/redux/actions/app.js new file mode 100644 index 0000000..5bf035a --- /dev/null +++ b/src/redux/actions/app.js @@ -0,0 +1,24 @@ +import * as ACTIONS from 'constants/action_types'; + +export function doOpenModal(modal, modalProps = {}) { + return { + type: ACTIONS.OPEN_MODAL, + data: { + modal, + modalProps, + }, + }; +} + +export function doCloseModal() { + return { + type: ACTIONS.CLOSE_MODAL, + }; +} + +export function doShowSnackBar(data) { + return { + type: ACTIONS.SHOW_SNACKBAR, + data, + }; +} -- 2.45.3 From d60fa6e18a441c00961398f573526191ac1c3026 Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Wed, 17 Jan 2018 15:45:45 +0100 Subject: [PATCH 03/41] removed resolutions and engines from package.json --- package.json | 7 ------- 1 file changed, 7 deletions(-) diff --git a/package.json b/package.json index f66958f..e69d094 100644 --- a/package.json +++ b/package.json @@ -96,13 +96,6 @@ "webpack": "^3.10.0", "webpack-build-notifier": "^0.1.18" }, - "resolutions": { - "webpack/webpack-sources": "1.0.1" - }, - "engines": { - "node": ">=6", - "yarn": "^1.3" - }, "license": "MIT", "lbrySettings": { "lbrynetDaemonVersion": "0.18.0", -- 2.45.3 From aac0ea997252284ddb0ec1ff04c7ee10e183cb64 Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Fri, 19 Jan 2018 11:48:43 +0100 Subject: [PATCH 04/41] moved navigation actions and selectors, exported commoon utils --- build/index.js | 906 +++++++++++++++++++++++---------------- src/index.js | 28 ++ src/lbry.js | 2 +- src/util/batchActions.js | 4 +- 4 files changed, 555 insertions(+), 385 deletions(-) diff --git a/build/index.js b/build/index.js index c30743a..0770204 100644 --- a/build/index.js +++ b/build/index.js @@ -70,7 +70,7 @@ return /******/ (function(modules) { // webpackBootstrap /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 12); +/******/ return __webpack_require__(__webpack_require__.s = 13); /******/ }) /************************************************************************/ /******/ ([ @@ -255,6 +255,176 @@ var MEDIA_POSITION = exports.MEDIA_POSITION = 'MEDIA_POSITION'; "use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.selectActiveHistoryEntry = exports.selectHistoryStack = exports.selectHistoryIndex = exports.selectIsForwardDisabled = exports.selectIsBackDisabled = exports.selectPathAfterAuth = exports.selectPageTitle = exports.selectHeaderLinks = exports.makeSelectCurrentParam = exports.selectCurrentParams = exports.selectCurrentPage = exports.computePageFromPath = exports.selectCurrentPath = exports.selectState = undefined; + +var _reselect = __webpack_require__(2); + +var _query_params = __webpack_require__(7); + +var _lbryuri = __webpack_require__(4); + +var _lbryuri2 = _interopRequireDefault(_lbryuri); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var selectState = exports.selectState = function selectState(state) { + return state.navigation || {}; +}; + +var selectCurrentPath = exports.selectCurrentPath = (0, _reselect.createSelector)(selectState, function (state) { + return state.currentPath; +}); + +var computePageFromPath = exports.computePageFromPath = function computePageFromPath(path) { + return path.replace(/^\//, '').split('?')[0]; +}; + +var selectCurrentPage = exports.selectCurrentPage = (0, _reselect.createSelector)(selectCurrentPath, function (path) { + return computePageFromPath(path); +}); + +var selectCurrentParams = exports.selectCurrentParams = (0, _reselect.createSelector)(selectCurrentPath, function (path) { + if (path === undefined) return {}; + if (!path.match(/\?/)) return {}; + + return (0, _query_params.parseQueryParams)(path.split('?')[1]); +}); + +var makeSelectCurrentParam = exports.makeSelectCurrentParam = function makeSelectCurrentParam(param) { + return (0, _reselect.createSelector)(selectCurrentParams, function (params) { + return params ? params[param] : undefined; + }); +}; + +var selectHeaderLinks = exports.selectHeaderLinks = (0, _reselect.createSelector)(selectCurrentPage, function (page) { + // This contains intentional fall throughs + switch (page) { + case 'wallet': + case 'history': + case 'send': + case 'getcredits': + case 'invite': + case 'rewards': + case 'backup': + return { + wallet: __('Overview'), + getcredits: __('Get Credits'), + send: __('Send / Receive'), + rewards: __('Rewards'), + invite: __('Invites'), + history: __('History') + }; + case 'downloaded': + case 'published': + return { + downloaded: __('Downloaded'), + published: __('Published') + }; + case 'settings': + case 'help': + return { + settings: __('Settings'), + help: __('Help') + }; + case 'discover': + case 'subscriptions': + return { + discover: __('Discover'), + subscriptions: __('Subscriptions') + }; + default: + return null; + } +}); + +var selectPageTitle = exports.selectPageTitle = (0, _reselect.createSelector)(selectCurrentPage, selectCurrentParams, function (page, params) { + switch (page) { + case 'settings': + return __('Settings'); + case 'report': + return __('Report'); + case 'wallet': + return __('Wallet'); + case 'send': + return __('Send or Receive LBRY Credits'); + case 'getcredits': + return __('Get LBRY Credits'); + case 'backup': + return __('Backup Your Wallet'); + case 'rewards': + return __('Rewards'); + case 'invite': + return __('Invites'); + case 'start': + return __('Start'); + case 'publish': + return params.id ? __('Edit') : __('Publish'); + case 'help': + return __('Help'); + case 'developer': + return __('Developer'); + case 'show': + { + var parts = [_lbryuri2.default.normalize(params.uri)]; + // If the params has any keys other than "uri" + if (Object.keys(params).length > 1) { + parts.push((0, _query_params.toQueryString)(Object.assign({}, params, { uri: null }))); + } + return parts.join('?'); + } + case 'downloaded': + return __('Downloads & Purchases'); + case 'published': + return __('Publications'); + case 'search': + return params.query ? __('Search results for %s', params.query) : __('Search'); + case 'subscriptions': + return __('Your Subscriptions'); + case 'discover': + case false: + case null: + case '': + return ''; + default: + return page[0].toUpperCase() + (page.length > 0 ? page.substr(1) : ''); + } +}); + +var selectPathAfterAuth = exports.selectPathAfterAuth = (0, _reselect.createSelector)(selectState, function (state) { + return state.pathAfterAuth; +}); + +var selectIsBackDisabled = exports.selectIsBackDisabled = (0, _reselect.createSelector)(selectState, function (state) { + return state.index === 0; +}); + +var selectIsForwardDisabled = exports.selectIsForwardDisabled = (0, _reselect.createSelector)(selectState, function (state) { + return state.index === state.stack.length - 1; +}); + +var selectHistoryIndex = exports.selectHistoryIndex = (0, _reselect.createSelector)(selectState, function (state) { + return state.index; +}); + +var selectHistoryStack = exports.selectHistoryStack = (0, _reselect.createSelector)(selectState, function (state) { + return state.stack; +}); + +// returns current page attributes (scrollY, path) +var selectActiveHistoryEntry = exports.selectActiveHistoryEntry = (0, _reselect.createSelector)(selectState, function (state) { + return state.stack[state.index]; +}); + +/***/ }), +/* 2 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + exports.__esModule = true; exports.defaultMemoize = defaultMemoize; exports.createSelectorCreator = createSelectorCreator; @@ -380,7 +550,7 @@ function createStructuredSelector(selectors) { } /***/ }), -/* 2 */ +/* 3 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -390,7 +560,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); -var _jsonrpc = __webpack_require__(13); +var _jsonrpc = __webpack_require__(14); var _jsonrpc2 = _interopRequireDefault(_jsonrpc); @@ -690,7 +860,7 @@ var lbryProxy = new Proxy(Lbry, { exports.default = lbryProxy; /***/ }), -/* 3 */ +/* 4 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -928,7 +1098,7 @@ if (window) { exports.default = Lbryuri; /***/ }), -/* 4 */ +/* 5 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -939,13 +1109,13 @@ Object.defineProperty(exports, "__esModule", { }); exports.makeSelectIsUriResolving = exports.selectResolvingUris = exports.selectMyChannelClaims = exports.selectFetchingMyChannels = exports.selectMyClaimsOutpoints = exports.selectAllMyClaimsByOutpoint = exports.selectMyClaimsWithoutChannels = exports.selectMyClaims = exports.selectPendingClaims = exports.selectIsFetchingClaimListMine = exports.makeSelectContentTypeForUri = exports.makeSelectTitleForUri = exports.makeSelectMetadataForUri = exports.makeSelectClaimsInChannelForCurrentPage = exports.makeSelectFetchingChannelClaims = exports.selectAllFetchingChannelClaims = exports.makeSelectClaimIsMine = exports.selectMyActiveClaims = exports.selectAbandoningIds = exports.selectMyClaimsRaw = exports.makeSelectClaimForUri = exports.selectAllClaimsByChannel = exports.selectClaimsByUri = exports.selectClaimsById = undefined; -var _lbryuri = __webpack_require__(3); +var _lbryuri = __webpack_require__(4); var _lbryuri2 = _interopRequireDefault(_lbryuri); -var _navigation = __webpack_require__(5); +var _navigation = __webpack_require__(1); -var _reselect = __webpack_require__(1); +var _reselect = __webpack_require__(2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -1128,176 +1298,6 @@ var makeSelectIsUriResolving = exports.makeSelectIsUriResolving = function makeS }); }; -/***/ }), -/* 5 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.selectActiveHistoryEntry = exports.selectHistoryStack = exports.selectHistoryIndex = exports.selectIsForwardDisabled = exports.selectIsBackDisabled = exports.selectPathAfterAuth = exports.selectPageTitle = exports.selectHeaderLinks = exports.makeSelectCurrentParam = exports.selectCurrentParams = exports.selectCurrentPage = exports.computePageFromPath = exports.selectCurrentPath = exports.selectState = undefined; - -var _reselect = __webpack_require__(1); - -var _query_params = __webpack_require__(8); - -var _lbryuri = __webpack_require__(3); - -var _lbryuri2 = _interopRequireDefault(_lbryuri); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var selectState = exports.selectState = function selectState(state) { - return state.navigation || {}; -}; - -var selectCurrentPath = exports.selectCurrentPath = (0, _reselect.createSelector)(selectState, function (state) { - return state.currentPath; -}); - -var computePageFromPath = exports.computePageFromPath = function computePageFromPath(path) { - return path.replace(/^\//, '').split('?')[0]; -}; - -var selectCurrentPage = exports.selectCurrentPage = (0, _reselect.createSelector)(selectCurrentPath, function (path) { - return computePageFromPath(path); -}); - -var selectCurrentParams = exports.selectCurrentParams = (0, _reselect.createSelector)(selectCurrentPath, function (path) { - if (path === undefined) return {}; - if (!path.match(/\?/)) return {}; - - return (0, _query_params.parseQueryParams)(path.split('?')[1]); -}); - -var makeSelectCurrentParam = exports.makeSelectCurrentParam = function makeSelectCurrentParam(param) { - return (0, _reselect.createSelector)(selectCurrentParams, function (params) { - return params ? params[param] : undefined; - }); -}; - -var selectHeaderLinks = exports.selectHeaderLinks = (0, _reselect.createSelector)(selectCurrentPage, function (page) { - // This contains intentional fall throughs - switch (page) { - case 'wallet': - case 'history': - case 'send': - case 'getcredits': - case 'invite': - case 'rewards': - case 'backup': - return { - wallet: __('Overview'), - getcredits: __('Get Credits'), - send: __('Send / Receive'), - rewards: __('Rewards'), - invite: __('Invites'), - history: __('History') - }; - case 'downloaded': - case 'published': - return { - downloaded: __('Downloaded'), - published: __('Published') - }; - case 'settings': - case 'help': - return { - settings: __('Settings'), - help: __('Help') - }; - case 'discover': - case 'subscriptions': - return { - discover: __('Discover'), - subscriptions: __('Subscriptions') - }; - default: - return null; - } -}); - -var selectPageTitle = exports.selectPageTitle = (0, _reselect.createSelector)(selectCurrentPage, selectCurrentParams, function (page, params) { - switch (page) { - case 'settings': - return __('Settings'); - case 'report': - return __('Report'); - case 'wallet': - return __('Wallet'); - case 'send': - return __('Send or Receive LBRY Credits'); - case 'getcredits': - return __('Get LBRY Credits'); - case 'backup': - return __('Backup Your Wallet'); - case 'rewards': - return __('Rewards'); - case 'invite': - return __('Invites'); - case 'start': - return __('Start'); - case 'publish': - return params.id ? __('Edit') : __('Publish'); - case 'help': - return __('Help'); - case 'developer': - return __('Developer'); - case 'show': - { - var parts = [_lbryuri2.default.normalize(params.uri)]; - // If the params has any keys other than "uri" - if (Object.keys(params).length > 1) { - parts.push((0, _query_params.toQueryString)(Object.assign({}, params, { uri: null }))); - } - return parts.join('?'); - } - case 'downloaded': - return __('Downloads & Purchases'); - case 'published': - return __('Publications'); - case 'search': - return params.query ? __('Search results for %s', params.query) : __('Search'); - case 'subscriptions': - return __('Your Subscriptions'); - case 'discover': - case false: - case null: - case '': - return ''; - default: - return page[0].toUpperCase() + (page.length > 0 ? page.substr(1) : ''); - } -}); - -var selectPathAfterAuth = exports.selectPathAfterAuth = (0, _reselect.createSelector)(selectState, function (state) { - return state.pathAfterAuth; -}); - -var selectIsBackDisabled = exports.selectIsBackDisabled = (0, _reselect.createSelector)(selectState, function (state) { - return state.index === 0; -}); - -var selectIsForwardDisabled = exports.selectIsForwardDisabled = (0, _reselect.createSelector)(selectState, function (state) { - return state.index === state.stack.length - 1; -}); - -var selectHistoryIndex = exports.selectHistoryIndex = (0, _reselect.createSelector)(selectState, function (state) { - return state.index; -}); - -var selectHistoryStack = exports.selectHistoryStack = (0, _reselect.createSelector)(selectState, function (state) { - return state.stack; -}); - -// returns current page attributes (scrollY, path) -var selectActiveHistoryEntry = exports.selectActiveHistoryEntry = (0, _reselect.createSelector)(selectState, function (state) { - return state.stack[state.index]; -}); - /***/ }), /* 6 */ /***/ (function(module, exports, __webpack_require__) { @@ -1320,15 +1320,15 @@ var _action_types = __webpack_require__(0); var ACTIONS = _interopRequireWildcard(_action_types); -var _lbry = __webpack_require__(2); +var _lbry = __webpack_require__(3); var _lbry2 = _interopRequireDefault(_lbry); -var _lbryuri = __webpack_require__(3); +var _lbryuri = __webpack_require__(4); var _lbryuri2 = _interopRequireDefault(_lbryuri); -var _claims = __webpack_require__(4); +var _claims = __webpack_require__(5); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -1455,51 +1455,6 @@ function doAbandonClaim(txid, nout) { "use strict"; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.doOpenModal = doOpenModal; -exports.doCloseModal = doCloseModal; -exports.doShowSnackBar = doShowSnackBar; - -var _action_types = __webpack_require__(0); - -var ACTIONS = _interopRequireWildcard(_action_types); - -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - -function doOpenModal(modal) { - var modalProps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - - return { - type: ACTIONS.OPEN_MODAL, - data: { - modal: modal, - modalProps: modalProps - } - }; -} - -function doCloseModal() { - return { - type: ACTIONS.CLOSE_MODAL - }; -} - -function doShowSnackBar(data) { - return { - type: ACTIONS.SHOW_SNACKBAR, - data: data - }; -} - -/***/ }), -/* 8 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - Object.defineProperty(exports, "__esModule", { value: true }); @@ -1538,6 +1493,105 @@ function toQueryString(params) { return parts.join('&'); } +/***/ }), +/* 8 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.doNavigate = doNavigate; +exports.doAuthNavigate = doAuthNavigate; +exports.doHistoryTraverse = doHistoryTraverse; +exports.doHistoryBack = doHistoryBack; +exports.doHistoryForward = doHistoryForward; +exports.doRecordScroll = doRecordScroll; + +var _action_types = __webpack_require__(0); + +var ACTIONS = _interopRequireWildcard(_action_types); + +var _navigation = __webpack_require__(1); + +var _query_params = __webpack_require__(7); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function doNavigate(path) { + var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + + return function (dispatch) { + if (!path) { + return; + } + + var url = path; + if (params && Object.values(params).length) { + url += '?' + (0, _query_params.toQueryString)(params); + } + + var scrollY = options.scrollY; + + + dispatch({ + type: ACTIONS.HISTORY_NAVIGATE, + data: { url: url, index: options.index, scrollY: scrollY } + }); + }; +} + +function doAuthNavigate() { + var pathAfterAuth = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + return function (dispatch) { + if (pathAfterAuth) { + dispatch({ + type: ACTIONS.CHANGE_AFTER_AUTH_PATH, + data: { + path: pathAfterAuth + '?' + (0, _query_params.toQueryString)(params) + } + }); + } + dispatch(doNavigate('/auth')); + }; +} + +function doHistoryTraverse(dispatch, state, modifier) { + var stack = (0, _navigation.selectHistoryStack)(state); + var index = (0, _navigation.selectHistoryIndex)(state) + modifier; + + if (index >= 0 && index < stack.length) { + var historyItem = stack[index]; + dispatch(doNavigate(historyItem.path, {}, { scrollY: historyItem.scrollY, index: index })); + } +} + +function doHistoryBack() { + return function (dispatch, getState) { + return doHistoryTraverse(dispatch, getState(), -1); + }; +} + +function doHistoryForward() { + return function (dispatch, getState) { + return doHistoryTraverse(dispatch, getState(), 1); + }; +} + +function doRecordScroll(scroll) { + return function (dispatch) { + dispatch({ + type: ACTIONS.WINDOW_SCROLLED, + data: { scrollY: scroll } + }); + }; +} + /***/ }), /* 9 */ /***/ (function(module, exports, __webpack_require__) { @@ -1545,14 +1599,59 @@ function toQueryString(params) { "use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.doOpenModal = doOpenModal; +exports.doCloseModal = doCloseModal; +exports.doShowSnackBar = doShowSnackBar; + +var _action_types = __webpack_require__(0); + +var ACTIONS = _interopRequireWildcard(_action_types); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function doOpenModal(modal) { + var modalProps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + return { + type: ACTIONS.OPEN_MODAL, + data: { + modal: modal, + modalProps: modalProps + } + }; +} + +function doCloseModal() { + return { + type: ACTIONS.CLOSE_MODAL + }; +} + +function doShowSnackBar(data) { + return { + type: ACTIONS.SHOW_SNACKBAR, + data: data + }; +} + +/***/ }), +/* 10 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + Object.defineProperty(exports, "__esModule", { value: true }); exports.selectTotalDownloadProgress = exports.selectDownloadingFileInfos = exports.selectFileInfosDownloaded = exports.makeSelectLoadingForUri = exports.selectUrisLoading = exports.makeSelectDownloadingForUri = exports.selectDownloadingByOutpoint = exports.makeSelectFileInfoForUri = exports.selectIsFetchingFileListDownloadedOrPublished = exports.selectIsFetchingFileList = exports.selectFileInfosByOutpoint = exports.selectState = undefined; -var _claims = __webpack_require__(4); +var _claims = __webpack_require__(5); -var _reselect = __webpack_require__(1); +var _reselect = __webpack_require__(2); var selectState = exports.selectState = function selectState(state) { return state.fileInfo || {}; @@ -1648,7 +1747,7 @@ var selectTotalDownloadProgress = exports.selectTotalDownloadProgress = (0, _res }); /***/ }), -/* 10 */ +/* 11 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1657,97 +1756,21 @@ var selectTotalDownloadProgress = exports.selectTotalDownloadProgress = (0, _res Object.defineProperty(exports, "__esModule", { value: true }); -exports.doNavigate = doNavigate; -exports.doAuthNavigate = doAuthNavigate; -exports.doHistoryTraverse = doHistoryTraverse; -exports.doHistoryBack = doHistoryBack; -exports.doHistoryForward = doHistoryForward; -exports.doRecordScroll = doRecordScroll; - -var _action_types = __webpack_require__(0); - -var ACTIONS = _interopRequireWildcard(_action_types); - -var _navigation = __webpack_require__(5); - -var _query_params = __webpack_require__(8); - -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - -function doNavigate(path) { - var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; - - return function (dispatch) { - if (!path) { - return; - } - - var url = path; - if (params && Object.values(params).length) { - url += '?' + (0, _query_params.toQueryString)(params); - } - - var scrollY = options.scrollY; - - - dispatch({ - type: ACTIONS.HISTORY_NAVIGATE, - data: { url: url, index: options.index, scrollY: scrollY } - }); - }; -} - -function doAuthNavigate() { - var pathAfterAuth = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; - var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - - return function (dispatch) { - if (pathAfterAuth) { - dispatch({ - type: ACTIONS.CHANGE_AFTER_AUTH_PATH, - data: { - path: pathAfterAuth + '?' + (0, _query_params.toQueryString)(params) - } - }); - } - dispatch(doNavigate('/auth')); - }; -} - -function doHistoryTraverse(dispatch, state, modifier) { - var stack = (0, _navigation.selectHistoryStack)(state); - var index = (0, _navigation.selectHistoryIndex)(state) + modifier; - - if (index >= 0 && index < stack.length) { - var historyItem = stack[index]; - dispatch(doNavigate(historyItem.path, {}, { scrollY: historyItem.scrollY, index: index })); +exports.batchActions = batchActions; +// https://github.com/reactjs/redux/issues/911 +function batchActions() { + for (var _len = arguments.length, actions = Array(_len), _key = 0; _key < _len; _key++) { + actions[_key] = arguments[_key]; } -} -function doHistoryBack() { - return function (dispatch, getState) { - return doHistoryTraverse(dispatch, getState(), -1); - }; -} - -function doHistoryForward() { - return function (dispatch, getState) { - return doHistoryTraverse(dispatch, getState(), 1); - }; -} - -function doRecordScroll(scroll) { - return function (dispatch) { - dispatch({ - type: ACTIONS.WINDOW_SCROLLED, - data: { scrollY: scroll } - }); + return { + type: 'BATCH_ACTIONS', + actions: actions }; } /***/ }), -/* 11 */ +/* 12 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1758,7 +1781,7 @@ Object.defineProperty(exports, "__esModule", { }); exports.makeSelectBlockDate = exports.selectBlocks = exports.selectDraftTransactionError = exports.selectDraftTransactionAddress = exports.selectDraftTransactionAmount = exports.selectDraftTransaction = exports.selectGettingNewAddress = exports.selectReceiveAddress = exports.selectIsSendingSupport = exports.selectIsFetchingTransactions = exports.selectHasTransactions = exports.selectRecentTransactions = exports.selectTransactionItems = exports.selectTransactionsById = exports.selectBalance = exports.selectState = undefined; -var _reselect = __webpack_require__(1); +var _reselect = __webpack_require__(2); function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } @@ -1883,7 +1906,7 @@ var makeSelectBlockDate = exports.makeSelectBlockDate = function makeSelectBlock }; /***/ }), -/* 12 */ +/* 13 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1892,9 +1915,10 @@ var makeSelectBlockDate = exports.makeSelectBlockDate = function makeSelectBlock Object.defineProperty(exports, "__esModule", { value: true }); -exports.selectBlocks = exports.selectDraftTransactionError = exports.selectDraftTransactionAddress = exports.selectDraftTransactionAmount = exports.selectDraftTransaction = exports.selectGettingNewAddress = exports.selectReceiveAddress = exports.selectIsSendingSupport = exports.selectIsFetchingTransactions = exports.selectHasTransactions = exports.selectRecentTransactions = exports.selectTransactionItems = exports.selectTransactionsById = exports.selectBalance = exports.makeSelectBlockDate = exports.selectWunderBarIcon = exports.selectWunderBarAddress = exports.selectSearchUrisByQuery = exports.selectIsSearching = exports.selectSearchQuery = exports.makeSelectSearchUris = exports.selectTotalDownloadProgress = exports.selectDownloadingFileInfos = exports.selectFileInfosDownloaded = exports.selectUrisLoading = exports.selectDownloadingByOutpoint = exports.selectIsFetchingFileListDownloadedOrPublished = exports.selectIsFetchingFileList = exports.selectFileInfosByOutpoint = exports.makeSelectLoadingForUri = exports.makeSelectDownloadingForUri = exports.makeSelectFileInfoForUri = exports.selectFetchingCostInfo = exports.selectCostForCurrentPageUri = exports.selectAllCostInfoByUri = exports.makeSelectCostInfoForUri = exports.makeSelectFetchingCostInfoForUri = exports.selectResolvingUris = exports.selectMyChannelClaims = exports.selectFetchingMyChannels = exports.selectMyClaimsOutpoints = exports.selectAllMyClaimsByOutpoint = exports.selectMyClaimsWithoutChannels = exports.selectMyClaims = exports.selectPendingClaims = exports.selectIsFetchingClaimListMine = exports.selectAllFetchingChannelClaims = exports.selectMyActiveClaims = exports.selectAbandoningIds = exports.selectMyClaimsRaw = exports.selectAllClaimsByChannel = exports.selectClaimsByUri = exports.selectClaimsById = exports.makeSelectIsUriResolving = exports.makeSelectContentTypeForUri = exports.makeSelectTitleForUri = exports.makeSelectMetadataForUri = exports.makeSelectClaimsInChannelForCurrentPage = exports.makeSelectFetchingChannelClaims = exports.makeSelectClaimIsMine = exports.makeSelectClaimForUri = exports.walletReducer = exports.searchReducer = exports.fileInfoReducer = exports.costInfoReducer = exports.claimsReducer = exports.doSendSupport = exports.doSetDraftTransactionAddress = exports.doSetDraftTransactionAmount = exports.doSendDraftTransaction = exports.doCheckAddressIsMine = exports.doGetNewAddress = exports.doFetchBlock = exports.doFetchTransactions = exports.doBalanceSubscribe = exports.doUpdateBalance = exports.doSearch = exports.doFetchFileInfosAndPublishedClaims = exports.doFileList = exports.doFetchFileInfo = exports.doFetchCostInfoForUri = exports.doResolveUri = exports.doResolveUris = exports.doAbandonClaim = exports.doFetchClaimListMine = exports.doShowSnackBar = exports.doCloseModal = exports.doOpenModal = exports.Lbryuri = exports.Lbry = undefined; +exports.selectBlocks = exports.selectDraftTransactionError = exports.selectDraftTransactionAddress = exports.selectDraftTransactionAmount = exports.selectDraftTransaction = exports.selectGettingNewAddress = exports.selectReceiveAddress = exports.selectIsSendingSupport = exports.selectIsFetchingTransactions = exports.selectHasTransactions = exports.selectRecentTransactions = exports.selectTransactionItems = undefined; +exports.selectTransactionsById = exports.selectBalance = exports.makeSelectBlockDate = exports.selectWunderBarIcon = exports.selectWunderBarAddress = exports.selectSearchUrisByQuery = exports.selectIsSearching = exports.selectSearchQuery = exports.makeSelectSearchUris = exports.selectActiveHistoryEntry = exports.selectHistoryStack = exports.selectHistoryIndex = exports.selectIsForwardDisabled = exports.selectIsBackDisabled = exports.selectPathAfterAuth = exports.selectPageTitle = exports.selectHeaderLinks = exports.selectCurrentParams = exports.selectCurrentPage = exports.selectCurrentPath = exports.makeSelectCurrentParam = exports.computePageFromPath = exports.selectTotalDownloadProgress = exports.selectDownloadingFileInfos = exports.selectFileInfosDownloaded = exports.selectUrisLoading = exports.selectDownloadingByOutpoint = exports.selectIsFetchingFileListDownloadedOrPublished = exports.selectIsFetchingFileList = exports.selectFileInfosByOutpoint = exports.makeSelectLoadingForUri = exports.makeSelectDownloadingForUri = exports.makeSelectFileInfoForUri = exports.selectFetchingCostInfo = exports.selectCostForCurrentPageUri = exports.selectAllCostInfoByUri = exports.makeSelectCostInfoForUri = exports.makeSelectFetchingCostInfoForUri = exports.selectResolvingUris = exports.selectMyChannelClaims = exports.selectFetchingMyChannels = exports.selectMyClaimsOutpoints = exports.selectAllMyClaimsByOutpoint = exports.selectMyClaimsWithoutChannels = exports.selectMyClaims = exports.selectPendingClaims = exports.selectIsFetchingClaimListMine = exports.selectAllFetchingChannelClaims = exports.selectMyActiveClaims = exports.selectAbandoningIds = exports.selectMyClaimsRaw = exports.selectAllClaimsByChannel = exports.selectClaimsByUri = exports.selectClaimsById = exports.makeSelectIsUriResolving = exports.makeSelectContentTypeForUri = exports.makeSelectTitleForUri = exports.makeSelectMetadataForUri = exports.makeSelectClaimsInChannelForCurrentPage = exports.makeSelectFetchingChannelClaims = exports.makeSelectClaimIsMine = exports.makeSelectClaimForUri = exports.walletReducer = exports.searchReducer = exports.fileInfoReducer = exports.costInfoReducer = exports.claimsReducer = exports.toQueryString = exports.parseQueryParams = exports.batchActions = exports.doSendSupport = exports.doSetDraftTransactionAddress = exports.doSetDraftTransactionAmount = exports.doSendDraftTransaction = exports.doCheckAddressIsMine = exports.doGetNewAddress = exports.doFetchBlock = exports.doFetchTransactions = exports.doBalanceSubscribe = exports.doUpdateBalance = exports.doSearch = exports.doRecordScroll = exports.doHistoryForward = exports.doHistoryBack = exports.doHistoryTraverse = exports.doAuthNavigate = exports.doNavigate = exports.doFetchFileInfosAndPublishedClaims = exports.doFileList = exports.doFetchFileInfo = exports.doFetchCostInfoForUri = exports.doResolveUri = exports.doResolveUris = exports.doAbandonClaim = exports.doFetchClaimListMine = exports.doShowSnackBar = exports.doCloseModal = exports.doOpenModal = exports.Lbryuri = exports.Lbry = undefined; -var _app = __webpack_require__(7); +var _app = __webpack_require__(9); Object.defineProperty(exports, 'doOpenModal', { enumerable: true, @@ -1942,7 +1966,7 @@ Object.defineProperty(exports, 'doResolveUri', { } }); -var _cost_info = __webpack_require__(14); +var _cost_info = __webpack_require__(15); Object.defineProperty(exports, 'doFetchCostInfoForUri', { enumerable: true, @@ -1951,7 +1975,7 @@ Object.defineProperty(exports, 'doFetchCostInfoForUri', { } }); -var _file_info = __webpack_require__(20); +var _file_info = __webpack_require__(21); Object.defineProperty(exports, 'doFetchFileInfo', { enumerable: true, @@ -1972,7 +1996,46 @@ Object.defineProperty(exports, 'doFetchFileInfosAndPublishedClaims', { } }); -var _search = __webpack_require__(21); +var _navigation = __webpack_require__(8); + +Object.defineProperty(exports, 'doNavigate', { + enumerable: true, + get: function get() { + return _navigation.doNavigate; + } +}); +Object.defineProperty(exports, 'doAuthNavigate', { + enumerable: true, + get: function get() { + return _navigation.doAuthNavigate; + } +}); +Object.defineProperty(exports, 'doHistoryTraverse', { + enumerable: true, + get: function get() { + return _navigation.doHistoryTraverse; + } +}); +Object.defineProperty(exports, 'doHistoryBack', { + enumerable: true, + get: function get() { + return _navigation.doHistoryBack; + } +}); +Object.defineProperty(exports, 'doHistoryForward', { + enumerable: true, + get: function get() { + return _navigation.doHistoryForward; + } +}); +Object.defineProperty(exports, 'doRecordScroll', { + enumerable: true, + get: function get() { + return _navigation.doRecordScroll; + } +}); + +var _search = __webpack_require__(22); Object.defineProperty(exports, 'doSearch', { enumerable: true, @@ -2044,6 +2107,30 @@ Object.defineProperty(exports, 'doSendSupport', { } }); +var _batchActions = __webpack_require__(11); + +Object.defineProperty(exports, 'batchActions', { + enumerable: true, + get: function get() { + return _batchActions.batchActions; + } +}); + +var _query_params = __webpack_require__(7); + +Object.defineProperty(exports, 'parseQueryParams', { + enumerable: true, + get: function get() { + return _query_params.parseQueryParams; + } +}); +Object.defineProperty(exports, 'toQueryString', { + enumerable: true, + get: function get() { + return _query_params.toQueryString; + } +}); + var _claims2 = __webpack_require__(25); Object.defineProperty(exports, 'claimsReducer', { @@ -2089,7 +2176,7 @@ Object.defineProperty(exports, 'walletReducer', { } }); -var _claims3 = __webpack_require__(4); +var _claims3 = __webpack_require__(5); Object.defineProperty(exports, 'makeSelectClaimForUri', { enumerable: true, @@ -2269,7 +2356,7 @@ Object.defineProperty(exports, 'selectFetchingCostInfo', { } }); -var _file_info3 = __webpack_require__(9); +var _file_info3 = __webpack_require__(10); Object.defineProperty(exports, 'makeSelectFileInfoForUri', { enumerable: true, @@ -2338,6 +2425,87 @@ Object.defineProperty(exports, 'selectTotalDownloadProgress', { } }); +var _navigation2 = __webpack_require__(1); + +Object.defineProperty(exports, 'computePageFromPath', { + enumerable: true, + get: function get() { + return _navigation2.computePageFromPath; + } +}); +Object.defineProperty(exports, 'makeSelectCurrentParam', { + enumerable: true, + get: function get() { + return _navigation2.makeSelectCurrentParam; + } +}); +Object.defineProperty(exports, 'selectCurrentPath', { + enumerable: true, + get: function get() { + return _navigation2.selectCurrentPath; + } +}); +Object.defineProperty(exports, 'selectCurrentPage', { + enumerable: true, + get: function get() { + return _navigation2.selectCurrentPage; + } +}); +Object.defineProperty(exports, 'selectCurrentParams', { + enumerable: true, + get: function get() { + return _navigation2.selectCurrentParams; + } +}); +Object.defineProperty(exports, 'selectHeaderLinks', { + enumerable: true, + get: function get() { + return _navigation2.selectHeaderLinks; + } +}); +Object.defineProperty(exports, 'selectPageTitle', { + enumerable: true, + get: function get() { + return _navigation2.selectPageTitle; + } +}); +Object.defineProperty(exports, 'selectPathAfterAuth', { + enumerable: true, + get: function get() { + return _navigation2.selectPathAfterAuth; + } +}); +Object.defineProperty(exports, 'selectIsBackDisabled', { + enumerable: true, + get: function get() { + return _navigation2.selectIsBackDisabled; + } +}); +Object.defineProperty(exports, 'selectIsForwardDisabled', { + enumerable: true, + get: function get() { + return _navigation2.selectIsForwardDisabled; + } +}); +Object.defineProperty(exports, 'selectHistoryIndex', { + enumerable: true, + get: function get() { + return _navigation2.selectHistoryIndex; + } +}); +Object.defineProperty(exports, 'selectHistoryStack', { + enumerable: true, + get: function get() { + return _navigation2.selectHistoryStack; + } +}); +Object.defineProperty(exports, 'selectActiveHistoryEntry', { + enumerable: true, + get: function get() { + return _navigation2.selectActiveHistoryEntry; + } +}); + var _search3 = __webpack_require__(31); Object.defineProperty(exports, 'makeSelectSearchUris', { @@ -2377,7 +2545,7 @@ Object.defineProperty(exports, 'selectWunderBarIcon', { } }); -var _wallet3 = __webpack_require__(11); +var _wallet3 = __webpack_require__(12); Object.defineProperty(exports, 'makeSelectBlockDate', { enumerable: true, @@ -2470,11 +2638,11 @@ Object.defineProperty(exports, 'selectBlocks', { } }); -var _lbry = __webpack_require__(2); +var _lbry = __webpack_require__(3); var _lbry2 = _interopRequireDefault(_lbry); -var _lbryuri = __webpack_require__(3); +var _lbryuri = __webpack_require__(4); var _lbryuri2 = _interopRequireDefault(_lbryuri); @@ -2487,7 +2655,7 @@ exports.Lbryuri = _lbryuri2.default; // actions /***/ }), -/* 13 */ +/* 14 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2574,7 +2742,7 @@ jsonrpc.call = function (connectionString, method, params, callback, errorCallba exports.default = jsonrpc; /***/ }), -/* 14 */ +/* 15 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2589,11 +2757,11 @@ var _action_types = __webpack_require__(0); var ACTIONS = _interopRequireWildcard(_action_types); -var _lbryapi = __webpack_require__(15); +var _lbryapi = __webpack_require__(16); var _lbryapi2 = _interopRequireDefault(_lbryapi); -var _claims = __webpack_require__(4); +var _claims = __webpack_require__(5); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -2634,7 +2802,7 @@ function doFetchCostInfoForUri(uri) { } /***/ }), -/* 15 */ +/* 16 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2646,11 +2814,11 @@ Object.defineProperty(exports, "__esModule", { var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; -var _lbry = __webpack_require__(2); +var _lbry = __webpack_require__(3); var _lbry2 = _interopRequireDefault(_lbry); -var _querystring = __webpack_require__(17); +var _querystring = __webpack_require__(18); var _querystring2 = _interopRequireDefault(_querystring); @@ -2742,10 +2910,10 @@ LbryApi.call = function (resource, action) { }; exports.default = LbryApi; -/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(16))) +/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(17))) /***/ }), -/* 16 */ +/* 17 */ /***/ (function(module, exports) { // shim for using process in browser @@ -2935,18 +3103,18 @@ process.umask = function() { return 0; }; /***/ }), -/* 17 */ +/* 18 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -exports.decode = exports.parse = __webpack_require__(18); -exports.encode = exports.stringify = __webpack_require__(19); +exports.decode = exports.parse = __webpack_require__(19); +exports.encode = exports.stringify = __webpack_require__(20); /***/ }), -/* 18 */ +/* 19 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3037,7 +3205,7 @@ var isArray = Array.isArray || function (xs) { /***/ }), -/* 19 */ +/* 20 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3129,7 +3297,7 @@ var objectKeys = Object.keys || function (obj) { /***/ }), -/* 20 */ +/* 21 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3146,15 +3314,15 @@ var _action_types = __webpack_require__(0); var ACTIONS = _interopRequireWildcard(_action_types); -var _lbry = __webpack_require__(2); +var _lbry = __webpack_require__(3); var _lbry2 = _interopRequireDefault(_lbry); var _claims = __webpack_require__(6); -var _claims2 = __webpack_require__(4); +var _claims2 = __webpack_require__(5); -var _file_info = __webpack_require__(9); +var _file_info = __webpack_require__(10); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -3222,7 +3390,7 @@ function doFetchFileInfosAndPublishedClaims() { } /***/ }), -/* 21 */ +/* 22 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3237,17 +3405,17 @@ var _action_types = __webpack_require__(0); var ACTIONS = _interopRequireWildcard(_action_types); -var _lbryuri = __webpack_require__(3); +var _lbryuri = __webpack_require__(4); var _lbryuri2 = _interopRequireDefault(_lbryuri); var _claims = __webpack_require__(6); -var _navigation = __webpack_require__(10); +var _navigation = __webpack_require__(8); -var _navigation2 = __webpack_require__(5); +var _navigation2 = __webpack_require__(1); -var _batchActions = __webpack_require__(22); +var _batchActions = __webpack_require__(11); var _batchActions2 = _interopRequireDefault(_batchActions); @@ -3310,30 +3478,6 @@ function doSearch(rawQuery) { }; } -/***/ }), -/* 22 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -// https://github.com/reactjs/redux/issues/911 -function batchActions() { - for (var _len = arguments.length, actions = Array(_len), _key = 0; _key < _len; _key++) { - actions[_key] = arguments[_key]; - } - - return { - type: 'BATCH_ACTIONS', - actions: actions - }; -} - -exports.default = batchActions; - /***/ }), /* 23 */ /***/ (function(module, exports, __webpack_require__) { @@ -3363,15 +3507,15 @@ var _modal_types = __webpack_require__(24); var MODALS = _interopRequireWildcard(_modal_types); -var _lbry = __webpack_require__(2); +var _lbry = __webpack_require__(3); var _lbry2 = _interopRequireDefault(_lbry); -var _app = __webpack_require__(7); +var _app = __webpack_require__(9); -var _navigation = __webpack_require__(10); +var _navigation = __webpack_require__(8); -var _wallet = __webpack_require__(11); +var _wallet = __webpack_require__(12); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -4336,9 +4480,9 @@ Object.defineProperty(exports, "__esModule", { }); exports.makeSelectFetchingCostInfoForUri = exports.selectFetchingCostInfo = exports.selectCostForCurrentPageUri = exports.makeSelectCostInfoForUri = exports.selectAllCostInfoByUri = exports.selectState = undefined; -var _reselect = __webpack_require__(1); +var _reselect = __webpack_require__(2); -var _navigation = __webpack_require__(5); +var _navigation = __webpack_require__(1); var selectState = exports.selectState = function selectState(state) { return state.costInfo || {}; @@ -4380,9 +4524,9 @@ Object.defineProperty(exports, "__esModule", { }); exports.selectWunderBarIcon = exports.selectWunderBarAddress = exports.makeSelectSearchUris = exports.selectSearchUrisByQuery = exports.selectIsSearching = exports.selectSearchQuery = exports.selectState = undefined; -var _navigation = __webpack_require__(5); +var _navigation = __webpack_require__(1); -var _reselect = __webpack_require__(1); +var _reselect = __webpack_require__(2); var selectState = exports.selectState = function selectState(state) { return state.search || {}; diff --git a/src/index.js b/src/index.js index 847989c..033dd6b 100644 --- a/src/index.js +++ b/src/index.js @@ -8,6 +8,14 @@ export { doOpenModal, doCloseModal, doShowSnackBar } from 'redux/actions/app'; export { doFetchClaimListMine, doAbandonClaim, doResolveUris, doResolveUri } from 'redux/actions/claims'; export { doFetchCostInfoForUri } from 'redux/actions/cost_info'; export { doFetchFileInfo, doFileList, doFetchFileInfosAndPublishedClaims } from 'redux/actions/file_info'; +export { + doNavigate, + doAuthNavigate, + doHistoryTraverse, + doHistoryBack, + doHistoryForward, + doRecordScroll +} from 'redux/actions/navigation'; export { doSearch } from 'redux/actions/search'; export { doUpdateBalance, @@ -22,6 +30,10 @@ export { doSendSupport } from 'redux/actions/wallet'; +// utils +export { batchActions } from 'util/batchActions'; +export { parseQueryParams, toQueryString } from 'util/query_params'; + // reducers export { claimsReducer } from 'redux/reducers/claims'; export { costInfoReducer } from 'redux/reducers/cost_info'; @@ -79,6 +91,22 @@ export { selectTotalDownloadProgress } from 'redux/selectors/file_info'; +export { + computePageFromPath, + makeSelectCurrentParam, + selectCurrentPath, + selectCurrentPage, + selectCurrentParams, + selectHeaderLinks, + selectPageTitle, + selectPathAfterAuth, + selectIsBackDisabled, + selectIsForwardDisabled, + selectHistoryIndex, + selectHistoryStack, + selectActiveHistoryEntry +} from 'redux/selectors/navigation'; + export { makeSelectSearchUris, selectSearchQuery, diff --git a/src/lbry.js b/src/lbry.js index 4ce3055..ab2917f 100644 --- a/src/lbry.js +++ b/src/lbry.js @@ -262,7 +262,7 @@ Lbry.resolve = (params = {}) => reject ); }); - + const lbryProxy = new Proxy(Lbry, { get(target, name) { if (name in target) { diff --git a/src/util/batchActions.js b/src/util/batchActions.js index 4bc4eee..0af1c42 100644 --- a/src/util/batchActions.js +++ b/src/util/batchActions.js @@ -1,9 +1,7 @@ // https://github.com/reactjs/redux/issues/911 -function batchActions(...actions) { +export function batchActions(...actions) { return { type: 'BATCH_ACTIONS', actions, }; } - -export default batchActions; -- 2.45.3 From 7a5d25d3d9cd10c5392f2b60c262256572bd9605 Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Fri, 19 Jan 2018 12:20:07 +0100 Subject: [PATCH 05/41] added eslint configuration files and scripts --- .eslintrc.json | 30 ++++++++++++++++++++++++++ .lintstagedrc | 12 +++++++++++ .prettierrc.json | 5 +++++ package.json | 1 + src/index.js | 40 ++++++++++++++++++++++------------- src/lbry.js | 2 ++ src/lbryapi.js | 24 ++++++++++----------- src/redux/actions/claims.js | 6 ++++-- src/redux/selectors/claims.js | 1 - 9 files changed, 90 insertions(+), 31 deletions(-) create mode 100644 .eslintrc.json create mode 100644 .lintstagedrc create mode 100644 .prettierrc.json diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..8581d49 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,30 @@ +{ + "plugins": ["flowtype"], + "extends": [ + "airbnb", + "plugin:import/electron", + "plugin:flowtype/recommended", + "plugin:prettier/recommended" + ], + "settings": { + "import/resolver": { + "webpack": { + "config": "webpack.config.js" + } + } + }, + "parser": "babel-eslint", + "env": { + "browser": true, + "node": true + }, + "globals": { + "__": true + }, + "rules": { + "import/no-commonjs": "warn", + "import/no-amd": "warn", + "import/prefer-default-export": "ignore", + "func-names": ["warn", "as-needed"] + } +} diff --git a/.lintstagedrc b/.lintstagedrc new file mode 100644 index 0000000..63267d0 --- /dev/null +++ b/.lintstagedrc @@ -0,0 +1,12 @@ +{ + "linters": { + "src/**/*.{js}": [ + "prettier --write", + "git add" + ], + "src/**/*.{js}": [ + "eslint --fix", + "git add" + ] + } +} diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..1d3fce7 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,5 @@ +{ + "trailingComma": "es5", + "printWidth": 100, + "singleQuote": true +} \ No newline at end of file diff --git a/package.json b/package.json index e69d094..64d6411 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "main": "build/index.js", "scripts": { "build": "webpack", + "precommit": "lint-staged", "lint": "eslint 'src/**/*.{js,jsx}' --fix", "format": "prettier 'src/**/*.{js,jsx,scss,json}' --write" }, diff --git a/src/index.js b/src/index.js index 033dd6b..1d5f62f 100644 --- a/src/index.js +++ b/src/index.js @@ -1,20 +1,30 @@ // common import Lbry from 'lbry'; import Lbryuri from 'lbryuri'; + export { Lbry, Lbryuri }; // actions export { doOpenModal, doCloseModal, doShowSnackBar } from 'redux/actions/app'; -export { doFetchClaimListMine, doAbandonClaim, doResolveUris, doResolveUri } from 'redux/actions/claims'; +export { + doFetchClaimListMine, + doAbandonClaim, + doResolveUris, + doResolveUri, +} from 'redux/actions/claims'; export { doFetchCostInfoForUri } from 'redux/actions/cost_info'; -export { doFetchFileInfo, doFileList, doFetchFileInfosAndPublishedClaims } from 'redux/actions/file_info'; +export { + doFetchFileInfo, + doFileList, + doFetchFileInfosAndPublishedClaims, +} from 'redux/actions/file_info'; export { doNavigate, doAuthNavigate, doHistoryTraverse, doHistoryBack, doHistoryForward, - doRecordScroll + doRecordScroll, } from 'redux/actions/navigation'; export { doSearch } from 'redux/actions/search'; export { @@ -27,7 +37,7 @@ export { doSendDraftTransaction, doSetDraftTransactionAmount, doSetDraftTransactionAddress, - doSendSupport + doSendSupport, } from 'redux/actions/wallet'; // utils @@ -35,7 +45,7 @@ export { batchActions } from 'util/batchActions'; export { parseQueryParams, toQueryString } from 'util/query_params'; // reducers -export { claimsReducer } from 'redux/reducers/claims'; +export { claimsReducer } from 'redux/reducers/claims'; export { costInfoReducer } from 'redux/reducers/cost_info'; export { fileInfoReducer } from 'redux/reducers/file_info'; export { searchReducer } from 'redux/reducers/search'; @@ -66,15 +76,15 @@ export { selectMyClaimsOutpoints, selectFetchingMyChannels, selectMyChannelClaims, - selectResolvingUris + selectResolvingUris, } from 'redux/selectors/claims'; export { - makeSelectFetchingCostInfoForUri, - makeSelectCostInfoForUri, - selectAllCostInfoByUri, - selectCostForCurrentPageUri, - selectFetchingCostInfo + makeSelectFetchingCostInfoForUri, + makeSelectCostInfoForUri, + selectAllCostInfoByUri, + selectCostForCurrentPageUri, + selectFetchingCostInfo, } from 'redux/selectors/cost_info'; export { @@ -88,7 +98,7 @@ export { selectUrisLoading, selectFileInfosDownloaded, selectDownloadingFileInfos, - selectTotalDownloadProgress + selectTotalDownloadProgress, } from 'redux/selectors/file_info'; export { @@ -104,7 +114,7 @@ export { selectIsForwardDisabled, selectHistoryIndex, selectHistoryStack, - selectActiveHistoryEntry + selectActiveHistoryEntry, } from 'redux/selectors/navigation'; export { @@ -113,7 +123,7 @@ export { selectIsSearching, selectSearchUrisByQuery, selectWunderBarAddress, - selectWunderBarIcon + selectWunderBarIcon, } from 'redux/selectors/search'; export { @@ -131,5 +141,5 @@ export { selectDraftTransactionAmount, selectDraftTransactionAddress, selectDraftTransactionError, - selectBlocks + selectBlocks, } from 'redux/selectors/wallet'; diff --git a/src/lbry.js b/src/lbry.js index ab2917f..7962210 100644 --- a/src/lbry.js +++ b/src/lbry.js @@ -103,6 +103,7 @@ Lbry.connect = () => { // Check every half second to see if the daemon is accepting connections function checkDaemonStarted() { tryNum += 1; + // eslint-disable-next-line no-use-before-define lbryProxy .status() .then(resolve) @@ -146,6 +147,7 @@ Lbry.publishDeprecated = (params, fileListedCallback, publishedCallback, errorCa { once: true } ); + // eslint-disable-next-line no-use-before-define lbryProxy.publish(params).then( result => { if (returnPendingTimeout) clearTimeout(returnPendingTimeout); diff --git a/src/lbryapi.js b/src/lbryapi.js index 8f980c3..630649a 100644 --- a/src/lbryapi.js +++ b/src/lbryapi.js @@ -1,7 +1,6 @@ -import Lbry from 'lbry'; import querystring from 'querystring'; -const LbryApi = { +const Lbryapi = { enabled: true, exchangePromise: null, exchangeLastFetched: null, @@ -13,27 +12,26 @@ const CONNECTION_STRING = process.env.LBRY_APP_API_URL const EXCHANGE_RATE_TIMEOUT = 20 * 60 * 1000; -LbryApi.getExchangeRates = () => { +Lbryapi.getExchangeRates = () => { if ( - !LbryApi.exchangeLastFetched || - Date.now() - LbryApi.exchangeLastFetched > EXCHANGE_RATE_TIMEOUT + !Lbryapi.exchangeLastFetched || + Date.now() - Lbryapi.exchangeLastFetched > EXCHANGE_RATE_TIMEOUT ) { - LbryApi.exchangePromise = new Promise((resolve, reject) => { - LbryApi.call('lbc', 'exchange_rate', {}, 'get', true) + Lbryapi.exchangePromise = new Promise((resolve, reject) => { + Lbryapi.call('lbc', 'exchange_rate', {}, 'get', true) .then(({ lbc_usd: LBC_USD, lbc_btc: LBC_BTC, btc_usd: BTC_USD }) => { const rates = { LBC_USD, LBC_BTC, BTC_USD }; resolve(rates); }) .catch(reject); }); - LbryApi.exchangeLastFetched = Date.now(); + Lbryapi.exchangeLastFetched = Date.now(); } - return LbryApi.exchangePromise; + return Lbryapi.exchangePromise; }; -LbryApi.call = (resource, action, params = {}, method = 'get') => { - if (!LbryApi.enabled) { - console.log(__('Internal API disabled')); +Lbryapi.call = (resource, action, params = {}, method = 'get') => { + if (!Lbryapi.enabled) { return Promise.reject(new Error(__('LBRY internal API is disabled'))); } @@ -83,4 +81,4 @@ LbryApi.call = (resource, action, params = {}, method = 'get') => { return makeRequest(url, options).then(response => response.data); }; -export default LbryApi; +export default Lbryapi; diff --git a/src/redux/actions/claims.js b/src/redux/actions/claims.js index 5da8010..188783b 100644 --- a/src/redux/actions/claims.js +++ b/src/redux/actions/claims.js @@ -1,7 +1,9 @@ import * as ACTIONS from 'constants/action_types'; +import * as MODALS from 'constants/modal_types'; import Lbry from 'lbry'; import Lbryuri from 'lbryuri'; -import { selectResolvingUris } from 'redux/selectors/claims'; +import { doOpenModal } from 'redux/actions/app'; +import { selectMyClaimsRaw, selectResolvingUris } from 'redux/selectors/claims'; export function doResolveUris(uris) { return (dispatch, getState) => { @@ -104,4 +106,4 @@ export function doAbandonClaim(txid, nout) { nout, }).then(successCallback, errorCallback); }; -} \ No newline at end of file +} diff --git a/src/redux/selectors/claims.js b/src/redux/selectors/claims.js index b85e282..7b778f6 100644 --- a/src/redux/selectors/claims.js +++ b/src/redux/selectors/claims.js @@ -179,4 +179,3 @@ export const makeSelectIsUriResolving = uri => selectResolvingUris, resolvingUris => resolvingUris && resolvingUris.indexOf(uri) !== -1 ); - -- 2.45.3 From cf069259a87ede6cfecb9659ca3b6dd81fac9b63 Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Fri, 19 Jan 2018 12:24:49 +0100 Subject: [PATCH 06/41] added eslint configuration files and scripts --- .lintstagedrc | 3 --- 1 file changed, 3 deletions(-) diff --git a/.lintstagedrc b/.lintstagedrc index 63267d0..89284ac 100644 --- a/.lintstagedrc +++ b/.lintstagedrc @@ -2,9 +2,6 @@ "linters": { "src/**/*.{js}": [ "prettier --write", - "git add" - ], - "src/**/*.{js}": [ "eslint --fix", "git add" ] -- 2.45.3 From ca06c27d32c507b3a6c7a39b0eb391f8da535f8f Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Fri, 19 Jan 2018 12:30:02 +0100 Subject: [PATCH 07/41] added Lbryapi export for getExchangeRates method --- .lintstagedrc | 2 +- src/index.js | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.lintstagedrc b/.lintstagedrc index 89284ac..b03e7c9 100644 --- a/.lintstagedrc +++ b/.lintstagedrc @@ -1,6 +1,6 @@ { "linters": { - "src/**/*.{js}": [ + "src/**/*.js": [ "prettier --write", "eslint --fix", "git add" diff --git a/src/index.js b/src/index.js index 1d5f62f..85e1ed0 100644 --- a/src/index.js +++ b/src/index.js @@ -1,8 +1,9 @@ // common import Lbry from 'lbry'; +import Lbryapi from 'lbryapi'; import Lbryuri from 'lbryuri'; -export { Lbry, Lbryuri }; +export { Lbry, Lbryapi, Lbryuri }; // actions export { doOpenModal, doCloseModal, doShowSnackBar } from 'redux/actions/app'; -- 2.45.3 From 4a0f8505f8f0025c230ef9bcea78fa07cadf5c85 Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Sun, 28 Jan 2018 01:45:45 +0100 Subject: [PATCH 08/41] some lbryURI updates from lbry-app master --- build/index.js | 1404 +++++++++++++++-------------- src/index.js | 12 +- src/{lbryuri.js => lbryURI.js} | 68 +- src/redux/actions/claims.js | 6 +- src/redux/actions/search.js | 4 +- src/redux/selectors/claims.js | 6 +- src/redux/selectors/navigation.js | 4 +- 7 files changed, 768 insertions(+), 736 deletions(-) rename src/{lbryuri.js => lbryURI.js} (80%) diff --git a/build/index.js b/build/index.js index 0770204..cf644a0 100644 --- a/build/index.js +++ b/build/index.js @@ -70,7 +70,7 @@ return /******/ (function(modules) { // webpackBootstrap /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 13); +/******/ return __webpack_require__(__webpack_require__.s = 15); /******/ }) /************************************************************************/ /******/ ([ @@ -262,13 +262,9 @@ exports.selectActiveHistoryEntry = exports.selectHistoryStack = exports.selectHi var _reselect = __webpack_require__(2); -var _query_params = __webpack_require__(7); +var _lbryURI = __webpack_require__(3); -var _lbryuri = __webpack_require__(4); - -var _lbryuri2 = _interopRequireDefault(_lbryuri); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +var _query_params = __webpack_require__(8); var selectState = exports.selectState = function selectState(state) { return state.navigation || {}; @@ -368,7 +364,7 @@ var selectPageTitle = exports.selectPageTitle = (0, _reselect.createSelector)(se return __('Developer'); case 'show': { - var parts = [_lbryuri2.default.normalize(params.uri)]; + var parts = [(0, _lbryURI.normalizeURI)(params.uri)]; // If the params has any keys other than "uri" if (Object.keys(params).length > 1) { parts.push((0, _query_params.toQueryString)(Object.assign({}, params, { uri: null }))); @@ -560,7 +556,440 @@ Object.defineProperty(exports, "__esModule", { value: true }); -var _jsonrpc = __webpack_require__(14); +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); + +exports.parseURI = parseURI; +exports.buildURI = buildURI; +exports.normalizeURI = normalizeURI; +exports.isURIValid = isURIValid; +exports.isNameValid = isNameValid; +exports.isURIClaimable = isURIClaimable; +var channelNameMinLength = 1; +var claimIdMaxLength = 40; + +var regexInvalidURI = exports.regexInvalidURI = /[^A-Za-z0-9-]/g; +var regexAddress = exports.regexAddress = /^b(?=[^0OIl]{32,33})[0-9A-Za-z]{32,33}$/; + +/** + * Parses a LBRY name into its component parts. Throws errors with user-friendly + * messages for invalid names. + * + * N.B. that "name" indicates the value in the name position of the URI. For + * claims for channel content, this will actually be the channel name, and + * the content name is in the path (e.g. lbry://@channel/content) + * + * In most situations, you'll want to use the contentName and channelName keys + * and ignore the name key. + * + * Returns a dictionary with keys: + * - name (string): The value in the "name" position in the URI. Note that this + * could be either content name or channel name; see above. + * - path (string, if persent) + * - claimSequence (int, if present) + * - bidPosition (int, if present) + * - claimId (string, if present) + * - isChannel (boolean) + * - contentName (string): For anon claims, the name; for channel claims, the path + * - channelName (string, if present): Channel name without @ + */ +function parseURI(URI) { + var requireProto = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + // Break into components. Empty sub-matches are converted to null + var componentsRegex = new RegExp('^((?:lbry://)?)' + // protocol + '([^:$#/]*)' + // name (stops at the first separator or end) + '([:$#]?)([^/]*)' + // modifier separator, modifier (stops at the first path separator or end) + '(/?)(.*)' // path separator, path + ); + + var _componentsRegex$exec = componentsRegex.exec(URI).slice(1).map(function (match) { + return match || null; + }), + _componentsRegex$exec2 = _slicedToArray(_componentsRegex$exec, 6), + proto = _componentsRegex$exec2[0], + name = _componentsRegex$exec2[1], + modSep = _componentsRegex$exec2[2], + modVal = _componentsRegex$exec2[3], + pathSep = _componentsRegex$exec2[4], + path = _componentsRegex$exec2[5]; + + var contentName = void 0; + + // Validate protocol + if (requireProto && !proto) { + throw new Error(__('LBRY URIs must include a protocol prefix (lbry://).')); + } + + // Validate and process name + if (!name) { + throw new Error(__('URI does not include name.')); + } + + var isChannel = name.startsWith('@'); + var channelName = isChannel ? name.slice(1) : name; + + if (isChannel) { + if (!channelName) { + throw new Error(__('No channel name after @.')); + } + + if (channelName.length < channelNameMinLength) { + throw new Error(__('Channel names must be at least %s characters.', channelNameMinLength)); + } + + contentName = path; + } + + var nameBadChars = (channelName || name).match(regexInvalidURI); + if (nameBadChars) { + throw new Error(__('Invalid character %s in name: %s.', nameBadChars.length === 1 ? '' : 's', nameBadChars.join(', '))); + } + + // Validate and process modifier (claim ID, bid position or claim sequence) + var claimId = void 0; + var claimSequence = void 0; + var bidPosition = void 0; + if (modSep) { + if (!modVal) { + throw new Error(__('No modifier provided after separator %s.', modSep)); + } + + if (modSep === '#') { + claimId = modVal; + } else if (modSep === ':') { + claimSequence = modVal; + } else if (modSep === '$') { + bidPosition = modVal; + } + } + + if (claimId && (claimId.length > claimIdMaxLength || !claimId.match(/^[0-9a-f]+$/)) && !claimId.match(/^pending/) // ought to be dropped when savePendingPublish drops hack + ) { + throw new Error(__('Invalid claim ID %s.', claimId)); + } + + if (claimSequence && !claimSequence.match(/^-?[1-9][0-9]*$/)) { + throw new Error(__('Claim sequence must be a number.')); + } + + if (bidPosition && !bidPosition.match(/^-?[1-9][0-9]*$/)) { + throw new Error(__('Bid position must be a number.')); + } + + // Validate and process path + if (path) { + if (!isChannel) { + throw new Error(__('Only channel URIs may have a path.')); + } + + var pathBadChars = path.match(regexInvalidURI); + if (pathBadChars) { + throw new Error(__('Invalid character in path: %s', pathBadChars.join(', '))); + } + + contentName = path; + } else if (pathSep) { + throw new Error(__('No path provided after /')); + } + + return _extends({ + name: name, + path: path, + isChannel: isChannel + }, contentName ? { contentName: contentName } : {}, channelName ? { channelName: channelName } : {}, claimSequence ? { claimSequence: parseInt(claimSequence, 10) } : {}, bidPosition ? { bidPosition: parseInt(bidPosition, 10) } : {}, claimId ? { claimId: claimId } : {}, path ? { path: path } : {}); +} + +/** + * Takes an object in the same format returned by parse() and builds a URI. + * + * The channelName key will accept names with or without the @ prefix. + */ +function buildURI(URIObj) { + var includeProto = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + var claimId = URIObj.claimId, + claimSequence = URIObj.claimSequence, + bidPosition = URIObj.bidPosition, + contentName = URIObj.contentName, + channelName = URIObj.channelName; + var name = URIObj.name, + path = URIObj.path; + + + if (channelName) { + var channelNameFormatted = channelName.startsWith('@') ? channelName : '@' + channelName; + if (!name) { + name = channelNameFormatted; + } else if (name !== channelNameFormatted) { + throw new Error(__('Received a channel content URI, but name and channelName do not match. "name" represents the value in the name position of the URI (lbry://name...), which for channel content will be the channel name. In most cases, to construct a channel URI you should just pass channelName and contentName.')); + } + } + + if (contentName) { + if (!name) { + name = contentName; + } else if (!path) { + path = contentName; + } + if (path && path !== contentName) { + throw new Error(__('Path and contentName do not match. Only one is required; most likely you wanted contentName.')); + } + } + + return (includeProto ? 'lbry://' : '') + name + (claimId ? '#' + claimId : '') + (claimSequence ? ':' + claimSequence : '') + (bidPosition ? '' + bidPosition : '') + (path ? '/' + path : ''); +} + +/* Takes a parseable LBRY URI and converts it to standard, canonical format */ +function normalizeURI(URI) { + if (URI.match(/pending_claim/)) return URI; + + var _parseURI = parseURI(URI), + name = _parseURI.name, + path = _parseURI.path, + bidPosition = _parseURI.bidPosition, + claimSequence = _parseURI.claimSequence, + claimId = _parseURI.claimId; + + return buildURI({ name: name, path: path, claimSequence: claimSequence, bidPosition: bidPosition, claimId: claimId }); +} + +function isURIValid(URI) { + var parts = void 0; + try { + parts = parseURI(normalizeURI(URI)); + } catch (error) { + return false; + } + return parts && parts.name; +} + +function isNameValid(name) { + var checkCase = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + + var regexp = new RegExp('^[a-z0-9-]+$', checkCase ? '' : 'i'); + return regexp.test(name); +} + +function isURIClaimable(URI) { + var parts = void 0; + try { + parts = parseURI(normalizeURI(URI)); + } catch (error) { + return false; + } + return parts && parts.name && !parts.claimId && !parts.bidPosition && !parts.claimSequence && !parts.isChannel && !parts.path; +} + +/***/ }), +/* 4 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.makeSelectIsUriResolving = exports.selectResolvingUris = exports.selectMyChannelClaims = exports.selectFetchingMyChannels = exports.selectMyClaimsOutpoints = exports.selectAllMyClaimsByOutpoint = exports.selectMyClaimsWithoutChannels = exports.selectMyClaims = exports.selectPendingClaims = exports.selectIsFetchingClaimListMine = exports.makeSelectContentTypeForUri = exports.makeSelectTitleForUri = exports.makeSelectMetadataForUri = exports.makeSelectClaimsInChannelForCurrentPage = exports.makeSelectFetchingChannelClaims = exports.selectAllFetchingChannelClaims = exports.makeSelectClaimIsMine = exports.selectMyActiveClaims = exports.selectAbandoningIds = exports.selectMyClaimsRaw = exports.makeSelectClaimForUri = exports.selectAllClaimsByChannel = exports.selectClaimsByUri = exports.selectClaimsById = undefined; + +var _lbryURI = __webpack_require__(3); + +var _navigation = __webpack_require__(1); + +var _reselect = __webpack_require__(2); + +function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } + +var selectState = function selectState(state) { + return state.claims || {}; +}; + +var selectClaimsById = exports.selectClaimsById = (0, _reselect.createSelector)(selectState, function (state) { + return state.byId || {}; +}); + +var selectClaimsByUri = exports.selectClaimsByUri = (0, _reselect.createSelector)(selectState, selectClaimsById, function (state, byId) { + var byUri = state.claimsByUri || {}; + var claims = {}; + + Object.keys(byUri).forEach(function (uri) { + var claimId = byUri[uri]; + + // NOTE returning a null claim allows us to differentiate between an + // undefined (never fetched claim) and one which just doesn't exist. Not + // the cleanest solution but couldn't think of anything better right now + if (claimId === null) { + claims[uri] = null; + } else { + claims[uri] = byId[claimId]; + } + }); + + return claims; +}); + +var selectAllClaimsByChannel = exports.selectAllClaimsByChannel = (0, _reselect.createSelector)(selectState, function (state) { + return state.claimsByChannel || {}; +}); + +var makeSelectClaimForUri = exports.makeSelectClaimForUri = function makeSelectClaimForUri(uri) { + return (0, _reselect.createSelector)(selectClaimsByUri, function (claims) { + return claims && claims[(0, _lbryURI.normalizeURI)(uri)]; + }); +}; + +var selectMyClaimsRaw = exports.selectMyClaimsRaw = (0, _reselect.createSelector)(selectState, function (state) { + return state.myClaims; +}); + +var selectAbandoningIds = exports.selectAbandoningIds = (0, _reselect.createSelector)(selectState, function (state) { + return Object.keys(state.abandoningById || {}); +}); + +var selectMyActiveClaims = exports.selectMyActiveClaims = (0, _reselect.createSelector)(selectMyClaimsRaw, selectAbandoningIds, function (claims, abandoningIds) { + return new Set(claims && claims.map(function (claim) { + return claim.claim_id; + }).filter(function (claimId) { + return Object.keys(abandoningIds).indexOf(claimId) === -1; + })); +}); + +var makeSelectClaimIsMine = exports.makeSelectClaimIsMine = function makeSelectClaimIsMine(rawUri) { + var uri = (0, _lbryURI.normalizeURI)(rawUri); + return (0, _reselect.createSelector)(selectClaimsByUri, selectMyActiveClaims, function (claims, myClaims) { + return claims && claims[uri] && claims[uri].claim_id && myClaims.has(claims[uri].claim_id); + }); +}; + +var selectAllFetchingChannelClaims = exports.selectAllFetchingChannelClaims = (0, _reselect.createSelector)(selectState, function (state) { + return state.fetchingChannelClaims || {}; +}); + +var makeSelectFetchingChannelClaims = exports.makeSelectFetchingChannelClaims = function makeSelectFetchingChannelClaims(uri) { + return (0, _reselect.createSelector)(selectAllFetchingChannelClaims, function (fetching) { + return fetching && fetching[uri]; + }); +}; + +var makeSelectClaimsInChannelForCurrentPage = exports.makeSelectClaimsInChannelForCurrentPage = function makeSelectClaimsInChannelForCurrentPage(uri) { + var pageSelector = (0, _navigation.makeSelectCurrentParam)('page'); + + return (0, _reselect.createSelector)(selectClaimsById, selectAllClaimsByChannel, pageSelector, function (byId, allClaims, page) { + var byChannel = allClaims[uri] || {}; + var claimIds = byChannel[page || 1]; + + if (!claimIds) return claimIds; + + return claimIds.map(function (claimId) { + return byId[claimId]; + }); + }); +}; + +var makeSelectMetadataForUri = exports.makeSelectMetadataForUri = function makeSelectMetadataForUri(uri) { + return (0, _reselect.createSelector)(makeSelectClaimForUri(uri), function (claim) { + var metadata = claim && claim.value && claim.value.stream && claim.value.stream.metadata; + + return metadata || (claim === undefined ? undefined : null); + }); +}; + +var makeSelectTitleForUri = exports.makeSelectTitleForUri = function makeSelectTitleForUri(uri) { + return (0, _reselect.createSelector)(makeSelectMetadataForUri(uri), function (metadata) { + return metadata && metadata.title; + }); +}; + +var makeSelectContentTypeForUri = exports.makeSelectContentTypeForUri = function makeSelectContentTypeForUri(uri) { + return (0, _reselect.createSelector)(makeSelectClaimForUri(uri), function (claim) { + var source = claim && claim.value && claim.value.stream && claim.value.stream.source; + return source ? source.contentType : undefined; + }); +}; + +var selectIsFetchingClaimListMine = exports.selectIsFetchingClaimListMine = (0, _reselect.createSelector)(selectState, function (state) { + return state.isFetchingClaimListMine; +}); + +var selectPendingClaims = exports.selectPendingClaims = (0, _reselect.createSelector)(selectState, function (state) { + return Object.values(state.pendingById || {}); +}); + +var selectMyClaims = exports.selectMyClaims = (0, _reselect.createSelector)(selectMyActiveClaims, selectClaimsById, selectAbandoningIds, selectPendingClaims, function (myClaimIds, byId, abandoningIds, pendingClaims) { + var claims = []; + + myClaimIds.forEach(function (id) { + var claim = byId[id]; + + if (claim && abandoningIds.indexOf(id) === -1) claims.push(claim); + }); + + return [].concat(claims, _toConsumableArray(pendingClaims)); +}); + +var selectMyClaimsWithoutChannels = exports.selectMyClaimsWithoutChannels = (0, _reselect.createSelector)(selectMyClaims, function (myClaims) { + return myClaims.filter(function (claim) { + return !claim.name.match(/^@/); + }); +}); + +var selectAllMyClaimsByOutpoint = exports.selectAllMyClaimsByOutpoint = (0, _reselect.createSelector)(selectMyClaimsRaw, function (claims) { + return new Set(claims && claims.length ? claims.map(function (claim) { + return claim.txid + ':' + claim.nout; + }) : null); +}); + +var selectMyClaimsOutpoints = exports.selectMyClaimsOutpoints = (0, _reselect.createSelector)(selectMyClaims, function (myClaims) { + var outpoints = []; + + myClaims.forEach(function (claim) { + return outpoints.push(claim.txid + ':' + claim.nout); + }); + + return outpoints; +}); + +var selectFetchingMyChannels = exports.selectFetchingMyChannels = (0, _reselect.createSelector)(selectState, function (state) { + return state.fetchingMyChannels; +}); + +var selectMyChannelClaims = exports.selectMyChannelClaims = (0, _reselect.createSelector)(selectState, selectClaimsById, function (state, byId) { + var ids = state.myChannelClaims || []; + var claims = []; + + ids.forEach(function (id) { + if (byId[id]) { + // I'm not sure why this check is necessary, but it ought to be a quick fix for https://github.com/lbryio/lbry-app/issues/544 + claims.push(byId[id]); + } + }); + + return claims; +}); + +var selectResolvingUris = exports.selectResolvingUris = (0, _reselect.createSelector)(selectState, function (state) { + return state.resolvingUris || []; +}); + +var makeSelectIsUriResolving = exports.makeSelectIsUriResolving = function makeSelectIsUriResolving(uri) { + return (0, _reselect.createSelector)(selectResolvingUris, function (resolvingUris) { + return resolvingUris && resolvingUris.indexOf(uri) !== -1; + }); +}; + +/***/ }), +/* 5 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _jsonrpc = __webpack_require__(16); var _jsonrpc2 = _interopRequireDefault(_jsonrpc); @@ -690,6 +1119,7 @@ Lbry.connect = function () { // Check every half second to see if the daemon is accepting connections function checkDaemonStarted() { tryNum += 1; + // eslint-disable-next-line no-use-before-define lbryProxy.status().then(resolve).catch(function () { if (tryNum <= CHECK_DAEMON_STARTED_TRY_NUMBER) { setTimeout(checkDaemonStarted, tryNum < 50 ? 400 : 1000); @@ -728,6 +1158,7 @@ Lbry.publishDeprecated = function (params, fileListedCallback, publishedCallback } }, 2000, { once: true }); + // eslint-disable-next-line no-use-before-define lbryProxy.publish(params).then(function (result) { if (returnPendingTimeout) clearTimeout(returnPendingTimeout); publishedCallback(result); @@ -859,445 +1290,6 @@ var lbryProxy = new Proxy(Lbry, { exports.default = lbryProxy; -/***/ }), -/* 4 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; - -var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); - -var CHANNEL_NAME_MIN_LEN = 1; -var CLAIM_ID_MAX_LEN = 40; - -var Lbryuri = {}; - -Lbryuri.REGEXP_INVALID_URI = /[^A-Za-z0-9-]/g; -Lbryuri.REGEXP_ADDRESS = /^b(?=[^0OIl]{32,33})[0-9A-Za-z]{32,33}$/; - -/** - * Parses a LBRY name into its component parts. Throws errors with user-friendly - * messages for invalid names. - * - * N.B. that "name" indicates the value in the name position of the URI. For - * claims for channel content, this will actually be the channel name, and - * the content name is in the path (e.g. lbry://@channel/content) - * - * In most situations, you'll want to use the contentName and channelName keys - * and ignore the name key. - * - * Returns a dictionary with keys: - * - name (string): The value in the "name" position in the URI. Note that this - * could be either content name or channel name; see above. - * - path (string, if persent) - * - claimSequence (int, if present) - * - bidPosition (int, if present) - * - claimId (string, if present) - * - isChannel (boolean) - * - contentName (string): For anon claims, the name; for channel claims, the path - * - channelName (string, if present): Channel name without @ - */ -Lbryuri.parse = function (uri) { - var requireProto = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - - // Break into components. Empty sub-matches are converted to null - var componentsRegex = new RegExp('^((?:lbry://)?)' + // protocol - '([^:$#/]*)' + // name (stops at the first separator or end) - '([:$#]?)([^/]*)' + // modifier separator, modifier (stops at the first path separator or end) - '(/?)(.*)' // path separator, path - ); - - var _componentsRegex$exec = componentsRegex.exec(uri).slice(1).map(function (match) { - return match || null; - }), - _componentsRegex$exec2 = _slicedToArray(_componentsRegex$exec, 6), - proto = _componentsRegex$exec2[0], - name = _componentsRegex$exec2[1], - modSep = _componentsRegex$exec2[2], - modVal = _componentsRegex$exec2[3], - pathSep = _componentsRegex$exec2[4], - path = _componentsRegex$exec2[5]; - - var contentName = void 0; - - // Validate protocol - if (requireProto && !proto) { - throw new Error(__('LBRY URIs must include a protocol prefix (lbry://).')); - } - - // Validate and process name - if (!name) { - throw new Error(__('URI does not include name.')); - } - - var isChannel = name.startsWith('@'); - var channelName = isChannel ? name.slice(1) : name; - - if (isChannel) { - if (!channelName) { - throw new Error(__('No channel name after @.')); - } - - if (channelName.length < CHANNEL_NAME_MIN_LEN) { - throw new Error(__('Channel names must be at least %s characters.', CHANNEL_NAME_MIN_LEN)); - } - - contentName = path; - } - - var nameBadChars = (channelName || name).match(Lbryuri.REGEXP_INVALID_URI); - if (nameBadChars) { - throw new Error(__('Invalid character %s in name: %s.', nameBadChars.length === 1 ? '' : 's', nameBadChars.join(', '))); - } - - // Validate and process modifier (claim ID, bid position or claim sequence) - var claimId = void 0; - var claimSequence = void 0; - var bidPosition = void 0; - if (modSep) { - if (!modVal) { - throw new Error(__('No modifier provided after separator %s.', modSep)); - } - - if (modSep === '#') { - claimId = modVal; - } else if (modSep === ':') { - claimSequence = modVal; - } else if (modSep === '$') { - bidPosition = modVal; - } - } - - if (claimId && (claimId.length > CLAIM_ID_MAX_LEN || !claimId.match(/^[0-9a-f]+$/)) && !claimId.match(/^pending/) // ought to be dropped when savePendingPublish drops hack - ) { - throw new Error(__('Invalid claim ID %s.', claimId)); - } - - if (claimSequence && !claimSequence.match(/^-?[1-9][0-9]*$/)) { - throw new Error(__('Claim sequence must be a number.')); - } - - if (bidPosition && !bidPosition.match(/^-?[1-9][0-9]*$/)) { - throw new Error(__('Bid position must be a number.')); - } - - // Validate and process path - if (path) { - if (!isChannel) { - throw new Error(__('Only channel URIs may have a path.')); - } - - var pathBadChars = path.match(Lbryuri.REGEXP_INVALID_URI); - if (pathBadChars) { - throw new Error(__('Invalid character in path: %s', pathBadChars.join(', '))); - } - - contentName = path; - } else if (pathSep) { - throw new Error(__('No path provided after /')); - } - - return _extends({ - name: name, - path: path, - isChannel: isChannel - }, contentName ? { contentName: contentName } : {}, channelName ? { channelName: channelName } : {}, claimSequence ? { claimSequence: parseInt(claimSequence, 10) } : {}, bidPosition ? { bidPosition: parseInt(bidPosition, 10) } : {}, claimId ? { claimId: claimId } : {}, path ? { path: path } : {}); -}; - -/** - * Takes an object in the same format returned by lbryuri.parse() and builds a URI. - * - * The channelName key will accept names with or without the @ prefix. - */ -Lbryuri.build = function (uriObj) { - var includeProto = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; - var claimId = uriObj.claimId, - claimSequence = uriObj.claimSequence, - bidPosition = uriObj.bidPosition, - contentName = uriObj.contentName, - channelName = uriObj.channelName; - var name = uriObj.name, - path = uriObj.path; - - - if (channelName) { - var channelNameFormatted = channelName.startsWith('@') ? channelName : '@' + channelName; - if (!name) { - name = channelNameFormatted; - } else if (name !== channelNameFormatted) { - throw new Error(__('Received a channel content URI, but name and channelName do not match. "name" represents the value in the name position of the URI (lbry://name...), which for channel content will be the channel name. In most cases, to construct a channel URI you should just pass channelName and contentName.')); - } - } - - if (contentName) { - if (!name) { - name = contentName; - } else if (!path) { - path = contentName; - } - if (path && path !== contentName) { - throw new Error(__('Path and contentName do not match. Only one is required; most likely you wanted contentName.')); - } - } - - return (includeProto ? 'lbry://' : '') + name + (claimId ? '#' + claimId : '') + (claimSequence ? ':' + claimSequence : '') + (bidPosition ? '' + bidPosition : '') + (path ? '/' + path : ''); -}; - -/* Takes a parseable LBRY URI and converts it to standard, canonical format (currently this just - * consists of adding the lbry:// prefix if needed) */ -Lbryuri.normalize = function (uri) { - if (uri.match(/pending_claim/)) return uri; - - var _Lbryuri$parse = Lbryuri.parse(uri), - name = _Lbryuri$parse.name, - path = _Lbryuri$parse.path, - bidPosition = _Lbryuri$parse.bidPosition, - claimSequence = _Lbryuri$parse.claimSequence, - claimId = _Lbryuri$parse.claimId; - - return Lbryuri.build({ name: name, path: path, claimSequence: claimSequence, bidPosition: bidPosition, claimId: claimId }); -}; - -Lbryuri.isValid = function (uri) { - var parts = void 0; - try { - parts = Lbryuri.parse(Lbryuri.normalize(uri)); - } catch (error) { - return false; - } - return parts && parts.name; -}; - -Lbryuri.isValidName = function (name) { - var checkCase = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; - - var regexp = new RegExp('^[a-z0-9-]+$', checkCase ? '' : 'i'); - return regexp.test(name); -}; - -Lbryuri.isClaimable = function (uri) { - var parts = void 0; - try { - parts = Lbryuri.parse(Lbryuri.normalize(uri)); - } catch (error) { - return false; - } - return parts && parts.name && !parts.claimId && !parts.bidPosition && !parts.claimSequence && !parts.isChannel && !parts.path; -}; - -if (window) { - window.lbryuri = Lbryuri; -} -exports.default = Lbryuri; - -/***/ }), -/* 5 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.makeSelectIsUriResolving = exports.selectResolvingUris = exports.selectMyChannelClaims = exports.selectFetchingMyChannels = exports.selectMyClaimsOutpoints = exports.selectAllMyClaimsByOutpoint = exports.selectMyClaimsWithoutChannels = exports.selectMyClaims = exports.selectPendingClaims = exports.selectIsFetchingClaimListMine = exports.makeSelectContentTypeForUri = exports.makeSelectTitleForUri = exports.makeSelectMetadataForUri = exports.makeSelectClaimsInChannelForCurrentPage = exports.makeSelectFetchingChannelClaims = exports.selectAllFetchingChannelClaims = exports.makeSelectClaimIsMine = exports.selectMyActiveClaims = exports.selectAbandoningIds = exports.selectMyClaimsRaw = exports.makeSelectClaimForUri = exports.selectAllClaimsByChannel = exports.selectClaimsByUri = exports.selectClaimsById = undefined; - -var _lbryuri = __webpack_require__(4); - -var _lbryuri2 = _interopRequireDefault(_lbryuri); - -var _navigation = __webpack_require__(1); - -var _reselect = __webpack_require__(2); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } - -var selectState = function selectState(state) { - return state.claims || {}; -}; - -var selectClaimsById = exports.selectClaimsById = (0, _reselect.createSelector)(selectState, function (state) { - return state.byId || {}; -}); - -var selectClaimsByUri = exports.selectClaimsByUri = (0, _reselect.createSelector)(selectState, selectClaimsById, function (state, byId) { - var byUri = state.claimsByUri || {}; - var claims = {}; - - Object.keys(byUri).forEach(function (uri) { - var claimId = byUri[uri]; - - // NOTE returning a null claim allows us to differentiate between an - // undefined (never fetched claim) and one which just doesn't exist. Not - // the cleanest solution but couldn't think of anything better right now - if (claimId === null) { - claims[uri] = null; - } else { - claims[uri] = byId[claimId]; - } - }); - - return claims; -}); - -var selectAllClaimsByChannel = exports.selectAllClaimsByChannel = (0, _reselect.createSelector)(selectState, function (state) { - return state.claimsByChannel || {}; -}); - -var makeSelectClaimForUri = exports.makeSelectClaimForUri = function makeSelectClaimForUri(uri) { - return (0, _reselect.createSelector)(selectClaimsByUri, function (claims) { - return claims && claims[_lbryuri2.default.normalize(uri)]; - }); -}; - -var selectMyClaimsRaw = exports.selectMyClaimsRaw = (0, _reselect.createSelector)(selectState, function (state) { - return state.myClaims; -}); - -var selectAbandoningIds = exports.selectAbandoningIds = (0, _reselect.createSelector)(selectState, function (state) { - return Object.keys(state.abandoningById || {}); -}); - -var selectMyActiveClaims = exports.selectMyActiveClaims = (0, _reselect.createSelector)(selectMyClaimsRaw, selectAbandoningIds, function (claims, abandoningIds) { - return new Set(claims && claims.map(function (claim) { - return claim.claim_id; - }).filter(function (claimId) { - return Object.keys(abandoningIds).indexOf(claimId) === -1; - })); -}); - -var makeSelectClaimIsMine = exports.makeSelectClaimIsMine = function makeSelectClaimIsMine(rawUri) { - var uri = _lbryuri2.default.normalize(rawUri); - return (0, _reselect.createSelector)(selectClaimsByUri, selectMyActiveClaims, function (claims, myClaims) { - return claims && claims[uri] && claims[uri].claim_id && myClaims.has(claims[uri].claim_id); - }); -}; - -var selectAllFetchingChannelClaims = exports.selectAllFetchingChannelClaims = (0, _reselect.createSelector)(selectState, function (state) { - return state.fetchingChannelClaims || {}; -}); - -var makeSelectFetchingChannelClaims = exports.makeSelectFetchingChannelClaims = function makeSelectFetchingChannelClaims(uri) { - return (0, _reselect.createSelector)(selectAllFetchingChannelClaims, function (fetching) { - return fetching && fetching[uri]; - }); -}; - -var makeSelectClaimsInChannelForCurrentPage = exports.makeSelectClaimsInChannelForCurrentPage = function makeSelectClaimsInChannelForCurrentPage(uri) { - var pageSelector = (0, _navigation.makeSelectCurrentParam)('page'); - - return (0, _reselect.createSelector)(selectClaimsById, selectAllClaimsByChannel, pageSelector, function (byId, allClaims, page) { - var byChannel = allClaims[uri] || {}; - var claimIds = byChannel[page || 1]; - - if (!claimIds) return claimIds; - - return claimIds.map(function (claimId) { - return byId[claimId]; - }); - }); -}; - -var makeSelectMetadataForUri = exports.makeSelectMetadataForUri = function makeSelectMetadataForUri(uri) { - return (0, _reselect.createSelector)(makeSelectClaimForUri(uri), function (claim) { - var metadata = claim && claim.value && claim.value.stream && claim.value.stream.metadata; - - return metadata || (claim === undefined ? undefined : null); - }); -}; - -var makeSelectTitleForUri = exports.makeSelectTitleForUri = function makeSelectTitleForUri(uri) { - return (0, _reselect.createSelector)(makeSelectMetadataForUri(uri), function (metadata) { - return metadata && metadata.title; - }); -}; - -var makeSelectContentTypeForUri = exports.makeSelectContentTypeForUri = function makeSelectContentTypeForUri(uri) { - return (0, _reselect.createSelector)(makeSelectClaimForUri(uri), function (claim) { - var source = claim && claim.value && claim.value.stream && claim.value.stream.source; - return source ? source.contentType : undefined; - }); -}; - -var selectIsFetchingClaimListMine = exports.selectIsFetchingClaimListMine = (0, _reselect.createSelector)(selectState, function (state) { - return state.isFetchingClaimListMine; -}); - -var selectPendingClaims = exports.selectPendingClaims = (0, _reselect.createSelector)(selectState, function (state) { - return Object.values(state.pendingById || {}); -}); - -var selectMyClaims = exports.selectMyClaims = (0, _reselect.createSelector)(selectMyActiveClaims, selectClaimsById, selectAbandoningIds, selectPendingClaims, function (myClaimIds, byId, abandoningIds, pendingClaims) { - var claims = []; - - myClaimIds.forEach(function (id) { - var claim = byId[id]; - - if (claim && abandoningIds.indexOf(id) === -1) claims.push(claim); - }); - - return [].concat(claims, _toConsumableArray(pendingClaims)); -}); - -var selectMyClaimsWithoutChannels = exports.selectMyClaimsWithoutChannels = (0, _reselect.createSelector)(selectMyClaims, function (myClaims) { - return myClaims.filter(function (claim) { - return !claim.name.match(/^@/); - }); -}); - -var selectAllMyClaimsByOutpoint = exports.selectAllMyClaimsByOutpoint = (0, _reselect.createSelector)(selectMyClaimsRaw, function (claims) { - return new Set(claims && claims.length ? claims.map(function (claim) { - return claim.txid + ':' + claim.nout; - }) : null); -}); - -var selectMyClaimsOutpoints = exports.selectMyClaimsOutpoints = (0, _reselect.createSelector)(selectMyClaims, function (myClaims) { - var outpoints = []; - - myClaims.forEach(function (claim) { - return outpoints.push(claim.txid + ':' + claim.nout); - }); - - return outpoints; -}); - -var selectFetchingMyChannels = exports.selectFetchingMyChannels = (0, _reselect.createSelector)(selectState, function (state) { - return state.fetchingMyChannels; -}); - -var selectMyChannelClaims = exports.selectMyChannelClaims = (0, _reselect.createSelector)(selectState, selectClaimsById, function (state, byId) { - var ids = state.myChannelClaims || []; - var claims = []; - - ids.forEach(function (id) { - if (byId[id]) { - // I'm not sure why this check is necessary, but it ought to be a quick fix for https://github.com/lbryio/lbry-app/issues/544 - claims.push(byId[id]); - } - }); - - return claims; -}); - -var selectResolvingUris = exports.selectResolvingUris = (0, _reselect.createSelector)(selectState, function (state) { - return state.resolvingUris || []; -}); - -var makeSelectIsUriResolving = exports.makeSelectIsUriResolving = function makeSelectIsUriResolving(uri) { - return (0, _reselect.createSelector)(selectResolvingUris, function (resolvingUris) { - return resolvingUris && resolvingUris.indexOf(uri) !== -1; - }); -}; - /***/ }), /* 6 */ /***/ (function(module, exports, __webpack_require__) { @@ -1305,6 +1297,51 @@ var makeSelectIsUriResolving = exports.makeSelectIsUriResolving = function makeS "use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.doOpenModal = doOpenModal; +exports.doCloseModal = doCloseModal; +exports.doShowSnackBar = doShowSnackBar; + +var _action_types = __webpack_require__(0); + +var ACTIONS = _interopRequireWildcard(_action_types); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function doOpenModal(modal) { + var modalProps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + return { + type: ACTIONS.OPEN_MODAL, + data: { + modal: modal, + modalProps: modalProps + } + }; +} + +function doCloseModal() { + return { + type: ACTIONS.CLOSE_MODAL + }; +} + +function doShowSnackBar(data) { + return { + type: ACTIONS.SHOW_SNACKBAR, + data: data + }; +} + +/***/ }), +/* 7 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + Object.defineProperty(exports, "__esModule", { value: true }); @@ -1320,15 +1357,19 @@ var _action_types = __webpack_require__(0); var ACTIONS = _interopRequireWildcard(_action_types); -var _lbry = __webpack_require__(3); +var _modal_types = __webpack_require__(10); + +var MODALS = _interopRequireWildcard(_modal_types); + +var _lbry = __webpack_require__(5); var _lbry2 = _interopRequireDefault(_lbry); -var _lbryuri = __webpack_require__(4); +var _lbryURI = __webpack_require__(3); -var _lbryuri2 = _interopRequireDefault(_lbryuri); +var _app = __webpack_require__(6); -var _claims = __webpack_require__(5); +var _claims = __webpack_require__(4); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -1336,7 +1377,7 @@ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; function doResolveUris(uris) { return function (dispatch, getState) { - var normalizedUris = uris.map(_lbryuri2.default.normalize); + var normalizedUris = uris.map(_lbryURI.normalizeURI); var state = getState(); // Filter out URIs that are already resolving @@ -1407,7 +1448,7 @@ function doFetchClaimListMine() { function doAbandonClaim(txid, nout) { return function (dispatch, getState) { var state = getState(); - var myClaims = selectMyClaimsRaw(state); + var myClaims = (0, _claims.selectMyClaimsRaw)(state); var _myClaims$find = myClaims.find(function (claim) { return claim.txid === txid && claim.nout === nout; @@ -1423,7 +1464,7 @@ function doAbandonClaim(txid, nout) { }); var errorCallback = function errorCallback() { - dispatch(doOpenModal(MODALS.TRANSACTION_FAILED)); + dispatch((0, _app.doOpenModal)(MODALS.TRANSACTION_FAILED)); }; var successCallback = function successCallback(results) { @@ -1434,10 +1475,10 @@ function doAbandonClaim(txid, nout) { claimId: claimId } }); - dispatch(doResolveUri(_lbryuri2.default.build({ name: name, claimId: claimId }))); + dispatch(doResolveUri((0, _lbryURI.buildURI)({ name: name, claimId: claimId }))); dispatch(doFetchClaimListMine()); } else { - dispatch(doOpenModal(MODALS.TRANSACTION_FAILED)); + dispatch((0, _app.doOpenModal)(MODALS.TRANSACTION_FAILED)); } }; @@ -1449,7 +1490,7 @@ function doAbandonClaim(txid, nout) { } /***/ }), -/* 7 */ +/* 8 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1494,7 +1535,7 @@ function toQueryString(params) { } /***/ }), -/* 8 */ +/* 9 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1516,7 +1557,7 @@ var ACTIONS = _interopRequireWildcard(_action_types); var _navigation = __webpack_require__(1); -var _query_params = __webpack_require__(7); +var _query_params = __webpack_require__(8); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } @@ -1593,7 +1634,7 @@ function doRecordScroll(scroll) { } /***/ }), -/* 9 */ +/* 10 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1602,43 +1643,130 @@ function doRecordScroll(scroll) { Object.defineProperty(exports, "__esModule", { value: true }); -exports.doOpenModal = doOpenModal; -exports.doCloseModal = doCloseModal; -exports.doShowSnackBar = doShowSnackBar; - -var _action_types = __webpack_require__(0); - -var ACTIONS = _interopRequireWildcard(_action_types); - -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - -function doOpenModal(modal) { - var modalProps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - - return { - type: ACTIONS.OPEN_MODAL, - data: { - modal: modal, - modalProps: modalProps - } - }; -} - -function doCloseModal() { - return { - type: ACTIONS.CLOSE_MODAL - }; -} - -function doShowSnackBar(data) { - return { - type: ACTIONS.SHOW_SNACKBAR, - data: data - }; -} +var CONFIRM_FILE_REMOVE = exports.CONFIRM_FILE_REMOVE = 'confirmFileRemove'; +var INCOMPATIBLE_DAEMON = exports.INCOMPATIBLE_DAEMON = 'incompatibleDaemon'; +var FILE_TIMEOUT = exports.FILE_TIMEOUT = 'file_timeout'; +var DOWNLOADING = exports.DOWNLOADING = 'downloading'; +var ERROR = exports.ERROR = 'error'; +var INSUFFICIENT_CREDITS = exports.INSUFFICIENT_CREDITS = 'insufficient_credits'; +var UPGRADE = exports.UPGRADE = 'upgrade'; +var WELCOME = exports.WELCOME = 'welcome'; +var EMAIL_COLLECTION = exports.EMAIL_COLLECTION = 'email_collection'; +var FIRST_REWARD = exports.FIRST_REWARD = 'first_reward'; +var AUTHENTICATION_FAILURE = exports.AUTHENTICATION_FAILURE = 'auth_failure'; +var TRANSACTION_FAILED = exports.TRANSACTION_FAILED = 'transaction_failed'; +var REWARD_APPROVAL_REQUIRED = exports.REWARD_APPROVAL_REQUIRED = 'reward_approval_required'; +var AFFIRM_PURCHASE = exports.AFFIRM_PURCHASE = 'affirm_purchase'; +var CONFIRM_CLAIM_REVOKE = exports.CONFIRM_CLAIM_REVOKE = 'confirmClaimRevoke'; /***/ }), -/* 10 */ +/* 11 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(process) { + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +var _querystring = __webpack_require__(19); + +var _querystring2 = _interopRequireDefault(_querystring); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var Lbryapi = { + enabled: true, + exchangePromise: null, + exchangeLastFetched: null +}; + +var CONNECTION_STRING = process.env.LBRY_APP_API_URL ? process.env.LBRY_APP_API_URL.replace(/\/*$/, '/') // exactly one slash at the end +: 'https://api.lbry.io/'; + +var EXCHANGE_RATE_TIMEOUT = 20 * 60 * 1000; + +Lbryapi.getExchangeRates = function () { + if (!Lbryapi.exchangeLastFetched || Date.now() - Lbryapi.exchangeLastFetched > EXCHANGE_RATE_TIMEOUT) { + Lbryapi.exchangePromise = new Promise(function (resolve, reject) { + Lbryapi.call('lbc', 'exchange_rate', {}, 'get', true).then(function (_ref) { + var LBC_USD = _ref.lbc_usd, + LBC_BTC = _ref.lbc_btc, + BTC_USD = _ref.btc_usd; + + var rates = { LBC_USD: LBC_USD, LBC_BTC: LBC_BTC, BTC_USD: BTC_USD }; + resolve(rates); + }).catch(reject); + }); + Lbryapi.exchangeLastFetched = Date.now(); + } + return Lbryapi.exchangePromise; +}; + +Lbryapi.call = function (resource, action) { + var params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + var method = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'get'; + + if (!Lbryapi.enabled) { + return Promise.reject(new Error(__('LBRY internal API is disabled'))); + } + + if (!(method === 'get' || method === 'post')) { + return Promise.reject(new Error(__('Invalid method'))); + } + + function checkAndParse(response) { + if (response.status >= 200 && response.status < 300) { + return response.json(); + } + return response.json().then(function (json) { + var error = void 0; + if (json.error) { + error = new Error(json.error); + } else { + error = new Error('Unknown API error signature'); + } + error.response = response; // This is primarily a hack used in actions/user.js + return Promise.reject(error); + }); + } + + function makeRequest(url, options) { + return fetch(url, options).then(checkAndParse); + } + + var fullParams = _extends({}, params); + var qs = _querystring2.default.stringify(fullParams); + var url = '' + CONNECTION_STRING + resource + '/' + action + '?' + qs; + + var options = { + method: 'GET' + }; + + if (method === 'post') { + options = { + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded' + }, + body: qs + }; + url = '' + CONNECTION_STRING + resource + '/' + action; + } + + return makeRequest(url, options).then(function (response) { + return response.data; + }); +}; + +exports.default = Lbryapi; +/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(18))) + +/***/ }), +/* 12 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1649,7 +1777,7 @@ Object.defineProperty(exports, "__esModule", { }); exports.selectTotalDownloadProgress = exports.selectDownloadingFileInfos = exports.selectFileInfosDownloaded = exports.makeSelectLoadingForUri = exports.selectUrisLoading = exports.makeSelectDownloadingForUri = exports.selectDownloadingByOutpoint = exports.makeSelectFileInfoForUri = exports.selectIsFetchingFileListDownloadedOrPublished = exports.selectIsFetchingFileList = exports.selectFileInfosByOutpoint = exports.selectState = undefined; -var _claims = __webpack_require__(5); +var _claims = __webpack_require__(4); var _reselect = __webpack_require__(2); @@ -1747,7 +1875,7 @@ var selectTotalDownloadProgress = exports.selectTotalDownloadProgress = (0, _res }); /***/ }), -/* 11 */ +/* 13 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1770,7 +1898,7 @@ function batchActions() { } /***/ }), -/* 12 */ +/* 14 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1906,7 +2034,7 @@ var makeSelectBlockDate = exports.makeSelectBlockDate = function makeSelectBlock }; /***/ }), -/* 13 */ +/* 15 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1915,10 +2043,55 @@ var makeSelectBlockDate = exports.makeSelectBlockDate = function makeSelectBlock Object.defineProperty(exports, "__esModule", { value: true }); -exports.selectBlocks = exports.selectDraftTransactionError = exports.selectDraftTransactionAddress = exports.selectDraftTransactionAmount = exports.selectDraftTransaction = exports.selectGettingNewAddress = exports.selectReceiveAddress = exports.selectIsSendingSupport = exports.selectIsFetchingTransactions = exports.selectHasTransactions = exports.selectRecentTransactions = exports.selectTransactionItems = undefined; -exports.selectTransactionsById = exports.selectBalance = exports.makeSelectBlockDate = exports.selectWunderBarIcon = exports.selectWunderBarAddress = exports.selectSearchUrisByQuery = exports.selectIsSearching = exports.selectSearchQuery = exports.makeSelectSearchUris = exports.selectActiveHistoryEntry = exports.selectHistoryStack = exports.selectHistoryIndex = exports.selectIsForwardDisabled = exports.selectIsBackDisabled = exports.selectPathAfterAuth = exports.selectPageTitle = exports.selectHeaderLinks = exports.selectCurrentParams = exports.selectCurrentPage = exports.selectCurrentPath = exports.makeSelectCurrentParam = exports.computePageFromPath = exports.selectTotalDownloadProgress = exports.selectDownloadingFileInfos = exports.selectFileInfosDownloaded = exports.selectUrisLoading = exports.selectDownloadingByOutpoint = exports.selectIsFetchingFileListDownloadedOrPublished = exports.selectIsFetchingFileList = exports.selectFileInfosByOutpoint = exports.makeSelectLoadingForUri = exports.makeSelectDownloadingForUri = exports.makeSelectFileInfoForUri = exports.selectFetchingCostInfo = exports.selectCostForCurrentPageUri = exports.selectAllCostInfoByUri = exports.makeSelectCostInfoForUri = exports.makeSelectFetchingCostInfoForUri = exports.selectResolvingUris = exports.selectMyChannelClaims = exports.selectFetchingMyChannels = exports.selectMyClaimsOutpoints = exports.selectAllMyClaimsByOutpoint = exports.selectMyClaimsWithoutChannels = exports.selectMyClaims = exports.selectPendingClaims = exports.selectIsFetchingClaimListMine = exports.selectAllFetchingChannelClaims = exports.selectMyActiveClaims = exports.selectAbandoningIds = exports.selectMyClaimsRaw = exports.selectAllClaimsByChannel = exports.selectClaimsByUri = exports.selectClaimsById = exports.makeSelectIsUriResolving = exports.makeSelectContentTypeForUri = exports.makeSelectTitleForUri = exports.makeSelectMetadataForUri = exports.makeSelectClaimsInChannelForCurrentPage = exports.makeSelectFetchingChannelClaims = exports.makeSelectClaimIsMine = exports.makeSelectClaimForUri = exports.walletReducer = exports.searchReducer = exports.fileInfoReducer = exports.costInfoReducer = exports.claimsReducer = exports.toQueryString = exports.parseQueryParams = exports.batchActions = exports.doSendSupport = exports.doSetDraftTransactionAddress = exports.doSetDraftTransactionAmount = exports.doSendDraftTransaction = exports.doCheckAddressIsMine = exports.doGetNewAddress = exports.doFetchBlock = exports.doFetchTransactions = exports.doBalanceSubscribe = exports.doUpdateBalance = exports.doSearch = exports.doRecordScroll = exports.doHistoryForward = exports.doHistoryBack = exports.doHistoryTraverse = exports.doAuthNavigate = exports.doNavigate = exports.doFetchFileInfosAndPublishedClaims = exports.doFileList = exports.doFetchFileInfo = exports.doFetchCostInfoForUri = exports.doResolveUri = exports.doResolveUris = exports.doAbandonClaim = exports.doFetchClaimListMine = exports.doShowSnackBar = exports.doCloseModal = exports.doOpenModal = exports.Lbryuri = exports.Lbry = undefined; +exports.selectBlocks = exports.selectDraftTransactionError = exports.selectDraftTransactionAddress = exports.selectDraftTransactionAmount = exports.selectDraftTransaction = exports.selectGettingNewAddress = exports.selectReceiveAddress = exports.selectIsSendingSupport = exports.selectIsFetchingTransactions = exports.selectHasTransactions = exports.selectRecentTransactions = exports.selectTransactionItems = exports.selectTransactionsById = exports.selectBalance = exports.makeSelectBlockDate = exports.selectWunderBarIcon = exports.selectWunderBarAddress = exports.selectSearchUrisByQuery = exports.selectIsSearching = undefined; +exports.selectSearchQuery = exports.makeSelectSearchUris = exports.selectActiveHistoryEntry = exports.selectHistoryStack = exports.selectHistoryIndex = exports.selectIsForwardDisabled = exports.selectIsBackDisabled = exports.selectPathAfterAuth = exports.selectPageTitle = exports.selectHeaderLinks = exports.selectCurrentParams = exports.selectCurrentPage = exports.selectCurrentPath = exports.makeSelectCurrentParam = exports.computePageFromPath = exports.selectTotalDownloadProgress = exports.selectDownloadingFileInfos = exports.selectFileInfosDownloaded = exports.selectUrisLoading = exports.selectDownloadingByOutpoint = exports.selectIsFetchingFileListDownloadedOrPublished = exports.selectIsFetchingFileList = exports.selectFileInfosByOutpoint = exports.makeSelectLoadingForUri = exports.makeSelectDownloadingForUri = exports.makeSelectFileInfoForUri = exports.selectFetchingCostInfo = exports.selectCostForCurrentPageUri = exports.selectAllCostInfoByUri = exports.makeSelectCostInfoForUri = exports.makeSelectFetchingCostInfoForUri = exports.selectResolvingUris = exports.selectMyChannelClaims = exports.selectFetchingMyChannels = exports.selectMyClaimsOutpoints = exports.selectAllMyClaimsByOutpoint = exports.selectMyClaimsWithoutChannels = exports.selectMyClaims = exports.selectPendingClaims = exports.selectIsFetchingClaimListMine = exports.selectAllFetchingChannelClaims = exports.selectMyActiveClaims = exports.selectAbandoningIds = exports.selectMyClaimsRaw = exports.selectAllClaimsByChannel = exports.selectClaimsByUri = exports.selectClaimsById = exports.makeSelectIsUriResolving = exports.makeSelectContentTypeForUri = exports.makeSelectTitleForUri = exports.makeSelectMetadataForUri = exports.makeSelectClaimsInChannelForCurrentPage = exports.makeSelectFetchingChannelClaims = exports.makeSelectClaimIsMine = exports.makeSelectClaimForUri = exports.walletReducer = exports.searchReducer = exports.fileInfoReducer = exports.costInfoReducer = exports.claimsReducer = exports.toQueryString = exports.parseQueryParams = exports.batchActions = exports.doSendSupport = exports.doSetDraftTransactionAddress = exports.doSetDraftTransactionAmount = exports.doSendDraftTransaction = exports.doCheckAddressIsMine = exports.doGetNewAddress = exports.doFetchBlock = exports.doFetchTransactions = exports.doBalanceSubscribe = exports.doUpdateBalance = exports.doSearch = exports.doRecordScroll = exports.doHistoryForward = exports.doHistoryBack = exports.doHistoryTraverse = exports.doAuthNavigate = exports.doNavigate = exports.doFetchFileInfosAndPublishedClaims = exports.doFileList = exports.doFetchFileInfo = exports.doFetchCostInfoForUri = exports.doResolveUri = exports.doResolveUris = exports.doAbandonClaim = exports.doFetchClaimListMine = exports.doShowSnackBar = exports.doCloseModal = exports.doOpenModal = exports.isURIClaimable = exports.isURIValid = exports.normalizeURI = exports.buildURI = exports.parseURI = exports.regexAddress = exports.regexInvalidURI = exports.Lbryapi = exports.Lbry = undefined; -var _app = __webpack_require__(9); +var _lbryURI = __webpack_require__(3); + +Object.defineProperty(exports, 'regexInvalidURI', { + enumerable: true, + get: function get() { + return _lbryURI.regexInvalidURI; + } +}); +Object.defineProperty(exports, 'regexAddress', { + enumerable: true, + get: function get() { + return _lbryURI.regexAddress; + } +}); +Object.defineProperty(exports, 'parseURI', { + enumerable: true, + get: function get() { + return _lbryURI.parseURI; + } +}); +Object.defineProperty(exports, 'buildURI', { + enumerable: true, + get: function get() { + return _lbryURI.buildURI; + } +}); +Object.defineProperty(exports, 'normalizeURI', { + enumerable: true, + get: function get() { + return _lbryURI.normalizeURI; + } +}); +Object.defineProperty(exports, 'isURIValid', { + enumerable: true, + get: function get() { + return _lbryURI.isURIValid; + } +}); +Object.defineProperty(exports, 'isURIClaimable', { + enumerable: true, + get: function get() { + return _lbryURI.isURIClaimable; + } +}); + +var _app = __webpack_require__(6); Object.defineProperty(exports, 'doOpenModal', { enumerable: true, @@ -1939,7 +2112,7 @@ Object.defineProperty(exports, 'doShowSnackBar', { } }); -var _claims = __webpack_require__(6); +var _claims = __webpack_require__(7); Object.defineProperty(exports, 'doFetchClaimListMine', { enumerable: true, @@ -1966,7 +2139,7 @@ Object.defineProperty(exports, 'doResolveUri', { } }); -var _cost_info = __webpack_require__(15); +var _cost_info = __webpack_require__(17); Object.defineProperty(exports, 'doFetchCostInfoForUri', { enumerable: true, @@ -1975,7 +2148,7 @@ Object.defineProperty(exports, 'doFetchCostInfoForUri', { } }); -var _file_info = __webpack_require__(21); +var _file_info = __webpack_require__(22); Object.defineProperty(exports, 'doFetchFileInfo', { enumerable: true, @@ -1996,7 +2169,7 @@ Object.defineProperty(exports, 'doFetchFileInfosAndPublishedClaims', { } }); -var _navigation = __webpack_require__(8); +var _navigation = __webpack_require__(9); Object.defineProperty(exports, 'doNavigate', { enumerable: true, @@ -2035,7 +2208,7 @@ Object.defineProperty(exports, 'doRecordScroll', { } }); -var _search = __webpack_require__(22); +var _search = __webpack_require__(23); Object.defineProperty(exports, 'doSearch', { enumerable: true, @@ -2044,7 +2217,7 @@ Object.defineProperty(exports, 'doSearch', { } }); -var _wallet = __webpack_require__(23); +var _wallet = __webpack_require__(24); Object.defineProperty(exports, 'doUpdateBalance', { enumerable: true, @@ -2107,7 +2280,7 @@ Object.defineProperty(exports, 'doSendSupport', { } }); -var _batchActions = __webpack_require__(11); +var _batchActions = __webpack_require__(13); Object.defineProperty(exports, 'batchActions', { enumerable: true, @@ -2116,7 +2289,7 @@ Object.defineProperty(exports, 'batchActions', { } }); -var _query_params = __webpack_require__(7); +var _query_params = __webpack_require__(8); Object.defineProperty(exports, 'parseQueryParams', { enumerable: true, @@ -2176,7 +2349,7 @@ Object.defineProperty(exports, 'walletReducer', { } }); -var _claims3 = __webpack_require__(5); +var _claims3 = __webpack_require__(4); Object.defineProperty(exports, 'makeSelectClaimForUri', { enumerable: true, @@ -2356,7 +2529,7 @@ Object.defineProperty(exports, 'selectFetchingCostInfo', { } }); -var _file_info3 = __webpack_require__(10); +var _file_info3 = __webpack_require__(12); Object.defineProperty(exports, 'makeSelectFileInfoForUri', { enumerable: true, @@ -2545,7 +2718,7 @@ Object.defineProperty(exports, 'selectWunderBarIcon', { } }); -var _wallet3 = __webpack_require__(12); +var _wallet3 = __webpack_require__(14); Object.defineProperty(exports, 'makeSelectBlockDate', { enumerable: true, @@ -2638,24 +2811,22 @@ Object.defineProperty(exports, 'selectBlocks', { } }); -var _lbry = __webpack_require__(3); +var _lbry = __webpack_require__(5); var _lbry2 = _interopRequireDefault(_lbry); -var _lbryuri = __webpack_require__(4); +var _lbryapi = __webpack_require__(11); -var _lbryuri2 = _interopRequireDefault(_lbryuri); +var _lbryapi2 = _interopRequireDefault(_lbryapi); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } // common exports.Lbry = _lbry2.default; -exports.Lbryuri = _lbryuri2.default; - -// actions +exports.Lbryapi = _lbryapi2.default; /***/ }), -/* 14 */ +/* 16 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2742,7 +2913,7 @@ jsonrpc.call = function (connectionString, method, params, callback, errorCallba exports.default = jsonrpc; /***/ }), -/* 15 */ +/* 17 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2757,11 +2928,11 @@ var _action_types = __webpack_require__(0); var ACTIONS = _interopRequireWildcard(_action_types); -var _lbryapi = __webpack_require__(16); +var _lbryapi = __webpack_require__(11); var _lbryapi2 = _interopRequireDefault(_lbryapi); -var _claims = __webpack_require__(5); +var _claims = __webpack_require__(4); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -2802,118 +2973,7 @@ function doFetchCostInfoForUri(uri) { } /***/ }), -/* 16 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/* WEBPACK VAR INJECTION */(function(process) { - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; - -var _lbry = __webpack_require__(3); - -var _lbry2 = _interopRequireDefault(_lbry); - -var _querystring = __webpack_require__(18); - -var _querystring2 = _interopRequireDefault(_querystring); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var LbryApi = { - enabled: true, - exchangePromise: null, - exchangeLastFetched: null -}; - -var CONNECTION_STRING = process.env.LBRY_APP_API_URL ? process.env.LBRY_APP_API_URL.replace(/\/*$/, '/') // exactly one slash at the end -: 'https://api.lbry.io/'; - -var EXCHANGE_RATE_TIMEOUT = 20 * 60 * 1000; - -LbryApi.getExchangeRates = function () { - if (!LbryApi.exchangeLastFetched || Date.now() - LbryApi.exchangeLastFetched > EXCHANGE_RATE_TIMEOUT) { - LbryApi.exchangePromise = new Promise(function (resolve, reject) { - LbryApi.call('lbc', 'exchange_rate', {}, 'get', true).then(function (_ref) { - var LBC_USD = _ref.lbc_usd, - LBC_BTC = _ref.lbc_btc, - BTC_USD = _ref.btc_usd; - - var rates = { LBC_USD: LBC_USD, LBC_BTC: LBC_BTC, BTC_USD: BTC_USD }; - resolve(rates); - }).catch(reject); - }); - LbryApi.exchangeLastFetched = Date.now(); - } - return LbryApi.exchangePromise; -}; - -LbryApi.call = function (resource, action) { - var params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; - var method = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'get'; - - if (!LbryApi.enabled) { - console.log(__('Internal API disabled')); - return Promise.reject(new Error(__('LBRY internal API is disabled'))); - } - - if (!(method === 'get' || method === 'post')) { - return Promise.reject(new Error(__('Invalid method'))); - } - - function checkAndParse(response) { - if (response.status >= 200 && response.status < 300) { - return response.json(); - } - return response.json().then(function (json) { - var error = void 0; - if (json.error) { - error = new Error(json.error); - } else { - error = new Error('Unknown API error signature'); - } - error.response = response; // This is primarily a hack used in actions/user.js - return Promise.reject(error); - }); - } - - function makeRequest(url, options) { - return fetch(url, options).then(checkAndParse); - } - - var fullParams = _extends({}, params); - var qs = _querystring2.default.stringify(fullParams); - var url = '' + CONNECTION_STRING + resource + '/' + action + '?' + qs; - - var options = { - method: 'GET' - }; - - if (method === 'post') { - options = { - method: 'POST', - headers: { - 'Content-Type': 'application/x-www-form-urlencoded' - }, - body: qs - }; - url = '' + CONNECTION_STRING + resource + '/' + action; - } - - return makeRequest(url, options).then(function (response) { - return response.data; - }); -}; - -exports.default = LbryApi; -/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(17))) - -/***/ }), -/* 17 */ +/* 18 */ /***/ (function(module, exports) { // shim for using process in browser @@ -3103,18 +3163,18 @@ process.umask = function() { return 0; }; /***/ }), -/* 18 */ +/* 19 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -exports.decode = exports.parse = __webpack_require__(19); -exports.encode = exports.stringify = __webpack_require__(20); +exports.decode = exports.parse = __webpack_require__(20); +exports.encode = exports.stringify = __webpack_require__(21); /***/ }), -/* 19 */ +/* 20 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3205,7 +3265,7 @@ var isArray = Array.isArray || function (xs) { /***/ }), -/* 20 */ +/* 21 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3297,7 +3357,7 @@ var objectKeys = Object.keys || function (obj) { /***/ }), -/* 21 */ +/* 22 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3314,15 +3374,15 @@ var _action_types = __webpack_require__(0); var ACTIONS = _interopRequireWildcard(_action_types); -var _lbry = __webpack_require__(3); +var _lbry = __webpack_require__(5); var _lbry2 = _interopRequireDefault(_lbry); -var _claims = __webpack_require__(6); +var _claims = __webpack_require__(7); -var _claims2 = __webpack_require__(5); +var _claims2 = __webpack_require__(4); -var _file_info = __webpack_require__(10); +var _file_info = __webpack_require__(12); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -3390,7 +3450,7 @@ function doFetchFileInfosAndPublishedClaims() { } /***/ }), -/* 22 */ +/* 23 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3405,17 +3465,15 @@ var _action_types = __webpack_require__(0); var ACTIONS = _interopRequireWildcard(_action_types); -var _lbryuri = __webpack_require__(4); +var _lbryURI = __webpack_require__(3); -var _lbryuri2 = _interopRequireDefault(_lbryuri); +var _claims = __webpack_require__(7); -var _claims = __webpack_require__(6); - -var _navigation = __webpack_require__(8); +var _navigation = __webpack_require__(9); var _navigation2 = __webpack_require__(1); -var _batchActions = __webpack_require__(11); +var _batchActions = __webpack_require__(13); var _batchActions2 = _interopRequireDefault(_batchActions); @@ -3453,7 +3511,7 @@ function doSearch(rawQuery) { var actions = []; data.forEach(function (result) { - var uri = _lbryuri2.default.build({ + var uri = (0, _lbryURI.buildURI)({ name: result.name, claimId: result.claimId }); @@ -3479,7 +3537,7 @@ function doSearch(rawQuery) { } /***/ }), -/* 23 */ +/* 24 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3503,19 +3561,19 @@ var _action_types = __webpack_require__(0); var ACTIONS = _interopRequireWildcard(_action_types); -var _modal_types = __webpack_require__(24); +var _modal_types = __webpack_require__(10); var MODALS = _interopRequireWildcard(_modal_types); -var _lbry = __webpack_require__(3); +var _lbry = __webpack_require__(5); var _lbry2 = _interopRequireDefault(_lbry); -var _app = __webpack_require__(9); +var _app = __webpack_require__(6); -var _navigation = __webpack_require__(8); +var _navigation = __webpack_require__(9); -var _wallet = __webpack_require__(12); +var _wallet = __webpack_require__(14); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -3716,32 +3774,6 @@ function doSendSupport(amount, claimId, uri) { }; } -/***/ }), -/* 24 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -var CONFIRM_FILE_REMOVE = exports.CONFIRM_FILE_REMOVE = 'confirmFileRemove'; -var INCOMPATIBLE_DAEMON = exports.INCOMPATIBLE_DAEMON = 'incompatibleDaemon'; -var FILE_TIMEOUT = exports.FILE_TIMEOUT = 'file_timeout'; -var DOWNLOADING = exports.DOWNLOADING = 'downloading'; -var ERROR = exports.ERROR = 'error'; -var INSUFFICIENT_CREDITS = exports.INSUFFICIENT_CREDITS = 'insufficient_credits'; -var UPGRADE = exports.UPGRADE = 'upgrade'; -var WELCOME = exports.WELCOME = 'welcome'; -var EMAIL_COLLECTION = exports.EMAIL_COLLECTION = 'email_collection'; -var FIRST_REWARD = exports.FIRST_REWARD = 'first_reward'; -var AUTHENTICATION_FAILURE = exports.AUTHENTICATION_FAILURE = 'auth_failure'; -var TRANSACTION_FAILED = exports.TRANSACTION_FAILED = 'transaction_failed'; -var REWARD_APPROVAL_REQUIRED = exports.REWARD_APPROVAL_REQUIRED = 'reward_approval_required'; -var AFFIRM_PURCHASE = exports.AFFIRM_PURCHASE = 'affirm_purchase'; -var CONFIRM_CLAIM_REVOKE = exports.CONFIRM_CLAIM_REVOKE = 'confirmClaimRevoke'; - /***/ }), /* 25 */ /***/ (function(module, exports, __webpack_require__) { diff --git a/src/index.js b/src/index.js index 85e1ed0..5ada795 100644 --- a/src/index.js +++ b/src/index.js @@ -1,9 +1,17 @@ // common import Lbry from 'lbry'; import Lbryapi from 'lbryapi'; -import Lbryuri from 'lbryuri'; -export { Lbry, Lbryapi, Lbryuri }; +export { Lbry, Lbryapi }; +export { + regexInvalidURI, + regexAddress, + parseURI, + buildURI, + normalizeURI, + isURIValid, + isURIClaimable, +} from 'lbryURI'; // actions export { doOpenModal, doCloseModal, doShowSnackBar } from 'redux/actions/app'; diff --git a/src/lbryuri.js b/src/lbryURI.js similarity index 80% rename from src/lbryuri.js rename to src/lbryURI.js index f7c1a31..e069196 100644 --- a/src/lbryuri.js +++ b/src/lbryURI.js @@ -1,10 +1,8 @@ -const CHANNEL_NAME_MIN_LEN = 1; -const CLAIM_ID_MAX_LEN = 40; +const channelNameMinLength = 1; +const claimIdMaxLength = 40; -const Lbryuri = {}; - -Lbryuri.REGEXP_INVALID_URI = /[^A-Za-z0-9-]/g; -Lbryuri.REGEXP_ADDRESS = /^b(?=[^0OIl]{32,33})[0-9A-Za-z]{32,33}$/; +export const regexInvalidURI = /[^A-Za-z0-9-]/g; +export const regexAddress = /^b(?=[^0OIl]{32,33})[0-9A-Za-z]{32,33}$/; /** * Parses a LBRY name into its component parts. Throws errors with user-friendly @@ -28,7 +26,7 @@ Lbryuri.REGEXP_ADDRESS = /^b(?=[^0OIl]{32,33})[0-9A-Za-z]{32,33}$/; * - contentName (string): For anon claims, the name; for channel claims, the path * - channelName (string, if present): Channel name without @ */ -Lbryuri.parse = (uri, requireProto = false) => { +export function parseURI(URI, requireProto = false) { // Break into components. Empty sub-matches are converted to null const componentsRegex = new RegExp( '^((?:lbry://)?)' + // protocol @@ -37,7 +35,7 @@ Lbryuri.parse = (uri, requireProto = false) => { '(/?)(.*)' // path separator, path ); const [proto, name, modSep, modVal, pathSep, path] = componentsRegex - .exec(uri) + .exec(URI) .slice(1) .map(match => match || null); @@ -61,14 +59,14 @@ Lbryuri.parse = (uri, requireProto = false) => { throw new Error(__('No channel name after @.')); } - if (channelName.length < CHANNEL_NAME_MIN_LEN) { - throw new Error(__(`Channel names must be at least %s characters.`, CHANNEL_NAME_MIN_LEN)); + if (channelName.length < channelNameMinLength) { + throw new Error(__(`Channel names must be at least %s characters.`, channelNameMinLength)); } contentName = path; } - const nameBadChars = (channelName || name).match(Lbryuri.REGEXP_INVALID_URI); + const nameBadChars = (channelName || name).match(regexInvalidURI); if (nameBadChars) { throw new Error( __( @@ -99,7 +97,7 @@ Lbryuri.parse = (uri, requireProto = false) => { if ( claimId && - (claimId.length > CLAIM_ID_MAX_LEN || !claimId.match(/^[0-9a-f]+$/)) && + (claimId.length > claimIdMaxLength || !claimId.match(/^[0-9a-f]+$/)) && !claimId.match(/^pending/) // ought to be dropped when savePendingPublish drops hack ) { throw new Error(__(`Invalid claim ID %s.`, claimId)); @@ -119,7 +117,7 @@ Lbryuri.parse = (uri, requireProto = false) => { throw new Error(__('Only channel URIs may have a path.')); } - const pathBadChars = path.match(Lbryuri.REGEXP_INVALID_URI); + const pathBadChars = path.match(regexInvalidURI); if (pathBadChars) { throw new Error(__(`Invalid character in path: %s`, pathBadChars.join(', '))); } @@ -140,17 +138,17 @@ Lbryuri.parse = (uri, requireProto = false) => { ...(claimId ? { claimId } : {}), ...(path ? { path } : {}), }; -}; +} /** - * Takes an object in the same format returned by lbryuri.parse() and builds a URI. + * Takes an object in the same format returned by parse() and builds a URI. * * The channelName key will accept names with or without the @ prefix. */ -Lbryuri.build = (uriObj, includeProto = true) => { - const { claimId, claimSequence, bidPosition, contentName, channelName } = uriObj; +export function buildURI(URIObj, includeProto = true) { + const { claimId, claimSequence, bidPosition, contentName, channelName } = URIObj; - let { name, path } = uriObj; + let { name, path } = URIObj; if (channelName) { const channelNameFormatted = channelName.startsWith('@') ? channelName : `@${channelName}`; @@ -188,36 +186,35 @@ Lbryuri.build = (uriObj, includeProto = true) => { (bidPosition ? `${bidPosition}` : '') + (path ? `/${path}` : '') ); -}; +} -/* Takes a parseable LBRY URI and converts it to standard, canonical format (currently this just - * consists of adding the lbry:// prefix if needed) */ -Lbryuri.normalize = uri => { - if (uri.match(/pending_claim/)) return uri; +/* Takes a parseable LBRY URI and converts it to standard, canonical format */ +export function normalizeURI(URI) { + if (URI.match(/pending_claim/)) return URI; - const { name, path, bidPosition, claimSequence, claimId } = Lbryuri.parse(uri); - return Lbryuri.build({ name, path, claimSequence, bidPosition, claimId }); -}; + const { name, path, bidPosition, claimSequence, claimId } = parseURI(URI); + return buildURI({ name, path, claimSequence, bidPosition, claimId }); +} -Lbryuri.isValid = uri => { +export function isURIValid(URI) { let parts; try { - parts = Lbryuri.parse(Lbryuri.normalize(uri)); + parts = parseURI(normalizeURI(URI)); } catch (error) { return false; } return parts && parts.name; -}; +} -Lbryuri.isValidName = (name, checkCase = true) => { +export function isNameValid(name, checkCase = true) { const regexp = new RegExp('^[a-z0-9-]+$', checkCase ? '' : 'i'); return regexp.test(name); -}; +} -Lbryuri.isClaimable = uri => { +export function isURIClaimable(URI) { let parts; try { - parts = Lbryuri.parse(Lbryuri.normalize(uri)); + parts = parseURI(normalizeURI(URI)); } catch (error) { return false; } @@ -230,9 +227,4 @@ Lbryuri.isClaimable = uri => { !parts.isChannel && !parts.path ); -}; - -if (window) { - window.lbryuri = Lbryuri; } -export default Lbryuri; diff --git a/src/redux/actions/claims.js b/src/redux/actions/claims.js index 188783b..c582e8c 100644 --- a/src/redux/actions/claims.js +++ b/src/redux/actions/claims.js @@ -1,13 +1,13 @@ import * as ACTIONS from 'constants/action_types'; import * as MODALS from 'constants/modal_types'; import Lbry from 'lbry'; -import Lbryuri from 'lbryuri'; +import { buildURI, normalizeURI } from 'lbryURI'; import { doOpenModal } from 'redux/actions/app'; import { selectMyClaimsRaw, selectResolvingUris } from 'redux/selectors/claims'; export function doResolveUris(uris) { return (dispatch, getState) => { - const normalizedUris = uris.map(Lbryuri.normalize); + const normalizedUris = uris.map(normalizeURI); const state = getState(); // Filter out URIs that are already resolving @@ -94,7 +94,7 @@ export function doAbandonClaim(txid, nout) { claimId, }, }); - dispatch(doResolveUri(Lbryuri.build({ name, claimId }))); + dispatch(doResolveUri(buildURI({ name, claimId }))); dispatch(doFetchClaimListMine()); } else { dispatch(doOpenModal(MODALS.TRANSACTION_FAILED)); diff --git a/src/redux/actions/search.js b/src/redux/actions/search.js index a98d7c7..8ada6e4 100644 --- a/src/redux/actions/search.js +++ b/src/redux/actions/search.js @@ -1,5 +1,5 @@ import * as ACTIONS from 'constants/action_types'; -import Lbryuri from 'lbryuri'; +import { buildURI } from 'lbryURI'; import { doResolveUri } from 'redux/actions/claims'; import { doNavigate } from 'redux/actions/navigation'; import { selectCurrentPage } from 'redux/selectors/navigation'; @@ -40,7 +40,7 @@ export function doSearch(rawQuery) { const actions = []; data.forEach(result => { - const uri = Lbryuri.build({ + const uri = buildURI({ name: result.name, claimId: result.claimId, }); diff --git a/src/redux/selectors/claims.js b/src/redux/selectors/claims.js index 7b778f6..0ea6b4c 100644 --- a/src/redux/selectors/claims.js +++ b/src/redux/selectors/claims.js @@ -1,4 +1,4 @@ -import Lbryuri from 'lbryuri'; +import { normalizeURI } from 'lbryURI'; import { makeSelectCurrentParam } from 'redux/selectors/navigation'; import { createSelector } from 'reselect'; @@ -32,7 +32,7 @@ export const selectAllClaimsByChannel = createSelector( ); export const makeSelectClaimForUri = uri => - createSelector(selectClaimsByUri, claims => claims && claims[Lbryuri.normalize(uri)]); + createSelector(selectClaimsByUri, claims => claims && claims[normalizeURI(uri)]); export const selectMyClaimsRaw = createSelector(selectState, state => state.myClaims); @@ -53,7 +53,7 @@ export const selectMyActiveClaims = createSelector( ); export const makeSelectClaimIsMine = rawUri => { - const uri = Lbryuri.normalize(rawUri); + const uri = normalizeURI(rawUri); return createSelector( selectClaimsByUri, selectMyActiveClaims, diff --git a/src/redux/selectors/navigation.js b/src/redux/selectors/navigation.js index dc0b507..fa9fa3b 100644 --- a/src/redux/selectors/navigation.js +++ b/src/redux/selectors/navigation.js @@ -1,6 +1,6 @@ import { createSelector } from 'reselect'; +import { normalizeURI } from 'lbryURI'; import { parseQueryParams, toQueryString } from 'util/query_params'; -import Lbryuri from 'lbryuri'; export const selectState = state => state.navigation || {}; @@ -93,7 +93,7 @@ export const selectPageTitle = createSelector( case 'developer': return __('Developer'); case 'show': { - const parts = [Lbryuri.normalize(params.uri)]; + const parts = [normalizeURI(params.uri)]; // If the params has any keys other than "uri" if (Object.keys(params).length > 1) { parts.push(toQueryString(Object.assign({}, params, { uri: null }))); -- 2.45.3 From 13d46eeb19cc223aab06674b3706eddb92ef9759 Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Fri, 9 Feb 2018 02:55:08 +0100 Subject: [PATCH 09/41] doNavigate refactor --- build/index.js | 742 +++++++++++++------------------- src/index.js | 12 +- src/redux/actions/navigation.js | 64 --- src/redux/actions/search.js | 7 +- src/redux/actions/wallet.js | 33 +- 5 files changed, 301 insertions(+), 557 deletions(-) delete mode 100644 src/redux/actions/navigation.js diff --git a/build/index.js b/build/index.js index cf644a0..da315fe 100644 --- a/build/index.js +++ b/build/index.js @@ -70,7 +70,7 @@ return /******/ (function(modules) { // webpackBootstrap /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 15); +/******/ return __webpack_require__(__webpack_require__.s = 14); /******/ }) /************************************************************************/ /******/ ([ @@ -255,172 +255,6 @@ var MEDIA_POSITION = exports.MEDIA_POSITION = 'MEDIA_POSITION'; "use strict"; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.selectActiveHistoryEntry = exports.selectHistoryStack = exports.selectHistoryIndex = exports.selectIsForwardDisabled = exports.selectIsBackDisabled = exports.selectPathAfterAuth = exports.selectPageTitle = exports.selectHeaderLinks = exports.makeSelectCurrentParam = exports.selectCurrentParams = exports.selectCurrentPage = exports.computePageFromPath = exports.selectCurrentPath = exports.selectState = undefined; - -var _reselect = __webpack_require__(2); - -var _lbryURI = __webpack_require__(3); - -var _query_params = __webpack_require__(8); - -var selectState = exports.selectState = function selectState(state) { - return state.navigation || {}; -}; - -var selectCurrentPath = exports.selectCurrentPath = (0, _reselect.createSelector)(selectState, function (state) { - return state.currentPath; -}); - -var computePageFromPath = exports.computePageFromPath = function computePageFromPath(path) { - return path.replace(/^\//, '').split('?')[0]; -}; - -var selectCurrentPage = exports.selectCurrentPage = (0, _reselect.createSelector)(selectCurrentPath, function (path) { - return computePageFromPath(path); -}); - -var selectCurrentParams = exports.selectCurrentParams = (0, _reselect.createSelector)(selectCurrentPath, function (path) { - if (path === undefined) return {}; - if (!path.match(/\?/)) return {}; - - return (0, _query_params.parseQueryParams)(path.split('?')[1]); -}); - -var makeSelectCurrentParam = exports.makeSelectCurrentParam = function makeSelectCurrentParam(param) { - return (0, _reselect.createSelector)(selectCurrentParams, function (params) { - return params ? params[param] : undefined; - }); -}; - -var selectHeaderLinks = exports.selectHeaderLinks = (0, _reselect.createSelector)(selectCurrentPage, function (page) { - // This contains intentional fall throughs - switch (page) { - case 'wallet': - case 'history': - case 'send': - case 'getcredits': - case 'invite': - case 'rewards': - case 'backup': - return { - wallet: __('Overview'), - getcredits: __('Get Credits'), - send: __('Send / Receive'), - rewards: __('Rewards'), - invite: __('Invites'), - history: __('History') - }; - case 'downloaded': - case 'published': - return { - downloaded: __('Downloaded'), - published: __('Published') - }; - case 'settings': - case 'help': - return { - settings: __('Settings'), - help: __('Help') - }; - case 'discover': - case 'subscriptions': - return { - discover: __('Discover'), - subscriptions: __('Subscriptions') - }; - default: - return null; - } -}); - -var selectPageTitle = exports.selectPageTitle = (0, _reselect.createSelector)(selectCurrentPage, selectCurrentParams, function (page, params) { - switch (page) { - case 'settings': - return __('Settings'); - case 'report': - return __('Report'); - case 'wallet': - return __('Wallet'); - case 'send': - return __('Send or Receive LBRY Credits'); - case 'getcredits': - return __('Get LBRY Credits'); - case 'backup': - return __('Backup Your Wallet'); - case 'rewards': - return __('Rewards'); - case 'invite': - return __('Invites'); - case 'start': - return __('Start'); - case 'publish': - return params.id ? __('Edit') : __('Publish'); - case 'help': - return __('Help'); - case 'developer': - return __('Developer'); - case 'show': - { - var parts = [(0, _lbryURI.normalizeURI)(params.uri)]; - // If the params has any keys other than "uri" - if (Object.keys(params).length > 1) { - parts.push((0, _query_params.toQueryString)(Object.assign({}, params, { uri: null }))); - } - return parts.join('?'); - } - case 'downloaded': - return __('Downloads & Purchases'); - case 'published': - return __('Publications'); - case 'search': - return params.query ? __('Search results for %s', params.query) : __('Search'); - case 'subscriptions': - return __('Your Subscriptions'); - case 'discover': - case false: - case null: - case '': - return ''; - default: - return page[0].toUpperCase() + (page.length > 0 ? page.substr(1) : ''); - } -}); - -var selectPathAfterAuth = exports.selectPathAfterAuth = (0, _reselect.createSelector)(selectState, function (state) { - return state.pathAfterAuth; -}); - -var selectIsBackDisabled = exports.selectIsBackDisabled = (0, _reselect.createSelector)(selectState, function (state) { - return state.index === 0; -}); - -var selectIsForwardDisabled = exports.selectIsForwardDisabled = (0, _reselect.createSelector)(selectState, function (state) { - return state.index === state.stack.length - 1; -}); - -var selectHistoryIndex = exports.selectHistoryIndex = (0, _reselect.createSelector)(selectState, function (state) { - return state.index; -}); - -var selectHistoryStack = exports.selectHistoryStack = (0, _reselect.createSelector)(selectState, function (state) { - return state.stack; -}); - -// returns current page attributes (scrollY, path) -var selectActiveHistoryEntry = exports.selectActiveHistoryEntry = (0, _reselect.createSelector)(selectState, function (state) { - return state.stack[state.index]; -}); - -/***/ }), -/* 2 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - exports.__esModule = true; exports.defaultMemoize = defaultMemoize; exports.createSelectorCreator = createSelectorCreator; @@ -546,7 +380,7 @@ function createStructuredSelector(selectors) { } /***/ }), -/* 3 */ +/* 2 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -782,7 +616,7 @@ function isURIClaimable(URI) { } /***/ }), -/* 4 */ +/* 3 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -793,11 +627,11 @@ Object.defineProperty(exports, "__esModule", { }); exports.makeSelectIsUriResolving = exports.selectResolvingUris = exports.selectMyChannelClaims = exports.selectFetchingMyChannels = exports.selectMyClaimsOutpoints = exports.selectAllMyClaimsByOutpoint = exports.selectMyClaimsWithoutChannels = exports.selectMyClaims = exports.selectPendingClaims = exports.selectIsFetchingClaimListMine = exports.makeSelectContentTypeForUri = exports.makeSelectTitleForUri = exports.makeSelectMetadataForUri = exports.makeSelectClaimsInChannelForCurrentPage = exports.makeSelectFetchingChannelClaims = exports.selectAllFetchingChannelClaims = exports.makeSelectClaimIsMine = exports.selectMyActiveClaims = exports.selectAbandoningIds = exports.selectMyClaimsRaw = exports.makeSelectClaimForUri = exports.selectAllClaimsByChannel = exports.selectClaimsByUri = exports.selectClaimsById = undefined; -var _lbryURI = __webpack_require__(3); +var _lbryURI = __webpack_require__(2); -var _navigation = __webpack_require__(1); +var _navigation = __webpack_require__(4); -var _reselect = __webpack_require__(2); +var _reselect = __webpack_require__(1); function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } @@ -978,6 +812,172 @@ var makeSelectIsUriResolving = exports.makeSelectIsUriResolving = function makeS }); }; +/***/ }), +/* 4 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.selectActiveHistoryEntry = exports.selectHistoryStack = exports.selectHistoryIndex = exports.selectIsForwardDisabled = exports.selectIsBackDisabled = exports.selectPathAfterAuth = exports.selectPageTitle = exports.selectHeaderLinks = exports.makeSelectCurrentParam = exports.selectCurrentParams = exports.selectCurrentPage = exports.computePageFromPath = exports.selectCurrentPath = exports.selectState = undefined; + +var _reselect = __webpack_require__(1); + +var _lbryURI = __webpack_require__(2); + +var _query_params = __webpack_require__(9); + +var selectState = exports.selectState = function selectState(state) { + return state.navigation || {}; +}; + +var selectCurrentPath = exports.selectCurrentPath = (0, _reselect.createSelector)(selectState, function (state) { + return state.currentPath; +}); + +var computePageFromPath = exports.computePageFromPath = function computePageFromPath(path) { + return path.replace(/^\//, '').split('?')[0]; +}; + +var selectCurrentPage = exports.selectCurrentPage = (0, _reselect.createSelector)(selectCurrentPath, function (path) { + return computePageFromPath(path); +}); + +var selectCurrentParams = exports.selectCurrentParams = (0, _reselect.createSelector)(selectCurrentPath, function (path) { + if (path === undefined) return {}; + if (!path.match(/\?/)) return {}; + + return (0, _query_params.parseQueryParams)(path.split('?')[1]); +}); + +var makeSelectCurrentParam = exports.makeSelectCurrentParam = function makeSelectCurrentParam(param) { + return (0, _reselect.createSelector)(selectCurrentParams, function (params) { + return params ? params[param] : undefined; + }); +}; + +var selectHeaderLinks = exports.selectHeaderLinks = (0, _reselect.createSelector)(selectCurrentPage, function (page) { + // This contains intentional fall throughs + switch (page) { + case 'wallet': + case 'history': + case 'send': + case 'getcredits': + case 'invite': + case 'rewards': + case 'backup': + return { + wallet: __('Overview'), + getcredits: __('Get Credits'), + send: __('Send / Receive'), + rewards: __('Rewards'), + invite: __('Invites'), + history: __('History') + }; + case 'downloaded': + case 'published': + return { + downloaded: __('Downloaded'), + published: __('Published') + }; + case 'settings': + case 'help': + return { + settings: __('Settings'), + help: __('Help') + }; + case 'discover': + case 'subscriptions': + return { + discover: __('Discover'), + subscriptions: __('Subscriptions') + }; + default: + return null; + } +}); + +var selectPageTitle = exports.selectPageTitle = (0, _reselect.createSelector)(selectCurrentPage, selectCurrentParams, function (page, params) { + switch (page) { + case 'settings': + return __('Settings'); + case 'report': + return __('Report'); + case 'wallet': + return __('Wallet'); + case 'send': + return __('Send or Receive LBRY Credits'); + case 'getcredits': + return __('Get LBRY Credits'); + case 'backup': + return __('Backup Your Wallet'); + case 'rewards': + return __('Rewards'); + case 'invite': + return __('Invites'); + case 'start': + return __('Start'); + case 'publish': + return params.id ? __('Edit') : __('Publish'); + case 'help': + return __('Help'); + case 'developer': + return __('Developer'); + case 'show': + { + var parts = [(0, _lbryURI.normalizeURI)(params.uri)]; + // If the params has any keys other than "uri" + if (Object.keys(params).length > 1) { + parts.push((0, _query_params.toQueryString)(Object.assign({}, params, { uri: null }))); + } + return parts.join('?'); + } + case 'downloaded': + return __('Downloads & Purchases'); + case 'published': + return __('Publications'); + case 'search': + return params.query ? __('Search results for %s', params.query) : __('Search'); + case 'subscriptions': + return __('Your Subscriptions'); + case 'discover': + case false: + case null: + case '': + return ''; + default: + return page[0].toUpperCase() + (page.length > 0 ? page.substr(1) : ''); + } +}); + +var selectPathAfterAuth = exports.selectPathAfterAuth = (0, _reselect.createSelector)(selectState, function (state) { + return state.pathAfterAuth; +}); + +var selectIsBackDisabled = exports.selectIsBackDisabled = (0, _reselect.createSelector)(selectState, function (state) { + return state.index === 0; +}); + +var selectIsForwardDisabled = exports.selectIsForwardDisabled = (0, _reselect.createSelector)(selectState, function (state) { + return state.index === state.stack.length - 1; +}); + +var selectHistoryIndex = exports.selectHistoryIndex = (0, _reselect.createSelector)(selectState, function (state) { + return state.index; +}); + +var selectHistoryStack = exports.selectHistoryStack = (0, _reselect.createSelector)(selectState, function (state) { + return state.stack; +}); + +// returns current page attributes (scrollY, path) +var selectActiveHistoryEntry = exports.selectActiveHistoryEntry = (0, _reselect.createSelector)(selectState, function (state) { + return state.stack[state.index]; +}); + /***/ }), /* 5 */ /***/ (function(module, exports, __webpack_require__) { @@ -989,7 +989,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); -var _jsonrpc = __webpack_require__(16); +var _jsonrpc = __webpack_require__(15); var _jsonrpc2 = _interopRequireDefault(_jsonrpc); @@ -1357,7 +1357,7 @@ var _action_types = __webpack_require__(0); var ACTIONS = _interopRequireWildcard(_action_types); -var _modal_types = __webpack_require__(10); +var _modal_types = __webpack_require__(8); var MODALS = _interopRequireWildcard(_modal_types); @@ -1365,11 +1365,11 @@ var _lbry = __webpack_require__(5); var _lbry2 = _interopRequireDefault(_lbry); -var _lbryURI = __webpack_require__(3); +var _lbryURI = __webpack_require__(2); var _app = __webpack_require__(6); -var _claims = __webpack_require__(4); +var _claims = __webpack_require__(3); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -1496,6 +1496,32 @@ function doAbandonClaim(txid, nout) { "use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +var CONFIRM_FILE_REMOVE = exports.CONFIRM_FILE_REMOVE = 'confirmFileRemove'; +var INCOMPATIBLE_DAEMON = exports.INCOMPATIBLE_DAEMON = 'incompatibleDaemon'; +var FILE_TIMEOUT = exports.FILE_TIMEOUT = 'file_timeout'; +var DOWNLOADING = exports.DOWNLOADING = 'downloading'; +var ERROR = exports.ERROR = 'error'; +var INSUFFICIENT_CREDITS = exports.INSUFFICIENT_CREDITS = 'insufficient_credits'; +var UPGRADE = exports.UPGRADE = 'upgrade'; +var WELCOME = exports.WELCOME = 'welcome'; +var EMAIL_COLLECTION = exports.EMAIL_COLLECTION = 'email_collection'; +var FIRST_REWARD = exports.FIRST_REWARD = 'first_reward'; +var AUTHENTICATION_FAILURE = exports.AUTHENTICATION_FAILURE = 'auth_failure'; +var TRANSACTION_FAILED = exports.TRANSACTION_FAILED = 'transaction_failed'; +var REWARD_APPROVAL_REQUIRED = exports.REWARD_APPROVAL_REQUIRED = 'reward_approval_required'; +var AFFIRM_PURCHASE = exports.AFFIRM_PURCHASE = 'affirm_purchase'; +var CONFIRM_CLAIM_REVOKE = exports.CONFIRM_CLAIM_REVOKE = 'confirmClaimRevoke'; + +/***/ }), +/* 9 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + Object.defineProperty(exports, "__esModule", { value: true }); @@ -1534,135 +1560,10 @@ function toQueryString(params) { return parts.join('&'); } -/***/ }), -/* 9 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.doNavigate = doNavigate; -exports.doAuthNavigate = doAuthNavigate; -exports.doHistoryTraverse = doHistoryTraverse; -exports.doHistoryBack = doHistoryBack; -exports.doHistoryForward = doHistoryForward; -exports.doRecordScroll = doRecordScroll; - -var _action_types = __webpack_require__(0); - -var ACTIONS = _interopRequireWildcard(_action_types); - -var _navigation = __webpack_require__(1); - -var _query_params = __webpack_require__(8); - -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - -function doNavigate(path) { - var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; - - return function (dispatch) { - if (!path) { - return; - } - - var url = path; - if (params && Object.values(params).length) { - url += '?' + (0, _query_params.toQueryString)(params); - } - - var scrollY = options.scrollY; - - - dispatch({ - type: ACTIONS.HISTORY_NAVIGATE, - data: { url: url, index: options.index, scrollY: scrollY } - }); - }; -} - -function doAuthNavigate() { - var pathAfterAuth = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; - var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - - return function (dispatch) { - if (pathAfterAuth) { - dispatch({ - type: ACTIONS.CHANGE_AFTER_AUTH_PATH, - data: { - path: pathAfterAuth + '?' + (0, _query_params.toQueryString)(params) - } - }); - } - dispatch(doNavigate('/auth')); - }; -} - -function doHistoryTraverse(dispatch, state, modifier) { - var stack = (0, _navigation.selectHistoryStack)(state); - var index = (0, _navigation.selectHistoryIndex)(state) + modifier; - - if (index >= 0 && index < stack.length) { - var historyItem = stack[index]; - dispatch(doNavigate(historyItem.path, {}, { scrollY: historyItem.scrollY, index: index })); - } -} - -function doHistoryBack() { - return function (dispatch, getState) { - return doHistoryTraverse(dispatch, getState(), -1); - }; -} - -function doHistoryForward() { - return function (dispatch, getState) { - return doHistoryTraverse(dispatch, getState(), 1); - }; -} - -function doRecordScroll(scroll) { - return function (dispatch) { - dispatch({ - type: ACTIONS.WINDOW_SCROLLED, - data: { scrollY: scroll } - }); - }; -} - /***/ }), /* 10 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -var CONFIRM_FILE_REMOVE = exports.CONFIRM_FILE_REMOVE = 'confirmFileRemove'; -var INCOMPATIBLE_DAEMON = exports.INCOMPATIBLE_DAEMON = 'incompatibleDaemon'; -var FILE_TIMEOUT = exports.FILE_TIMEOUT = 'file_timeout'; -var DOWNLOADING = exports.DOWNLOADING = 'downloading'; -var ERROR = exports.ERROR = 'error'; -var INSUFFICIENT_CREDITS = exports.INSUFFICIENT_CREDITS = 'insufficient_credits'; -var UPGRADE = exports.UPGRADE = 'upgrade'; -var WELCOME = exports.WELCOME = 'welcome'; -var EMAIL_COLLECTION = exports.EMAIL_COLLECTION = 'email_collection'; -var FIRST_REWARD = exports.FIRST_REWARD = 'first_reward'; -var AUTHENTICATION_FAILURE = exports.AUTHENTICATION_FAILURE = 'auth_failure'; -var TRANSACTION_FAILED = exports.TRANSACTION_FAILED = 'transaction_failed'; -var REWARD_APPROVAL_REQUIRED = exports.REWARD_APPROVAL_REQUIRED = 'reward_approval_required'; -var AFFIRM_PURCHASE = exports.AFFIRM_PURCHASE = 'affirm_purchase'; -var CONFIRM_CLAIM_REVOKE = exports.CONFIRM_CLAIM_REVOKE = 'confirmClaimRevoke'; - -/***/ }), -/* 11 */ -/***/ (function(module, exports, __webpack_require__) { - "use strict"; /* WEBPACK VAR INJECTION */(function(process) { @@ -1672,7 +1573,7 @@ Object.defineProperty(exports, "__esModule", { var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; -var _querystring = __webpack_require__(19); +var _querystring = __webpack_require__(18); var _querystring2 = _interopRequireDefault(_querystring); @@ -1763,10 +1664,10 @@ Lbryapi.call = function (resource, action) { }; exports.default = Lbryapi; -/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(18))) +/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(17))) /***/ }), -/* 12 */ +/* 11 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1777,9 +1678,9 @@ Object.defineProperty(exports, "__esModule", { }); exports.selectTotalDownloadProgress = exports.selectDownloadingFileInfos = exports.selectFileInfosDownloaded = exports.makeSelectLoadingForUri = exports.selectUrisLoading = exports.makeSelectDownloadingForUri = exports.selectDownloadingByOutpoint = exports.makeSelectFileInfoForUri = exports.selectIsFetchingFileListDownloadedOrPublished = exports.selectIsFetchingFileList = exports.selectFileInfosByOutpoint = exports.selectState = undefined; -var _claims = __webpack_require__(4); +var _claims = __webpack_require__(3); -var _reselect = __webpack_require__(2); +var _reselect = __webpack_require__(1); var selectState = exports.selectState = function selectState(state) { return state.fileInfo || {}; @@ -1875,7 +1776,7 @@ var selectTotalDownloadProgress = exports.selectTotalDownloadProgress = (0, _res }); /***/ }), -/* 13 */ +/* 12 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1898,7 +1799,7 @@ function batchActions() { } /***/ }), -/* 14 */ +/* 13 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1909,7 +1810,7 @@ Object.defineProperty(exports, "__esModule", { }); exports.makeSelectBlockDate = exports.selectBlocks = exports.selectDraftTransactionError = exports.selectDraftTransactionAddress = exports.selectDraftTransactionAmount = exports.selectDraftTransaction = exports.selectGettingNewAddress = exports.selectReceiveAddress = exports.selectIsSendingSupport = exports.selectIsFetchingTransactions = exports.selectHasTransactions = exports.selectRecentTransactions = exports.selectTransactionItems = exports.selectTransactionsById = exports.selectBalance = exports.selectState = undefined; -var _reselect = __webpack_require__(2); +var _reselect = __webpack_require__(1); function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } @@ -2034,7 +1935,7 @@ var makeSelectBlockDate = exports.makeSelectBlockDate = function makeSelectBlock }; /***/ }), -/* 15 */ +/* 14 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2043,10 +1944,10 @@ var makeSelectBlockDate = exports.makeSelectBlockDate = function makeSelectBlock Object.defineProperty(exports, "__esModule", { value: true }); -exports.selectBlocks = exports.selectDraftTransactionError = exports.selectDraftTransactionAddress = exports.selectDraftTransactionAmount = exports.selectDraftTransaction = exports.selectGettingNewAddress = exports.selectReceiveAddress = exports.selectIsSendingSupport = exports.selectIsFetchingTransactions = exports.selectHasTransactions = exports.selectRecentTransactions = exports.selectTransactionItems = exports.selectTransactionsById = exports.selectBalance = exports.makeSelectBlockDate = exports.selectWunderBarIcon = exports.selectWunderBarAddress = exports.selectSearchUrisByQuery = exports.selectIsSearching = undefined; -exports.selectSearchQuery = exports.makeSelectSearchUris = exports.selectActiveHistoryEntry = exports.selectHistoryStack = exports.selectHistoryIndex = exports.selectIsForwardDisabled = exports.selectIsBackDisabled = exports.selectPathAfterAuth = exports.selectPageTitle = exports.selectHeaderLinks = exports.selectCurrentParams = exports.selectCurrentPage = exports.selectCurrentPath = exports.makeSelectCurrentParam = exports.computePageFromPath = exports.selectTotalDownloadProgress = exports.selectDownloadingFileInfos = exports.selectFileInfosDownloaded = exports.selectUrisLoading = exports.selectDownloadingByOutpoint = exports.selectIsFetchingFileListDownloadedOrPublished = exports.selectIsFetchingFileList = exports.selectFileInfosByOutpoint = exports.makeSelectLoadingForUri = exports.makeSelectDownloadingForUri = exports.makeSelectFileInfoForUri = exports.selectFetchingCostInfo = exports.selectCostForCurrentPageUri = exports.selectAllCostInfoByUri = exports.makeSelectCostInfoForUri = exports.makeSelectFetchingCostInfoForUri = exports.selectResolvingUris = exports.selectMyChannelClaims = exports.selectFetchingMyChannels = exports.selectMyClaimsOutpoints = exports.selectAllMyClaimsByOutpoint = exports.selectMyClaimsWithoutChannels = exports.selectMyClaims = exports.selectPendingClaims = exports.selectIsFetchingClaimListMine = exports.selectAllFetchingChannelClaims = exports.selectMyActiveClaims = exports.selectAbandoningIds = exports.selectMyClaimsRaw = exports.selectAllClaimsByChannel = exports.selectClaimsByUri = exports.selectClaimsById = exports.makeSelectIsUriResolving = exports.makeSelectContentTypeForUri = exports.makeSelectTitleForUri = exports.makeSelectMetadataForUri = exports.makeSelectClaimsInChannelForCurrentPage = exports.makeSelectFetchingChannelClaims = exports.makeSelectClaimIsMine = exports.makeSelectClaimForUri = exports.walletReducer = exports.searchReducer = exports.fileInfoReducer = exports.costInfoReducer = exports.claimsReducer = exports.toQueryString = exports.parseQueryParams = exports.batchActions = exports.doSendSupport = exports.doSetDraftTransactionAddress = exports.doSetDraftTransactionAmount = exports.doSendDraftTransaction = exports.doCheckAddressIsMine = exports.doGetNewAddress = exports.doFetchBlock = exports.doFetchTransactions = exports.doBalanceSubscribe = exports.doUpdateBalance = exports.doSearch = exports.doRecordScroll = exports.doHistoryForward = exports.doHistoryBack = exports.doHistoryTraverse = exports.doAuthNavigate = exports.doNavigate = exports.doFetchFileInfosAndPublishedClaims = exports.doFileList = exports.doFetchFileInfo = exports.doFetchCostInfoForUri = exports.doResolveUri = exports.doResolveUris = exports.doAbandonClaim = exports.doFetchClaimListMine = exports.doShowSnackBar = exports.doCloseModal = exports.doOpenModal = exports.isURIClaimable = exports.isURIValid = exports.normalizeURI = exports.buildURI = exports.parseURI = exports.regexAddress = exports.regexInvalidURI = exports.Lbryapi = exports.Lbry = undefined; +exports.selectBlocks = exports.selectDraftTransactionError = exports.selectDraftTransactionAddress = exports.selectDraftTransactionAmount = exports.selectDraftTransaction = exports.selectGettingNewAddress = exports.selectReceiveAddress = exports.selectIsSendingSupport = exports.selectIsFetchingTransactions = exports.selectHasTransactions = exports.selectRecentTransactions = exports.selectTransactionItems = exports.selectTransactionsById = exports.selectBalance = undefined; +exports.makeSelectBlockDate = exports.selectWunderBarIcon = exports.selectWunderBarAddress = exports.selectSearchUrisByQuery = exports.selectIsSearching = exports.selectSearchQuery = exports.makeSelectSearchUris = exports.selectActiveHistoryEntry = exports.selectHistoryStack = exports.selectHistoryIndex = exports.selectIsForwardDisabled = exports.selectIsBackDisabled = exports.selectPathAfterAuth = exports.selectPageTitle = exports.selectHeaderLinks = exports.selectCurrentParams = exports.selectCurrentPage = exports.selectCurrentPath = exports.makeSelectCurrentParam = exports.computePageFromPath = exports.selectTotalDownloadProgress = exports.selectDownloadingFileInfos = exports.selectFileInfosDownloaded = exports.selectUrisLoading = exports.selectDownloadingByOutpoint = exports.selectIsFetchingFileListDownloadedOrPublished = exports.selectIsFetchingFileList = exports.selectFileInfosByOutpoint = exports.makeSelectLoadingForUri = exports.makeSelectDownloadingForUri = exports.makeSelectFileInfoForUri = exports.selectFetchingCostInfo = exports.selectCostForCurrentPageUri = exports.selectAllCostInfoByUri = exports.makeSelectCostInfoForUri = exports.makeSelectFetchingCostInfoForUri = exports.selectResolvingUris = exports.selectMyChannelClaims = exports.selectFetchingMyChannels = exports.selectMyClaimsOutpoints = exports.selectAllMyClaimsByOutpoint = exports.selectMyClaimsWithoutChannels = exports.selectMyClaims = exports.selectPendingClaims = exports.selectIsFetchingClaimListMine = exports.selectAllFetchingChannelClaims = exports.selectMyActiveClaims = exports.selectAbandoningIds = exports.selectMyClaimsRaw = exports.selectAllClaimsByChannel = exports.selectClaimsByUri = exports.selectClaimsById = exports.makeSelectIsUriResolving = exports.makeSelectContentTypeForUri = exports.makeSelectTitleForUri = exports.makeSelectMetadataForUri = exports.makeSelectClaimsInChannelForCurrentPage = exports.makeSelectFetchingChannelClaims = exports.makeSelectClaimIsMine = exports.makeSelectClaimForUri = exports.walletReducer = exports.searchReducer = exports.fileInfoReducer = exports.costInfoReducer = exports.claimsReducer = exports.toQueryString = exports.parseQueryParams = exports.batchActions = exports.doSendSupport = exports.doSetDraftTransactionAddress = exports.doSetDraftTransactionAmount = exports.doSendDraftTransaction = exports.doCheckAddressIsMine = exports.doGetNewAddress = exports.doFetchBlock = exports.doFetchTransactions = exports.doBalanceSubscribe = exports.doUpdateBalance = exports.doSearch = exports.doFetchFileInfosAndPublishedClaims = exports.doFileList = exports.doFetchFileInfo = exports.doFetchCostInfoForUri = exports.doResolveUri = exports.doResolveUris = exports.doAbandonClaim = exports.doFetchClaimListMine = exports.doShowSnackBar = exports.doCloseModal = exports.doOpenModal = exports.isURIClaimable = exports.isURIValid = exports.normalizeURI = exports.buildURI = exports.parseURI = exports.regexAddress = exports.regexInvalidURI = exports.Lbryapi = exports.Lbry = exports.ACTIONS = undefined; -var _lbryURI = __webpack_require__(3); +var _lbryURI = __webpack_require__(2); Object.defineProperty(exports, 'regexInvalidURI', { enumerable: true, @@ -2139,7 +2040,7 @@ Object.defineProperty(exports, 'doResolveUri', { } }); -var _cost_info = __webpack_require__(17); +var _cost_info = __webpack_require__(16); Object.defineProperty(exports, 'doFetchCostInfoForUri', { enumerable: true, @@ -2148,7 +2049,7 @@ Object.defineProperty(exports, 'doFetchCostInfoForUri', { } }); -var _file_info = __webpack_require__(22); +var _file_info = __webpack_require__(21); Object.defineProperty(exports, 'doFetchFileInfo', { enumerable: true, @@ -2169,46 +2070,7 @@ Object.defineProperty(exports, 'doFetchFileInfosAndPublishedClaims', { } }); -var _navigation = __webpack_require__(9); - -Object.defineProperty(exports, 'doNavigate', { - enumerable: true, - get: function get() { - return _navigation.doNavigate; - } -}); -Object.defineProperty(exports, 'doAuthNavigate', { - enumerable: true, - get: function get() { - return _navigation.doAuthNavigate; - } -}); -Object.defineProperty(exports, 'doHistoryTraverse', { - enumerable: true, - get: function get() { - return _navigation.doHistoryTraverse; - } -}); -Object.defineProperty(exports, 'doHistoryBack', { - enumerable: true, - get: function get() { - return _navigation.doHistoryBack; - } -}); -Object.defineProperty(exports, 'doHistoryForward', { - enumerable: true, - get: function get() { - return _navigation.doHistoryForward; - } -}); -Object.defineProperty(exports, 'doRecordScroll', { - enumerable: true, - get: function get() { - return _navigation.doRecordScroll; - } -}); - -var _search = __webpack_require__(23); +var _search = __webpack_require__(22); Object.defineProperty(exports, 'doSearch', { enumerable: true, @@ -2217,7 +2079,7 @@ Object.defineProperty(exports, 'doSearch', { } }); -var _wallet = __webpack_require__(24); +var _wallet = __webpack_require__(23); Object.defineProperty(exports, 'doUpdateBalance', { enumerable: true, @@ -2280,7 +2142,7 @@ Object.defineProperty(exports, 'doSendSupport', { } }); -var _batchActions = __webpack_require__(13); +var _batchActions = __webpack_require__(12); Object.defineProperty(exports, 'batchActions', { enumerable: true, @@ -2289,7 +2151,7 @@ Object.defineProperty(exports, 'batchActions', { } }); -var _query_params = __webpack_require__(8); +var _query_params = __webpack_require__(9); Object.defineProperty(exports, 'parseQueryParams', { enumerable: true, @@ -2304,7 +2166,7 @@ Object.defineProperty(exports, 'toQueryString', { } }); -var _claims2 = __webpack_require__(25); +var _claims2 = __webpack_require__(24); Object.defineProperty(exports, 'claimsReducer', { enumerable: true, @@ -2313,7 +2175,7 @@ Object.defineProperty(exports, 'claimsReducer', { } }); -var _cost_info2 = __webpack_require__(26); +var _cost_info2 = __webpack_require__(25); Object.defineProperty(exports, 'costInfoReducer', { enumerable: true, @@ -2322,7 +2184,7 @@ Object.defineProperty(exports, 'costInfoReducer', { } }); -var _file_info2 = __webpack_require__(27); +var _file_info2 = __webpack_require__(26); Object.defineProperty(exports, 'fileInfoReducer', { enumerable: true, @@ -2331,7 +2193,7 @@ Object.defineProperty(exports, 'fileInfoReducer', { } }); -var _search2 = __webpack_require__(28); +var _search2 = __webpack_require__(27); Object.defineProperty(exports, 'searchReducer', { enumerable: true, @@ -2340,7 +2202,7 @@ Object.defineProperty(exports, 'searchReducer', { } }); -var _wallet2 = __webpack_require__(29); +var _wallet2 = __webpack_require__(28); Object.defineProperty(exports, 'walletReducer', { enumerable: true, @@ -2349,7 +2211,7 @@ Object.defineProperty(exports, 'walletReducer', { } }); -var _claims3 = __webpack_require__(4); +var _claims3 = __webpack_require__(3); Object.defineProperty(exports, 'makeSelectClaimForUri', { enumerable: true, @@ -2496,7 +2358,7 @@ Object.defineProperty(exports, 'selectResolvingUris', { } }); -var _cost_info3 = __webpack_require__(30); +var _cost_info3 = __webpack_require__(29); Object.defineProperty(exports, 'makeSelectFetchingCostInfoForUri', { enumerable: true, @@ -2529,7 +2391,7 @@ Object.defineProperty(exports, 'selectFetchingCostInfo', { } }); -var _file_info3 = __webpack_require__(12); +var _file_info3 = __webpack_require__(11); Object.defineProperty(exports, 'makeSelectFileInfoForUri', { enumerable: true, @@ -2598,88 +2460,88 @@ Object.defineProperty(exports, 'selectTotalDownloadProgress', { } }); -var _navigation2 = __webpack_require__(1); +var _navigation = __webpack_require__(4); Object.defineProperty(exports, 'computePageFromPath', { enumerable: true, get: function get() { - return _navigation2.computePageFromPath; + return _navigation.computePageFromPath; } }); Object.defineProperty(exports, 'makeSelectCurrentParam', { enumerable: true, get: function get() { - return _navigation2.makeSelectCurrentParam; + return _navigation.makeSelectCurrentParam; } }); Object.defineProperty(exports, 'selectCurrentPath', { enumerable: true, get: function get() { - return _navigation2.selectCurrentPath; + return _navigation.selectCurrentPath; } }); Object.defineProperty(exports, 'selectCurrentPage', { enumerable: true, get: function get() { - return _navigation2.selectCurrentPage; + return _navigation.selectCurrentPage; } }); Object.defineProperty(exports, 'selectCurrentParams', { enumerable: true, get: function get() { - return _navigation2.selectCurrentParams; + return _navigation.selectCurrentParams; } }); Object.defineProperty(exports, 'selectHeaderLinks', { enumerable: true, get: function get() { - return _navigation2.selectHeaderLinks; + return _navigation.selectHeaderLinks; } }); Object.defineProperty(exports, 'selectPageTitle', { enumerable: true, get: function get() { - return _navigation2.selectPageTitle; + return _navigation.selectPageTitle; } }); Object.defineProperty(exports, 'selectPathAfterAuth', { enumerable: true, get: function get() { - return _navigation2.selectPathAfterAuth; + return _navigation.selectPathAfterAuth; } }); Object.defineProperty(exports, 'selectIsBackDisabled', { enumerable: true, get: function get() { - return _navigation2.selectIsBackDisabled; + return _navigation.selectIsBackDisabled; } }); Object.defineProperty(exports, 'selectIsForwardDisabled', { enumerable: true, get: function get() { - return _navigation2.selectIsForwardDisabled; + return _navigation.selectIsForwardDisabled; } }); Object.defineProperty(exports, 'selectHistoryIndex', { enumerable: true, get: function get() { - return _navigation2.selectHistoryIndex; + return _navigation.selectHistoryIndex; } }); Object.defineProperty(exports, 'selectHistoryStack', { enumerable: true, get: function get() { - return _navigation2.selectHistoryStack; + return _navigation.selectHistoryStack; } }); Object.defineProperty(exports, 'selectActiveHistoryEntry', { enumerable: true, get: function get() { - return _navigation2.selectActiveHistoryEntry; + return _navigation.selectActiveHistoryEntry; } }); -var _search3 = __webpack_require__(31); +var _search3 = __webpack_require__(30); Object.defineProperty(exports, 'makeSelectSearchUris', { enumerable: true, @@ -2718,7 +2580,7 @@ Object.defineProperty(exports, 'selectWunderBarIcon', { } }); -var _wallet3 = __webpack_require__(14); +var _wallet3 = __webpack_require__(13); Object.defineProperty(exports, 'makeSelectBlockDate', { enumerable: true, @@ -2811,22 +2673,32 @@ Object.defineProperty(exports, 'selectBlocks', { } }); +var _action_types = __webpack_require__(0); + +var ACTIONS = _interopRequireWildcard(_action_types); + var _lbry = __webpack_require__(5); var _lbry2 = _interopRequireDefault(_lbry); -var _lbryapi = __webpack_require__(11); +var _lbryapi = __webpack_require__(10); var _lbryapi2 = _interopRequireDefault(_lbryapi); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +exports.ACTIONS = ACTIONS; + // common +// constants + exports.Lbry = _lbry2.default; exports.Lbryapi = _lbryapi2.default; /***/ }), -/* 16 */ +/* 15 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2913,7 +2785,7 @@ jsonrpc.call = function (connectionString, method, params, callback, errorCallba exports.default = jsonrpc; /***/ }), -/* 17 */ +/* 16 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2928,11 +2800,11 @@ var _action_types = __webpack_require__(0); var ACTIONS = _interopRequireWildcard(_action_types); -var _lbryapi = __webpack_require__(11); +var _lbryapi = __webpack_require__(10); var _lbryapi2 = _interopRequireDefault(_lbryapi); -var _claims = __webpack_require__(4); +var _claims = __webpack_require__(3); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -2973,7 +2845,7 @@ function doFetchCostInfoForUri(uri) { } /***/ }), -/* 18 */ +/* 17 */ /***/ (function(module, exports) { // shim for using process in browser @@ -3163,18 +3035,18 @@ process.umask = function() { return 0; }; /***/ }), -/* 19 */ +/* 18 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -exports.decode = exports.parse = __webpack_require__(20); -exports.encode = exports.stringify = __webpack_require__(21); +exports.decode = exports.parse = __webpack_require__(19); +exports.encode = exports.stringify = __webpack_require__(20); /***/ }), -/* 20 */ +/* 19 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3265,7 +3137,7 @@ var isArray = Array.isArray || function (xs) { /***/ }), -/* 21 */ +/* 20 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3357,7 +3229,7 @@ var objectKeys = Object.keys || function (obj) { /***/ }), -/* 22 */ +/* 21 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3380,9 +3252,9 @@ var _lbry2 = _interopRequireDefault(_lbry); var _claims = __webpack_require__(7); -var _claims2 = __webpack_require__(4); +var _claims2 = __webpack_require__(3); -var _file_info = __webpack_require__(12); +var _file_info = __webpack_require__(11); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -3450,7 +3322,7 @@ function doFetchFileInfosAndPublishedClaims() { } /***/ }), -/* 23 */ +/* 22 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3465,15 +3337,13 @@ var _action_types = __webpack_require__(0); var ACTIONS = _interopRequireWildcard(_action_types); -var _lbryURI = __webpack_require__(3); +var _lbryURI = __webpack_require__(2); var _claims = __webpack_require__(7); -var _navigation = __webpack_require__(9); +var _navigation = __webpack_require__(4); -var _navigation2 = __webpack_require__(1); - -var _batchActions = __webpack_require__(13); +var _batchActions = __webpack_require__(12); var _batchActions2 = _interopRequireDefault(_batchActions); @@ -3482,10 +3352,10 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } // eslint-disable-next-line import/prefer-default-export -function doSearch(rawQuery) { +function doSearch(rawQuery, currentPageNotSearchHandler) { return function (dispatch, getState) { var state = getState(); - var page = (0, _navigation2.selectCurrentPage)(state); + var page = (0, _navigation.selectCurrentPage)(state); var query = rawQuery.replace(/^lbry:\/\//i, ''); @@ -3502,7 +3372,9 @@ function doSearch(rawQuery) { }); if (page !== 'search') { - dispatch((0, _navigation.doNavigate)('search', { query: query })); + if (currentPageNotSearchHandler) { + currentPageNotSearchHandler(); + } } else { fetch('https://lighthouse.lbry.io/search?s=' + query).then(function (response) { return response.status === 200 ? Promise.resolve(response.json()) : Promise.reject(new Error(response.statusText)); @@ -3537,7 +3409,7 @@ function doSearch(rawQuery) { } /***/ }), -/* 24 */ +/* 23 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3561,7 +3433,7 @@ var _action_types = __webpack_require__(0); var ACTIONS = _interopRequireWildcard(_action_types); -var _modal_types = __webpack_require__(10); +var _modal_types = __webpack_require__(8); var MODALS = _interopRequireWildcard(_modal_types); @@ -3571,9 +3443,7 @@ var _lbry2 = _interopRequireDefault(_lbry); var _app = __webpack_require__(6); -var _navigation = __webpack_require__(9); - -var _wallet = __webpack_require__(14); +var _wallet = __webpack_require__(13); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -3725,7 +3595,7 @@ function doSetDraftTransactionAddress(address) { }; } -function doSendSupport(amount, claimId, uri) { +function doSendSupport(amount, claimId, uri, successCallback, errorCallback) { return function (dispatch, getState) { var state = getState(); var balance = (0, _wallet.selectBalance)(state); @@ -3739,34 +3609,6 @@ function doSendSupport(amount, claimId, uri) { type: ACTIONS.SUPPORT_TRANSACTION_STARTED }); - var successCallback = function successCallback(results) { - if (results.txid) { - dispatch({ - type: ACTIONS.SUPPORT_TRANSACTION_COMPLETED - }); - dispatch((0, _app.doShowSnackBar)({ - message: __('You sent ' + amount + ' LBC as support, Mahalo!'), - linkText: __('History'), - linkTarget: __('/wallet') - })); - dispatch((0, _navigation.doNavigate)('/show', { uri: uri })); - } else { - dispatch({ - type: ACTIONS.SUPPORT_TRANSACTION_FAILED, - data: { error: results.code } - }); - dispatch((0, _app.doOpenModal)(MODALS.TRANSACTION_FAILED)); - } - }; - - var errorCallback = function errorCallback(error) { - dispatch({ - type: ACTIONS.SUPPORT_TRANSACTION_FAILED, - data: { error: error.code } - }); - dispatch((0, _app.doOpenModal)(MODALS.TRANSACTION_FAILED)); - }; - _lbry2.default.wallet_send({ claim_id: claimId, amount: amount @@ -3775,7 +3617,7 @@ function doSendSupport(amount, claimId, uri) { } /***/ }), -/* 25 */ +/* 24 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4003,7 +3845,7 @@ function claimsReducer() { } /***/ }), -/* 26 */ +/* 25 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4061,7 +3903,7 @@ function costInfoReducer() { } /***/ }), -/* 27 */ +/* 26 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4258,7 +4100,7 @@ function fileInfoReducer() { } /***/ }), -/* 28 */ +/* 27 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4317,7 +4159,7 @@ function searchReducer() { } /***/ }), -/* 29 */ +/* 28 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4501,7 +4343,7 @@ function walletReducer() { } /***/ }), -/* 30 */ +/* 29 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4512,9 +4354,9 @@ Object.defineProperty(exports, "__esModule", { }); exports.makeSelectFetchingCostInfoForUri = exports.selectFetchingCostInfo = exports.selectCostForCurrentPageUri = exports.makeSelectCostInfoForUri = exports.selectAllCostInfoByUri = exports.selectState = undefined; -var _reselect = __webpack_require__(2); +var _reselect = __webpack_require__(1); -var _navigation = __webpack_require__(1); +var _navigation = __webpack_require__(4); var selectState = exports.selectState = function selectState(state) { return state.costInfo || {}; @@ -4545,7 +4387,7 @@ var makeSelectFetchingCostInfoForUri = exports.makeSelectFetchingCostInfoForUri }; /***/ }), -/* 31 */ +/* 30 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4556,9 +4398,9 @@ Object.defineProperty(exports, "__esModule", { }); exports.selectWunderBarIcon = exports.selectWunderBarAddress = exports.makeSelectSearchUris = exports.selectSearchUrisByQuery = exports.selectIsSearching = exports.selectSearchQuery = exports.selectState = undefined; -var _navigation = __webpack_require__(1); +var _navigation = __webpack_require__(4); -var _reselect = __webpack_require__(2); +var _reselect = __webpack_require__(1); var selectState = exports.selectState = function selectState(state) { return state.search || {}; diff --git a/src/index.js b/src/index.js index 5ada795..6ec047c 100644 --- a/src/index.js +++ b/src/index.js @@ -1,7 +1,11 @@ +// constants +import * as ACTIONS from 'constants/action_types'; + // common import Lbry from 'lbry'; import Lbryapi from 'lbryapi'; +export { ACTIONS }; export { Lbry, Lbryapi }; export { regexInvalidURI, @@ -27,14 +31,6 @@ export { doFileList, doFetchFileInfosAndPublishedClaims, } from 'redux/actions/file_info'; -export { - doNavigate, - doAuthNavigate, - doHistoryTraverse, - doHistoryBack, - doHistoryForward, - doRecordScroll, -} from 'redux/actions/navigation'; export { doSearch } from 'redux/actions/search'; export { doUpdateBalance, diff --git a/src/redux/actions/navigation.js b/src/redux/actions/navigation.js deleted file mode 100644 index 78e8743..0000000 --- a/src/redux/actions/navigation.js +++ /dev/null @@ -1,64 +0,0 @@ -import * as ACTIONS from 'constants/action_types'; -import { selectHistoryIndex, selectHistoryStack } from 'redux/selectors/navigation'; -import { toQueryString } from 'util/query_params'; - -export function doNavigate(path, params = {}, options = {}) { - return dispatch => { - if (!path) { - return; - } - - let url = path; - if (params && Object.values(params).length) { - url += `?${toQueryString(params)}`; - } - - const { scrollY } = options; - - dispatch({ - type: ACTIONS.HISTORY_NAVIGATE, - data: { url, index: options.index, scrollY }, - }); - }; -} - -export function doAuthNavigate(pathAfterAuth = null, params = {}) { - return dispatch => { - if (pathAfterAuth) { - dispatch({ - type: ACTIONS.CHANGE_AFTER_AUTH_PATH, - data: { - path: `${pathAfterAuth}?${toQueryString(params)}`, - }, - }); - } - dispatch(doNavigate('/auth')); - }; -} - -export function doHistoryTraverse(dispatch, state, modifier) { - const stack = selectHistoryStack(state); - const index = selectHistoryIndex(state) + modifier; - - if (index >= 0 && index < stack.length) { - const historyItem = stack[index]; - dispatch(doNavigate(historyItem.path, {}, { scrollY: historyItem.scrollY, index })); - } -} - -export function doHistoryBack() { - return (dispatch, getState) => doHistoryTraverse(dispatch, getState(), -1); -} - -export function doHistoryForward() { - return (dispatch, getState) => doHistoryTraverse(dispatch, getState(), 1); -} - -export function doRecordScroll(scroll) { - return dispatch => { - dispatch({ - type: ACTIONS.WINDOW_SCROLLED, - data: { scrollY: scroll }, - }); - }; -} diff --git a/src/redux/actions/search.js b/src/redux/actions/search.js index 8ada6e4..9caa5a2 100644 --- a/src/redux/actions/search.js +++ b/src/redux/actions/search.js @@ -1,12 +1,11 @@ import * as ACTIONS from 'constants/action_types'; import { buildURI } from 'lbryURI'; import { doResolveUri } from 'redux/actions/claims'; -import { doNavigate } from 'redux/actions/navigation'; import { selectCurrentPage } from 'redux/selectors/navigation'; import batchActions from 'util/batchActions'; // eslint-disable-next-line import/prefer-default-export -export function doSearch(rawQuery) { +export function doSearch(rawQuery, currentPageNotSearchHandler) { return (dispatch, getState) => { const state = getState(); const page = selectCurrentPage(state); @@ -26,7 +25,9 @@ export function doSearch(rawQuery) { }); if (page !== 'search') { - dispatch(doNavigate('search', { query })); + if (currentPageNotSearchHandler) { + currentPageNotSearchHandler(); + } } else { fetch(`https://lighthouse.lbry.io/search?s=${query}`) .then( diff --git a/src/redux/actions/wallet.js b/src/redux/actions/wallet.js index df2faeb..e1f66d0 100644 --- a/src/redux/actions/wallet.js +++ b/src/redux/actions/wallet.js @@ -2,7 +2,6 @@ import * as ACTIONS from 'constants/action_types'; import * as MODALS from 'constants/modal_types'; import Lbry from 'lbry'; import { doOpenModal, doShowSnackBar } from 'redux/actions/app'; -import { doNavigate } from 'redux/actions/navigation'; import { selectBalance, selectDraftTransaction, @@ -155,7 +154,7 @@ export function doSetDraftTransactionAddress(address) { }; } -export function doSendSupport(amount, claimId, uri) { +export function doSendSupport(amount, claimId, uri, successCallback, errorCallback) { return (dispatch, getState) => { const state = getState(); const balance = selectBalance(state); @@ -169,36 +168,6 @@ export function doSendSupport(amount, claimId, uri) { type: ACTIONS.SUPPORT_TRANSACTION_STARTED, }); - const successCallback = results => { - if (results.txid) { - dispatch({ - type: ACTIONS.SUPPORT_TRANSACTION_COMPLETED, - }); - dispatch( - doShowSnackBar({ - message: __(`You sent ${amount} LBC as support, Mahalo!`), - linkText: __('History'), - linkTarget: __('/wallet'), - }) - ); - dispatch(doNavigate('/show', { uri })); - } else { - dispatch({ - type: ACTIONS.SUPPORT_TRANSACTION_FAILED, - data: { error: results.code }, - }); - dispatch(doOpenModal(MODALS.TRANSACTION_FAILED)); - } - }; - - const errorCallback = error => { - dispatch({ - type: ACTIONS.SUPPORT_TRANSACTION_FAILED, - data: { error: error.code }, - }); - dispatch(doOpenModal(MODALS.TRANSACTION_FAILED)); - }; - Lbry.wallet_send({ claim_id: claimId, amount, -- 2.45.3 From 3bc432b7d3f3800d97be7c1bbb1cb3f289bc37a3 Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Sun, 11 Feb 2018 20:28:38 +0100 Subject: [PATCH 10/41] doNotify implementation --- build/index.js | 273 +++++++++++++++++++++------ src/constants/action_types.js | 4 + src/index.js | 19 +- src/redux/actions/notifications.js | 10 + src/redux/reducers/notifications.js | 39 ++++ src/redux/selectors/notifications.js | 8 + src/types/Notification.js | 12 ++ 7 files changed, 308 insertions(+), 57 deletions(-) create mode 100644 src/redux/actions/notifications.js create mode 100644 src/redux/reducers/notifications.js create mode 100644 src/redux/selectors/notifications.js create mode 100644 src/types/Notification.js diff --git a/build/index.js b/build/index.js index da315fe..56b81f5 100644 --- a/build/index.js +++ b/build/index.js @@ -70,7 +70,7 @@ return /******/ (function(modules) { // webpackBootstrap /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 14); +/******/ return __webpack_require__(__webpack_require__.s = 15); /******/ }) /************************************************************************/ /******/ ([ @@ -248,6 +248,10 @@ var MEDIA_PLAY = exports.MEDIA_PLAY = 'MEDIA_PLAY'; var MEDIA_PAUSE = exports.MEDIA_PAUSE = 'MEDIA_PAUSE'; var MEDIA_POSITION = exports.MEDIA_POSITION = 'MEDIA_POSITION'; +// Notifications +var NOTIFICATION_CREATED = exports.NOTIFICATION_CREATED = 'NOTIFICATION_CREATED'; +var NOTIFICATION_DISPLAYED = exports.NOTIFICATION_DISPLAYED = 'NOTIFICATION_DISPLAYED'; + /***/ }), /* 1 */ /***/ (function(module, exports, __webpack_require__) { @@ -828,7 +832,7 @@ var _reselect = __webpack_require__(1); var _lbryURI = __webpack_require__(2); -var _query_params = __webpack_require__(9); +var _query_params = __webpack_require__(10); var selectState = exports.selectState = function selectState(state) { return state.navigation || {}; @@ -989,7 +993,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); -var _jsonrpc = __webpack_require__(15); +var _jsonrpc = __webpack_require__(17); var _jsonrpc2 = _interopRequireDefault(_jsonrpc); @@ -1357,7 +1361,7 @@ var _action_types = __webpack_require__(0); var ACTIONS = _interopRequireWildcard(_action_types); -var _modal_types = __webpack_require__(8); +var _modal_types = __webpack_require__(9); var MODALS = _interopRequireWildcard(_modal_types); @@ -1496,6 +1500,13 @@ function doAbandonClaim(txid, nout) { "use strict"; +/***/ }), +/* 9 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + Object.defineProperty(exports, "__esModule", { value: true }); @@ -1516,7 +1527,7 @@ var AFFIRM_PURCHASE = exports.AFFIRM_PURCHASE = 'affirm_purchase'; var CONFIRM_CLAIM_REVOKE = exports.CONFIRM_CLAIM_REVOKE = 'confirmClaimRevoke'; /***/ }), -/* 9 */ +/* 10 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1561,7 +1572,7 @@ function toQueryString(params) { } /***/ }), -/* 10 */ +/* 11 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1573,7 +1584,7 @@ Object.defineProperty(exports, "__esModule", { var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; -var _querystring = __webpack_require__(18); +var _querystring = __webpack_require__(20); var _querystring2 = _interopRequireDefault(_querystring); @@ -1664,10 +1675,10 @@ Lbryapi.call = function (resource, action) { }; exports.default = Lbryapi; -/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(17))) +/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(19))) /***/ }), -/* 11 */ +/* 12 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1776,7 +1787,7 @@ var selectTotalDownloadProgress = exports.selectTotalDownloadProgress = (0, _res }); /***/ }), -/* 12 */ +/* 13 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1799,7 +1810,7 @@ function batchActions() { } /***/ }), -/* 13 */ +/* 14 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1935,7 +1946,7 @@ var makeSelectBlockDate = exports.makeSelectBlockDate = function makeSelectBlock }; /***/ }), -/* 14 */ +/* 15 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1944,8 +1955,17 @@ var makeSelectBlockDate = exports.makeSelectBlockDate = function makeSelectBlock Object.defineProperty(exports, "__esModule", { value: true }); -exports.selectBlocks = exports.selectDraftTransactionError = exports.selectDraftTransactionAddress = exports.selectDraftTransactionAmount = exports.selectDraftTransaction = exports.selectGettingNewAddress = exports.selectReceiveAddress = exports.selectIsSendingSupport = exports.selectIsFetchingTransactions = exports.selectHasTransactions = exports.selectRecentTransactions = exports.selectTransactionItems = exports.selectTransactionsById = exports.selectBalance = undefined; -exports.makeSelectBlockDate = exports.selectWunderBarIcon = exports.selectWunderBarAddress = exports.selectSearchUrisByQuery = exports.selectIsSearching = exports.selectSearchQuery = exports.makeSelectSearchUris = exports.selectActiveHistoryEntry = exports.selectHistoryStack = exports.selectHistoryIndex = exports.selectIsForwardDisabled = exports.selectIsBackDisabled = exports.selectPathAfterAuth = exports.selectPageTitle = exports.selectHeaderLinks = exports.selectCurrentParams = exports.selectCurrentPage = exports.selectCurrentPath = exports.makeSelectCurrentParam = exports.computePageFromPath = exports.selectTotalDownloadProgress = exports.selectDownloadingFileInfos = exports.selectFileInfosDownloaded = exports.selectUrisLoading = exports.selectDownloadingByOutpoint = exports.selectIsFetchingFileListDownloadedOrPublished = exports.selectIsFetchingFileList = exports.selectFileInfosByOutpoint = exports.makeSelectLoadingForUri = exports.makeSelectDownloadingForUri = exports.makeSelectFileInfoForUri = exports.selectFetchingCostInfo = exports.selectCostForCurrentPageUri = exports.selectAllCostInfoByUri = exports.makeSelectCostInfoForUri = exports.makeSelectFetchingCostInfoForUri = exports.selectResolvingUris = exports.selectMyChannelClaims = exports.selectFetchingMyChannels = exports.selectMyClaimsOutpoints = exports.selectAllMyClaimsByOutpoint = exports.selectMyClaimsWithoutChannels = exports.selectMyClaims = exports.selectPendingClaims = exports.selectIsFetchingClaimListMine = exports.selectAllFetchingChannelClaims = exports.selectMyActiveClaims = exports.selectAbandoningIds = exports.selectMyClaimsRaw = exports.selectAllClaimsByChannel = exports.selectClaimsByUri = exports.selectClaimsById = exports.makeSelectIsUriResolving = exports.makeSelectContentTypeForUri = exports.makeSelectTitleForUri = exports.makeSelectMetadataForUri = exports.makeSelectClaimsInChannelForCurrentPage = exports.makeSelectFetchingChannelClaims = exports.makeSelectClaimIsMine = exports.makeSelectClaimForUri = exports.walletReducer = exports.searchReducer = exports.fileInfoReducer = exports.costInfoReducer = exports.claimsReducer = exports.toQueryString = exports.parseQueryParams = exports.batchActions = exports.doSendSupport = exports.doSetDraftTransactionAddress = exports.doSetDraftTransactionAmount = exports.doSendDraftTransaction = exports.doCheckAddressIsMine = exports.doGetNewAddress = exports.doFetchBlock = exports.doFetchTransactions = exports.doBalanceSubscribe = exports.doUpdateBalance = exports.doSearch = exports.doFetchFileInfosAndPublishedClaims = exports.doFileList = exports.doFetchFileInfo = exports.doFetchCostInfoForUri = exports.doResolveUri = exports.doResolveUris = exports.doAbandonClaim = exports.doFetchClaimListMine = exports.doShowSnackBar = exports.doCloseModal = exports.doOpenModal = exports.isURIClaimable = exports.isURIValid = exports.normalizeURI = exports.buildURI = exports.parseURI = exports.regexAddress = exports.regexInvalidURI = exports.Lbryapi = exports.Lbry = exports.ACTIONS = undefined; +exports.selectBlocks = exports.selectDraftTransactionError = exports.selectDraftTransactionAddress = exports.selectDraftTransactionAmount = exports.selectDraftTransaction = exports.selectGettingNewAddress = exports.selectReceiveAddress = exports.selectIsSendingSupport = exports.selectIsFetchingTransactions = exports.selectHasTransactions = exports.selectRecentTransactions = exports.selectTransactionItems = exports.selectTransactionsById = exports.selectBalance = exports.makeSelectBlockDate = exports.selectWunderBarIcon = exports.selectWunderBarAddress = exports.selectSearchUrisByQuery = undefined; +exports.selectIsSearching = exports.selectSearchQuery = exports.makeSelectSearchUris = exports.selectActiveHistoryEntry = exports.selectHistoryStack = exports.selectHistoryIndex = exports.selectIsForwardDisabled = exports.selectIsBackDisabled = exports.selectPathAfterAuth = exports.selectPageTitle = exports.selectHeaderLinks = exports.selectCurrentParams = exports.selectCurrentPage = exports.selectCurrentPath = exports.makeSelectCurrentParam = exports.computePageFromPath = exports.selectTotalDownloadProgress = exports.selectDownloadingFileInfos = exports.selectFileInfosDownloaded = exports.selectUrisLoading = exports.selectDownloadingByOutpoint = exports.selectIsFetchingFileListDownloadedOrPublished = exports.selectIsFetchingFileList = exports.selectFileInfosByOutpoint = exports.makeSelectLoadingForUri = exports.makeSelectDownloadingForUri = exports.makeSelectFileInfoForUri = exports.selectFetchingCostInfo = exports.selectCostForCurrentPageUri = exports.selectAllCostInfoByUri = exports.makeSelectCostInfoForUri = exports.makeSelectFetchingCostInfoForUri = exports.selectResolvingUris = exports.selectMyChannelClaims = exports.selectFetchingMyChannels = exports.selectMyClaimsOutpoints = exports.selectAllMyClaimsByOutpoint = exports.selectMyClaimsWithoutChannels = exports.selectMyClaims = exports.selectPendingClaims = exports.selectIsFetchingClaimListMine = exports.selectAllFetchingChannelClaims = exports.selectMyActiveClaims = exports.selectAbandoningIds = exports.selectMyClaimsRaw = exports.selectAllClaimsByChannel = exports.selectClaimsByUri = exports.selectClaimsById = exports.makeSelectIsUriResolving = exports.makeSelectContentTypeForUri = exports.makeSelectTitleForUri = exports.makeSelectMetadataForUri = exports.makeSelectClaimsInChannelForCurrentPage = exports.makeSelectFetchingChannelClaims = exports.makeSelectClaimIsMine = exports.makeSelectClaimForUri = exports.selectNotification = exports.walletReducer = exports.searchReducer = exports.notificationsReducer = exports.fileInfoReducer = exports.costInfoReducer = exports.claimsReducer = exports.toQueryString = exports.parseQueryParams = exports.batchActions = exports.doSendSupport = exports.doSetDraftTransactionAddress = exports.doSetDraftTransactionAmount = exports.doSendDraftTransaction = exports.doCheckAddressIsMine = exports.doGetNewAddress = exports.doFetchBlock = exports.doFetchTransactions = exports.doBalanceSubscribe = exports.doUpdateBalance = exports.doSearch = exports.doFetchFileInfosAndPublishedClaims = exports.doFileList = exports.doFetchFileInfo = exports.doFetchCostInfoForUri = exports.doResolveUri = exports.doResolveUris = exports.doAbandonClaim = exports.doFetchClaimListMine = exports.doShowSnackBar = exports.doCloseModal = exports.doOpenModal = exports.doNotify = exports.isURIClaimable = exports.isURIValid = exports.normalizeURI = exports.buildURI = exports.parseURI = exports.regexAddress = exports.regexInvalidURI = exports.Lbryapi = exports.Lbry = exports.ACTIONS = exports.Notification = undefined; + +var _Notification = __webpack_require__(8); + +Object.defineProperty(exports, 'Notification', { + enumerable: true, + get: function get() { + return _Notification.Notification; + } +}); var _lbryURI = __webpack_require__(2); @@ -1992,6 +2012,15 @@ Object.defineProperty(exports, 'isURIClaimable', { } }); +var _notifications = __webpack_require__(16); + +Object.defineProperty(exports, 'doNotify', { + enumerable: true, + get: function get() { + return _notifications.doNotify; + } +}); + var _app = __webpack_require__(6); Object.defineProperty(exports, 'doOpenModal', { @@ -2040,7 +2069,7 @@ Object.defineProperty(exports, 'doResolveUri', { } }); -var _cost_info = __webpack_require__(16); +var _cost_info = __webpack_require__(18); Object.defineProperty(exports, 'doFetchCostInfoForUri', { enumerable: true, @@ -2049,7 +2078,7 @@ Object.defineProperty(exports, 'doFetchCostInfoForUri', { } }); -var _file_info = __webpack_require__(21); +var _file_info = __webpack_require__(23); Object.defineProperty(exports, 'doFetchFileInfo', { enumerable: true, @@ -2070,7 +2099,7 @@ Object.defineProperty(exports, 'doFetchFileInfosAndPublishedClaims', { } }); -var _search = __webpack_require__(22); +var _search = __webpack_require__(24); Object.defineProperty(exports, 'doSearch', { enumerable: true, @@ -2079,7 +2108,7 @@ Object.defineProperty(exports, 'doSearch', { } }); -var _wallet = __webpack_require__(23); +var _wallet = __webpack_require__(25); Object.defineProperty(exports, 'doUpdateBalance', { enumerable: true, @@ -2142,7 +2171,7 @@ Object.defineProperty(exports, 'doSendSupport', { } }); -var _batchActions = __webpack_require__(12); +var _batchActions = __webpack_require__(13); Object.defineProperty(exports, 'batchActions', { enumerable: true, @@ -2151,7 +2180,7 @@ Object.defineProperty(exports, 'batchActions', { } }); -var _query_params = __webpack_require__(9); +var _query_params = __webpack_require__(10); Object.defineProperty(exports, 'parseQueryParams', { enumerable: true, @@ -2166,7 +2195,7 @@ Object.defineProperty(exports, 'toQueryString', { } }); -var _claims2 = __webpack_require__(24); +var _claims2 = __webpack_require__(26); Object.defineProperty(exports, 'claimsReducer', { enumerable: true, @@ -2175,7 +2204,7 @@ Object.defineProperty(exports, 'claimsReducer', { } }); -var _cost_info2 = __webpack_require__(25); +var _cost_info2 = __webpack_require__(27); Object.defineProperty(exports, 'costInfoReducer', { enumerable: true, @@ -2184,7 +2213,7 @@ Object.defineProperty(exports, 'costInfoReducer', { } }); -var _file_info2 = __webpack_require__(26); +var _file_info2 = __webpack_require__(28); Object.defineProperty(exports, 'fileInfoReducer', { enumerable: true, @@ -2193,7 +2222,16 @@ Object.defineProperty(exports, 'fileInfoReducer', { } }); -var _search2 = __webpack_require__(27); +var _notifications2 = __webpack_require__(29); + +Object.defineProperty(exports, 'notificationsReducer', { + enumerable: true, + get: function get() { + return _notifications2.notificationsReducer; + } +}); + +var _search2 = __webpack_require__(30); Object.defineProperty(exports, 'searchReducer', { enumerable: true, @@ -2202,7 +2240,7 @@ Object.defineProperty(exports, 'searchReducer', { } }); -var _wallet2 = __webpack_require__(28); +var _wallet2 = __webpack_require__(31); Object.defineProperty(exports, 'walletReducer', { enumerable: true, @@ -2211,6 +2249,15 @@ Object.defineProperty(exports, 'walletReducer', { } }); +var _notifications3 = __webpack_require__(32); + +Object.defineProperty(exports, 'selectNotification', { + enumerable: true, + get: function get() { + return _notifications3.selectNotification; + } +}); + var _claims3 = __webpack_require__(3); Object.defineProperty(exports, 'makeSelectClaimForUri', { @@ -2358,7 +2405,7 @@ Object.defineProperty(exports, 'selectResolvingUris', { } }); -var _cost_info3 = __webpack_require__(29); +var _cost_info3 = __webpack_require__(33); Object.defineProperty(exports, 'makeSelectFetchingCostInfoForUri', { enumerable: true, @@ -2391,7 +2438,7 @@ Object.defineProperty(exports, 'selectFetchingCostInfo', { } }); -var _file_info3 = __webpack_require__(11); +var _file_info3 = __webpack_require__(12); Object.defineProperty(exports, 'makeSelectFileInfoForUri', { enumerable: true, @@ -2541,7 +2588,7 @@ Object.defineProperty(exports, 'selectActiveHistoryEntry', { } }); -var _search3 = __webpack_require__(30); +var _search3 = __webpack_require__(34); Object.defineProperty(exports, 'makeSelectSearchUris', { enumerable: true, @@ -2580,7 +2627,7 @@ Object.defineProperty(exports, 'selectWunderBarIcon', { } }); -var _wallet3 = __webpack_require__(13); +var _wallet3 = __webpack_require__(14); Object.defineProperty(exports, 'makeSelectBlockDate', { enumerable: true, @@ -2681,7 +2728,7 @@ var _lbry = __webpack_require__(5); var _lbry2 = _interopRequireDefault(_lbry); -var _lbryapi = __webpack_require__(10); +var _lbryapi = __webpack_require__(11); var _lbryapi2 = _interopRequireDefault(_lbryapi); @@ -2689,16 +2736,47 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } +// constants exports.ACTIONS = ACTIONS; // common -// constants exports.Lbry = _lbry2.default; exports.Lbryapi = _lbryapi2.default; /***/ }), -/* 15 */ +/* 16 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.doNotify = doNotify; + +var _action_types = __webpack_require__(0); + +var ACTIONS = _interopRequireWildcard(_action_types); + +var _Notification = __webpack_require__(8); + +var _Notification2 = _interopRequireDefault(_Notification); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function doNotify(data) { + return { + type: ACTIONS.CREATE_NOTIFICATION, + data: data + }; +} + +/***/ }), +/* 17 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2785,7 +2863,7 @@ jsonrpc.call = function (connectionString, method, params, callback, errorCallba exports.default = jsonrpc; /***/ }), -/* 16 */ +/* 18 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2800,7 +2878,7 @@ var _action_types = __webpack_require__(0); var ACTIONS = _interopRequireWildcard(_action_types); -var _lbryapi = __webpack_require__(10); +var _lbryapi = __webpack_require__(11); var _lbryapi2 = _interopRequireDefault(_lbryapi); @@ -2845,7 +2923,7 @@ function doFetchCostInfoForUri(uri) { } /***/ }), -/* 17 */ +/* 19 */ /***/ (function(module, exports) { // shim for using process in browser @@ -3035,18 +3113,18 @@ process.umask = function() { return 0; }; /***/ }), -/* 18 */ +/* 20 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -exports.decode = exports.parse = __webpack_require__(19); -exports.encode = exports.stringify = __webpack_require__(20); +exports.decode = exports.parse = __webpack_require__(21); +exports.encode = exports.stringify = __webpack_require__(22); /***/ }), -/* 19 */ +/* 21 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3137,7 +3215,7 @@ var isArray = Array.isArray || function (xs) { /***/ }), -/* 20 */ +/* 22 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3229,7 +3307,7 @@ var objectKeys = Object.keys || function (obj) { /***/ }), -/* 21 */ +/* 23 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3254,7 +3332,7 @@ var _claims = __webpack_require__(7); var _claims2 = __webpack_require__(3); -var _file_info = __webpack_require__(11); +var _file_info = __webpack_require__(12); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -3322,7 +3400,7 @@ function doFetchFileInfosAndPublishedClaims() { } /***/ }), -/* 22 */ +/* 24 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3343,7 +3421,7 @@ var _claims = __webpack_require__(7); var _navigation = __webpack_require__(4); -var _batchActions = __webpack_require__(12); +var _batchActions = __webpack_require__(13); var _batchActions2 = _interopRequireDefault(_batchActions); @@ -3409,7 +3487,7 @@ function doSearch(rawQuery, currentPageNotSearchHandler) { } /***/ }), -/* 23 */ +/* 25 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3433,7 +3511,7 @@ var _action_types = __webpack_require__(0); var ACTIONS = _interopRequireWildcard(_action_types); -var _modal_types = __webpack_require__(8); +var _modal_types = __webpack_require__(9); var MODALS = _interopRequireWildcard(_modal_types); @@ -3443,7 +3521,7 @@ var _lbry2 = _interopRequireDefault(_lbry); var _app = __webpack_require__(6); -var _wallet = __webpack_require__(13); +var _wallet = __webpack_require__(14); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -3617,7 +3695,7 @@ function doSendSupport(amount, claimId, uri, successCallback, errorCallback) { } /***/ }), -/* 24 */ +/* 26 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3845,7 +3923,7 @@ function claimsReducer() { } /***/ }), -/* 25 */ +/* 27 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3903,7 +3981,7 @@ function costInfoReducer() { } /***/ }), -/* 26 */ +/* 28 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4100,7 +4178,72 @@ function fileInfoReducer() { } /***/ }), -/* 27 */ +/* 29 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.notificationsReducer = notificationsReducer; + +var _action_types = __webpack_require__(0); + +var ACTIONS = _interopRequireWildcard(_action_types); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +var reducers = {}; + +var defaultState = { + // First-in, first-out + queue: [] +}; + +reducers[ACTIONS.NOTIFICATION_CREATED] = function (state, action) { + var _action$data = action.data, + title = _action$data.title, + message = _action$data.message, + type = _action$data.type, + errorCode = _action$data.errorCode, + displayType = _action$data.displayType; + + var queue = Object.assign([], state.queue); + queue.push({ + title: title, + message: message, + type: type, + errorCode: errorCode, + displayType: displayType + }); + + return Object.assign({}, state, { + queue: queue + }); +}; + +reducers[ACTIONS.NOTIFICATION_DISPLAYED] = function (state, action) { + var queue = Object.assign([], state.queue); + queue.shift(); + + return Object.assign({}, state, { + queue: queue + }); +}; + +function notificationsReducer() { + var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultState; + var action = arguments[1]; + + var handler = reducers[action.type]; + if (handler) return handler(state, action); + return state; +} + +/***/ }), +/* 30 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4159,7 +4302,7 @@ function searchReducer() { } /***/ }), -/* 28 */ +/* 31 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4343,7 +4486,29 @@ function walletReducer() { } /***/ }), -/* 29 */ +/* 32 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.selectNotification = exports.selectState = undefined; + +var _reselect = __webpack_require__(1); + +var selectState = exports.selectState = function selectState(state) { + return state.notifications || {}; +}; + +var selectNotification = exports.selectNotification = (0, _reselect.createSelector)(selectState, function (state) { + return state.queue.length > 0 ? state.queue[0] : {}; +}); + +/***/ }), +/* 33 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4387,7 +4552,7 @@ var makeSelectFetchingCostInfoForUri = exports.makeSelectFetchingCostInfoForUri }; /***/ }), -/* 30 */ +/* 34 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; diff --git a/src/constants/action_types.js b/src/constants/action_types.js index 3c828f5..49b5190 100644 --- a/src/constants/action_types.js +++ b/src/constants/action_types.js @@ -162,3 +162,7 @@ export const SET_VIDEO_PAUSE = 'SET_VIDEO_PAUSE'; export const MEDIA_PLAY = 'MEDIA_PLAY'; export const MEDIA_PAUSE = 'MEDIA_PAUSE'; export const MEDIA_POSITION = 'MEDIA_POSITION'; + +// Notifications +export const NOTIFICATION_CREATED = 'NOTIFICATION_CREATED'; +export const NOTIFICATION_DISPLAYED = 'NOTIFICATION_DISPLAYED'; diff --git a/src/index.js b/src/index.js index 6ec047c..307ff22 100644 --- a/src/index.js +++ b/src/index.js @@ -1,11 +1,14 @@ -// constants import * as ACTIONS from 'constants/action_types'; - -// common import Lbry from 'lbry'; import Lbryapi from 'lbryapi'; +// types +export { Notification } from 'types/Notification'; + +// constants export { ACTIONS }; + +// common export { Lbry, Lbryapi }; export { regexInvalidURI, @@ -18,20 +21,27 @@ export { } from 'lbryURI'; // actions +export { doNotify } from 'redux/actions/notifications'; + export { doOpenModal, doCloseModal, doShowSnackBar } from 'redux/actions/app'; + export { doFetchClaimListMine, doAbandonClaim, doResolveUris, doResolveUri, } from 'redux/actions/claims'; + export { doFetchCostInfoForUri } from 'redux/actions/cost_info'; + export { doFetchFileInfo, doFileList, doFetchFileInfosAndPublishedClaims, } from 'redux/actions/file_info'; + export { doSearch } from 'redux/actions/search'; + export { doUpdateBalance, doBalanceSubscribe, @@ -53,10 +63,13 @@ export { parseQueryParams, toQueryString } from 'util/query_params'; export { claimsReducer } from 'redux/reducers/claims'; export { costInfoReducer } from 'redux/reducers/cost_info'; export { fileInfoReducer } from 'redux/reducers/file_info'; +export { notificationsReducer } from 'redux/reducers/notifications'; export { searchReducer } from 'redux/reducers/search'; export { walletReducer } from 'redux/reducers/wallet'; // selectors +export { selectNotification } from 'redux/selectors/notifications'; + export { makeSelectClaimForUri, makeSelectClaimIsMine, diff --git a/src/redux/actions/notifications.js b/src/redux/actions/notifications.js new file mode 100644 index 0000000..ce5d085 --- /dev/null +++ b/src/redux/actions/notifications.js @@ -0,0 +1,10 @@ +// @flow +import * as ACTIONS from 'constants/action_types'; +import Notification from 'types/Notification'; + +export function doNotify(data: Notification) { + return { + type: ACTIONS.CREATE_NOTIFICATION, + data, + }; +} diff --git a/src/redux/reducers/notifications.js b/src/redux/reducers/notifications.js new file mode 100644 index 0000000..a066202 --- /dev/null +++ b/src/redux/reducers/notifications.js @@ -0,0 +1,39 @@ +import * as ACTIONS from 'constants/action_types'; + +const reducers = {}; + +const defaultState = { + // First-in, first-out + queue: [], +}; + +reducers[ACTIONS.NOTIFICATION_CREATED] = (state, action) => { + const { title, message, type, errorCode, displayType } = action.data; + const queue = Object.assign([], state.queue); + queue.push({ + title, + message, + type, + errorCode, + displayType, + }); + + return Object.assign({}, state, { + queue, + }); +}; + +reducers[ACTIONS.NOTIFICATION_DISPLAYED] = state => { + const queue = Object.assign([], state.queue); + queue.shift(); + + return Object.assign({}, state, { + queue, + }); +}; + +export function notificationsReducer(state = defaultState, action) { + const handler = reducers[action.type]; + if (handler) return handler(state, action); + return state; +} diff --git a/src/redux/selectors/notifications.js b/src/redux/selectors/notifications.js new file mode 100644 index 0000000..0b41428 --- /dev/null +++ b/src/redux/selectors/notifications.js @@ -0,0 +1,8 @@ +import { createSelector } from 'reselect'; + +export const selectState = state => state.notifications || {}; + +export const selectNotification = createSelector( + selectState, + state => (state.queue.length > 0 ? state.queue[0] : {}) +); diff --git a/src/types/Notification.js b/src/types/Notification.js new file mode 100644 index 0000000..735591c --- /dev/null +++ b/src/types/Notification.js @@ -0,0 +1,12 @@ +// @flow +export type Notification = { + title: ?string, + message: string, + type: string, + errorCode: ?number, + displayType: mixed, + + // additional properties for SnackBar + linkText: ?string, + linkTarget: ?string, +}; -- 2.45.3 From 6bc124238110d6f0976e11dfd4f3328481c1cb2a Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Thu, 22 Feb 2018 00:13:32 +0100 Subject: [PATCH 11/41] Added proxy polyfill module for React Native --- build/index.js | 3049 ++++++++++++++++++++++++++---------------------- package.json | 1 + src/lbry.js | 1 + 3 files changed, 1632 insertions(+), 1419 deletions(-) diff --git a/build/index.js b/build/index.js index 56b81f5..3268a19 100644 --- a/build/index.js +++ b/build/index.js @@ -70,7 +70,7 @@ return /******/ (function(modules) { // webpackBootstrap /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 15); +/******/ return __webpack_require__(__webpack_require__.s = 16); /******/ }) /************************************************************************/ /******/ ([ @@ -832,7 +832,7 @@ var _reselect = __webpack_require__(1); var _lbryURI = __webpack_require__(2); -var _query_params = __webpack_require__(10); +var _query_params = __webpack_require__(11); var selectState = exports.selectState = function selectState(state) { return state.navigation || {}; @@ -993,10 +993,12 @@ Object.defineProperty(exports, "__esModule", { value: true }); -var _jsonrpc = __webpack_require__(17); +var _jsonrpc = __webpack_require__(18); var _jsonrpc2 = _interopRequireDefault(_jsonrpc); +__webpack_require__(19); + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } @@ -1528,1402 +1530,6 @@ var CONFIRM_CLAIM_REVOKE = exports.CONFIRM_CLAIM_REVOKE = 'confirmClaimRevoke'; /***/ }), /* 10 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); - -exports.parseQueryParams = parseQueryParams; -exports.toQueryString = toQueryString; -function parseQueryParams(queryString) { - if (queryString === '') return {}; - var parts = queryString.split('?').pop().split('&').map(function (p) { - return p.split('='); - }); - - var params = {}; - parts.forEach(function (array) { - var _array = _slicedToArray(array, 2), - first = _array[0], - second = _array[1]; - - params[first] = second; - }); - return params; -} - -function toQueryString(params) { - if (!params) return ''; - - var parts = []; - Object.keys(params).forEach(function (key) { - if (Object.prototype.hasOwnProperty.call(params, key) && params[key]) { - parts.push(key + '=' + params[key]); - } - }); - - return parts.join('&'); -} - -/***/ }), -/* 11 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/* WEBPACK VAR INJECTION */(function(process) { - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; - -var _querystring = __webpack_require__(20); - -var _querystring2 = _interopRequireDefault(_querystring); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var Lbryapi = { - enabled: true, - exchangePromise: null, - exchangeLastFetched: null -}; - -var CONNECTION_STRING = process.env.LBRY_APP_API_URL ? process.env.LBRY_APP_API_URL.replace(/\/*$/, '/') // exactly one slash at the end -: 'https://api.lbry.io/'; - -var EXCHANGE_RATE_TIMEOUT = 20 * 60 * 1000; - -Lbryapi.getExchangeRates = function () { - if (!Lbryapi.exchangeLastFetched || Date.now() - Lbryapi.exchangeLastFetched > EXCHANGE_RATE_TIMEOUT) { - Lbryapi.exchangePromise = new Promise(function (resolve, reject) { - Lbryapi.call('lbc', 'exchange_rate', {}, 'get', true).then(function (_ref) { - var LBC_USD = _ref.lbc_usd, - LBC_BTC = _ref.lbc_btc, - BTC_USD = _ref.btc_usd; - - var rates = { LBC_USD: LBC_USD, LBC_BTC: LBC_BTC, BTC_USD: BTC_USD }; - resolve(rates); - }).catch(reject); - }); - Lbryapi.exchangeLastFetched = Date.now(); - } - return Lbryapi.exchangePromise; -}; - -Lbryapi.call = function (resource, action) { - var params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; - var method = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'get'; - - if (!Lbryapi.enabled) { - return Promise.reject(new Error(__('LBRY internal API is disabled'))); - } - - if (!(method === 'get' || method === 'post')) { - return Promise.reject(new Error(__('Invalid method'))); - } - - function checkAndParse(response) { - if (response.status >= 200 && response.status < 300) { - return response.json(); - } - return response.json().then(function (json) { - var error = void 0; - if (json.error) { - error = new Error(json.error); - } else { - error = new Error('Unknown API error signature'); - } - error.response = response; // This is primarily a hack used in actions/user.js - return Promise.reject(error); - }); - } - - function makeRequest(url, options) { - return fetch(url, options).then(checkAndParse); - } - - var fullParams = _extends({}, params); - var qs = _querystring2.default.stringify(fullParams); - var url = '' + CONNECTION_STRING + resource + '/' + action + '?' + qs; - - var options = { - method: 'GET' - }; - - if (method === 'post') { - options = { - method: 'POST', - headers: { - 'Content-Type': 'application/x-www-form-urlencoded' - }, - body: qs - }; - url = '' + CONNECTION_STRING + resource + '/' + action; - } - - return makeRequest(url, options).then(function (response) { - return response.data; - }); -}; - -exports.default = Lbryapi; -/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(19))) - -/***/ }), -/* 12 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.selectTotalDownloadProgress = exports.selectDownloadingFileInfos = exports.selectFileInfosDownloaded = exports.makeSelectLoadingForUri = exports.selectUrisLoading = exports.makeSelectDownloadingForUri = exports.selectDownloadingByOutpoint = exports.makeSelectFileInfoForUri = exports.selectIsFetchingFileListDownloadedOrPublished = exports.selectIsFetchingFileList = exports.selectFileInfosByOutpoint = exports.selectState = undefined; - -var _claims = __webpack_require__(3); - -var _reselect = __webpack_require__(1); - -var selectState = exports.selectState = function selectState(state) { - return state.fileInfo || {}; -}; - -var selectFileInfosByOutpoint = exports.selectFileInfosByOutpoint = (0, _reselect.createSelector)(selectState, function (state) { - return state.byOutpoint || {}; -}); - -var selectIsFetchingFileList = exports.selectIsFetchingFileList = (0, _reselect.createSelector)(selectState, function (state) { - return state.isFetchingFileList; -}); - -var selectIsFetchingFileListDownloadedOrPublished = exports.selectIsFetchingFileListDownloadedOrPublished = (0, _reselect.createSelector)(selectIsFetchingFileList, _claims.selectIsFetchingClaimListMine, function (isFetchingFileList, isFetchingClaimListMine) { - return isFetchingFileList || isFetchingClaimListMine; -}); - -var makeSelectFileInfoForUri = exports.makeSelectFileInfoForUri = function makeSelectFileInfoForUri(uri) { - return (0, _reselect.createSelector)(_claims.selectClaimsByUri, selectFileInfosByOutpoint, function (claims, byOutpoint) { - var claim = claims[uri]; - var outpoint = claim ? claim.txid + ':' + claim.nout : undefined; - - return outpoint ? byOutpoint[outpoint] : undefined; - }); -}; - -var selectDownloadingByOutpoint = exports.selectDownloadingByOutpoint = (0, _reselect.createSelector)(selectState, function (state) { - return state.downloadingByOutpoint || {}; -}); - -var makeSelectDownloadingForUri = exports.makeSelectDownloadingForUri = function makeSelectDownloadingForUri(uri) { - return (0, _reselect.createSelector)(selectDownloadingByOutpoint, makeSelectFileInfoForUri(uri), function (byOutpoint, fileInfo) { - if (!fileInfo) return false; - return byOutpoint[fileInfo.outpoint]; - }); -}; - -var selectUrisLoading = exports.selectUrisLoading = (0, _reselect.createSelector)(selectState, function (state) { - return state.urisLoading || {}; -}); - -var makeSelectLoadingForUri = exports.makeSelectLoadingForUri = function makeSelectLoadingForUri(uri) { - return (0, _reselect.createSelector)(selectUrisLoading, function (byUri) { - return byUri && byUri[uri]; - }); -}; - -var selectFileInfosDownloaded = exports.selectFileInfosDownloaded = (0, _reselect.createSelector)(selectFileInfosByOutpoint, _claims.selectMyClaims, function (byOutpoint, myClaims) { - return Object.values(byOutpoint).filter(function (fileInfo) { - var myClaimIds = myClaims.map(function (claim) { - return claim.claim_id; - }); - - return fileInfo && myClaimIds.indexOf(fileInfo.claim_id) === -1 && (fileInfo.completed || fileInfo.written_bytes); - }); -}); - -// export const selectFileInfoForUri = (state, props) => { -// const claims = selectClaimsByUri(state), -// claim = claims[props.uri], -// fileInfos = selectAllFileInfos(state), -// outpoint = claim ? `${claim.txid}:${claim.nout}` : undefined; - -// return outpoint && fileInfos ? fileInfos[outpoint] : undefined; -// }; - -var selectDownloadingFileInfos = exports.selectDownloadingFileInfos = (0, _reselect.createSelector)(selectDownloadingByOutpoint, selectFileInfosByOutpoint, function (downloadingByOutpoint, fileInfosByOutpoint) { - var outpoints = Object.keys(downloadingByOutpoint); - var fileInfos = []; - - outpoints.forEach(function (outpoint) { - var fileInfo = fileInfosByOutpoint[outpoint]; - - if (fileInfo) fileInfos.push(fileInfo); - }); - - return fileInfos; -}); - -var selectTotalDownloadProgress = exports.selectTotalDownloadProgress = (0, _reselect.createSelector)(selectDownloadingFileInfos, function (fileInfos) { - var progress = []; - - fileInfos.forEach(function (fileInfo) { - progress.push(fileInfo.written_bytes / fileInfo.total_bytes * 100); - }); - - var totalProgress = progress.reduce(function (a, b) { - return a + b; - }, 0); - - if (fileInfos.length > 0) return totalProgress / fileInfos.length / 100.0; - return -1; -}); - -/***/ }), -/* 13 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.batchActions = batchActions; -// https://github.com/reactjs/redux/issues/911 -function batchActions() { - for (var _len = arguments.length, actions = Array(_len), _key = 0; _key < _len; _key++) { - actions[_key] = arguments[_key]; - } - - return { - type: 'BATCH_ACTIONS', - actions: actions - }; -} - -/***/ }), -/* 14 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.makeSelectBlockDate = exports.selectBlocks = exports.selectDraftTransactionError = exports.selectDraftTransactionAddress = exports.selectDraftTransactionAmount = exports.selectDraftTransaction = exports.selectGettingNewAddress = exports.selectReceiveAddress = exports.selectIsSendingSupport = exports.selectIsFetchingTransactions = exports.selectHasTransactions = exports.selectRecentTransactions = exports.selectTransactionItems = exports.selectTransactionsById = exports.selectBalance = exports.selectState = undefined; - -var _reselect = __webpack_require__(1); - -function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } - -var selectState = exports.selectState = function selectState(state) { - return state.wallet || {}; -}; - -var selectBalance = exports.selectBalance = (0, _reselect.createSelector)(selectState, function (state) { - return state.balance; -}); - -var selectTransactionsById = exports.selectTransactionsById = (0, _reselect.createSelector)(selectState, function (state) { - return state.transactions; -}); - -var selectTransactionItems = exports.selectTransactionItems = (0, _reselect.createSelector)(selectTransactionsById, function (byId) { - var items = []; - - Object.keys(byId).forEach(function (txid) { - var tx = byId[txid]; - - // ignore dust/fees - // it is fee only txn if all infos are also empty - if (Math.abs(tx.value) === Math.abs(tx.fee) && tx.claim_info.length === 0 && tx.support_info.length === 0 && tx.update_info.length === 0) { - return; - } - - var append = []; - - append.push.apply(append, _toConsumableArray(tx.claim_info.map(function (item) { - return Object.assign({}, tx, item, { - type: item.claim_name[0] === '@' ? 'channel' : 'publish' - }); - }))); - append.push.apply(append, _toConsumableArray(tx.support_info.map(function (item) { - return Object.assign({}, tx, item, { - type: !item.is_tip ? 'support' : 'tip' - }); - }))); - append.push.apply(append, _toConsumableArray(tx.update_info.map(function (item) { - return Object.assign({}, tx, item, { type: 'update' }); - }))); - - if (!append.length) { - append.push(Object.assign({}, tx, { - type: tx.value < 0 ? 'spend' : 'receive' - })); - } - - items.push.apply(items, _toConsumableArray(append.map(function (item) { - // value on transaction, amount on outpoint - // amount is always positive, but should match sign of value - var amount = parseFloat(item.balance_delta ? item.balance_delta : item.value); - - return { - txid: txid, - date: tx.timestamp ? new Date(Number(tx.timestamp) * 1000) : null, - amount: amount, - fee: amount < 0 ? -1 * tx.fee / append.length : 0, - claim_id: item.claim_id, - claim_name: item.claim_name, - type: item.type || 'send', - nout: item.nout - }; - }))); - }); - return items.reverse(); -}); - -var selectRecentTransactions = exports.selectRecentTransactions = (0, _reselect.createSelector)(selectTransactionItems, function (transactions) { - var threshold = new Date(); - threshold.setDate(threshold.getDate() - 7); - return transactions.filter(function (transaction) { - return transaction.date > threshold; - }); -}); - -var selectHasTransactions = exports.selectHasTransactions = (0, _reselect.createSelector)(selectTransactionItems, function (transactions) { - return transactions && transactions.length > 0; -}); - -var selectIsFetchingTransactions = exports.selectIsFetchingTransactions = (0, _reselect.createSelector)(selectState, function (state) { - return state.fetchingTransactions; -}); - -var selectIsSendingSupport = exports.selectIsSendingSupport = (0, _reselect.createSelector)(selectState, function (state) { - return state.sendingSupport; -}); - -var selectReceiveAddress = exports.selectReceiveAddress = (0, _reselect.createSelector)(selectState, function (state) { - return state.receiveAddress; -}); - -var selectGettingNewAddress = exports.selectGettingNewAddress = (0, _reselect.createSelector)(selectState, function (state) { - return state.gettingNewAddress; -}); - -var selectDraftTransaction = exports.selectDraftTransaction = (0, _reselect.createSelector)(selectState, function (state) { - return state.draftTransaction || {}; -}); - -var selectDraftTransactionAmount = exports.selectDraftTransactionAmount = (0, _reselect.createSelector)(selectDraftTransaction, function (draft) { - return draft.amount; -}); - -var selectDraftTransactionAddress = exports.selectDraftTransactionAddress = (0, _reselect.createSelector)(selectDraftTransaction, function (draft) { - return draft.address; -}); - -var selectDraftTransactionError = exports.selectDraftTransactionError = (0, _reselect.createSelector)(selectDraftTransaction, function (draft) { - return draft.error; -}); - -var selectBlocks = exports.selectBlocks = (0, _reselect.createSelector)(selectState, function (state) { - return state.blocks; -}); - -var makeSelectBlockDate = exports.makeSelectBlockDate = function makeSelectBlockDate(block) { - return (0, _reselect.createSelector)(selectBlocks, function (blocks) { - return blocks && blocks[block] ? new Date(blocks[block].time * 1000) : undefined; - }); -}; - -/***/ }), -/* 15 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.selectBlocks = exports.selectDraftTransactionError = exports.selectDraftTransactionAddress = exports.selectDraftTransactionAmount = exports.selectDraftTransaction = exports.selectGettingNewAddress = exports.selectReceiveAddress = exports.selectIsSendingSupport = exports.selectIsFetchingTransactions = exports.selectHasTransactions = exports.selectRecentTransactions = exports.selectTransactionItems = exports.selectTransactionsById = exports.selectBalance = exports.makeSelectBlockDate = exports.selectWunderBarIcon = exports.selectWunderBarAddress = exports.selectSearchUrisByQuery = undefined; -exports.selectIsSearching = exports.selectSearchQuery = exports.makeSelectSearchUris = exports.selectActiveHistoryEntry = exports.selectHistoryStack = exports.selectHistoryIndex = exports.selectIsForwardDisabled = exports.selectIsBackDisabled = exports.selectPathAfterAuth = exports.selectPageTitle = exports.selectHeaderLinks = exports.selectCurrentParams = exports.selectCurrentPage = exports.selectCurrentPath = exports.makeSelectCurrentParam = exports.computePageFromPath = exports.selectTotalDownloadProgress = exports.selectDownloadingFileInfos = exports.selectFileInfosDownloaded = exports.selectUrisLoading = exports.selectDownloadingByOutpoint = exports.selectIsFetchingFileListDownloadedOrPublished = exports.selectIsFetchingFileList = exports.selectFileInfosByOutpoint = exports.makeSelectLoadingForUri = exports.makeSelectDownloadingForUri = exports.makeSelectFileInfoForUri = exports.selectFetchingCostInfo = exports.selectCostForCurrentPageUri = exports.selectAllCostInfoByUri = exports.makeSelectCostInfoForUri = exports.makeSelectFetchingCostInfoForUri = exports.selectResolvingUris = exports.selectMyChannelClaims = exports.selectFetchingMyChannels = exports.selectMyClaimsOutpoints = exports.selectAllMyClaimsByOutpoint = exports.selectMyClaimsWithoutChannels = exports.selectMyClaims = exports.selectPendingClaims = exports.selectIsFetchingClaimListMine = exports.selectAllFetchingChannelClaims = exports.selectMyActiveClaims = exports.selectAbandoningIds = exports.selectMyClaimsRaw = exports.selectAllClaimsByChannel = exports.selectClaimsByUri = exports.selectClaimsById = exports.makeSelectIsUriResolving = exports.makeSelectContentTypeForUri = exports.makeSelectTitleForUri = exports.makeSelectMetadataForUri = exports.makeSelectClaimsInChannelForCurrentPage = exports.makeSelectFetchingChannelClaims = exports.makeSelectClaimIsMine = exports.makeSelectClaimForUri = exports.selectNotification = exports.walletReducer = exports.searchReducer = exports.notificationsReducer = exports.fileInfoReducer = exports.costInfoReducer = exports.claimsReducer = exports.toQueryString = exports.parseQueryParams = exports.batchActions = exports.doSendSupport = exports.doSetDraftTransactionAddress = exports.doSetDraftTransactionAmount = exports.doSendDraftTransaction = exports.doCheckAddressIsMine = exports.doGetNewAddress = exports.doFetchBlock = exports.doFetchTransactions = exports.doBalanceSubscribe = exports.doUpdateBalance = exports.doSearch = exports.doFetchFileInfosAndPublishedClaims = exports.doFileList = exports.doFetchFileInfo = exports.doFetchCostInfoForUri = exports.doResolveUri = exports.doResolveUris = exports.doAbandonClaim = exports.doFetchClaimListMine = exports.doShowSnackBar = exports.doCloseModal = exports.doOpenModal = exports.doNotify = exports.isURIClaimable = exports.isURIValid = exports.normalizeURI = exports.buildURI = exports.parseURI = exports.regexAddress = exports.regexInvalidURI = exports.Lbryapi = exports.Lbry = exports.ACTIONS = exports.Notification = undefined; - -var _Notification = __webpack_require__(8); - -Object.defineProperty(exports, 'Notification', { - enumerable: true, - get: function get() { - return _Notification.Notification; - } -}); - -var _lbryURI = __webpack_require__(2); - -Object.defineProperty(exports, 'regexInvalidURI', { - enumerable: true, - get: function get() { - return _lbryURI.regexInvalidURI; - } -}); -Object.defineProperty(exports, 'regexAddress', { - enumerable: true, - get: function get() { - return _lbryURI.regexAddress; - } -}); -Object.defineProperty(exports, 'parseURI', { - enumerable: true, - get: function get() { - return _lbryURI.parseURI; - } -}); -Object.defineProperty(exports, 'buildURI', { - enumerable: true, - get: function get() { - return _lbryURI.buildURI; - } -}); -Object.defineProperty(exports, 'normalizeURI', { - enumerable: true, - get: function get() { - return _lbryURI.normalizeURI; - } -}); -Object.defineProperty(exports, 'isURIValid', { - enumerable: true, - get: function get() { - return _lbryURI.isURIValid; - } -}); -Object.defineProperty(exports, 'isURIClaimable', { - enumerable: true, - get: function get() { - return _lbryURI.isURIClaimable; - } -}); - -var _notifications = __webpack_require__(16); - -Object.defineProperty(exports, 'doNotify', { - enumerable: true, - get: function get() { - return _notifications.doNotify; - } -}); - -var _app = __webpack_require__(6); - -Object.defineProperty(exports, 'doOpenModal', { - enumerable: true, - get: function get() { - return _app.doOpenModal; - } -}); -Object.defineProperty(exports, 'doCloseModal', { - enumerable: true, - get: function get() { - return _app.doCloseModal; - } -}); -Object.defineProperty(exports, 'doShowSnackBar', { - enumerable: true, - get: function get() { - return _app.doShowSnackBar; - } -}); - -var _claims = __webpack_require__(7); - -Object.defineProperty(exports, 'doFetchClaimListMine', { - enumerable: true, - get: function get() { - return _claims.doFetchClaimListMine; - } -}); -Object.defineProperty(exports, 'doAbandonClaim', { - enumerable: true, - get: function get() { - return _claims.doAbandonClaim; - } -}); -Object.defineProperty(exports, 'doResolveUris', { - enumerable: true, - get: function get() { - return _claims.doResolveUris; - } -}); -Object.defineProperty(exports, 'doResolveUri', { - enumerable: true, - get: function get() { - return _claims.doResolveUri; - } -}); - -var _cost_info = __webpack_require__(18); - -Object.defineProperty(exports, 'doFetchCostInfoForUri', { - enumerable: true, - get: function get() { - return _cost_info.doFetchCostInfoForUri; - } -}); - -var _file_info = __webpack_require__(23); - -Object.defineProperty(exports, 'doFetchFileInfo', { - enumerable: true, - get: function get() { - return _file_info.doFetchFileInfo; - } -}); -Object.defineProperty(exports, 'doFileList', { - enumerable: true, - get: function get() { - return _file_info.doFileList; - } -}); -Object.defineProperty(exports, 'doFetchFileInfosAndPublishedClaims', { - enumerable: true, - get: function get() { - return _file_info.doFetchFileInfosAndPublishedClaims; - } -}); - -var _search = __webpack_require__(24); - -Object.defineProperty(exports, 'doSearch', { - enumerable: true, - get: function get() { - return _search.doSearch; - } -}); - -var _wallet = __webpack_require__(25); - -Object.defineProperty(exports, 'doUpdateBalance', { - enumerable: true, - get: function get() { - return _wallet.doUpdateBalance; - } -}); -Object.defineProperty(exports, 'doBalanceSubscribe', { - enumerable: true, - get: function get() { - return _wallet.doBalanceSubscribe; - } -}); -Object.defineProperty(exports, 'doFetchTransactions', { - enumerable: true, - get: function get() { - return _wallet.doFetchTransactions; - } -}); -Object.defineProperty(exports, 'doFetchBlock', { - enumerable: true, - get: function get() { - return _wallet.doFetchBlock; - } -}); -Object.defineProperty(exports, 'doGetNewAddress', { - enumerable: true, - get: function get() { - return _wallet.doGetNewAddress; - } -}); -Object.defineProperty(exports, 'doCheckAddressIsMine', { - enumerable: true, - get: function get() { - return _wallet.doCheckAddressIsMine; - } -}); -Object.defineProperty(exports, 'doSendDraftTransaction', { - enumerable: true, - get: function get() { - return _wallet.doSendDraftTransaction; - } -}); -Object.defineProperty(exports, 'doSetDraftTransactionAmount', { - enumerable: true, - get: function get() { - return _wallet.doSetDraftTransactionAmount; - } -}); -Object.defineProperty(exports, 'doSetDraftTransactionAddress', { - enumerable: true, - get: function get() { - return _wallet.doSetDraftTransactionAddress; - } -}); -Object.defineProperty(exports, 'doSendSupport', { - enumerable: true, - get: function get() { - return _wallet.doSendSupport; - } -}); - -var _batchActions = __webpack_require__(13); - -Object.defineProperty(exports, 'batchActions', { - enumerable: true, - get: function get() { - return _batchActions.batchActions; - } -}); - -var _query_params = __webpack_require__(10); - -Object.defineProperty(exports, 'parseQueryParams', { - enumerable: true, - get: function get() { - return _query_params.parseQueryParams; - } -}); -Object.defineProperty(exports, 'toQueryString', { - enumerable: true, - get: function get() { - return _query_params.toQueryString; - } -}); - -var _claims2 = __webpack_require__(26); - -Object.defineProperty(exports, 'claimsReducer', { - enumerable: true, - get: function get() { - return _claims2.claimsReducer; - } -}); - -var _cost_info2 = __webpack_require__(27); - -Object.defineProperty(exports, 'costInfoReducer', { - enumerable: true, - get: function get() { - return _cost_info2.costInfoReducer; - } -}); - -var _file_info2 = __webpack_require__(28); - -Object.defineProperty(exports, 'fileInfoReducer', { - enumerable: true, - get: function get() { - return _file_info2.fileInfoReducer; - } -}); - -var _notifications2 = __webpack_require__(29); - -Object.defineProperty(exports, 'notificationsReducer', { - enumerable: true, - get: function get() { - return _notifications2.notificationsReducer; - } -}); - -var _search2 = __webpack_require__(30); - -Object.defineProperty(exports, 'searchReducer', { - enumerable: true, - get: function get() { - return _search2.searchReducer; - } -}); - -var _wallet2 = __webpack_require__(31); - -Object.defineProperty(exports, 'walletReducer', { - enumerable: true, - get: function get() { - return _wallet2.walletReducer; - } -}); - -var _notifications3 = __webpack_require__(32); - -Object.defineProperty(exports, 'selectNotification', { - enumerable: true, - get: function get() { - return _notifications3.selectNotification; - } -}); - -var _claims3 = __webpack_require__(3); - -Object.defineProperty(exports, 'makeSelectClaimForUri', { - enumerable: true, - get: function get() { - return _claims3.makeSelectClaimForUri; - } -}); -Object.defineProperty(exports, 'makeSelectClaimIsMine', { - enumerable: true, - get: function get() { - return _claims3.makeSelectClaimIsMine; - } -}); -Object.defineProperty(exports, 'makeSelectFetchingChannelClaims', { - enumerable: true, - get: function get() { - return _claims3.makeSelectFetchingChannelClaims; - } -}); -Object.defineProperty(exports, 'makeSelectClaimsInChannelForCurrentPage', { - enumerable: true, - get: function get() { - return _claims3.makeSelectClaimsInChannelForCurrentPage; - } -}); -Object.defineProperty(exports, 'makeSelectMetadataForUri', { - enumerable: true, - get: function get() { - return _claims3.makeSelectMetadataForUri; - } -}); -Object.defineProperty(exports, 'makeSelectTitleForUri', { - enumerable: true, - get: function get() { - return _claims3.makeSelectTitleForUri; - } -}); -Object.defineProperty(exports, 'makeSelectContentTypeForUri', { - enumerable: true, - get: function get() { - return _claims3.makeSelectContentTypeForUri; - } -}); -Object.defineProperty(exports, 'makeSelectIsUriResolving', { - enumerable: true, - get: function get() { - return _claims3.makeSelectIsUriResolving; - } -}); -Object.defineProperty(exports, 'selectClaimsById', { - enumerable: true, - get: function get() { - return _claims3.selectClaimsById; - } -}); -Object.defineProperty(exports, 'selectClaimsByUri', { - enumerable: true, - get: function get() { - return _claims3.selectClaimsByUri; - } -}); -Object.defineProperty(exports, 'selectAllClaimsByChannel', { - enumerable: true, - get: function get() { - return _claims3.selectAllClaimsByChannel; - } -}); -Object.defineProperty(exports, 'selectMyClaimsRaw', { - enumerable: true, - get: function get() { - return _claims3.selectMyClaimsRaw; - } -}); -Object.defineProperty(exports, 'selectAbandoningIds', { - enumerable: true, - get: function get() { - return _claims3.selectAbandoningIds; - } -}); -Object.defineProperty(exports, 'selectMyActiveClaims', { - enumerable: true, - get: function get() { - return _claims3.selectMyActiveClaims; - } -}); -Object.defineProperty(exports, 'selectAllFetchingChannelClaims', { - enumerable: true, - get: function get() { - return _claims3.selectAllFetchingChannelClaims; - } -}); -Object.defineProperty(exports, 'selectIsFetchingClaimListMine', { - enumerable: true, - get: function get() { - return _claims3.selectIsFetchingClaimListMine; - } -}); -Object.defineProperty(exports, 'selectPendingClaims', { - enumerable: true, - get: function get() { - return _claims3.selectPendingClaims; - } -}); -Object.defineProperty(exports, 'selectMyClaims', { - enumerable: true, - get: function get() { - return _claims3.selectMyClaims; - } -}); -Object.defineProperty(exports, 'selectMyClaimsWithoutChannels', { - enumerable: true, - get: function get() { - return _claims3.selectMyClaimsWithoutChannels; - } -}); -Object.defineProperty(exports, 'selectAllMyClaimsByOutpoint', { - enumerable: true, - get: function get() { - return _claims3.selectAllMyClaimsByOutpoint; - } -}); -Object.defineProperty(exports, 'selectMyClaimsOutpoints', { - enumerable: true, - get: function get() { - return _claims3.selectMyClaimsOutpoints; - } -}); -Object.defineProperty(exports, 'selectFetchingMyChannels', { - enumerable: true, - get: function get() { - return _claims3.selectFetchingMyChannels; - } -}); -Object.defineProperty(exports, 'selectMyChannelClaims', { - enumerable: true, - get: function get() { - return _claims3.selectMyChannelClaims; - } -}); -Object.defineProperty(exports, 'selectResolvingUris', { - enumerable: true, - get: function get() { - return _claims3.selectResolvingUris; - } -}); - -var _cost_info3 = __webpack_require__(33); - -Object.defineProperty(exports, 'makeSelectFetchingCostInfoForUri', { - enumerable: true, - get: function get() { - return _cost_info3.makeSelectFetchingCostInfoForUri; - } -}); -Object.defineProperty(exports, 'makeSelectCostInfoForUri', { - enumerable: true, - get: function get() { - return _cost_info3.makeSelectCostInfoForUri; - } -}); -Object.defineProperty(exports, 'selectAllCostInfoByUri', { - enumerable: true, - get: function get() { - return _cost_info3.selectAllCostInfoByUri; - } -}); -Object.defineProperty(exports, 'selectCostForCurrentPageUri', { - enumerable: true, - get: function get() { - return _cost_info3.selectCostForCurrentPageUri; - } -}); -Object.defineProperty(exports, 'selectFetchingCostInfo', { - enumerable: true, - get: function get() { - return _cost_info3.selectFetchingCostInfo; - } -}); - -var _file_info3 = __webpack_require__(12); - -Object.defineProperty(exports, 'makeSelectFileInfoForUri', { - enumerable: true, - get: function get() { - return _file_info3.makeSelectFileInfoForUri; - } -}); -Object.defineProperty(exports, 'makeSelectDownloadingForUri', { - enumerable: true, - get: function get() { - return _file_info3.makeSelectDownloadingForUri; - } -}); -Object.defineProperty(exports, 'makeSelectLoadingForUri', { - enumerable: true, - get: function get() { - return _file_info3.makeSelectLoadingForUri; - } -}); -Object.defineProperty(exports, 'selectFileInfosByOutpoint', { - enumerable: true, - get: function get() { - return _file_info3.selectFileInfosByOutpoint; - } -}); -Object.defineProperty(exports, 'selectIsFetchingFileList', { - enumerable: true, - get: function get() { - return _file_info3.selectIsFetchingFileList; - } -}); -Object.defineProperty(exports, 'selectIsFetchingFileListDownloadedOrPublished', { - enumerable: true, - get: function get() { - return _file_info3.selectIsFetchingFileListDownloadedOrPublished; - } -}); -Object.defineProperty(exports, 'selectDownloadingByOutpoint', { - enumerable: true, - get: function get() { - return _file_info3.selectDownloadingByOutpoint; - } -}); -Object.defineProperty(exports, 'selectUrisLoading', { - enumerable: true, - get: function get() { - return _file_info3.selectUrisLoading; - } -}); -Object.defineProperty(exports, 'selectFileInfosDownloaded', { - enumerable: true, - get: function get() { - return _file_info3.selectFileInfosDownloaded; - } -}); -Object.defineProperty(exports, 'selectDownloadingFileInfos', { - enumerable: true, - get: function get() { - return _file_info3.selectDownloadingFileInfos; - } -}); -Object.defineProperty(exports, 'selectTotalDownloadProgress', { - enumerable: true, - get: function get() { - return _file_info3.selectTotalDownloadProgress; - } -}); - -var _navigation = __webpack_require__(4); - -Object.defineProperty(exports, 'computePageFromPath', { - enumerable: true, - get: function get() { - return _navigation.computePageFromPath; - } -}); -Object.defineProperty(exports, 'makeSelectCurrentParam', { - enumerable: true, - get: function get() { - return _navigation.makeSelectCurrentParam; - } -}); -Object.defineProperty(exports, 'selectCurrentPath', { - enumerable: true, - get: function get() { - return _navigation.selectCurrentPath; - } -}); -Object.defineProperty(exports, 'selectCurrentPage', { - enumerable: true, - get: function get() { - return _navigation.selectCurrentPage; - } -}); -Object.defineProperty(exports, 'selectCurrentParams', { - enumerable: true, - get: function get() { - return _navigation.selectCurrentParams; - } -}); -Object.defineProperty(exports, 'selectHeaderLinks', { - enumerable: true, - get: function get() { - return _navigation.selectHeaderLinks; - } -}); -Object.defineProperty(exports, 'selectPageTitle', { - enumerable: true, - get: function get() { - return _navigation.selectPageTitle; - } -}); -Object.defineProperty(exports, 'selectPathAfterAuth', { - enumerable: true, - get: function get() { - return _navigation.selectPathAfterAuth; - } -}); -Object.defineProperty(exports, 'selectIsBackDisabled', { - enumerable: true, - get: function get() { - return _navigation.selectIsBackDisabled; - } -}); -Object.defineProperty(exports, 'selectIsForwardDisabled', { - enumerable: true, - get: function get() { - return _navigation.selectIsForwardDisabled; - } -}); -Object.defineProperty(exports, 'selectHistoryIndex', { - enumerable: true, - get: function get() { - return _navigation.selectHistoryIndex; - } -}); -Object.defineProperty(exports, 'selectHistoryStack', { - enumerable: true, - get: function get() { - return _navigation.selectHistoryStack; - } -}); -Object.defineProperty(exports, 'selectActiveHistoryEntry', { - enumerable: true, - get: function get() { - return _navigation.selectActiveHistoryEntry; - } -}); - -var _search3 = __webpack_require__(34); - -Object.defineProperty(exports, 'makeSelectSearchUris', { - enumerable: true, - get: function get() { - return _search3.makeSelectSearchUris; - } -}); -Object.defineProperty(exports, 'selectSearchQuery', { - enumerable: true, - get: function get() { - return _search3.selectSearchQuery; - } -}); -Object.defineProperty(exports, 'selectIsSearching', { - enumerable: true, - get: function get() { - return _search3.selectIsSearching; - } -}); -Object.defineProperty(exports, 'selectSearchUrisByQuery', { - enumerable: true, - get: function get() { - return _search3.selectSearchUrisByQuery; - } -}); -Object.defineProperty(exports, 'selectWunderBarAddress', { - enumerable: true, - get: function get() { - return _search3.selectWunderBarAddress; - } -}); -Object.defineProperty(exports, 'selectWunderBarIcon', { - enumerable: true, - get: function get() { - return _search3.selectWunderBarIcon; - } -}); - -var _wallet3 = __webpack_require__(14); - -Object.defineProperty(exports, 'makeSelectBlockDate', { - enumerable: true, - get: function get() { - return _wallet3.makeSelectBlockDate; - } -}); -Object.defineProperty(exports, 'selectBalance', { - enumerable: true, - get: function get() { - return _wallet3.selectBalance; - } -}); -Object.defineProperty(exports, 'selectTransactionsById', { - enumerable: true, - get: function get() { - return _wallet3.selectTransactionsById; - } -}); -Object.defineProperty(exports, 'selectTransactionItems', { - enumerable: true, - get: function get() { - return _wallet3.selectTransactionItems; - } -}); -Object.defineProperty(exports, 'selectRecentTransactions', { - enumerable: true, - get: function get() { - return _wallet3.selectRecentTransactions; - } -}); -Object.defineProperty(exports, 'selectHasTransactions', { - enumerable: true, - get: function get() { - return _wallet3.selectHasTransactions; - } -}); -Object.defineProperty(exports, 'selectIsFetchingTransactions', { - enumerable: true, - get: function get() { - return _wallet3.selectIsFetchingTransactions; - } -}); -Object.defineProperty(exports, 'selectIsSendingSupport', { - enumerable: true, - get: function get() { - return _wallet3.selectIsSendingSupport; - } -}); -Object.defineProperty(exports, 'selectReceiveAddress', { - enumerable: true, - get: function get() { - return _wallet3.selectReceiveAddress; - } -}); -Object.defineProperty(exports, 'selectGettingNewAddress', { - enumerable: true, - get: function get() { - return _wallet3.selectGettingNewAddress; - } -}); -Object.defineProperty(exports, 'selectDraftTransaction', { - enumerable: true, - get: function get() { - return _wallet3.selectDraftTransaction; - } -}); -Object.defineProperty(exports, 'selectDraftTransactionAmount', { - enumerable: true, - get: function get() { - return _wallet3.selectDraftTransactionAmount; - } -}); -Object.defineProperty(exports, 'selectDraftTransactionAddress', { - enumerable: true, - get: function get() { - return _wallet3.selectDraftTransactionAddress; - } -}); -Object.defineProperty(exports, 'selectDraftTransactionError', { - enumerable: true, - get: function get() { - return _wallet3.selectDraftTransactionError; - } -}); -Object.defineProperty(exports, 'selectBlocks', { - enumerable: true, - get: function get() { - return _wallet3.selectBlocks; - } -}); - -var _action_types = __webpack_require__(0); - -var ACTIONS = _interopRequireWildcard(_action_types); - -var _lbry = __webpack_require__(5); - -var _lbry2 = _interopRequireDefault(_lbry); - -var _lbryapi = __webpack_require__(11); - -var _lbryapi2 = _interopRequireDefault(_lbryapi); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - -// constants -exports.ACTIONS = ACTIONS; - -// common - -exports.Lbry = _lbry2.default; -exports.Lbryapi = _lbryapi2.default; - -/***/ }), -/* 16 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.doNotify = doNotify; - -var _action_types = __webpack_require__(0); - -var ACTIONS = _interopRequireWildcard(_action_types); - -var _Notification = __webpack_require__(8); - -var _Notification2 = _interopRequireDefault(_Notification); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - -function doNotify(data) { - return { - type: ACTIONS.CREATE_NOTIFICATION, - data: data - }; -} - -/***/ }), -/* 17 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -var jsonrpc = {}; - -jsonrpc.call = function (connectionString, method, params, callback, errorCallback, connectFailedCallback) { - function checkAndParse(response) { - if (response.status >= 200 && response.status < 300) { - return response.json(); - } - return response.json().then(function (json) { - var error = void 0; - if (json.error) { - error = new Error(json.error); - } else { - error = new Error('Protocol error with unknown response signature'); - } - return Promise.reject(error); - }); - } - - var counter = parseInt(sessionStorage.getItem('JSONRPCCounter') || 0, 10); - var url = connectionString; - var options = { - method: 'POST', - body: JSON.stringify({ - jsonrpc: '2.0', - method: method, - params: params, - id: counter - }) - }; - - sessionStorage.setItem('JSONRPCCounter', counter + 1); - - return fetch(url, options).then(checkAndParse).then(function (response) { - var error = response.error || response.result && response.result.error; - - if (!error && typeof callback === 'function') { - return callback(response.result); - } - - if (error && typeof errorCallback === 'function') { - return errorCallback(error); - } - - var errorEvent = new CustomEvent('unhandledError', { - detail: { - connectionString: connectionString, - method: method, - params: params, - code: error.code, - message: error.message || error, - data: error.data - } - }); - document.dispatchEvent(errorEvent); - - return Promise.resolve(); - }).catch(function (error) { - if (connectFailedCallback) { - return connectFailedCallback(error); - } - - var errorEvent = new CustomEvent('unhandledError', { - detail: { - connectionString: connectionString, - method: method, - params: params, - code: error.response && error.response.status, - message: __('Connection to API server failed') - } - }); - document.dispatchEvent(errorEvent); - return Promise.resolve(); - }); -}; - -exports.default = jsonrpc; - -/***/ }), -/* 18 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.doFetchCostInfoForUri = doFetchCostInfoForUri; - -var _action_types = __webpack_require__(0); - -var ACTIONS = _interopRequireWildcard(_action_types); - -var _lbryapi = __webpack_require__(11); - -var _lbryapi2 = _interopRequireDefault(_lbryapi); - -var _claims = __webpack_require__(3); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - -// eslint-disable-next-line import/prefer-default-export -function doFetchCostInfoForUri(uri) { - return function (dispatch, getState) { - var state = getState(); - var claim = (0, _claims.selectClaimsByUri)(state)[uri]; - - if (!claim) return; - - function resolve(costInfo) { - dispatch({ - type: ACTIONS.FETCH_COST_INFO_COMPLETED, - data: { - uri: uri, - costInfo: costInfo - } - }); - } - - var fee = claim.value && claim.value.stream && claim.value.stream.metadata ? claim.value.stream.metadata.fee : undefined; - - if (fee === undefined) { - resolve({ cost: 0, includesData: true }); - } else if (fee.currency === 'LBC') { - resolve({ cost: fee.amount, includesData: true }); - } else { - _lbryapi2.default.getExchangeRates().then(function (_ref) { - var LBC_USD = _ref.LBC_USD; - - resolve({ cost: fee.amount / LBC_USD, includesData: true }); - }); - } - }; -} - -/***/ }), -/* 19 */ /***/ (function(module, exports) { // shim for using process in browser @@ -3113,20 +1719,1625 @@ process.umask = function() { return 0; }; /***/ }), -/* 20 */ +/* 11 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -exports.decode = exports.parse = __webpack_require__(21); -exports.encode = exports.stringify = __webpack_require__(22); +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); + +exports.parseQueryParams = parseQueryParams; +exports.toQueryString = toQueryString; +function parseQueryParams(queryString) { + if (queryString === '') return {}; + var parts = queryString.split('?').pop().split('&').map(function (p) { + return p.split('='); + }); + + var params = {}; + parts.forEach(function (array) { + var _array = _slicedToArray(array, 2), + first = _array[0], + second = _array[1]; + + params[first] = second; + }); + return params; +} + +function toQueryString(params) { + if (!params) return ''; + + var parts = []; + Object.keys(params).forEach(function (key) { + if (Object.prototype.hasOwnProperty.call(params, key) && params[key]) { + parts.push(key + '=' + params[key]); + } + }); + + return parts.join('&'); +} + +/***/ }), +/* 12 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(process) { + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +var _querystring = __webpack_require__(22); + +var _querystring2 = _interopRequireDefault(_querystring); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var Lbryapi = { + enabled: true, + exchangePromise: null, + exchangeLastFetched: null +}; + +var CONNECTION_STRING = process.env.LBRY_APP_API_URL ? process.env.LBRY_APP_API_URL.replace(/\/*$/, '/') // exactly one slash at the end +: 'https://api.lbry.io/'; + +var EXCHANGE_RATE_TIMEOUT = 20 * 60 * 1000; + +Lbryapi.getExchangeRates = function () { + if (!Lbryapi.exchangeLastFetched || Date.now() - Lbryapi.exchangeLastFetched > EXCHANGE_RATE_TIMEOUT) { + Lbryapi.exchangePromise = new Promise(function (resolve, reject) { + Lbryapi.call('lbc', 'exchange_rate', {}, 'get', true).then(function (_ref) { + var LBC_USD = _ref.lbc_usd, + LBC_BTC = _ref.lbc_btc, + BTC_USD = _ref.btc_usd; + + var rates = { LBC_USD: LBC_USD, LBC_BTC: LBC_BTC, BTC_USD: BTC_USD }; + resolve(rates); + }).catch(reject); + }); + Lbryapi.exchangeLastFetched = Date.now(); + } + return Lbryapi.exchangePromise; +}; + +Lbryapi.call = function (resource, action) { + var params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + var method = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'get'; + + if (!Lbryapi.enabled) { + return Promise.reject(new Error(__('LBRY internal API is disabled'))); + } + + if (!(method === 'get' || method === 'post')) { + return Promise.reject(new Error(__('Invalid method'))); + } + + function checkAndParse(response) { + if (response.status >= 200 && response.status < 300) { + return response.json(); + } + return response.json().then(function (json) { + var error = void 0; + if (json.error) { + error = new Error(json.error); + } else { + error = new Error('Unknown API error signature'); + } + error.response = response; // This is primarily a hack used in actions/user.js + return Promise.reject(error); + }); + } + + function makeRequest(url, options) { + return fetch(url, options).then(checkAndParse); + } + + var fullParams = _extends({}, params); + var qs = _querystring2.default.stringify(fullParams); + var url = '' + CONNECTION_STRING + resource + '/' + action + '?' + qs; + + var options = { + method: 'GET' + }; + + if (method === 'post') { + options = { + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded' + }, + body: qs + }; + url = '' + CONNECTION_STRING + resource + '/' + action; + } + + return makeRequest(url, options).then(function (response) { + return response.data; + }); +}; + +exports.default = Lbryapi; +/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(10))) + +/***/ }), +/* 13 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.selectTotalDownloadProgress = exports.selectDownloadingFileInfos = exports.selectFileInfosDownloaded = exports.makeSelectLoadingForUri = exports.selectUrisLoading = exports.makeSelectDownloadingForUri = exports.selectDownloadingByOutpoint = exports.makeSelectFileInfoForUri = exports.selectIsFetchingFileListDownloadedOrPublished = exports.selectIsFetchingFileList = exports.selectFileInfosByOutpoint = exports.selectState = undefined; + +var _claims = __webpack_require__(3); + +var _reselect = __webpack_require__(1); + +var selectState = exports.selectState = function selectState(state) { + return state.fileInfo || {}; +}; + +var selectFileInfosByOutpoint = exports.selectFileInfosByOutpoint = (0, _reselect.createSelector)(selectState, function (state) { + return state.byOutpoint || {}; +}); + +var selectIsFetchingFileList = exports.selectIsFetchingFileList = (0, _reselect.createSelector)(selectState, function (state) { + return state.isFetchingFileList; +}); + +var selectIsFetchingFileListDownloadedOrPublished = exports.selectIsFetchingFileListDownloadedOrPublished = (0, _reselect.createSelector)(selectIsFetchingFileList, _claims.selectIsFetchingClaimListMine, function (isFetchingFileList, isFetchingClaimListMine) { + return isFetchingFileList || isFetchingClaimListMine; +}); + +var makeSelectFileInfoForUri = exports.makeSelectFileInfoForUri = function makeSelectFileInfoForUri(uri) { + return (0, _reselect.createSelector)(_claims.selectClaimsByUri, selectFileInfosByOutpoint, function (claims, byOutpoint) { + var claim = claims[uri]; + var outpoint = claim ? claim.txid + ':' + claim.nout : undefined; + + return outpoint ? byOutpoint[outpoint] : undefined; + }); +}; + +var selectDownloadingByOutpoint = exports.selectDownloadingByOutpoint = (0, _reselect.createSelector)(selectState, function (state) { + return state.downloadingByOutpoint || {}; +}); + +var makeSelectDownloadingForUri = exports.makeSelectDownloadingForUri = function makeSelectDownloadingForUri(uri) { + return (0, _reselect.createSelector)(selectDownloadingByOutpoint, makeSelectFileInfoForUri(uri), function (byOutpoint, fileInfo) { + if (!fileInfo) return false; + return byOutpoint[fileInfo.outpoint]; + }); +}; + +var selectUrisLoading = exports.selectUrisLoading = (0, _reselect.createSelector)(selectState, function (state) { + return state.urisLoading || {}; +}); + +var makeSelectLoadingForUri = exports.makeSelectLoadingForUri = function makeSelectLoadingForUri(uri) { + return (0, _reselect.createSelector)(selectUrisLoading, function (byUri) { + return byUri && byUri[uri]; + }); +}; + +var selectFileInfosDownloaded = exports.selectFileInfosDownloaded = (0, _reselect.createSelector)(selectFileInfosByOutpoint, _claims.selectMyClaims, function (byOutpoint, myClaims) { + return Object.values(byOutpoint).filter(function (fileInfo) { + var myClaimIds = myClaims.map(function (claim) { + return claim.claim_id; + }); + + return fileInfo && myClaimIds.indexOf(fileInfo.claim_id) === -1 && (fileInfo.completed || fileInfo.written_bytes); + }); +}); + +// export const selectFileInfoForUri = (state, props) => { +// const claims = selectClaimsByUri(state), +// claim = claims[props.uri], +// fileInfos = selectAllFileInfos(state), +// outpoint = claim ? `${claim.txid}:${claim.nout}` : undefined; + +// return outpoint && fileInfos ? fileInfos[outpoint] : undefined; +// }; + +var selectDownloadingFileInfos = exports.selectDownloadingFileInfos = (0, _reselect.createSelector)(selectDownloadingByOutpoint, selectFileInfosByOutpoint, function (downloadingByOutpoint, fileInfosByOutpoint) { + var outpoints = Object.keys(downloadingByOutpoint); + var fileInfos = []; + + outpoints.forEach(function (outpoint) { + var fileInfo = fileInfosByOutpoint[outpoint]; + + if (fileInfo) fileInfos.push(fileInfo); + }); + + return fileInfos; +}); + +var selectTotalDownloadProgress = exports.selectTotalDownloadProgress = (0, _reselect.createSelector)(selectDownloadingFileInfos, function (fileInfos) { + var progress = []; + + fileInfos.forEach(function (fileInfo) { + progress.push(fileInfo.written_bytes / fileInfo.total_bytes * 100); + }); + + var totalProgress = progress.reduce(function (a, b) { + return a + b; + }, 0); + + if (fileInfos.length > 0) return totalProgress / fileInfos.length / 100.0; + return -1; +}); + +/***/ }), +/* 14 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.batchActions = batchActions; +// https://github.com/reactjs/redux/issues/911 +function batchActions() { + for (var _len = arguments.length, actions = Array(_len), _key = 0; _key < _len; _key++) { + actions[_key] = arguments[_key]; + } + + return { + type: 'BATCH_ACTIONS', + actions: actions + }; +} + +/***/ }), +/* 15 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.makeSelectBlockDate = exports.selectBlocks = exports.selectDraftTransactionError = exports.selectDraftTransactionAddress = exports.selectDraftTransactionAmount = exports.selectDraftTransaction = exports.selectGettingNewAddress = exports.selectReceiveAddress = exports.selectIsSendingSupport = exports.selectIsFetchingTransactions = exports.selectHasTransactions = exports.selectRecentTransactions = exports.selectTransactionItems = exports.selectTransactionsById = exports.selectBalance = exports.selectState = undefined; + +var _reselect = __webpack_require__(1); + +function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } + +var selectState = exports.selectState = function selectState(state) { + return state.wallet || {}; +}; + +var selectBalance = exports.selectBalance = (0, _reselect.createSelector)(selectState, function (state) { + return state.balance; +}); + +var selectTransactionsById = exports.selectTransactionsById = (0, _reselect.createSelector)(selectState, function (state) { + return state.transactions; +}); + +var selectTransactionItems = exports.selectTransactionItems = (0, _reselect.createSelector)(selectTransactionsById, function (byId) { + var items = []; + + Object.keys(byId).forEach(function (txid) { + var tx = byId[txid]; + + // ignore dust/fees + // it is fee only txn if all infos are also empty + if (Math.abs(tx.value) === Math.abs(tx.fee) && tx.claim_info.length === 0 && tx.support_info.length === 0 && tx.update_info.length === 0) { + return; + } + + var append = []; + + append.push.apply(append, _toConsumableArray(tx.claim_info.map(function (item) { + return Object.assign({}, tx, item, { + type: item.claim_name[0] === '@' ? 'channel' : 'publish' + }); + }))); + append.push.apply(append, _toConsumableArray(tx.support_info.map(function (item) { + return Object.assign({}, tx, item, { + type: !item.is_tip ? 'support' : 'tip' + }); + }))); + append.push.apply(append, _toConsumableArray(tx.update_info.map(function (item) { + return Object.assign({}, tx, item, { type: 'update' }); + }))); + + if (!append.length) { + append.push(Object.assign({}, tx, { + type: tx.value < 0 ? 'spend' : 'receive' + })); + } + + items.push.apply(items, _toConsumableArray(append.map(function (item) { + // value on transaction, amount on outpoint + // amount is always positive, but should match sign of value + var amount = parseFloat(item.balance_delta ? item.balance_delta : item.value); + + return { + txid: txid, + date: tx.timestamp ? new Date(Number(tx.timestamp) * 1000) : null, + amount: amount, + fee: amount < 0 ? -1 * tx.fee / append.length : 0, + claim_id: item.claim_id, + claim_name: item.claim_name, + type: item.type || 'send', + nout: item.nout + }; + }))); + }); + return items.reverse(); +}); + +var selectRecentTransactions = exports.selectRecentTransactions = (0, _reselect.createSelector)(selectTransactionItems, function (transactions) { + var threshold = new Date(); + threshold.setDate(threshold.getDate() - 7); + return transactions.filter(function (transaction) { + return transaction.date > threshold; + }); +}); + +var selectHasTransactions = exports.selectHasTransactions = (0, _reselect.createSelector)(selectTransactionItems, function (transactions) { + return transactions && transactions.length > 0; +}); + +var selectIsFetchingTransactions = exports.selectIsFetchingTransactions = (0, _reselect.createSelector)(selectState, function (state) { + return state.fetchingTransactions; +}); + +var selectIsSendingSupport = exports.selectIsSendingSupport = (0, _reselect.createSelector)(selectState, function (state) { + return state.sendingSupport; +}); + +var selectReceiveAddress = exports.selectReceiveAddress = (0, _reselect.createSelector)(selectState, function (state) { + return state.receiveAddress; +}); + +var selectGettingNewAddress = exports.selectGettingNewAddress = (0, _reselect.createSelector)(selectState, function (state) { + return state.gettingNewAddress; +}); + +var selectDraftTransaction = exports.selectDraftTransaction = (0, _reselect.createSelector)(selectState, function (state) { + return state.draftTransaction || {}; +}); + +var selectDraftTransactionAmount = exports.selectDraftTransactionAmount = (0, _reselect.createSelector)(selectDraftTransaction, function (draft) { + return draft.amount; +}); + +var selectDraftTransactionAddress = exports.selectDraftTransactionAddress = (0, _reselect.createSelector)(selectDraftTransaction, function (draft) { + return draft.address; +}); + +var selectDraftTransactionError = exports.selectDraftTransactionError = (0, _reselect.createSelector)(selectDraftTransaction, function (draft) { + return draft.error; +}); + +var selectBlocks = exports.selectBlocks = (0, _reselect.createSelector)(selectState, function (state) { + return state.blocks; +}); + +var makeSelectBlockDate = exports.makeSelectBlockDate = function makeSelectBlockDate(block) { + return (0, _reselect.createSelector)(selectBlocks, function (blocks) { + return blocks && blocks[block] ? new Date(blocks[block].time * 1000) : undefined; + }); +}; + +/***/ }), +/* 16 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.selectBlocks = exports.selectDraftTransactionError = exports.selectDraftTransactionAddress = exports.selectDraftTransactionAmount = exports.selectDraftTransaction = exports.selectGettingNewAddress = exports.selectReceiveAddress = exports.selectIsSendingSupport = exports.selectIsFetchingTransactions = exports.selectHasTransactions = exports.selectRecentTransactions = exports.selectTransactionItems = exports.selectTransactionsById = exports.selectBalance = exports.makeSelectBlockDate = exports.selectWunderBarIcon = exports.selectWunderBarAddress = exports.selectSearchUrisByQuery = undefined; +exports.selectIsSearching = exports.selectSearchQuery = exports.makeSelectSearchUris = exports.selectActiveHistoryEntry = exports.selectHistoryStack = exports.selectHistoryIndex = exports.selectIsForwardDisabled = exports.selectIsBackDisabled = exports.selectPathAfterAuth = exports.selectPageTitle = exports.selectHeaderLinks = exports.selectCurrentParams = exports.selectCurrentPage = exports.selectCurrentPath = exports.makeSelectCurrentParam = exports.computePageFromPath = exports.selectTotalDownloadProgress = exports.selectDownloadingFileInfos = exports.selectFileInfosDownloaded = exports.selectUrisLoading = exports.selectDownloadingByOutpoint = exports.selectIsFetchingFileListDownloadedOrPublished = exports.selectIsFetchingFileList = exports.selectFileInfosByOutpoint = exports.makeSelectLoadingForUri = exports.makeSelectDownloadingForUri = exports.makeSelectFileInfoForUri = exports.selectFetchingCostInfo = exports.selectCostForCurrentPageUri = exports.selectAllCostInfoByUri = exports.makeSelectCostInfoForUri = exports.makeSelectFetchingCostInfoForUri = exports.selectResolvingUris = exports.selectMyChannelClaims = exports.selectFetchingMyChannels = exports.selectMyClaimsOutpoints = exports.selectAllMyClaimsByOutpoint = exports.selectMyClaimsWithoutChannels = exports.selectMyClaims = exports.selectPendingClaims = exports.selectIsFetchingClaimListMine = exports.selectAllFetchingChannelClaims = exports.selectMyActiveClaims = exports.selectAbandoningIds = exports.selectMyClaimsRaw = exports.selectAllClaimsByChannel = exports.selectClaimsByUri = exports.selectClaimsById = exports.makeSelectIsUriResolving = exports.makeSelectContentTypeForUri = exports.makeSelectTitleForUri = exports.makeSelectMetadataForUri = exports.makeSelectClaimsInChannelForCurrentPage = exports.makeSelectFetchingChannelClaims = exports.makeSelectClaimIsMine = exports.makeSelectClaimForUri = exports.selectNotification = exports.walletReducer = exports.searchReducer = exports.notificationsReducer = exports.fileInfoReducer = exports.costInfoReducer = exports.claimsReducer = exports.toQueryString = exports.parseQueryParams = exports.batchActions = exports.doSendSupport = exports.doSetDraftTransactionAddress = exports.doSetDraftTransactionAmount = exports.doSendDraftTransaction = exports.doCheckAddressIsMine = exports.doGetNewAddress = exports.doFetchBlock = exports.doFetchTransactions = exports.doBalanceSubscribe = exports.doUpdateBalance = exports.doSearch = exports.doFetchFileInfosAndPublishedClaims = exports.doFileList = exports.doFetchFileInfo = exports.doFetchCostInfoForUri = exports.doResolveUri = exports.doResolveUris = exports.doAbandonClaim = exports.doFetchClaimListMine = exports.doShowSnackBar = exports.doCloseModal = exports.doOpenModal = exports.doNotify = exports.isURIClaimable = exports.isURIValid = exports.normalizeURI = exports.buildURI = exports.parseURI = exports.regexAddress = exports.regexInvalidURI = exports.Lbryapi = exports.Lbry = exports.ACTIONS = exports.Notification = undefined; + +var _Notification = __webpack_require__(8); + +Object.defineProperty(exports, 'Notification', { + enumerable: true, + get: function get() { + return _Notification.Notification; + } +}); + +var _lbryURI = __webpack_require__(2); + +Object.defineProperty(exports, 'regexInvalidURI', { + enumerable: true, + get: function get() { + return _lbryURI.regexInvalidURI; + } +}); +Object.defineProperty(exports, 'regexAddress', { + enumerable: true, + get: function get() { + return _lbryURI.regexAddress; + } +}); +Object.defineProperty(exports, 'parseURI', { + enumerable: true, + get: function get() { + return _lbryURI.parseURI; + } +}); +Object.defineProperty(exports, 'buildURI', { + enumerable: true, + get: function get() { + return _lbryURI.buildURI; + } +}); +Object.defineProperty(exports, 'normalizeURI', { + enumerable: true, + get: function get() { + return _lbryURI.normalizeURI; + } +}); +Object.defineProperty(exports, 'isURIValid', { + enumerable: true, + get: function get() { + return _lbryURI.isURIValid; + } +}); +Object.defineProperty(exports, 'isURIClaimable', { + enumerable: true, + get: function get() { + return _lbryURI.isURIClaimable; + } +}); + +var _notifications = __webpack_require__(17); + +Object.defineProperty(exports, 'doNotify', { + enumerable: true, + get: function get() { + return _notifications.doNotify; + } +}); + +var _app = __webpack_require__(6); + +Object.defineProperty(exports, 'doOpenModal', { + enumerable: true, + get: function get() { + return _app.doOpenModal; + } +}); +Object.defineProperty(exports, 'doCloseModal', { + enumerable: true, + get: function get() { + return _app.doCloseModal; + } +}); +Object.defineProperty(exports, 'doShowSnackBar', { + enumerable: true, + get: function get() { + return _app.doShowSnackBar; + } +}); + +var _claims = __webpack_require__(7); + +Object.defineProperty(exports, 'doFetchClaimListMine', { + enumerable: true, + get: function get() { + return _claims.doFetchClaimListMine; + } +}); +Object.defineProperty(exports, 'doAbandonClaim', { + enumerable: true, + get: function get() { + return _claims.doAbandonClaim; + } +}); +Object.defineProperty(exports, 'doResolveUris', { + enumerable: true, + get: function get() { + return _claims.doResolveUris; + } +}); +Object.defineProperty(exports, 'doResolveUri', { + enumerable: true, + get: function get() { + return _claims.doResolveUri; + } +}); + +var _cost_info = __webpack_require__(21); + +Object.defineProperty(exports, 'doFetchCostInfoForUri', { + enumerable: true, + get: function get() { + return _cost_info.doFetchCostInfoForUri; + } +}); + +var _file_info = __webpack_require__(25); + +Object.defineProperty(exports, 'doFetchFileInfo', { + enumerable: true, + get: function get() { + return _file_info.doFetchFileInfo; + } +}); +Object.defineProperty(exports, 'doFileList', { + enumerable: true, + get: function get() { + return _file_info.doFileList; + } +}); +Object.defineProperty(exports, 'doFetchFileInfosAndPublishedClaims', { + enumerable: true, + get: function get() { + return _file_info.doFetchFileInfosAndPublishedClaims; + } +}); + +var _search = __webpack_require__(26); + +Object.defineProperty(exports, 'doSearch', { + enumerable: true, + get: function get() { + return _search.doSearch; + } +}); + +var _wallet = __webpack_require__(27); + +Object.defineProperty(exports, 'doUpdateBalance', { + enumerable: true, + get: function get() { + return _wallet.doUpdateBalance; + } +}); +Object.defineProperty(exports, 'doBalanceSubscribe', { + enumerable: true, + get: function get() { + return _wallet.doBalanceSubscribe; + } +}); +Object.defineProperty(exports, 'doFetchTransactions', { + enumerable: true, + get: function get() { + return _wallet.doFetchTransactions; + } +}); +Object.defineProperty(exports, 'doFetchBlock', { + enumerable: true, + get: function get() { + return _wallet.doFetchBlock; + } +}); +Object.defineProperty(exports, 'doGetNewAddress', { + enumerable: true, + get: function get() { + return _wallet.doGetNewAddress; + } +}); +Object.defineProperty(exports, 'doCheckAddressIsMine', { + enumerable: true, + get: function get() { + return _wallet.doCheckAddressIsMine; + } +}); +Object.defineProperty(exports, 'doSendDraftTransaction', { + enumerable: true, + get: function get() { + return _wallet.doSendDraftTransaction; + } +}); +Object.defineProperty(exports, 'doSetDraftTransactionAmount', { + enumerable: true, + get: function get() { + return _wallet.doSetDraftTransactionAmount; + } +}); +Object.defineProperty(exports, 'doSetDraftTransactionAddress', { + enumerable: true, + get: function get() { + return _wallet.doSetDraftTransactionAddress; + } +}); +Object.defineProperty(exports, 'doSendSupport', { + enumerable: true, + get: function get() { + return _wallet.doSendSupport; + } +}); + +var _batchActions = __webpack_require__(14); + +Object.defineProperty(exports, 'batchActions', { + enumerable: true, + get: function get() { + return _batchActions.batchActions; + } +}); + +var _query_params = __webpack_require__(11); + +Object.defineProperty(exports, 'parseQueryParams', { + enumerable: true, + get: function get() { + return _query_params.parseQueryParams; + } +}); +Object.defineProperty(exports, 'toQueryString', { + enumerable: true, + get: function get() { + return _query_params.toQueryString; + } +}); + +var _claims2 = __webpack_require__(28); + +Object.defineProperty(exports, 'claimsReducer', { + enumerable: true, + get: function get() { + return _claims2.claimsReducer; + } +}); + +var _cost_info2 = __webpack_require__(29); + +Object.defineProperty(exports, 'costInfoReducer', { + enumerable: true, + get: function get() { + return _cost_info2.costInfoReducer; + } +}); + +var _file_info2 = __webpack_require__(30); + +Object.defineProperty(exports, 'fileInfoReducer', { + enumerable: true, + get: function get() { + return _file_info2.fileInfoReducer; + } +}); + +var _notifications2 = __webpack_require__(31); + +Object.defineProperty(exports, 'notificationsReducer', { + enumerable: true, + get: function get() { + return _notifications2.notificationsReducer; + } +}); + +var _search2 = __webpack_require__(32); + +Object.defineProperty(exports, 'searchReducer', { + enumerable: true, + get: function get() { + return _search2.searchReducer; + } +}); + +var _wallet2 = __webpack_require__(33); + +Object.defineProperty(exports, 'walletReducer', { + enumerable: true, + get: function get() { + return _wallet2.walletReducer; + } +}); + +var _notifications3 = __webpack_require__(34); + +Object.defineProperty(exports, 'selectNotification', { + enumerable: true, + get: function get() { + return _notifications3.selectNotification; + } +}); + +var _claims3 = __webpack_require__(3); + +Object.defineProperty(exports, 'makeSelectClaimForUri', { + enumerable: true, + get: function get() { + return _claims3.makeSelectClaimForUri; + } +}); +Object.defineProperty(exports, 'makeSelectClaimIsMine', { + enumerable: true, + get: function get() { + return _claims3.makeSelectClaimIsMine; + } +}); +Object.defineProperty(exports, 'makeSelectFetchingChannelClaims', { + enumerable: true, + get: function get() { + return _claims3.makeSelectFetchingChannelClaims; + } +}); +Object.defineProperty(exports, 'makeSelectClaimsInChannelForCurrentPage', { + enumerable: true, + get: function get() { + return _claims3.makeSelectClaimsInChannelForCurrentPage; + } +}); +Object.defineProperty(exports, 'makeSelectMetadataForUri', { + enumerable: true, + get: function get() { + return _claims3.makeSelectMetadataForUri; + } +}); +Object.defineProperty(exports, 'makeSelectTitleForUri', { + enumerable: true, + get: function get() { + return _claims3.makeSelectTitleForUri; + } +}); +Object.defineProperty(exports, 'makeSelectContentTypeForUri', { + enumerable: true, + get: function get() { + return _claims3.makeSelectContentTypeForUri; + } +}); +Object.defineProperty(exports, 'makeSelectIsUriResolving', { + enumerable: true, + get: function get() { + return _claims3.makeSelectIsUriResolving; + } +}); +Object.defineProperty(exports, 'selectClaimsById', { + enumerable: true, + get: function get() { + return _claims3.selectClaimsById; + } +}); +Object.defineProperty(exports, 'selectClaimsByUri', { + enumerable: true, + get: function get() { + return _claims3.selectClaimsByUri; + } +}); +Object.defineProperty(exports, 'selectAllClaimsByChannel', { + enumerable: true, + get: function get() { + return _claims3.selectAllClaimsByChannel; + } +}); +Object.defineProperty(exports, 'selectMyClaimsRaw', { + enumerable: true, + get: function get() { + return _claims3.selectMyClaimsRaw; + } +}); +Object.defineProperty(exports, 'selectAbandoningIds', { + enumerable: true, + get: function get() { + return _claims3.selectAbandoningIds; + } +}); +Object.defineProperty(exports, 'selectMyActiveClaims', { + enumerable: true, + get: function get() { + return _claims3.selectMyActiveClaims; + } +}); +Object.defineProperty(exports, 'selectAllFetchingChannelClaims', { + enumerable: true, + get: function get() { + return _claims3.selectAllFetchingChannelClaims; + } +}); +Object.defineProperty(exports, 'selectIsFetchingClaimListMine', { + enumerable: true, + get: function get() { + return _claims3.selectIsFetchingClaimListMine; + } +}); +Object.defineProperty(exports, 'selectPendingClaims', { + enumerable: true, + get: function get() { + return _claims3.selectPendingClaims; + } +}); +Object.defineProperty(exports, 'selectMyClaims', { + enumerable: true, + get: function get() { + return _claims3.selectMyClaims; + } +}); +Object.defineProperty(exports, 'selectMyClaimsWithoutChannels', { + enumerable: true, + get: function get() { + return _claims3.selectMyClaimsWithoutChannels; + } +}); +Object.defineProperty(exports, 'selectAllMyClaimsByOutpoint', { + enumerable: true, + get: function get() { + return _claims3.selectAllMyClaimsByOutpoint; + } +}); +Object.defineProperty(exports, 'selectMyClaimsOutpoints', { + enumerable: true, + get: function get() { + return _claims3.selectMyClaimsOutpoints; + } +}); +Object.defineProperty(exports, 'selectFetchingMyChannels', { + enumerable: true, + get: function get() { + return _claims3.selectFetchingMyChannels; + } +}); +Object.defineProperty(exports, 'selectMyChannelClaims', { + enumerable: true, + get: function get() { + return _claims3.selectMyChannelClaims; + } +}); +Object.defineProperty(exports, 'selectResolvingUris', { + enumerable: true, + get: function get() { + return _claims3.selectResolvingUris; + } +}); + +var _cost_info3 = __webpack_require__(35); + +Object.defineProperty(exports, 'makeSelectFetchingCostInfoForUri', { + enumerable: true, + get: function get() { + return _cost_info3.makeSelectFetchingCostInfoForUri; + } +}); +Object.defineProperty(exports, 'makeSelectCostInfoForUri', { + enumerable: true, + get: function get() { + return _cost_info3.makeSelectCostInfoForUri; + } +}); +Object.defineProperty(exports, 'selectAllCostInfoByUri', { + enumerable: true, + get: function get() { + return _cost_info3.selectAllCostInfoByUri; + } +}); +Object.defineProperty(exports, 'selectCostForCurrentPageUri', { + enumerable: true, + get: function get() { + return _cost_info3.selectCostForCurrentPageUri; + } +}); +Object.defineProperty(exports, 'selectFetchingCostInfo', { + enumerable: true, + get: function get() { + return _cost_info3.selectFetchingCostInfo; + } +}); + +var _file_info3 = __webpack_require__(13); + +Object.defineProperty(exports, 'makeSelectFileInfoForUri', { + enumerable: true, + get: function get() { + return _file_info3.makeSelectFileInfoForUri; + } +}); +Object.defineProperty(exports, 'makeSelectDownloadingForUri', { + enumerable: true, + get: function get() { + return _file_info3.makeSelectDownloadingForUri; + } +}); +Object.defineProperty(exports, 'makeSelectLoadingForUri', { + enumerable: true, + get: function get() { + return _file_info3.makeSelectLoadingForUri; + } +}); +Object.defineProperty(exports, 'selectFileInfosByOutpoint', { + enumerable: true, + get: function get() { + return _file_info3.selectFileInfosByOutpoint; + } +}); +Object.defineProperty(exports, 'selectIsFetchingFileList', { + enumerable: true, + get: function get() { + return _file_info3.selectIsFetchingFileList; + } +}); +Object.defineProperty(exports, 'selectIsFetchingFileListDownloadedOrPublished', { + enumerable: true, + get: function get() { + return _file_info3.selectIsFetchingFileListDownloadedOrPublished; + } +}); +Object.defineProperty(exports, 'selectDownloadingByOutpoint', { + enumerable: true, + get: function get() { + return _file_info3.selectDownloadingByOutpoint; + } +}); +Object.defineProperty(exports, 'selectUrisLoading', { + enumerable: true, + get: function get() { + return _file_info3.selectUrisLoading; + } +}); +Object.defineProperty(exports, 'selectFileInfosDownloaded', { + enumerable: true, + get: function get() { + return _file_info3.selectFileInfosDownloaded; + } +}); +Object.defineProperty(exports, 'selectDownloadingFileInfos', { + enumerable: true, + get: function get() { + return _file_info3.selectDownloadingFileInfos; + } +}); +Object.defineProperty(exports, 'selectTotalDownloadProgress', { + enumerable: true, + get: function get() { + return _file_info3.selectTotalDownloadProgress; + } +}); + +var _navigation = __webpack_require__(4); + +Object.defineProperty(exports, 'computePageFromPath', { + enumerable: true, + get: function get() { + return _navigation.computePageFromPath; + } +}); +Object.defineProperty(exports, 'makeSelectCurrentParam', { + enumerable: true, + get: function get() { + return _navigation.makeSelectCurrentParam; + } +}); +Object.defineProperty(exports, 'selectCurrentPath', { + enumerable: true, + get: function get() { + return _navigation.selectCurrentPath; + } +}); +Object.defineProperty(exports, 'selectCurrentPage', { + enumerable: true, + get: function get() { + return _navigation.selectCurrentPage; + } +}); +Object.defineProperty(exports, 'selectCurrentParams', { + enumerable: true, + get: function get() { + return _navigation.selectCurrentParams; + } +}); +Object.defineProperty(exports, 'selectHeaderLinks', { + enumerable: true, + get: function get() { + return _navigation.selectHeaderLinks; + } +}); +Object.defineProperty(exports, 'selectPageTitle', { + enumerable: true, + get: function get() { + return _navigation.selectPageTitle; + } +}); +Object.defineProperty(exports, 'selectPathAfterAuth', { + enumerable: true, + get: function get() { + return _navigation.selectPathAfterAuth; + } +}); +Object.defineProperty(exports, 'selectIsBackDisabled', { + enumerable: true, + get: function get() { + return _navigation.selectIsBackDisabled; + } +}); +Object.defineProperty(exports, 'selectIsForwardDisabled', { + enumerable: true, + get: function get() { + return _navigation.selectIsForwardDisabled; + } +}); +Object.defineProperty(exports, 'selectHistoryIndex', { + enumerable: true, + get: function get() { + return _navigation.selectHistoryIndex; + } +}); +Object.defineProperty(exports, 'selectHistoryStack', { + enumerable: true, + get: function get() { + return _navigation.selectHistoryStack; + } +}); +Object.defineProperty(exports, 'selectActiveHistoryEntry', { + enumerable: true, + get: function get() { + return _navigation.selectActiveHistoryEntry; + } +}); + +var _search3 = __webpack_require__(36); + +Object.defineProperty(exports, 'makeSelectSearchUris', { + enumerable: true, + get: function get() { + return _search3.makeSelectSearchUris; + } +}); +Object.defineProperty(exports, 'selectSearchQuery', { + enumerable: true, + get: function get() { + return _search3.selectSearchQuery; + } +}); +Object.defineProperty(exports, 'selectIsSearching', { + enumerable: true, + get: function get() { + return _search3.selectIsSearching; + } +}); +Object.defineProperty(exports, 'selectSearchUrisByQuery', { + enumerable: true, + get: function get() { + return _search3.selectSearchUrisByQuery; + } +}); +Object.defineProperty(exports, 'selectWunderBarAddress', { + enumerable: true, + get: function get() { + return _search3.selectWunderBarAddress; + } +}); +Object.defineProperty(exports, 'selectWunderBarIcon', { + enumerable: true, + get: function get() { + return _search3.selectWunderBarIcon; + } +}); + +var _wallet3 = __webpack_require__(15); + +Object.defineProperty(exports, 'makeSelectBlockDate', { + enumerable: true, + get: function get() { + return _wallet3.makeSelectBlockDate; + } +}); +Object.defineProperty(exports, 'selectBalance', { + enumerable: true, + get: function get() { + return _wallet3.selectBalance; + } +}); +Object.defineProperty(exports, 'selectTransactionsById', { + enumerable: true, + get: function get() { + return _wallet3.selectTransactionsById; + } +}); +Object.defineProperty(exports, 'selectTransactionItems', { + enumerable: true, + get: function get() { + return _wallet3.selectTransactionItems; + } +}); +Object.defineProperty(exports, 'selectRecentTransactions', { + enumerable: true, + get: function get() { + return _wallet3.selectRecentTransactions; + } +}); +Object.defineProperty(exports, 'selectHasTransactions', { + enumerable: true, + get: function get() { + return _wallet3.selectHasTransactions; + } +}); +Object.defineProperty(exports, 'selectIsFetchingTransactions', { + enumerable: true, + get: function get() { + return _wallet3.selectIsFetchingTransactions; + } +}); +Object.defineProperty(exports, 'selectIsSendingSupport', { + enumerable: true, + get: function get() { + return _wallet3.selectIsSendingSupport; + } +}); +Object.defineProperty(exports, 'selectReceiveAddress', { + enumerable: true, + get: function get() { + return _wallet3.selectReceiveAddress; + } +}); +Object.defineProperty(exports, 'selectGettingNewAddress', { + enumerable: true, + get: function get() { + return _wallet3.selectGettingNewAddress; + } +}); +Object.defineProperty(exports, 'selectDraftTransaction', { + enumerable: true, + get: function get() { + return _wallet3.selectDraftTransaction; + } +}); +Object.defineProperty(exports, 'selectDraftTransactionAmount', { + enumerable: true, + get: function get() { + return _wallet3.selectDraftTransactionAmount; + } +}); +Object.defineProperty(exports, 'selectDraftTransactionAddress', { + enumerable: true, + get: function get() { + return _wallet3.selectDraftTransactionAddress; + } +}); +Object.defineProperty(exports, 'selectDraftTransactionError', { + enumerable: true, + get: function get() { + return _wallet3.selectDraftTransactionError; + } +}); +Object.defineProperty(exports, 'selectBlocks', { + enumerable: true, + get: function get() { + return _wallet3.selectBlocks; + } +}); + +var _action_types = __webpack_require__(0); + +var ACTIONS = _interopRequireWildcard(_action_types); + +var _lbry = __webpack_require__(5); + +var _lbry2 = _interopRequireDefault(_lbry); + +var _lbryapi = __webpack_require__(12); + +var _lbryapi2 = _interopRequireDefault(_lbryapi); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +// constants +exports.ACTIONS = ACTIONS; + +// common + +exports.Lbry = _lbry2.default; +exports.Lbryapi = _lbryapi2.default; + +/***/ }), +/* 17 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.doNotify = doNotify; + +var _action_types = __webpack_require__(0); + +var ACTIONS = _interopRequireWildcard(_action_types); + +var _Notification = __webpack_require__(8); + +var _Notification2 = _interopRequireDefault(_Notification); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function doNotify(data) { + return { + type: ACTIONS.CREATE_NOTIFICATION, + data: data + }; +} + +/***/ }), +/* 18 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +var jsonrpc = {}; + +jsonrpc.call = function (connectionString, method, params, callback, errorCallback, connectFailedCallback) { + function checkAndParse(response) { + if (response.status >= 200 && response.status < 300) { + return response.json(); + } + return response.json().then(function (json) { + var error = void 0; + if (json.error) { + error = new Error(json.error); + } else { + error = new Error('Protocol error with unknown response signature'); + } + return Promise.reject(error); + }); + } + + var counter = parseInt(sessionStorage.getItem('JSONRPCCounter') || 0, 10); + var url = connectionString; + var options = { + method: 'POST', + body: JSON.stringify({ + jsonrpc: '2.0', + method: method, + params: params, + id: counter + }) + }; + + sessionStorage.setItem('JSONRPCCounter', counter + 1); + + return fetch(url, options).then(checkAndParse).then(function (response) { + var error = response.error || response.result && response.result.error; + + if (!error && typeof callback === 'function') { + return callback(response.result); + } + + if (error && typeof errorCallback === 'function') { + return errorCallback(error); + } + + var errorEvent = new CustomEvent('unhandledError', { + detail: { + connectionString: connectionString, + method: method, + params: params, + code: error.code, + message: error.message || error, + data: error.data + } + }); + document.dispatchEvent(errorEvent); + + return Promise.resolve(); + }).catch(function (error) { + if (connectFailedCallback) { + return connectFailedCallback(error); + } + + var errorEvent = new CustomEvent('unhandledError', { + detail: { + connectionString: connectionString, + method: method, + params: params, + code: error.response && error.response.status, + message: __('Connection to API server failed') + } + }); + document.dispatchEvent(errorEvent); + return Promise.resolve(); + }); +}; + +exports.default = jsonrpc; + +/***/ }), +/* 19 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(process, global) {/* + * Copyright 2016 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + + + + +(function(scope) { + if (scope['Proxy']) { + return; + } + let lastRevokeFn = null; + + /** + * @param {*} o + * @return {boolean} whether this is probably a (non-null) Object + */ + function isObject(o) { + return o ? (typeof o == 'object' || typeof o == 'function') : false; + } + + /** + * @constructor + * @param {!Object} target + * @param {{apply, construct, get, set}} handler + */ + scope.Proxy = function(target, handler) { + if (!isObject(target) || !isObject(handler)) { + throw new TypeError('Cannot create proxy with a non-object as target or handler'); + } + + // Construct revoke function, and set lastRevokeFn so that Proxy.revocable can steal it. + // The caller might get the wrong revoke function if a user replaces or wraps scope.Proxy + // to call itself, but that seems unlikely especially when using the polyfill. + let throwRevoked = function() {}; + lastRevokeFn = function() { + throwRevoked = function(trap) { + throw new TypeError(`Cannot perform '${trap}' on a proxy that has been revoked`); + }; + }; + + // Fail on unsupported traps: Chrome doesn't do this, but ensure that users of the polyfill + // are a bit more careful. Copy the internal parts of handler to prevent user changes. + const unsafeHandler = handler; + handler = {'get': null, 'set': null, 'apply': null, 'construct': null}; + for (let k in unsafeHandler) { + if (!(k in handler)) { + throw new TypeError(`Proxy polyfill does not support trap '${k}'`); + } + handler[k] = unsafeHandler[k]; + } + if (typeof unsafeHandler == 'function') { + // Allow handler to be a function (which has an 'apply' method). This matches what is + // probably a bug in native versions. It treats the apply call as a trap to be configured. + handler.apply = unsafeHandler.apply.bind(unsafeHandler); + } + + // Define proxy as this, or a Function (if either it's callable, or apply is set). + // TODO(samthor): Closure compiler doesn't know about 'construct', attempts to rename it. + let proxy = this; + let isMethod = false; + const targetIsFunction = typeof target == 'function'; + if (handler.apply || handler['construct'] || targetIsFunction) { + proxy = function Proxy() { + const usingNew = (this && this.constructor === proxy); + const args = Array.prototype.slice.call(arguments); + throwRevoked(usingNew ? 'construct' : 'apply'); + + if (usingNew && handler['construct']) { + return handler['construct'].call(this, target, args); + } else if (!usingNew && handler.apply) { + return handler.apply(target, this, args); + } else if (targetIsFunction) { + // since the target was a function, fallback to calling it directly. + if (usingNew) { + // inspired by answers to https://stackoverflow.com/q/1606797 + args.unshift(target); // pass class as first arg to constructor, although irrelevant + // nb. cast to convince Closure compiler that this is a constructor + const f = /** @type {!Function} */ (target.bind.apply(target, args)); + return new f(); + } + return target.apply(this, args); + } + throw new TypeError(usingNew ? 'not a constructor' : 'not a function'); + }; + isMethod = true; + } + + // Create default getters/setters. Create different code paths as handler.get/handler.set can't + // change after creation. + const getter = handler.get ? function(prop) { + throwRevoked('get'); + return handler.get(this, prop, proxy); + } : function(prop) { + throwRevoked('get'); + return this[prop]; + }; + const setter = handler.set ? function(prop, value) { + throwRevoked('set'); + const status = handler.set(this, prop, value, proxy); + if (!status) { + // TODO(samthor): If the calling code is in strict mode, throw TypeError. + // It's (sometimes) possible to work this out, if this code isn't strict- try to load the + // callee, and if it's available, that code is non-strict. However, this isn't exhaustive. + } + } : function(prop, value) { + throwRevoked('set'); + this[prop] = value; + }; + + // Clone direct properties (i.e., not part of a prototype). + const propertyNames = Object.getOwnPropertyNames(target); + const propertyMap = {}; + propertyNames.forEach(function(prop) { + if (isMethod && prop in proxy) { + return; // ignore properties already here, e.g. 'bind', 'prototype' etc + } + const real = Object.getOwnPropertyDescriptor(target, prop); + const desc = { + enumerable: !!real.enumerable, + get: getter.bind(target, prop), + set: setter.bind(target, prop), + }; + Object.defineProperty(proxy, prop, desc); + propertyMap[prop] = true; + }); + + // Set the prototype, or clone all prototype methods (always required if a getter is provided). + // TODO(samthor): We don't allow prototype methods to be set. It's (even more) awkward. + // An alternative here would be to _just_ clone methods to keep behavior consistent. + let prototypeOk = true; + if (Object.setPrototypeOf) { + Object.setPrototypeOf(proxy, Object.getPrototypeOf(target)); + } else if (proxy.__proto__) { + proxy.__proto__ = target.__proto__; + } else { + prototypeOk = false; + } + if (handler.get || !prototypeOk) { + for (let k in target) { + if (propertyMap[k]) { + continue; + } + Object.defineProperty(proxy, k, {get: getter.bind(target, k)}); + } + } + + // The Proxy polyfill cannot handle adding new properties. Seal the target and proxy. + Object.seal(target); + Object.seal(proxy); + + return proxy; // nb. if isMethod is true, proxy != this + }; + + scope.Proxy.revocable = function(target, handler) { + const p = new scope.Proxy(target, handler); + return {'proxy': p, 'revoke': lastRevokeFn}; + }; + + scope.Proxy['revocable'] = scope.Proxy.revocable; + scope['Proxy'] = scope.Proxy; +})(typeof process !== 'undefined' && {}.toString.call(process) == '[object process]' ? global : self); + +/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(10), __webpack_require__(20))) + +/***/ }), +/* 20 */ +/***/ (function(module, exports) { + +var g; + +// This works in non-strict mode +g = (function() { + return this; +})(); + +try { + // This works if eval is allowed (see CSP) + g = g || Function("return this")() || (1,eval)("this"); +} catch(e) { + // This works if the window reference is available + if(typeof window === "object") + g = window; +} + +// g can still be undefined, but nothing to do about it... +// We return undefined, instead of nothing here, so it's +// easier to handle this case. if(!global) { ...} + +module.exports = g; /***/ }), /* 21 */ /***/ (function(module, exports, __webpack_require__) { +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.doFetchCostInfoForUri = doFetchCostInfoForUri; + +var _action_types = __webpack_require__(0); + +var ACTIONS = _interopRequireWildcard(_action_types); + +var _lbryapi = __webpack_require__(12); + +var _lbryapi2 = _interopRequireDefault(_lbryapi); + +var _claims = __webpack_require__(3); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +// eslint-disable-next-line import/prefer-default-export +function doFetchCostInfoForUri(uri) { + return function (dispatch, getState) { + var state = getState(); + var claim = (0, _claims.selectClaimsByUri)(state)[uri]; + + if (!claim) return; + + function resolve(costInfo) { + dispatch({ + type: ACTIONS.FETCH_COST_INFO_COMPLETED, + data: { + uri: uri, + costInfo: costInfo + } + }); + } + + var fee = claim.value && claim.value.stream && claim.value.stream.metadata ? claim.value.stream.metadata.fee : undefined; + + if (fee === undefined) { + resolve({ cost: 0, includesData: true }); + } else if (fee.currency === 'LBC') { + resolve({ cost: fee.amount, includesData: true }); + } else { + _lbryapi2.default.getExchangeRates().then(function (_ref) { + var LBC_USD = _ref.LBC_USD; + + resolve({ cost: fee.amount / LBC_USD, includesData: true }); + }); + } + }; +} + +/***/ }), +/* 22 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +exports.decode = exports.parse = __webpack_require__(23); +exports.encode = exports.stringify = __webpack_require__(24); + + +/***/ }), +/* 23 */ +/***/ (function(module, exports, __webpack_require__) { + "use strict"; // Copyright Joyent, Inc. and other Node contributors. // @@ -3215,7 +3426,7 @@ var isArray = Array.isArray || function (xs) { /***/ }), -/* 22 */ +/* 24 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3307,7 +3518,7 @@ var objectKeys = Object.keys || function (obj) { /***/ }), -/* 23 */ +/* 25 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3332,7 +3543,7 @@ var _claims = __webpack_require__(7); var _claims2 = __webpack_require__(3); -var _file_info = __webpack_require__(12); +var _file_info = __webpack_require__(13); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -3400,7 +3611,7 @@ function doFetchFileInfosAndPublishedClaims() { } /***/ }), -/* 24 */ +/* 26 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3421,7 +3632,7 @@ var _claims = __webpack_require__(7); var _navigation = __webpack_require__(4); -var _batchActions = __webpack_require__(13); +var _batchActions = __webpack_require__(14); var _batchActions2 = _interopRequireDefault(_batchActions); @@ -3487,7 +3698,7 @@ function doSearch(rawQuery, currentPageNotSearchHandler) { } /***/ }), -/* 25 */ +/* 27 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3521,7 +3732,7 @@ var _lbry2 = _interopRequireDefault(_lbry); var _app = __webpack_require__(6); -var _wallet = __webpack_require__(14); +var _wallet = __webpack_require__(15); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -3695,7 +3906,7 @@ function doSendSupport(amount, claimId, uri, successCallback, errorCallback) { } /***/ }), -/* 26 */ +/* 28 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3923,7 +4134,7 @@ function claimsReducer() { } /***/ }), -/* 27 */ +/* 29 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3981,7 +4192,7 @@ function costInfoReducer() { } /***/ }), -/* 28 */ +/* 30 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4178,7 +4389,7 @@ function fileInfoReducer() { } /***/ }), -/* 29 */ +/* 31 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4224,7 +4435,7 @@ reducers[ACTIONS.NOTIFICATION_CREATED] = function (state, action) { }); }; -reducers[ACTIONS.NOTIFICATION_DISPLAYED] = function (state, action) { +reducers[ACTIONS.NOTIFICATION_DISPLAYED] = function (state) { var queue = Object.assign([], state.queue); queue.shift(); @@ -4243,7 +4454,7 @@ function notificationsReducer() { } /***/ }), -/* 30 */ +/* 32 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4302,7 +4513,7 @@ function searchReducer() { } /***/ }), -/* 31 */ +/* 33 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4486,7 +4697,7 @@ function walletReducer() { } /***/ }), -/* 32 */ +/* 34 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4508,7 +4719,7 @@ var selectNotification = exports.selectNotification = (0, _reselect.createSelect }); /***/ }), -/* 33 */ +/* 35 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4552,7 +4763,7 @@ var makeSelectFetchingCostInfoForUri = exports.makeSelectFetchingCostInfoForUri }; /***/ }), -/* 34 */ +/* 36 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; diff --git a/package.json b/package.json index 64d6411..b1e2fe5 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ "keytar": "^4.0.3", "localforage": "^1.5.0", "npm": "^5.5.1", + "proxy-polyfill": "^0.1.7", "qrcode.react": "^0.7.2", "rc-progress": "^2.0.6", "react": "^16.2.0", diff --git a/src/lbry.js b/src/lbry.js index 7962210..27c08dc 100644 --- a/src/lbry.js +++ b/src/lbry.js @@ -1,4 +1,5 @@ import jsonrpc from 'jsonrpc'; +import 'proxy-polyfill'; const CHECK_DAEMON_STARTED_TRY_NUMBER = 200; -- 2.45.3 From a27992987811ec62c72d8c15fc7ffc434e50514a Mon Sep 17 00:00:00 2001 From: akinwale Date: Fri, 9 Mar 2018 18:03:37 +0100 Subject: [PATCH 12/41] Some fixes for React Native with Proxy and commonjs2 (#3) * commonjs2 test * commonjs2 test * proxy polyfill tweak * more global tweaks * downgrade proxy-polyfill * proxy polyfill madness * commonjs2 again * localStorage disabled --- build/index.js | 503 +++++++++++++++++------------------ package.json | 2 +- src/lbry.js | 5 +- src/redux/actions/wallet.js | 2 +- src/redux/reducers/wallet.js | 4 +- webpack.config.js | 2 +- 6 files changed, 255 insertions(+), 263 deletions(-) diff --git a/build/index.js b/build/index.js index 3268a19..e1955f2 100644 --- a/build/index.js +++ b/build/index.js @@ -1,14 +1,5 @@ -(function webpackUniversalModuleDefinition(root, factory) { - if(typeof exports === 'object' && typeof module === 'object') - module.exports = factory(); - else if(typeof define === 'function' && define.amd) - define([], factory); - else { - var a = factory(); - for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i]; - } -})(typeof self !== 'undefined' ? self : this, function() { -return /******/ (function(modules) { // webpackBootstrap +module.exports = +/******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ @@ -70,7 +61,7 @@ return /******/ (function(modules) { // webpackBootstrap /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 16); +/******/ return __webpack_require__(__webpack_require__.s = 15); /******/ }) /************************************************************************/ /******/ ([ @@ -832,7 +823,7 @@ var _reselect = __webpack_require__(1); var _lbryURI = __webpack_require__(2); -var _query_params = __webpack_require__(11); +var _query_params = __webpack_require__(10); var selectState = exports.selectState = function selectState(state) { return state.navigation || {}; @@ -993,11 +984,11 @@ Object.defineProperty(exports, "__esModule", { value: true }); -var _jsonrpc = __webpack_require__(18); +var _jsonrpc = __webpack_require__(17); var _jsonrpc2 = _interopRequireDefault(_jsonrpc); -__webpack_require__(19); +__webpack_require__(18); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -1018,13 +1009,14 @@ function apiCall(method, params, resolve, reject) { function getLocal(key) { var fallback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined; - var itemRaw = localStorage.getItem(key); + //const itemRaw = localStorage.getItem(key); + var itemRaw = null; return itemRaw === null ? fallback : JSON.parse(itemRaw); } -function setLocal(key, value) { - localStorage.setItem(key, JSON.stringify(value)); -} +function setLocal(key, value) {} +//localStorage.setItem(key, JSON.stringify(value)); + /** * Records a publish attempt in local storage. Returns a dictionary with all the data needed to @@ -1530,196 +1522,6 @@ var CONFIRM_CLAIM_REVOKE = exports.CONFIRM_CLAIM_REVOKE = 'confirmClaimRevoke'; /***/ }), /* 10 */ -/***/ (function(module, exports) { - -// shim for using process in browser -var process = module.exports = {}; - -// cached from whatever global is present so that test runners that stub it -// don't break things. But we need to wrap it in a try catch in case it is -// wrapped in strict mode code which doesn't define any globals. It's inside a -// function because try/catches deoptimize in certain engines. - -var cachedSetTimeout; -var cachedClearTimeout; - -function defaultSetTimout() { - throw new Error('setTimeout has not been defined'); -} -function defaultClearTimeout () { - throw new Error('clearTimeout has not been defined'); -} -(function () { - try { - if (typeof setTimeout === 'function') { - cachedSetTimeout = setTimeout; - } else { - cachedSetTimeout = defaultSetTimout; - } - } catch (e) { - cachedSetTimeout = defaultSetTimout; - } - try { - if (typeof clearTimeout === 'function') { - cachedClearTimeout = clearTimeout; - } else { - cachedClearTimeout = defaultClearTimeout; - } - } catch (e) { - cachedClearTimeout = defaultClearTimeout; - } -} ()) -function runTimeout(fun) { - if (cachedSetTimeout === setTimeout) { - //normal enviroments in sane situations - return setTimeout(fun, 0); - } - // if setTimeout wasn't available but was latter defined - if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { - cachedSetTimeout = setTimeout; - return setTimeout(fun, 0); - } - try { - // when when somebody has screwed with setTimeout but no I.E. maddness - return cachedSetTimeout(fun, 0); - } catch(e){ - try { - // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally - return cachedSetTimeout.call(null, fun, 0); - } catch(e){ - // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error - return cachedSetTimeout.call(this, fun, 0); - } - } - - -} -function runClearTimeout(marker) { - if (cachedClearTimeout === clearTimeout) { - //normal enviroments in sane situations - return clearTimeout(marker); - } - // if clearTimeout wasn't available but was latter defined - if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { - cachedClearTimeout = clearTimeout; - return clearTimeout(marker); - } - try { - // when when somebody has screwed with setTimeout but no I.E. maddness - return cachedClearTimeout(marker); - } catch (e){ - try { - // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally - return cachedClearTimeout.call(null, marker); - } catch (e){ - // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. - // Some versions of I.E. have different rules for clearTimeout vs setTimeout - return cachedClearTimeout.call(this, marker); - } - } - - - -} -var queue = []; -var draining = false; -var currentQueue; -var queueIndex = -1; - -function cleanUpNextTick() { - if (!draining || !currentQueue) { - return; - } - draining = false; - if (currentQueue.length) { - queue = currentQueue.concat(queue); - } else { - queueIndex = -1; - } - if (queue.length) { - drainQueue(); - } -} - -function drainQueue() { - if (draining) { - return; - } - var timeout = runTimeout(cleanUpNextTick); - draining = true; - - var len = queue.length; - while(len) { - currentQueue = queue; - queue = []; - while (++queueIndex < len) { - if (currentQueue) { - currentQueue[queueIndex].run(); - } - } - queueIndex = -1; - len = queue.length; - } - currentQueue = null; - draining = false; - runClearTimeout(timeout); -} - -process.nextTick = function (fun) { - var args = new Array(arguments.length - 1); - if (arguments.length > 1) { - for (var i = 1; i < arguments.length; i++) { - args[i - 1] = arguments[i]; - } - } - queue.push(new Item(fun, args)); - if (queue.length === 1 && !draining) { - runTimeout(drainQueue); - } -}; - -// v8 likes predictible objects -function Item(fun, array) { - this.fun = fun; - this.array = array; -} -Item.prototype.run = function () { - this.fun.apply(null, this.array); -}; -process.title = 'browser'; -process.browser = true; -process.env = {}; -process.argv = []; -process.version = ''; // empty string to avoid regexp issues -process.versions = {}; - -function noop() {} - -process.on = noop; -process.addListener = noop; -process.once = noop; -process.off = noop; -process.removeListener = noop; -process.removeAllListeners = noop; -process.emit = noop; -process.prependListener = noop; -process.prependOnceListener = noop; - -process.listeners = function (name) { return [] } - -process.binding = function (name) { - throw new Error('process.binding is not supported'); -}; - -process.cwd = function () { return '/' }; -process.chdir = function (dir) { - throw new Error('process.chdir is not supported'); -}; -process.umask = function() { return 0; }; - - -/***/ }), -/* 11 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1764,7 +1566,7 @@ function toQueryString(params) { } /***/ }), -/* 12 */ +/* 11 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1867,10 +1669,10 @@ Lbryapi.call = function (resource, action) { }; exports.default = Lbryapi; -/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(10))) +/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(21))) /***/ }), -/* 13 */ +/* 12 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1979,7 +1781,7 @@ var selectTotalDownloadProgress = exports.selectTotalDownloadProgress = (0, _res }); /***/ }), -/* 14 */ +/* 13 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2002,7 +1804,7 @@ function batchActions() { } /***/ }), -/* 15 */ +/* 14 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2138,7 +1940,7 @@ var makeSelectBlockDate = exports.makeSelectBlockDate = function makeSelectBlock }; /***/ }), -/* 16 */ +/* 15 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2204,7 +2006,7 @@ Object.defineProperty(exports, 'isURIClaimable', { } }); -var _notifications = __webpack_require__(17); +var _notifications = __webpack_require__(16); Object.defineProperty(exports, 'doNotify', { enumerable: true, @@ -2261,7 +2063,7 @@ Object.defineProperty(exports, 'doResolveUri', { } }); -var _cost_info = __webpack_require__(21); +var _cost_info = __webpack_require__(20); Object.defineProperty(exports, 'doFetchCostInfoForUri', { enumerable: true, @@ -2363,7 +2165,7 @@ Object.defineProperty(exports, 'doSendSupport', { } }); -var _batchActions = __webpack_require__(14); +var _batchActions = __webpack_require__(13); Object.defineProperty(exports, 'batchActions', { enumerable: true, @@ -2372,7 +2174,7 @@ Object.defineProperty(exports, 'batchActions', { } }); -var _query_params = __webpack_require__(11); +var _query_params = __webpack_require__(10); Object.defineProperty(exports, 'parseQueryParams', { enumerable: true, @@ -2630,7 +2432,7 @@ Object.defineProperty(exports, 'selectFetchingCostInfo', { } }); -var _file_info3 = __webpack_require__(13); +var _file_info3 = __webpack_require__(12); Object.defineProperty(exports, 'makeSelectFileInfoForUri', { enumerable: true, @@ -2819,7 +2621,7 @@ Object.defineProperty(exports, 'selectWunderBarIcon', { } }); -var _wallet3 = __webpack_require__(15); +var _wallet3 = __webpack_require__(14); Object.defineProperty(exports, 'makeSelectBlockDate', { enumerable: true, @@ -2920,7 +2722,7 @@ var _lbry = __webpack_require__(5); var _lbry2 = _interopRequireDefault(_lbry); -var _lbryapi = __webpack_require__(12); +var _lbryapi = __webpack_require__(11); var _lbryapi2 = _interopRequireDefault(_lbryapi); @@ -2937,7 +2739,7 @@ exports.Lbry = _lbry2.default; exports.Lbryapi = _lbryapi2.default; /***/ }), -/* 17 */ +/* 16 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2968,7 +2770,7 @@ function doNotify(data) { } /***/ }), -/* 18 */ +/* 17 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3055,11 +2857,11 @@ jsonrpc.call = function (connectionString, method, params, callback, errorCallba exports.default = jsonrpc; /***/ }), -/* 19 */ +/* 18 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -/* WEBPACK VAR INJECTION */(function(process, global) {/* +/* WEBPACK VAR INJECTION */(function(global) {/* * Copyright 2016 Google Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not @@ -3114,7 +2916,7 @@ exports.default = jsonrpc; // Fail on unsupported traps: Chrome doesn't do this, but ensure that users of the polyfill // are a bit more careful. Copy the internal parts of handler to prevent user changes. - const unsafeHandler = handler; + let unsafeHandler = handler; handler = {'get': null, 'set': null, 'apply': null, 'construct': null}; for (let k in unsafeHandler) { if (!(k in handler)) { @@ -3132,27 +2934,27 @@ exports.default = jsonrpc; // TODO(samthor): Closure compiler doesn't know about 'construct', attempts to rename it. let proxy = this; let isMethod = false; - const targetIsFunction = typeof target == 'function'; + let targetIsFunction = typeof target == 'function'; if (handler.apply || handler['construct'] || targetIsFunction) { proxy = function Proxy() { - const usingNew = (this && this.constructor === proxy); - const args = Array.prototype.slice.call(arguments); + let usingNew = (this && this.constructor === proxy); throwRevoked(usingNew ? 'construct' : 'apply'); if (usingNew && handler['construct']) { - return handler['construct'].call(this, target, args); + return handler['construct'].call(this, target, arguments); } else if (!usingNew && handler.apply) { - return handler.apply(target, this, args); + return handler.apply(target, this, arguments); } else if (targetIsFunction) { // since the target was a function, fallback to calling it directly. if (usingNew) { // inspired by answers to https://stackoverflow.com/q/1606797 - args.unshift(target); // pass class as first arg to constructor, although irrelevant + let all = Array.prototype.slice.call(arguments); + all.unshift(target); // pass class as first arg to constructor, although irrelevant // nb. cast to convince Closure compiler that this is a constructor - const f = /** @type {!Function} */ (target.bind.apply(target, args)); + let f = /** @type {!Function} */ (target.bind.apply(target, all)); return new f(); } - return target.apply(this, args); + return target.apply(this, arguments); } throw new TypeError(usingNew ? 'not a constructor' : 'not a function'); }; @@ -3161,16 +2963,16 @@ exports.default = jsonrpc; // Create default getters/setters. Create different code paths as handler.get/handler.set can't // change after creation. - const getter = handler.get ? function(prop) { + let getter = handler.get ? function(prop) { throwRevoked('get'); return handler.get(this, prop, proxy); } : function(prop) { throwRevoked('get'); return this[prop]; }; - const setter = handler.set ? function(prop, value) { + let setter = handler.set ? function(prop, value) { throwRevoked('set'); - const status = handler.set(this, prop, value, proxy); + let status = handler.set(this, prop, value, proxy); if (!status) { // TODO(samthor): If the calling code is in strict mode, throw TypeError. // It's (sometimes) possible to work this out, if this code isn't strict- try to load the @@ -3182,14 +2984,14 @@ exports.default = jsonrpc; }; // Clone direct properties (i.e., not part of a prototype). - const propertyNames = Object.getOwnPropertyNames(target); - const propertyMap = {}; + let propertyNames = Object.getOwnPropertyNames(target); + let propertyMap = {}; propertyNames.forEach(function(prop) { if (isMethod && prop in proxy) { return; // ignore properties already here, e.g. 'bind', 'prototype' etc } - const real = Object.getOwnPropertyDescriptor(target, prop); - const desc = { + let real = Object.getOwnPropertyDescriptor(target, prop); + let desc = { enumerable: !!real.enumerable, get: getter.bind(target, prop), set: setter.bind(target, prop), @@ -3226,18 +3028,18 @@ exports.default = jsonrpc; }; scope.Proxy.revocable = function(target, handler) { - const p = new scope.Proxy(target, handler); + let p = new scope.Proxy(target, handler); return {'proxy': p, 'revoke': lastRevokeFn}; }; scope.Proxy['revocable'] = scope.Proxy.revocable; scope['Proxy'] = scope.Proxy; -})(typeof process !== 'undefined' && {}.toString.call(process) == '[object process]' ? global : self); +})(typeof module !== 'undefined' && module['exports'] ? global : window); -/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(10), __webpack_require__(20))) +/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(19))) /***/ }), -/* 20 */ +/* 19 */ /***/ (function(module, exports) { var g; @@ -3264,7 +3066,7 @@ module.exports = g; /***/ }), -/* 21 */ +/* 20 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3279,7 +3081,7 @@ var _action_types = __webpack_require__(0); var ACTIONS = _interopRequireWildcard(_action_types); -var _lbryapi = __webpack_require__(12); +var _lbryapi = __webpack_require__(11); var _lbryapi2 = _interopRequireDefault(_lbryapi); @@ -3323,6 +3125,196 @@ function doFetchCostInfoForUri(uri) { }; } +/***/ }), +/* 21 */ +/***/ (function(module, exports) { + +// shim for using process in browser +var process = module.exports = {}; + +// cached from whatever global is present so that test runners that stub it +// don't break things. But we need to wrap it in a try catch in case it is +// wrapped in strict mode code which doesn't define any globals. It's inside a +// function because try/catches deoptimize in certain engines. + +var cachedSetTimeout; +var cachedClearTimeout; + +function defaultSetTimout() { + throw new Error('setTimeout has not been defined'); +} +function defaultClearTimeout () { + throw new Error('clearTimeout has not been defined'); +} +(function () { + try { + if (typeof setTimeout === 'function') { + cachedSetTimeout = setTimeout; + } else { + cachedSetTimeout = defaultSetTimout; + } + } catch (e) { + cachedSetTimeout = defaultSetTimout; + } + try { + if (typeof clearTimeout === 'function') { + cachedClearTimeout = clearTimeout; + } else { + cachedClearTimeout = defaultClearTimeout; + } + } catch (e) { + cachedClearTimeout = defaultClearTimeout; + } +} ()) +function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + //normal enviroments in sane situations + return setTimeout(fun, 0); + } + // if setTimeout wasn't available but was latter defined + if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedSetTimeout(fun, 0); + } catch(e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedSetTimeout.call(null, fun, 0); + } catch(e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error + return cachedSetTimeout.call(this, fun, 0); + } + } + + +} +function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + //normal enviroments in sane situations + return clearTimeout(marker); + } + // if clearTimeout wasn't available but was latter defined + if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedClearTimeout(marker); + } catch (e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedClearTimeout.call(null, marker); + } catch (e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. + // Some versions of I.E. have different rules for clearTimeout vs setTimeout + return cachedClearTimeout.call(this, marker); + } + } + + + +} +var queue = []; +var draining = false; +var currentQueue; +var queueIndex = -1; + +function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } +} + +function drainQueue() { + if (draining) { + return; + } + var timeout = runTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + runClearTimeout(timeout); +} + +process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); + } +}; + +// v8 likes predictible objects +function Item(fun, array) { + this.fun = fun; + this.array = array; +} +Item.prototype.run = function () { + this.fun.apply(null, this.array); +}; +process.title = 'browser'; +process.browser = true; +process.env = {}; +process.argv = []; +process.version = ''; // empty string to avoid regexp issues +process.versions = {}; + +function noop() {} + +process.on = noop; +process.addListener = noop; +process.once = noop; +process.off = noop; +process.removeListener = noop; +process.removeAllListeners = noop; +process.emit = noop; +process.prependListener = noop; +process.prependOnceListener = noop; + +process.listeners = function (name) { return [] } + +process.binding = function (name) { + throw new Error('process.binding is not supported'); +}; + +process.cwd = function () { return '/' }; +process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); +}; +process.umask = function() { return 0; }; + + /***/ }), /* 22 */ /***/ (function(module, exports, __webpack_require__) { @@ -3543,7 +3535,7 @@ var _claims = __webpack_require__(7); var _claims2 = __webpack_require__(3); -var _file_info = __webpack_require__(13); +var _file_info = __webpack_require__(12); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -3632,7 +3624,7 @@ var _claims = __webpack_require__(7); var _navigation = __webpack_require__(4); -var _batchActions = __webpack_require__(14); +var _batchActions = __webpack_require__(13); var _batchActions2 = _interopRequireDefault(_batchActions); @@ -3732,7 +3724,7 @@ var _lbry2 = _interopRequireDefault(_lbry); var _app = __webpack_require__(6); -var _wallet = __webpack_require__(15); +var _wallet = __webpack_require__(14); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -3795,7 +3787,7 @@ function doGetNewAddress() { }); _lbry2.default.wallet_new_address().then(function (address) { - localStorage.setItem('wallet_address', address); + //localStorage.setItem('wallet_address', address); dispatch({ type: ACTIONS.GET_NEW_ADDRESS_COMPLETED, data: { address: address } @@ -4531,7 +4523,7 @@ var ACTIONS = _interopRequireWildcard(_action_types); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } var reducers = {}; -var receiveAddress = localStorage.getItem('receiveAddress'); +var receiveAddress = null; //localStorage.getItem('receiveAddress'); var buildDraftTransaction = function buildDraftTransaction() { return { amount: undefined, @@ -4581,8 +4573,8 @@ reducers[ACTIONS.GET_NEW_ADDRESS_STARTED] = function (state) { reducers[ACTIONS.GET_NEW_ADDRESS_COMPLETED] = function (state, action) { var address = action.data.address; + //localStorage.setItem('receiveAddress', address); - localStorage.setItem('receiveAddress', address); return Object.assign({}, state, { gettingNewAddress: false, receiveAddress: address @@ -4851,5 +4843,4 @@ var selectWunderBarIcon = exports.selectWunderBarIcon = (0, _reselect.createSele }); /***/ }) -/******/ ]); -}); \ No newline at end of file +/******/ ]); \ No newline at end of file diff --git a/package.json b/package.json index b1e2fe5..1d9025f 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "keytar": "^4.0.3", "localforage": "^1.5.0", "npm": "^5.5.1", - "proxy-polyfill": "^0.1.7", + "proxy-polyfill": "0.1.6", "qrcode.react": "^0.7.2", "rc-progress": "^2.0.6", "react": "^16.2.0", diff --git a/src/lbry.js b/src/lbry.js index 27c08dc..b2b7aa3 100644 --- a/src/lbry.js +++ b/src/lbry.js @@ -14,12 +14,13 @@ function apiCall(method, params, resolve, reject) { } function getLocal(key, fallback = undefined) { - const itemRaw = localStorage.getItem(key); + //const itemRaw = localStorage.getItem(key); + const itemRaw = null; return itemRaw === null ? fallback : JSON.parse(itemRaw); } function setLocal(key, value) { - localStorage.setItem(key, JSON.stringify(value)); + //localStorage.setItem(key, JSON.stringify(value)); } /** diff --git a/src/redux/actions/wallet.js b/src/redux/actions/wallet.js index e1f66d0..be7593c 100644 --- a/src/redux/actions/wallet.js +++ b/src/redux/actions/wallet.js @@ -63,7 +63,7 @@ export function doGetNewAddress() { }); Lbry.wallet_new_address().then(address => { - localStorage.setItem('wallet_address', address); + //localStorage.setItem('wallet_address', address); dispatch({ type: ACTIONS.GET_NEW_ADDRESS_COMPLETED, data: { address }, diff --git a/src/redux/reducers/wallet.js b/src/redux/reducers/wallet.js index 9237178..bdc7123 100644 --- a/src/redux/reducers/wallet.js +++ b/src/redux/reducers/wallet.js @@ -1,7 +1,7 @@ import * as ACTIONS from 'constants/action_types'; const reducers = {}; -const receiveAddress = localStorage.getItem('receiveAddress'); +const receiveAddress = null;//localStorage.getItem('receiveAddress'); const buildDraftTransaction = () => ({ amount: undefined, address: undefined, @@ -46,7 +46,7 @@ reducers[ACTIONS.GET_NEW_ADDRESS_STARTED] = state => reducers[ACTIONS.GET_NEW_ADDRESS_COMPLETED] = (state, action) => { const { address } = action.data; - localStorage.setItem('receiveAddress', address); + //localStorage.setItem('receiveAddress', address); return Object.assign({}, state, { gettingNewAddress: false, receiveAddress: address, diff --git a/webpack.config.js b/webpack.config.js index 1bb41cf..3c8c34b 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -4,7 +4,7 @@ module.exports = { output: { path: path.resolve(__dirname, 'build'), filename: 'index.js', - libraryTarget: 'umd' + libraryTarget: 'commonjs2' }, module: { rules: [ -- 2.45.3 From 713967fa4281710d54f4045c26ca36ad4b8ad6c4 Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Fri, 9 Mar 2018 18:07:49 +0100 Subject: [PATCH 13/41] added featured URIs handling to claims actions and selectors[A --- build/index.js | 605 +++++++++++++++++++++------------- src/index.js | 9 + src/redux/actions/claims.js | 72 +++- src/redux/selectors/claims.js | 28 ++ webpack.config.js | 2 +- 5 files changed, 484 insertions(+), 232 deletions(-) diff --git a/build/index.js b/build/index.js index 3268a19..254cd79 100644 --- a/build/index.js +++ b/build/index.js @@ -1,14 +1,5 @@ -(function webpackUniversalModuleDefinition(root, factory) { - if(typeof exports === 'object' && typeof module === 'object') - module.exports = factory(); - else if(typeof define === 'function' && define.amd) - define([], factory); - else { - var a = factory(); - for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i]; - } -})(typeof self !== 'undefined' ? self : this, function() { -return /******/ (function(modules) { // webpackBootstrap +module.exports = +/******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ @@ -629,7 +620,7 @@ function isURIClaimable(URI) { Object.defineProperty(exports, "__esModule", { value: true }); -exports.makeSelectIsUriResolving = exports.selectResolvingUris = exports.selectMyChannelClaims = exports.selectFetchingMyChannels = exports.selectMyClaimsOutpoints = exports.selectAllMyClaimsByOutpoint = exports.selectMyClaimsWithoutChannels = exports.selectMyClaims = exports.selectPendingClaims = exports.selectIsFetchingClaimListMine = exports.makeSelectContentTypeForUri = exports.makeSelectTitleForUri = exports.makeSelectMetadataForUri = exports.makeSelectClaimsInChannelForCurrentPage = exports.makeSelectFetchingChannelClaims = exports.selectAllFetchingChannelClaims = exports.makeSelectClaimIsMine = exports.selectMyActiveClaims = exports.selectAbandoningIds = exports.selectMyClaimsRaw = exports.makeSelectClaimForUri = exports.selectAllClaimsByChannel = exports.selectClaimsByUri = exports.selectClaimsById = undefined; +exports.selectRewardContentClaimIds = exports.makeSelectTotalPagesForChannel = exports.makeSelectTotalItemsForChannel = exports.selectChannelClaimCounts = exports.selectPlayingUri = exports.selectFetchingFeaturedUris = exports.selectFeaturedUris = exports.makeSelectIsUriResolving = exports.selectResolvingUris = exports.selectMyChannelClaims = exports.selectFetchingMyChannels = exports.selectMyClaimsOutpoints = exports.selectAllMyClaimsByOutpoint = exports.selectMyClaimsWithoutChannels = exports.selectMyClaims = exports.selectPendingClaims = exports.selectIsFetchingClaimListMine = exports.makeSelectContentTypeForUri = exports.makeSelectTitleForUri = exports.makeSelectMetadataForUri = exports.makeSelectClaimsInChannelForCurrentPage = exports.makeSelectFetchingChannelClaims = exports.selectAllFetchingChannelClaims = exports.makeSelectClaimIsMine = exports.selectMyActiveClaims = exports.selectAbandoningIds = exports.selectMyClaimsRaw = exports.makeSelectClaimForUri = exports.selectAllClaimsByChannel = exports.selectClaimsByUri = exports.selectClaimsById = undefined; var _lbryURI = __webpack_require__(2); @@ -816,6 +807,38 @@ var makeSelectIsUriResolving = exports.makeSelectIsUriResolving = function makeS }); }; +var selectFeaturedUris = exports.selectFeaturedUris = (0, _reselect.createSelector)(selectState, function (state) { + return state.featuredUris; +}); + +var selectFetchingFeaturedUris = exports.selectFetchingFeaturedUris = (0, _reselect.createSelector)(selectState, function (state) { + return state.fetchingFeaturedContent; +}); + +var selectPlayingUri = exports.selectPlayingUri = (0, _reselect.createSelector)(selectState, function (state) { + return state.playingUri; +}); + +var selectChannelClaimCounts = exports.selectChannelClaimCounts = (0, _reselect.createSelector)(selectState, function (state) { + return state.channelClaimCounts || {}; +}); + +var makeSelectTotalItemsForChannel = exports.makeSelectTotalItemsForChannel = function makeSelectTotalItemsForChannel(uri) { + return (0, _reselect.createSelector)(selectChannelClaimCounts, function (byUri) { + return byUri && byUri[uri]; + }); +}; + +var makeSelectTotalPagesForChannel = exports.makeSelectTotalPagesForChannel = function makeSelectTotalPagesForChannel(uri) { + return (0, _reselect.createSelector)(selectChannelClaimCounts, function (byUri) { + return byUri && byUri[uri] && Math.ceil(byUri[uri] / 10); + }); +}; + +var selectRewardContentClaimIds = exports.selectRewardContentClaimIds = (0, _reselect.createSelector)(selectState, function (state) { + return state.rewardedContentClaimIds; +}); + /***/ }), /* 4 */ /***/ (function(module, exports, __webpack_require__) { @@ -832,7 +855,7 @@ var _reselect = __webpack_require__(1); var _lbryURI = __webpack_require__(2); -var _query_params = __webpack_require__(11); +var _query_params = __webpack_require__(13); var selectState = exports.selectState = function selectState(state) { return state.navigation || {}; @@ -1358,12 +1381,14 @@ exports.doResolveUris = doResolveUris; exports.doResolveUri = doResolveUri; exports.doFetchClaimListMine = doFetchClaimListMine; exports.doAbandonClaim = doAbandonClaim; +exports.doFetchFeaturedUris = doFetchFeaturedUris; +exports.doFetchRewardedContent = doFetchRewardedContent; var _action_types = __webpack_require__(0); var ACTIONS = _interopRequireWildcard(_action_types); -var _modal_types = __webpack_require__(9); +var _modal_types = __webpack_require__(11); var MODALS = _interopRequireWildcard(_modal_types); @@ -1371,16 +1396,26 @@ var _lbry = __webpack_require__(5); var _lbry2 = _interopRequireDefault(_lbry); +var _lbryapi = __webpack_require__(8); + +var _lbryapi2 = _interopRequireDefault(_lbryapi); + var _lbryURI = __webpack_require__(2); var _app = __webpack_require__(6); var _claims = __webpack_require__(3); +var _batchActions = __webpack_require__(9); + +var _batchActions2 = _interopRequireDefault(_batchActions); + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } +function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } + function doResolveUris(uris) { return function (dispatch, getState) { var normalizedUris = uris.map(_lbryURI.normalizeURI); @@ -1470,7 +1505,7 @@ function doAbandonClaim(txid, nout) { }); var errorCallback = function errorCallback() { - dispatch((0, _app.doOpenModal)(MODALS.TRANSACTION_FAILED)); + // dispatch(doOpenModal(MODALS.TRANSACTION_FAILED)); }; var successCallback = function successCallback(results) { @@ -1484,7 +1519,7 @@ function doAbandonClaim(txid, nout) { dispatch(doResolveUri((0, _lbryURI.buildURI)({ name: name, claimId: claimId }))); dispatch(doFetchClaimListMine()); } else { - dispatch((0, _app.doOpenModal)(MODALS.TRANSACTION_FAILED)); + // dispatch(doOpenModal(MODALS.TRANSACTION_FAILED)); } }; @@ -1495,15 +1530,207 @@ function doAbandonClaim(txid, nout) { }; } +function doFetchFeaturedUris() { + return function (dispatch) { + dispatch({ + type: ACTIONS.FETCH_FEATURED_CONTENT_STARTED + }); + + var success = function success(_ref4) { + var Uris = _ref4.Uris; + + var urisToResolve = []; + Object.keys(Uris).forEach(function (category) { + urisToResolve = [].concat(_toConsumableArray(urisToResolve), _toConsumableArray(Uris[category])); + }); + + var actions = [doResolveUris(urisToResolve), { + type: ACTIONS.FETCH_FEATURED_CONTENT_COMPLETED, + data: { + uris: Uris, + success: true + } + }]; + dispatch(_batchActions2.default.apply(undefined, actions)); + }; + + var failure = function failure() { + dispatch({ + type: ACTIONS.FETCH_FEATURED_CONTENT_COMPLETED, + data: { + uris: {} + } + }); + }; + + _lbryapi2.default.call('file', 'list_homepage').then(success, failure); + }; +} + +function doFetchRewardedContent() { + return function (dispatch) { + var success = function success(nameToClaimId) { + dispatch({ + type: ACTIONS.FETCH_REWARD_CONTENT_COMPLETED, + data: { + claimIds: Object.values(nameToClaimId), + success: true + } + }); + }; + + var failure = function failure() { + dispatch({ + type: ACTIONS.FETCH_REWARD_CONTENT_COMPLETED, + data: { + claimIds: [], + success: false + } + }); + }; + + _lbryapi2.default.call('reward', 'list_featured').then(success, failure); + }; +} + /***/ }), /* 8 */ /***/ (function(module, exports, __webpack_require__) { +"use strict"; +/* WEBPACK VAR INJECTION */(function(process) { + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +var _querystring = __webpack_require__(21); + +var _querystring2 = _interopRequireDefault(_querystring); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var Lbryapi = { + enabled: true, + exchangePromise: null, + exchangeLastFetched: null +}; + +var CONNECTION_STRING = process.env.LBRY_APP_API_URL ? process.env.LBRY_APP_API_URL.replace(/\/*$/, '/') // exactly one slash at the end +: 'https://api.lbry.io/'; + +var EXCHANGE_RATE_TIMEOUT = 20 * 60 * 1000; + +Lbryapi.getExchangeRates = function () { + if (!Lbryapi.exchangeLastFetched || Date.now() - Lbryapi.exchangeLastFetched > EXCHANGE_RATE_TIMEOUT) { + Lbryapi.exchangePromise = new Promise(function (resolve, reject) { + Lbryapi.call('lbc', 'exchange_rate', {}, 'get', true).then(function (_ref) { + var LBC_USD = _ref.lbc_usd, + LBC_BTC = _ref.lbc_btc, + BTC_USD = _ref.btc_usd; + + var rates = { LBC_USD: LBC_USD, LBC_BTC: LBC_BTC, BTC_USD: BTC_USD }; + resolve(rates); + }).catch(reject); + }); + Lbryapi.exchangeLastFetched = Date.now(); + } + return Lbryapi.exchangePromise; +}; + +Lbryapi.call = function (resource, action) { + var params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + var method = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'get'; + + if (!Lbryapi.enabled) { + return Promise.reject(new Error(__('LBRY internal API is disabled'))); + } + + if (!(method === 'get' || method === 'post')) { + return Promise.reject(new Error(__('Invalid method'))); + } + + function checkAndParse(response) { + if (response.status >= 200 && response.status < 300) { + return response.json(); + } + return response.json().then(function (json) { + var error = void 0; + if (json.error) { + error = new Error(json.error); + } else { + error = new Error('Unknown API error signature'); + } + error.response = response; // This is primarily a hack used in actions/user.js + return Promise.reject(error); + }); + } + + function makeRequest(url, options) { + return fetch(url, options).then(checkAndParse); + } + + var fullParams = _extends({}, params); + var qs = _querystring2.default.stringify(fullParams); + var url = '' + CONNECTION_STRING + resource + '/' + action + '?' + qs; + + var options = { + method: 'GET' + }; + + if (method === 'post') { + options = { + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded' + }, + body: qs + }; + url = '' + CONNECTION_STRING + resource + '/' + action; + } + + return makeRequest(url, options).then(function (response) { + return response.data; + }); +}; + +exports.default = Lbryapi; +/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(12))) + +/***/ }), +/* 9 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.batchActions = batchActions; +// https://github.com/reactjs/redux/issues/911 +function batchActions() { + for (var _len = arguments.length, actions = Array(_len), _key = 0; _key < _len; _key++) { + actions[_key] = arguments[_key]; + } + + return { + type: 'BATCH_ACTIONS', + actions: actions + }; +} + +/***/ }), +/* 10 */ +/***/ (function(module, exports, __webpack_require__) { + "use strict"; /***/ }), -/* 9 */ +/* 11 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1529,7 +1756,7 @@ var AFFIRM_PURCHASE = exports.AFFIRM_PURCHASE = 'affirm_purchase'; var CONFIRM_CLAIM_REVOKE = exports.CONFIRM_CLAIM_REVOKE = 'confirmClaimRevoke'; /***/ }), -/* 10 */ +/* 12 */ /***/ (function(module, exports) { // shim for using process in browser @@ -1719,7 +1946,7 @@ process.umask = function() { return 0; }; /***/ }), -/* 11 */ +/* 13 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1764,113 +1991,7 @@ function toQueryString(params) { } /***/ }), -/* 12 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/* WEBPACK VAR INJECTION */(function(process) { - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; - -var _querystring = __webpack_require__(22); - -var _querystring2 = _interopRequireDefault(_querystring); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var Lbryapi = { - enabled: true, - exchangePromise: null, - exchangeLastFetched: null -}; - -var CONNECTION_STRING = process.env.LBRY_APP_API_URL ? process.env.LBRY_APP_API_URL.replace(/\/*$/, '/') // exactly one slash at the end -: 'https://api.lbry.io/'; - -var EXCHANGE_RATE_TIMEOUT = 20 * 60 * 1000; - -Lbryapi.getExchangeRates = function () { - if (!Lbryapi.exchangeLastFetched || Date.now() - Lbryapi.exchangeLastFetched > EXCHANGE_RATE_TIMEOUT) { - Lbryapi.exchangePromise = new Promise(function (resolve, reject) { - Lbryapi.call('lbc', 'exchange_rate', {}, 'get', true).then(function (_ref) { - var LBC_USD = _ref.lbc_usd, - LBC_BTC = _ref.lbc_btc, - BTC_USD = _ref.btc_usd; - - var rates = { LBC_USD: LBC_USD, LBC_BTC: LBC_BTC, BTC_USD: BTC_USD }; - resolve(rates); - }).catch(reject); - }); - Lbryapi.exchangeLastFetched = Date.now(); - } - return Lbryapi.exchangePromise; -}; - -Lbryapi.call = function (resource, action) { - var params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; - var method = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'get'; - - if (!Lbryapi.enabled) { - return Promise.reject(new Error(__('LBRY internal API is disabled'))); - } - - if (!(method === 'get' || method === 'post')) { - return Promise.reject(new Error(__('Invalid method'))); - } - - function checkAndParse(response) { - if (response.status >= 200 && response.status < 300) { - return response.json(); - } - return response.json().then(function (json) { - var error = void 0; - if (json.error) { - error = new Error(json.error); - } else { - error = new Error('Unknown API error signature'); - } - error.response = response; // This is primarily a hack used in actions/user.js - return Promise.reject(error); - }); - } - - function makeRequest(url, options) { - return fetch(url, options).then(checkAndParse); - } - - var fullParams = _extends({}, params); - var qs = _querystring2.default.stringify(fullParams); - var url = '' + CONNECTION_STRING + resource + '/' + action + '?' + qs; - - var options = { - method: 'GET' - }; - - if (method === 'post') { - options = { - method: 'POST', - headers: { - 'Content-Type': 'application/x-www-form-urlencoded' - }, - body: qs - }; - url = '' + CONNECTION_STRING + resource + '/' + action; - } - - return makeRequest(url, options).then(function (response) { - return response.data; - }); -}; - -exports.default = Lbryapi; -/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(10))) - -/***/ }), -/* 13 */ +/* 14 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1978,29 +2099,6 @@ var selectTotalDownloadProgress = exports.selectTotalDownloadProgress = (0, _res return -1; }); -/***/ }), -/* 14 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.batchActions = batchActions; -// https://github.com/reactjs/redux/issues/911 -function batchActions() { - for (var _len = arguments.length, actions = Array(_len), _key = 0; _key < _len; _key++) { - actions[_key] = arguments[_key]; - } - - return { - type: 'BATCH_ACTIONS', - actions: actions - }; -} - /***/ }), /* 15 */ /***/ (function(module, exports, __webpack_require__) { @@ -2147,10 +2245,10 @@ var makeSelectBlockDate = exports.makeSelectBlockDate = function makeSelectBlock Object.defineProperty(exports, "__esModule", { value: true }); -exports.selectBlocks = exports.selectDraftTransactionError = exports.selectDraftTransactionAddress = exports.selectDraftTransactionAmount = exports.selectDraftTransaction = exports.selectGettingNewAddress = exports.selectReceiveAddress = exports.selectIsSendingSupport = exports.selectIsFetchingTransactions = exports.selectHasTransactions = exports.selectRecentTransactions = exports.selectTransactionItems = exports.selectTransactionsById = exports.selectBalance = exports.makeSelectBlockDate = exports.selectWunderBarIcon = exports.selectWunderBarAddress = exports.selectSearchUrisByQuery = undefined; -exports.selectIsSearching = exports.selectSearchQuery = exports.makeSelectSearchUris = exports.selectActiveHistoryEntry = exports.selectHistoryStack = exports.selectHistoryIndex = exports.selectIsForwardDisabled = exports.selectIsBackDisabled = exports.selectPathAfterAuth = exports.selectPageTitle = exports.selectHeaderLinks = exports.selectCurrentParams = exports.selectCurrentPage = exports.selectCurrentPath = exports.makeSelectCurrentParam = exports.computePageFromPath = exports.selectTotalDownloadProgress = exports.selectDownloadingFileInfos = exports.selectFileInfosDownloaded = exports.selectUrisLoading = exports.selectDownloadingByOutpoint = exports.selectIsFetchingFileListDownloadedOrPublished = exports.selectIsFetchingFileList = exports.selectFileInfosByOutpoint = exports.makeSelectLoadingForUri = exports.makeSelectDownloadingForUri = exports.makeSelectFileInfoForUri = exports.selectFetchingCostInfo = exports.selectCostForCurrentPageUri = exports.selectAllCostInfoByUri = exports.makeSelectCostInfoForUri = exports.makeSelectFetchingCostInfoForUri = exports.selectResolvingUris = exports.selectMyChannelClaims = exports.selectFetchingMyChannels = exports.selectMyClaimsOutpoints = exports.selectAllMyClaimsByOutpoint = exports.selectMyClaimsWithoutChannels = exports.selectMyClaims = exports.selectPendingClaims = exports.selectIsFetchingClaimListMine = exports.selectAllFetchingChannelClaims = exports.selectMyActiveClaims = exports.selectAbandoningIds = exports.selectMyClaimsRaw = exports.selectAllClaimsByChannel = exports.selectClaimsByUri = exports.selectClaimsById = exports.makeSelectIsUriResolving = exports.makeSelectContentTypeForUri = exports.makeSelectTitleForUri = exports.makeSelectMetadataForUri = exports.makeSelectClaimsInChannelForCurrentPage = exports.makeSelectFetchingChannelClaims = exports.makeSelectClaimIsMine = exports.makeSelectClaimForUri = exports.selectNotification = exports.walletReducer = exports.searchReducer = exports.notificationsReducer = exports.fileInfoReducer = exports.costInfoReducer = exports.claimsReducer = exports.toQueryString = exports.parseQueryParams = exports.batchActions = exports.doSendSupport = exports.doSetDraftTransactionAddress = exports.doSetDraftTransactionAmount = exports.doSendDraftTransaction = exports.doCheckAddressIsMine = exports.doGetNewAddress = exports.doFetchBlock = exports.doFetchTransactions = exports.doBalanceSubscribe = exports.doUpdateBalance = exports.doSearch = exports.doFetchFileInfosAndPublishedClaims = exports.doFileList = exports.doFetchFileInfo = exports.doFetchCostInfoForUri = exports.doResolveUri = exports.doResolveUris = exports.doAbandonClaim = exports.doFetchClaimListMine = exports.doShowSnackBar = exports.doCloseModal = exports.doOpenModal = exports.doNotify = exports.isURIClaimable = exports.isURIValid = exports.normalizeURI = exports.buildURI = exports.parseURI = exports.regexAddress = exports.regexInvalidURI = exports.Lbryapi = exports.Lbry = exports.ACTIONS = exports.Notification = undefined; +exports.selectBlocks = exports.selectDraftTransactionError = exports.selectDraftTransactionAddress = exports.selectDraftTransactionAmount = exports.selectDraftTransaction = exports.selectGettingNewAddress = exports.selectReceiveAddress = exports.selectIsSendingSupport = exports.selectIsFetchingTransactions = exports.selectHasTransactions = exports.selectRecentTransactions = exports.selectTransactionItems = exports.selectTransactionsById = exports.selectBalance = exports.makeSelectBlockDate = exports.selectWunderBarIcon = exports.selectWunderBarAddress = exports.selectSearchUrisByQuery = exports.selectIsSearching = exports.selectSearchQuery = exports.makeSelectSearchUris = exports.selectActiveHistoryEntry = exports.selectHistoryStack = exports.selectHistoryIndex = exports.selectIsForwardDisabled = exports.selectIsBackDisabled = exports.selectPathAfterAuth = undefined; +exports.selectPageTitle = exports.selectHeaderLinks = exports.selectCurrentParams = exports.selectCurrentPage = exports.selectCurrentPath = exports.makeSelectCurrentParam = exports.computePageFromPath = exports.selectTotalDownloadProgress = exports.selectDownloadingFileInfos = exports.selectFileInfosDownloaded = exports.selectUrisLoading = exports.selectDownloadingByOutpoint = exports.selectIsFetchingFileListDownloadedOrPublished = exports.selectIsFetchingFileList = exports.selectFileInfosByOutpoint = exports.makeSelectLoadingForUri = exports.makeSelectDownloadingForUri = exports.makeSelectFileInfoForUri = exports.selectFetchingCostInfo = exports.selectCostForCurrentPageUri = exports.selectAllCostInfoByUri = exports.makeSelectCostInfoForUri = exports.makeSelectFetchingCostInfoForUri = exports.selectRewardContentClaimIds = exports.selectChannelClaimCounts = exports.selectPlayingUri = exports.selectFetchingFeaturedUris = exports.selectFeaturedUris = exports.selectResolvingUris = exports.selectMyChannelClaims = exports.selectFetchingMyChannels = exports.selectMyClaimsOutpoints = exports.selectAllMyClaimsByOutpoint = exports.selectMyClaimsWithoutChannels = exports.selectMyClaims = exports.selectPendingClaims = exports.selectIsFetchingClaimListMine = exports.selectAllFetchingChannelClaims = exports.selectMyActiveClaims = exports.selectAbandoningIds = exports.selectMyClaimsRaw = exports.selectAllClaimsByChannel = exports.selectClaimsByUri = exports.selectClaimsById = exports.makeSelectTotalPagesForChannel = exports.makeSelectTotalItemsForChannel = exports.makeSelectIsUriResolving = exports.makeSelectContentTypeForUri = exports.makeSelectTitleForUri = exports.makeSelectMetadataForUri = exports.makeSelectClaimsInChannelForCurrentPage = exports.makeSelectFetchingChannelClaims = exports.makeSelectClaimIsMine = exports.makeSelectClaimForUri = exports.selectNotification = exports.walletReducer = exports.searchReducer = exports.notificationsReducer = exports.fileInfoReducer = exports.costInfoReducer = exports.claimsReducer = exports.toQueryString = exports.parseQueryParams = exports.batchActions = exports.doSendSupport = exports.doSetDraftTransactionAddress = exports.doSetDraftTransactionAmount = exports.doSendDraftTransaction = exports.doCheckAddressIsMine = exports.doGetNewAddress = exports.doFetchBlock = exports.doFetchTransactions = exports.doBalanceSubscribe = exports.doUpdateBalance = exports.doSearch = exports.doFetchFileInfosAndPublishedClaims = exports.doFileList = exports.doFetchFileInfo = exports.doFetchCostInfoForUri = exports.doFetchRewardedContent = exports.doFetchFeaturedUris = exports.doResolveUri = exports.doResolveUris = exports.doAbandonClaim = exports.doFetchClaimListMine = exports.doShowSnackBar = exports.doCloseModal = exports.doOpenModal = exports.doNotify = exports.isURIClaimable = exports.isURIValid = exports.normalizeURI = exports.buildURI = exports.parseURI = exports.regexAddress = exports.regexInvalidURI = exports.Lbryapi = exports.Lbry = exports.ACTIONS = exports.Notification = undefined; -var _Notification = __webpack_require__(8); +var _Notification = __webpack_require__(10); Object.defineProperty(exports, 'Notification', { enumerable: true, @@ -2260,8 +2358,20 @@ Object.defineProperty(exports, 'doResolveUri', { return _claims.doResolveUri; } }); +Object.defineProperty(exports, 'doFetchFeaturedUris', { + enumerable: true, + get: function get() { + return _claims.doFetchFeaturedUris; + } +}); +Object.defineProperty(exports, 'doFetchRewardedContent', { + enumerable: true, + get: function get() { + return _claims.doFetchRewardedContent; + } +}); -var _cost_info = __webpack_require__(21); +var _cost_info = __webpack_require__(24); Object.defineProperty(exports, 'doFetchCostInfoForUri', { enumerable: true, @@ -2363,7 +2473,7 @@ Object.defineProperty(exports, 'doSendSupport', { } }); -var _batchActions = __webpack_require__(14); +var _batchActions = __webpack_require__(9); Object.defineProperty(exports, 'batchActions', { enumerable: true, @@ -2372,7 +2482,7 @@ Object.defineProperty(exports, 'batchActions', { } }); -var _query_params = __webpack_require__(11); +var _query_params = __webpack_require__(13); Object.defineProperty(exports, 'parseQueryParams', { enumerable: true, @@ -2500,6 +2610,18 @@ Object.defineProperty(exports, 'makeSelectIsUriResolving', { return _claims3.makeSelectIsUriResolving; } }); +Object.defineProperty(exports, 'makeSelectTotalItemsForChannel', { + enumerable: true, + get: function get() { + return _claims3.makeSelectTotalItemsForChannel; + } +}); +Object.defineProperty(exports, 'makeSelectTotalPagesForChannel', { + enumerable: true, + get: function get() { + return _claims3.makeSelectTotalPagesForChannel; + } +}); Object.defineProperty(exports, 'selectClaimsById', { enumerable: true, get: function get() { @@ -2596,6 +2718,36 @@ Object.defineProperty(exports, 'selectResolvingUris', { return _claims3.selectResolvingUris; } }); +Object.defineProperty(exports, 'selectFeaturedUris', { + enumerable: true, + get: function get() { + return _claims3.selectFeaturedUris; + } +}); +Object.defineProperty(exports, 'selectFetchingFeaturedUris', { + enumerable: true, + get: function get() { + return _claims3.selectFetchingFeaturedUris; + } +}); +Object.defineProperty(exports, 'selectPlayingUri', { + enumerable: true, + get: function get() { + return _claims3.selectPlayingUri; + } +}); +Object.defineProperty(exports, 'selectChannelClaimCounts', { + enumerable: true, + get: function get() { + return _claims3.selectChannelClaimCounts; + } +}); +Object.defineProperty(exports, 'selectRewardContentClaimIds', { + enumerable: true, + get: function get() { + return _claims3.selectRewardContentClaimIds; + } +}); var _cost_info3 = __webpack_require__(35); @@ -2630,7 +2782,7 @@ Object.defineProperty(exports, 'selectFetchingCostInfo', { } }); -var _file_info3 = __webpack_require__(13); +var _file_info3 = __webpack_require__(14); Object.defineProperty(exports, 'makeSelectFileInfoForUri', { enumerable: true, @@ -2920,7 +3072,7 @@ var _lbry = __webpack_require__(5); var _lbry2 = _interopRequireDefault(_lbry); -var _lbryapi = __webpack_require__(12); +var _lbryapi = __webpack_require__(8); var _lbryapi2 = _interopRequireDefault(_lbryapi); @@ -2952,7 +3104,7 @@ var _action_types = __webpack_require__(0); var ACTIONS = _interopRequireWildcard(_action_types); -var _Notification = __webpack_require__(8); +var _Notification = __webpack_require__(10); var _Notification2 = _interopRequireDefault(_Notification); @@ -3234,7 +3386,7 @@ exports.default = jsonrpc; scope['Proxy'] = scope.Proxy; })(typeof process !== 'undefined' && {}.toString.call(process) == '[object process]' ? global : self); -/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(10), __webpack_require__(20))) +/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(12), __webpack_require__(20))) /***/ }), /* 20 */ @@ -3270,74 +3422,14 @@ module.exports = g; "use strict"; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.doFetchCostInfoForUri = doFetchCostInfoForUri; +exports.decode = exports.parse = __webpack_require__(22); +exports.encode = exports.stringify = __webpack_require__(23); -var _action_types = __webpack_require__(0); - -var ACTIONS = _interopRequireWildcard(_action_types); - -var _lbryapi = __webpack_require__(12); - -var _lbryapi2 = _interopRequireDefault(_lbryapi); - -var _claims = __webpack_require__(3); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - -// eslint-disable-next-line import/prefer-default-export -function doFetchCostInfoForUri(uri) { - return function (dispatch, getState) { - var state = getState(); - var claim = (0, _claims.selectClaimsByUri)(state)[uri]; - - if (!claim) return; - - function resolve(costInfo) { - dispatch({ - type: ACTIONS.FETCH_COST_INFO_COMPLETED, - data: { - uri: uri, - costInfo: costInfo - } - }); - } - - var fee = claim.value && claim.value.stream && claim.value.stream.metadata ? claim.value.stream.metadata.fee : undefined; - - if (fee === undefined) { - resolve({ cost: 0, includesData: true }); - } else if (fee.currency === 'LBC') { - resolve({ cost: fee.amount, includesData: true }); - } else { - _lbryapi2.default.getExchangeRates().then(function (_ref) { - var LBC_USD = _ref.LBC_USD; - - resolve({ cost: fee.amount / LBC_USD, includesData: true }); - }); - } - }; -} /***/ }), /* 22 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; - - -exports.decode = exports.parse = __webpack_require__(23); -exports.encode = exports.stringify = __webpack_require__(24); - - -/***/ }), -/* 23 */ -/***/ (function(module, exports, __webpack_require__) { - "use strict"; // Copyright Joyent, Inc. and other Node contributors. // @@ -3426,7 +3518,7 @@ var isArray = Array.isArray || function (xs) { /***/ }), -/* 24 */ +/* 23 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3517,6 +3609,66 @@ var objectKeys = Object.keys || function (obj) { }; +/***/ }), +/* 24 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.doFetchCostInfoForUri = doFetchCostInfoForUri; + +var _action_types = __webpack_require__(0); + +var ACTIONS = _interopRequireWildcard(_action_types); + +var _lbryapi = __webpack_require__(8); + +var _lbryapi2 = _interopRequireDefault(_lbryapi); + +var _claims = __webpack_require__(3); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +// eslint-disable-next-line import/prefer-default-export +function doFetchCostInfoForUri(uri) { + return function (dispatch, getState) { + var state = getState(); + var claim = (0, _claims.selectClaimsByUri)(state)[uri]; + + if (!claim) return; + + function resolve(costInfo) { + dispatch({ + type: ACTIONS.FETCH_COST_INFO_COMPLETED, + data: { + uri: uri, + costInfo: costInfo + } + }); + } + + var fee = claim.value && claim.value.stream && claim.value.stream.metadata ? claim.value.stream.metadata.fee : undefined; + + if (fee === undefined) { + resolve({ cost: 0, includesData: true }); + } else if (fee.currency === 'LBC') { + resolve({ cost: fee.amount, includesData: true }); + } else { + _lbryapi2.default.getExchangeRates().then(function (_ref) { + var LBC_USD = _ref.LBC_USD; + + resolve({ cost: fee.amount / LBC_USD, includesData: true }); + }); + } + }; +} + /***/ }), /* 25 */ /***/ (function(module, exports, __webpack_require__) { @@ -3543,7 +3695,7 @@ var _claims = __webpack_require__(7); var _claims2 = __webpack_require__(3); -var _file_info = __webpack_require__(13); +var _file_info = __webpack_require__(14); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -3632,7 +3784,7 @@ var _claims = __webpack_require__(7); var _navigation = __webpack_require__(4); -var _batchActions = __webpack_require__(14); +var _batchActions = __webpack_require__(9); var _batchActions2 = _interopRequireDefault(_batchActions); @@ -3722,7 +3874,7 @@ var _action_types = __webpack_require__(0); var ACTIONS = _interopRequireWildcard(_action_types); -var _modal_types = __webpack_require__(9); +var _modal_types = __webpack_require__(11); var MODALS = _interopRequireWildcard(_modal_types); @@ -4851,5 +5003,4 @@ var selectWunderBarIcon = exports.selectWunderBarIcon = (0, _reselect.createSele }); /***/ }) -/******/ ]); -}); \ No newline at end of file +/******/ ]); \ No newline at end of file diff --git a/src/index.js b/src/index.js index 307ff22..331c2db 100644 --- a/src/index.js +++ b/src/index.js @@ -30,6 +30,8 @@ export { doAbandonClaim, doResolveUris, doResolveUri, + doFetchFeaturedUris, + doFetchRewardedContent, } from 'redux/actions/claims'; export { doFetchCostInfoForUri } from 'redux/actions/cost_info'; @@ -79,6 +81,8 @@ export { makeSelectTitleForUri, makeSelectContentTypeForUri, makeSelectIsUriResolving, + makeSelectTotalItemsForChannel, + makeSelectTotalPagesForChannel, selectClaimsById, selectClaimsByUri, selectAllClaimsByChannel, @@ -95,6 +99,11 @@ export { selectFetchingMyChannels, selectMyChannelClaims, selectResolvingUris, + selectFeaturedUris, + selectFetchingFeaturedUris, + selectPlayingUri, + selectChannelClaimCounts, + selectRewardContentClaimIds, } from 'redux/selectors/claims'; export { diff --git a/src/redux/actions/claims.js b/src/redux/actions/claims.js index c582e8c..b41c578 100644 --- a/src/redux/actions/claims.js +++ b/src/redux/actions/claims.js @@ -1,9 +1,9 @@ import * as ACTIONS from 'constants/action_types'; -import * as MODALS from 'constants/modal_types'; import Lbry from 'lbry'; +import Lbryapi from 'lbryapi'; import { buildURI, normalizeURI } from 'lbryURI'; -import { doOpenModal } from 'redux/actions/app'; import { selectMyClaimsRaw, selectResolvingUris } from 'redux/selectors/claims'; +import batchActions from 'util/batchActions'; export function doResolveUris(uris) { return (dispatch, getState) => { @@ -83,7 +83,7 @@ export function doAbandonClaim(txid, nout) { }); const errorCallback = () => { - dispatch(doOpenModal(MODALS.TRANSACTION_FAILED)); + // dispatch(doOpenModal(MODALS.TRANSACTION_FAILED)); }; const successCallback = results => { @@ -97,7 +97,7 @@ export function doAbandonClaim(txid, nout) { dispatch(doResolveUri(buildURI({ name, claimId }))); dispatch(doFetchClaimListMine()); } else { - dispatch(doOpenModal(MODALS.TRANSACTION_FAILED)); + // dispatch(doOpenModal(MODALS.TRANSACTION_FAILED)); } }; @@ -107,3 +107,67 @@ export function doAbandonClaim(txid, nout) { }).then(successCallback, errorCallback); }; } + +export function doFetchFeaturedUris() { + return dispatch => { + dispatch({ + type: ACTIONS.FETCH_FEATURED_CONTENT_STARTED, + }); + + const success = ({ Uris }) => { + let urisToResolve = []; + Object.keys(Uris).forEach(category => { + urisToResolve = [...urisToResolve, ...Uris[category]]; + }); + + const actions = [ + doResolveUris(urisToResolve), + { + type: ACTIONS.FETCH_FEATURED_CONTENT_COMPLETED, + data: { + uris: Uris, + success: true, + }, + }, + ]; + dispatch(batchActions(...actions)); + }; + + const failure = () => { + dispatch({ + type: ACTIONS.FETCH_FEATURED_CONTENT_COMPLETED, + data: { + uris: {}, + }, + }); + }; + + Lbryapi.call('file', 'list_homepage').then(success, failure); + }; +} + +export function doFetchRewardedContent() { + return dispatch => { + const success = nameToClaimId => { + dispatch({ + type: ACTIONS.FETCH_REWARD_CONTENT_COMPLETED, + data: { + claimIds: Object.values(nameToClaimId), + success: true, + }, + }); + }; + + const failure = () => { + dispatch({ + type: ACTIONS.FETCH_REWARD_CONTENT_COMPLETED, + data: { + claimIds: [], + success: false, + }, + }); + }; + + Lbryapi.call('reward', 'list_featured').then(success, failure); + }; +} diff --git a/src/redux/selectors/claims.js b/src/redux/selectors/claims.js index 0ea6b4c..489eabb 100644 --- a/src/redux/selectors/claims.js +++ b/src/redux/selectors/claims.js @@ -179,3 +179,31 @@ export const makeSelectIsUriResolving = uri => selectResolvingUris, resolvingUris => resolvingUris && resolvingUris.indexOf(uri) !== -1 ); + +export const selectFeaturedUris = createSelector(selectState, state => state.featuredUris); + +export const selectFetchingFeaturedUris = createSelector( + selectState, + state => state.fetchingFeaturedContent +); + +export const selectPlayingUri = createSelector(selectState, state => state.playingUri); + +export const selectChannelClaimCounts = createSelector( + selectState, + state => state.channelClaimCounts || {} +); + +export const makeSelectTotalItemsForChannel = uri => + createSelector(selectChannelClaimCounts, byUri => byUri && byUri[uri]); + +export const makeSelectTotalPagesForChannel = uri => + createSelector( + selectChannelClaimCounts, + byUri => byUri && byUri[uri] && Math.ceil(byUri[uri] / 10) + ); + +export const selectRewardContentClaimIds = createSelector( + selectState, + state => state.rewardedContentClaimIds +); diff --git a/webpack.config.js b/webpack.config.js index 1bb41cf..3c8c34b 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -4,7 +4,7 @@ module.exports = { output: { path: path.resolve(__dirname, 'build'), filename: 'index.js', - libraryTarget: 'umd' + libraryTarget: 'commonjs2' }, module: { rules: [ -- 2.45.3 From d42625dc91d451768f13749759b2db681258e09f Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Fri, 9 Mar 2018 18:25:23 +0100 Subject: [PATCH 14/41] proxy-polyfill version updated --- src/lbry.js | 4 ++-- src/redux/actions/wallet.js | 2 +- src/redux/reducers/wallet.js | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/lbry.js b/src/lbry.js index b2b7aa3..61539da 100644 --- a/src/lbry.js +++ b/src/lbry.js @@ -14,13 +14,13 @@ function apiCall(method, params, resolve, reject) { } function getLocal(key, fallback = undefined) { - //const itemRaw = localStorage.getItem(key); + // const itemRaw = localStorage.getItem(key); const itemRaw = null; return itemRaw === null ? fallback : JSON.parse(itemRaw); } function setLocal(key, value) { - //localStorage.setItem(key, JSON.stringify(value)); + // localStorage.setItem(key, JSON.stringify(value)); } /** diff --git a/src/redux/actions/wallet.js b/src/redux/actions/wallet.js index be7593c..4bd5ca5 100644 --- a/src/redux/actions/wallet.js +++ b/src/redux/actions/wallet.js @@ -63,7 +63,7 @@ export function doGetNewAddress() { }); Lbry.wallet_new_address().then(address => { - //localStorage.setItem('wallet_address', address); + // localStorage.setItem('wallet_address', address); dispatch({ type: ACTIONS.GET_NEW_ADDRESS_COMPLETED, data: { address }, diff --git a/src/redux/reducers/wallet.js b/src/redux/reducers/wallet.js index bdc7123..b2fe9d1 100644 --- a/src/redux/reducers/wallet.js +++ b/src/redux/reducers/wallet.js @@ -1,7 +1,7 @@ import * as ACTIONS from 'constants/action_types'; const reducers = {}; -const receiveAddress = null;//localStorage.getItem('receiveAddress'); +const receiveAddress = null; // localStorage.getItem('receiveAddress'); const buildDraftTransaction = () => ({ amount: undefined, address: undefined, @@ -46,7 +46,7 @@ reducers[ACTIONS.GET_NEW_ADDRESS_STARTED] = state => reducers[ACTIONS.GET_NEW_ADDRESS_COMPLETED] = (state, action) => { const { address } = action.data; - //localStorage.setItem('receiveAddress', address); + // localStorage.setItem('receiveAddress', address); return Object.assign({}, state, { gettingNewAddress: false, receiveAddress: address, -- 2.45.3 From 1f42e6865ba952a2712e58e1ebb36a00dfa172f0 Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Fri, 9 Mar 2018 18:35:58 +0100 Subject: [PATCH 15/41] new build --- build/index.js | 466 ++++++++++++++++++++++++------------------------- 1 file changed, 233 insertions(+), 233 deletions(-) diff --git a/build/index.js b/build/index.js index 07928ed..5332b63 100644 --- a/build/index.js +++ b/build/index.js @@ -61,7 +61,7 @@ module.exports = /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 15); +/******/ return __webpack_require__(__webpack_require__.s = 14); /******/ }) /************************************************************************/ /******/ ([ @@ -855,7 +855,7 @@ var _reselect = __webpack_require__(1); var _lbryURI = __webpack_require__(2); -var _query_params = __webpack_require__(12); +var _query_params = __webpack_require__(11); var selectState = exports.selectState = function selectState(state) { return state.navigation || {}; @@ -1016,11 +1016,11 @@ Object.defineProperty(exports, "__esModule", { value: true }); -var _jsonrpc = __webpack_require__(17); +var _jsonrpc = __webpack_require__(16); var _jsonrpc2 = _interopRequireDefault(_jsonrpc); -__webpack_require__(18); +__webpack_require__(17); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -1041,13 +1041,13 @@ function apiCall(method, params, resolve, reject) { function getLocal(key) { var fallback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined; - //const itemRaw = localStorage.getItem(key); + // const itemRaw = localStorage.getItem(key); var itemRaw = null; return itemRaw === null ? fallback : JSON.parse(itemRaw); } function setLocal(key, value) {} -//localStorage.setItem(key, JSON.stringify(value)); +// localStorage.setItem(key, JSON.stringify(value)); /** @@ -1647,7 +1647,7 @@ Lbryapi.call = function (resource, action) { }; exports.default = Lbryapi; -/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(11))) +/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(19))) /***/ }), /* 8 */ @@ -1726,196 +1726,6 @@ function doShowSnackBar(data) { /***/ }), /* 11 */ -/***/ (function(module, exports) { - -// shim for using process in browser -var process = module.exports = {}; - -// cached from whatever global is present so that test runners that stub it -// don't break things. But we need to wrap it in a try catch in case it is -// wrapped in strict mode code which doesn't define any globals. It's inside a -// function because try/catches deoptimize in certain engines. - -var cachedSetTimeout; -var cachedClearTimeout; - -function defaultSetTimout() { - throw new Error('setTimeout has not been defined'); -} -function defaultClearTimeout () { - throw new Error('clearTimeout has not been defined'); -} -(function () { - try { - if (typeof setTimeout === 'function') { - cachedSetTimeout = setTimeout; - } else { - cachedSetTimeout = defaultSetTimout; - } - } catch (e) { - cachedSetTimeout = defaultSetTimout; - } - try { - if (typeof clearTimeout === 'function') { - cachedClearTimeout = clearTimeout; - } else { - cachedClearTimeout = defaultClearTimeout; - } - } catch (e) { - cachedClearTimeout = defaultClearTimeout; - } -} ()) -function runTimeout(fun) { - if (cachedSetTimeout === setTimeout) { - //normal enviroments in sane situations - return setTimeout(fun, 0); - } - // if setTimeout wasn't available but was latter defined - if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { - cachedSetTimeout = setTimeout; - return setTimeout(fun, 0); - } - try { - // when when somebody has screwed with setTimeout but no I.E. maddness - return cachedSetTimeout(fun, 0); - } catch(e){ - try { - // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally - return cachedSetTimeout.call(null, fun, 0); - } catch(e){ - // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error - return cachedSetTimeout.call(this, fun, 0); - } - } - - -} -function runClearTimeout(marker) { - if (cachedClearTimeout === clearTimeout) { - //normal enviroments in sane situations - return clearTimeout(marker); - } - // if clearTimeout wasn't available but was latter defined - if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { - cachedClearTimeout = clearTimeout; - return clearTimeout(marker); - } - try { - // when when somebody has screwed with setTimeout but no I.E. maddness - return cachedClearTimeout(marker); - } catch (e){ - try { - // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally - return cachedClearTimeout.call(null, marker); - } catch (e){ - // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. - // Some versions of I.E. have different rules for clearTimeout vs setTimeout - return cachedClearTimeout.call(this, marker); - } - } - - - -} -var queue = []; -var draining = false; -var currentQueue; -var queueIndex = -1; - -function cleanUpNextTick() { - if (!draining || !currentQueue) { - return; - } - draining = false; - if (currentQueue.length) { - queue = currentQueue.concat(queue); - } else { - queueIndex = -1; - } - if (queue.length) { - drainQueue(); - } -} - -function drainQueue() { - if (draining) { - return; - } - var timeout = runTimeout(cleanUpNextTick); - draining = true; - - var len = queue.length; - while(len) { - currentQueue = queue; - queue = []; - while (++queueIndex < len) { - if (currentQueue) { - currentQueue[queueIndex].run(); - } - } - queueIndex = -1; - len = queue.length; - } - currentQueue = null; - draining = false; - runClearTimeout(timeout); -} - -process.nextTick = function (fun) { - var args = new Array(arguments.length - 1); - if (arguments.length > 1) { - for (var i = 1; i < arguments.length; i++) { - args[i - 1] = arguments[i]; - } - } - queue.push(new Item(fun, args)); - if (queue.length === 1 && !draining) { - runTimeout(drainQueue); - } -}; - -// v8 likes predictible objects -function Item(fun, array) { - this.fun = fun; - this.array = array; -} -Item.prototype.run = function () { - this.fun.apply(null, this.array); -}; -process.title = 'browser'; -process.browser = true; -process.env = {}; -process.argv = []; -process.version = ''; // empty string to avoid regexp issues -process.versions = {}; - -function noop() {} - -process.on = noop; -process.addListener = noop; -process.once = noop; -process.off = noop; -process.removeListener = noop; -process.removeAllListeners = noop; -process.emit = noop; -process.prependListener = noop; -process.prependOnceListener = noop; - -process.listeners = function (name) { return [] } - -process.binding = function (name) { - throw new Error('process.binding is not supported'); -}; - -process.cwd = function () { return '/' }; -process.chdir = function (dir) { - throw new Error('process.chdir is not supported'); -}; -process.umask = function() { return 0; }; - - -/***/ }), -/* 12 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1960,7 +1770,7 @@ function toQueryString(params) { } /***/ }), -/* 13 */ +/* 12 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2069,7 +1879,7 @@ var selectTotalDownloadProgress = exports.selectTotalDownloadProgress = (0, _res }); /***/ }), -/* 14 */ +/* 13 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2205,7 +2015,7 @@ var makeSelectBlockDate = exports.makeSelectBlockDate = function makeSelectBlock }; /***/ }), -/* 15 */ +/* 14 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2271,7 +2081,7 @@ Object.defineProperty(exports, 'isURIClaimable', { } }); -var _notifications = __webpack_require__(16); +var _notifications = __webpack_require__(15); Object.defineProperty(exports, 'doNotify', { enumerable: true, @@ -2451,7 +2261,7 @@ Object.defineProperty(exports, 'batchActions', { } }); -var _query_params = __webpack_require__(12); +var _query_params = __webpack_require__(11); Object.defineProperty(exports, 'parseQueryParams', { enumerable: true, @@ -2751,7 +2561,7 @@ Object.defineProperty(exports, 'selectFetchingCostInfo', { } }); -var _file_info3 = __webpack_require__(13); +var _file_info3 = __webpack_require__(12); Object.defineProperty(exports, 'makeSelectFileInfoForUri', { enumerable: true, @@ -2940,7 +2750,7 @@ Object.defineProperty(exports, 'selectWunderBarIcon', { } }); -var _wallet3 = __webpack_require__(14); +var _wallet3 = __webpack_require__(13); Object.defineProperty(exports, 'makeSelectBlockDate', { enumerable: true, @@ -3058,7 +2868,7 @@ exports.Lbry = _lbry2.default; exports.Lbryapi = _lbryapi2.default; /***/ }), -/* 16 */ +/* 15 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3089,7 +2899,7 @@ function doNotify(data) { } /***/ }), -/* 17 */ +/* 16 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3176,11 +2986,11 @@ jsonrpc.call = function (connectionString, method, params, callback, errorCallba exports.default = jsonrpc; /***/ }), -/* 18 */ +/* 17 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -/* WEBPACK VAR INJECTION */(function(process, global) {/* +/* WEBPACK VAR INJECTION */(function(global) {/* * Copyright 2016 Google Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not @@ -3235,7 +3045,7 @@ exports.default = jsonrpc; // Fail on unsupported traps: Chrome doesn't do this, but ensure that users of the polyfill // are a bit more careful. Copy the internal parts of handler to prevent user changes. - const unsafeHandler = handler; + let unsafeHandler = handler; handler = {'get': null, 'set': null, 'apply': null, 'construct': null}; for (let k in unsafeHandler) { if (!(k in handler)) { @@ -3253,27 +3063,27 @@ exports.default = jsonrpc; // TODO(samthor): Closure compiler doesn't know about 'construct', attempts to rename it. let proxy = this; let isMethod = false; - const targetIsFunction = typeof target == 'function'; + let targetIsFunction = typeof target == 'function'; if (handler.apply || handler['construct'] || targetIsFunction) { proxy = function Proxy() { - const usingNew = (this && this.constructor === proxy); - const args = Array.prototype.slice.call(arguments); + let usingNew = (this && this.constructor === proxy); throwRevoked(usingNew ? 'construct' : 'apply'); if (usingNew && handler['construct']) { - return handler['construct'].call(this, target, args); + return handler['construct'].call(this, target, arguments); } else if (!usingNew && handler.apply) { - return handler.apply(target, this, args); + return handler.apply(target, this, arguments); } else if (targetIsFunction) { // since the target was a function, fallback to calling it directly. if (usingNew) { // inspired by answers to https://stackoverflow.com/q/1606797 - args.unshift(target); // pass class as first arg to constructor, although irrelevant + let all = Array.prototype.slice.call(arguments); + all.unshift(target); // pass class as first arg to constructor, although irrelevant // nb. cast to convince Closure compiler that this is a constructor - const f = /** @type {!Function} */ (target.bind.apply(target, args)); + let f = /** @type {!Function} */ (target.bind.apply(target, all)); return new f(); } - return target.apply(this, args); + return target.apply(this, arguments); } throw new TypeError(usingNew ? 'not a constructor' : 'not a function'); }; @@ -3282,16 +3092,16 @@ exports.default = jsonrpc; // Create default getters/setters. Create different code paths as handler.get/handler.set can't // change after creation. - const getter = handler.get ? function(prop) { + let getter = handler.get ? function(prop) { throwRevoked('get'); return handler.get(this, prop, proxy); } : function(prop) { throwRevoked('get'); return this[prop]; }; - const setter = handler.set ? function(prop, value) { + let setter = handler.set ? function(prop, value) { throwRevoked('set'); - const status = handler.set(this, prop, value, proxy); + let status = handler.set(this, prop, value, proxy); if (!status) { // TODO(samthor): If the calling code is in strict mode, throw TypeError. // It's (sometimes) possible to work this out, if this code isn't strict- try to load the @@ -3303,14 +3113,14 @@ exports.default = jsonrpc; }; // Clone direct properties (i.e., not part of a prototype). - const propertyNames = Object.getOwnPropertyNames(target); - const propertyMap = {}; + let propertyNames = Object.getOwnPropertyNames(target); + let propertyMap = {}; propertyNames.forEach(function(prop) { if (isMethod && prop in proxy) { return; // ignore properties already here, e.g. 'bind', 'prototype' etc } - const real = Object.getOwnPropertyDescriptor(target, prop); - const desc = { + let real = Object.getOwnPropertyDescriptor(target, prop); + let desc = { enumerable: !!real.enumerable, get: getter.bind(target, prop), set: setter.bind(target, prop), @@ -3347,18 +3157,18 @@ exports.default = jsonrpc; }; scope.Proxy.revocable = function(target, handler) { - const p = new scope.Proxy(target, handler); + let p = new scope.Proxy(target, handler); return {'proxy': p, 'revoke': lastRevokeFn}; }; scope.Proxy['revocable'] = scope.Proxy.revocable; scope['Proxy'] = scope.Proxy; -})(typeof process !== 'undefined' && {}.toString.call(process) == '[object process]' ? global : self); +})(typeof module !== 'undefined' && module['exports'] ? global : window); -/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(11), __webpack_require__(19))) +/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(18))) /***/ }), -/* 19 */ +/* 18 */ /***/ (function(module, exports) { var g; @@ -3384,6 +3194,196 @@ try { module.exports = g; +/***/ }), +/* 19 */ +/***/ (function(module, exports) { + +// shim for using process in browser +var process = module.exports = {}; + +// cached from whatever global is present so that test runners that stub it +// don't break things. But we need to wrap it in a try catch in case it is +// wrapped in strict mode code which doesn't define any globals. It's inside a +// function because try/catches deoptimize in certain engines. + +var cachedSetTimeout; +var cachedClearTimeout; + +function defaultSetTimout() { + throw new Error('setTimeout has not been defined'); +} +function defaultClearTimeout () { + throw new Error('clearTimeout has not been defined'); +} +(function () { + try { + if (typeof setTimeout === 'function') { + cachedSetTimeout = setTimeout; + } else { + cachedSetTimeout = defaultSetTimout; + } + } catch (e) { + cachedSetTimeout = defaultSetTimout; + } + try { + if (typeof clearTimeout === 'function') { + cachedClearTimeout = clearTimeout; + } else { + cachedClearTimeout = defaultClearTimeout; + } + } catch (e) { + cachedClearTimeout = defaultClearTimeout; + } +} ()) +function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + //normal enviroments in sane situations + return setTimeout(fun, 0); + } + // if setTimeout wasn't available but was latter defined + if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedSetTimeout(fun, 0); + } catch(e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedSetTimeout.call(null, fun, 0); + } catch(e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error + return cachedSetTimeout.call(this, fun, 0); + } + } + + +} +function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + //normal enviroments in sane situations + return clearTimeout(marker); + } + // if clearTimeout wasn't available but was latter defined + if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedClearTimeout(marker); + } catch (e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedClearTimeout.call(null, marker); + } catch (e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. + // Some versions of I.E. have different rules for clearTimeout vs setTimeout + return cachedClearTimeout.call(this, marker); + } + } + + + +} +var queue = []; +var draining = false; +var currentQueue; +var queueIndex = -1; + +function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } +} + +function drainQueue() { + if (draining) { + return; + } + var timeout = runTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + runClearTimeout(timeout); +} + +process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); + } +}; + +// v8 likes predictible objects +function Item(fun, array) { + this.fun = fun; + this.array = array; +} +Item.prototype.run = function () { + this.fun.apply(null, this.array); +}; +process.title = 'browser'; +process.browser = true; +process.env = {}; +process.argv = []; +process.version = ''; // empty string to avoid regexp issues +process.versions = {}; + +function noop() {} + +process.on = noop; +process.addListener = noop; +process.once = noop; +process.off = noop; +process.removeListener = noop; +process.removeAllListeners = noop; +process.emit = noop; +process.prependListener = noop; +process.prependOnceListener = noop; + +process.listeners = function (name) { return [] } + +process.binding = function (name) { + throw new Error('process.binding is not supported'); +}; + +process.cwd = function () { return '/' }; +process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); +}; +process.umask = function() { return 0; }; + + /***/ }), /* 20 */ /***/ (function(module, exports, __webpack_require__) { @@ -3664,7 +3664,7 @@ var _claims = __webpack_require__(6); var _claims2 = __webpack_require__(3); -var _file_info = __webpack_require__(13); +var _file_info = __webpack_require__(12); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -3853,7 +3853,7 @@ var _lbry2 = _interopRequireDefault(_lbry); var _app = __webpack_require__(10); -var _wallet = __webpack_require__(14); +var _wallet = __webpack_require__(13); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -3916,7 +3916,7 @@ function doGetNewAddress() { }); _lbry2.default.wallet_new_address().then(function (address) { - //localStorage.setItem('wallet_address', address); + // localStorage.setItem('wallet_address', address); dispatch({ type: ACTIONS.GET_NEW_ADDRESS_COMPLETED, data: { address: address } @@ -4678,7 +4678,7 @@ var ACTIONS = _interopRequireWildcard(_action_types); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } var reducers = {}; -var receiveAddress = null; //localStorage.getItem('receiveAddress'); +var receiveAddress = null; // localStorage.getItem('receiveAddress'); var buildDraftTransaction = function buildDraftTransaction() { return { amount: undefined, @@ -4728,7 +4728,7 @@ reducers[ACTIONS.GET_NEW_ADDRESS_STARTED] = function (state) { reducers[ACTIONS.GET_NEW_ADDRESS_COMPLETED] = function (state, action) { var address = action.data.address; - //localStorage.setItem('receiveAddress', address); + // localStorage.setItem('receiveAddress', address); return Object.assign({}, state, { gettingNewAddress: false, -- 2.45.3 From c316f566a34909882ab7a0ef72e651f1c4e45ac8 Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Sat, 10 Mar 2018 08:06:22 +0100 Subject: [PATCH 16/41] removed sessionStorage from jsonrpc --- src/jsonrpc.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/jsonrpc.js b/src/jsonrpc.js index 8e11c4f..70ec7c9 100644 --- a/src/jsonrpc.js +++ b/src/jsonrpc.js @@ -23,7 +23,6 @@ jsonrpc.call = ( }); } - const counter = parseInt(sessionStorage.getItem('JSONRPCCounter') || 0, 10); const url = connectionString; const options = { method: 'POST', @@ -31,12 +30,10 @@ jsonrpc.call = ( jsonrpc: '2.0', method, params, - id: counter, + id: new Date().getTime(), }), }; - sessionStorage.setItem('JSONRPCCounter', counter + 1); - return fetch(url, options) .then(checkAndParse) .then(response => { -- 2.45.3 From 5901b8d4af271f47fadd271a2310901ca770f802 Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Sat, 10 Mar 2018 08:06:36 +0100 Subject: [PATCH 17/41] removed sessionStorage from jsonrpc --- build/index.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/build/index.js b/build/index.js index 5332b63..bcfff7d 100644 --- a/build/index.js +++ b/build/index.js @@ -2926,7 +2926,6 @@ jsonrpc.call = function (connectionString, method, params, callback, errorCallba }); } - var counter = parseInt(sessionStorage.getItem('JSONRPCCounter') || 0, 10); var url = connectionString; var options = { method: 'POST', @@ -2934,12 +2933,10 @@ jsonrpc.call = function (connectionString, method, params, callback, errorCallba jsonrpc: '2.0', method: method, params: params, - id: counter + id: new Date().getTime() }) }; - sessionStorage.setItem('JSONRPCCounter', counter + 1); - return fetch(url, options).then(checkAndParse).then(function (response) { var error = response.error || response.result && response.result.error; -- 2.45.3 From 618a1baf1bf970e4f64f24cd1f95c7c4f53756e0 Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Sat, 10 Mar 2018 08:46:35 +0100 Subject: [PATCH 18/41] added content fetching reducers to claims --- build/index.js | 85 ++++++++++++++++++++++++++++++++++++ src/redux/reducers/claims.js | 67 ++++++++++++++++++++++++++++ 2 files changed, 152 insertions(+) diff --git a/build/index.js b/build/index.js index bcfff7d..cce2a23 100644 --- a/build/index.js +++ b/build/index.js @@ -4268,6 +4268,91 @@ reducers[ACTIONS.CREATE_CHANNEL_COMPLETED] = function (state, action) { }); }; +reducers[ACTIONS.FETCH_FEATURED_CONTENT_STARTED] = function (state) { + return Object.assign({}, state, { + fetchingFeaturedContent: true + }); +}; + +reducers[ACTIONS.FETCH_FEATURED_CONTENT_COMPLETED] = function (state, action) { + var _action$data3 = action.data, + uris = _action$data3.uris, + success = _action$data3.success; + + + return Object.assign({}, state, { + fetchingFeaturedContent: false, + fetchingFeaturedContentFailed: !success, + featuredUris: uris + }); +}; + +reducers[ACTIONS.FETCH_REWARD_CONTENT_COMPLETED] = function (state, action) { + var claimIds = action.data.claimIds; + + + return Object.assign({}, state, { + rewardedContentClaimIds: claimIds + }); +}; + +reducers[ACTIONS.RESOLVE_URIS_STARTED] = function (state, action) { + var uris = action.data.uris; + + + var oldResolving = state.resolvingUris || []; + var newResolving = Object.assign([], oldResolving); + + uris.forEach(function (uri) { + if (!newResolving.includes(uri)) { + newResolving.push(uri); + } + }); + + return Object.assign({}, state, { + resolvingUris: newResolving + }); +}; + +reducers[ACTIONS.RESOLVE_URIS_COMPLETED] = function (state, action) { + var resolveInfo = action.data.resolveInfo; + + var channelClaimCounts = Object.assign({}, state.channelClaimCounts); + + Object.entries(resolveInfo).forEach(function (_ref3) { + var _ref4 = _slicedToArray(_ref3, 2), + uri = _ref4[0], + _ref4$ = _ref4[1], + certificate = _ref4$.certificate, + claimsInChannel = _ref4$.claimsInChannel; + + if (certificate && !Number.isNaN(claimsInChannel)) { + channelClaimCounts[uri] = claimsInChannel; + } + }); + + return Object.assign({}, state, { + channelClaimCounts: channelClaimCounts, + resolvingUris: (state.resolvingUris || []).filter(function (uri) { + return !resolveInfo[uri]; + }) + }); +}; + +reducers[ACTIONS.FETCH_CHANNEL_CLAIM_COUNT_COMPLETED] = function (state, action) { + var channelClaimCounts = Object.assign({}, state.channelClaimCounts); + var _action$data4 = action.data, + uri = _action$data4.uri, + totalClaims = _action$data4.totalClaims; + + + channelClaimCounts[uri] = totalClaims; + + return Object.assign({}, state, { + channelClaimCounts: channelClaimCounts + }); +}; + function claimsReducer() { var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultState; var action = arguments[1]; diff --git a/src/redux/reducers/claims.js b/src/redux/reducers/claims.js index 4cba2f6..689582e 100644 --- a/src/redux/reducers/claims.js +++ b/src/redux/reducers/claims.js @@ -176,6 +176,73 @@ reducers[ACTIONS.CREATE_CHANNEL_COMPLETED] = (state, action) => { }); }; +reducers[ACTIONS.FETCH_FEATURED_CONTENT_STARTED] = state => + Object.assign({}, state, { + fetchingFeaturedContent: true, + }); + +reducers[ACTIONS.FETCH_FEATURED_CONTENT_COMPLETED] = (state, action) => { + const { uris, success } = action.data; + + return Object.assign({}, state, { + fetchingFeaturedContent: false, + fetchingFeaturedContentFailed: !success, + featuredUris: uris, + }); +}; + +reducers[ACTIONS.FETCH_REWARD_CONTENT_COMPLETED] = (state, action) => { + const { claimIds } = action.data; + + return Object.assign({}, state, { + rewardedContentClaimIds: claimIds, + }); +}; + +reducers[ACTIONS.RESOLVE_URIS_STARTED] = (state, action) => { + const { uris } = action.data; + + const oldResolving = state.resolvingUris || []; + const newResolving = Object.assign([], oldResolving); + + uris.forEach(uri => { + if (!newResolving.includes(uri)) { + newResolving.push(uri); + } + }); + + return Object.assign({}, state, { + resolvingUris: newResolving, + }); +}; + +reducers[ACTIONS.RESOLVE_URIS_COMPLETED] = (state, action) => { + const { resolveInfo } = action.data; + const channelClaimCounts = Object.assign({}, state.channelClaimCounts); + + Object.entries(resolveInfo).forEach(([uri, { certificate, claimsInChannel }]) => { + if (certificate && !Number.isNaN(claimsInChannel)) { + channelClaimCounts[uri] = claimsInChannel; + } + }); + + return Object.assign({}, state, { + channelClaimCounts, + resolvingUris: (state.resolvingUris || []).filter(uri => !resolveInfo[uri]), + }); +}; + +reducers[ACTIONS.FETCH_CHANNEL_CLAIM_COUNT_COMPLETED] = (state, action) => { + const channelClaimCounts = Object.assign({}, state.channelClaimCounts); + const { uri, totalClaims } = action.data; + + channelClaimCounts[uri] = totalClaims; + + return Object.assign({}, state, { + channelClaimCounts, + }); +}; + export function claimsReducer(state = defaultState, action) { const handler = reducers[action.type]; if (handler) return handler(state, action); -- 2.45.3 From 59638014ef8a4d25629d2c534d9eedb992aa905c Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Sat, 10 Mar 2018 21:02:46 +0100 Subject: [PATCH 19/41] Some modifications to lbryProxy --- build/index.js | 198 +++++++++++++++++++++++------------ src/index.js | 1 + src/lbry.js | 41 +++++--- src/redux/actions/claims.js | 2 +- src/redux/actions/search.js | 2 +- src/redux/reducers/claims.js | 32 +++--- src/util/formatCredits.js | 21 ++++ webpack.config.js | 2 +- 8 files changed, 193 insertions(+), 106 deletions(-) create mode 100644 src/util/formatCredits.js diff --git a/build/index.js b/build/index.js index cce2a23..b213028 100644 --- a/build/index.js +++ b/build/index.js @@ -1,5 +1,14 @@ -module.exports = -/******/ (function(modules) { // webpackBootstrap +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else { + var a = factory(); + for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i]; + } +})(typeof self !== 'undefined' ? self : this, function() { +return /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ @@ -1146,20 +1155,21 @@ Lbry.connect = function () { Lbry.connectPromise = new Promise(function (resolve, reject) { var tryNum = 0; - // Check every half second to see if the daemon is accepting connections - function checkDaemonStarted() { + var checkDaemonStarted = function checkDaemonStarted(resolve, reject) { tryNum += 1; - // eslint-disable-next-line no-use-before-define - lbryProxy.status().then(resolve).catch(function () { - if (tryNum <= CHECK_DAEMON_STARTED_TRY_NUMBER) { - setTimeout(checkDaemonStarted, tryNum < 50 ? 400 : 1000); - } else { - reject(new Error('Unable to connect to LBRY')); - } + new Promise(function () { + apiCall('status', {}, resolve, reject); }); - } + }; - checkDaemonStarted(); + // Check every half second to see if the daemon is accepting connections + checkDaemonStarted(resolve, function () { + if (tryNum <= CHECK_DAEMON_STARTED_TRY_NUMBER) { + setTimeout(checkDaemonStarted, tryNum < 50 ? 400 : 1000); + } else { + reject(new Error('Unable to connect to LBRY')); + } + }); }); } @@ -1225,6 +1235,13 @@ Lbry.getMediaType = function (contentType, fileName) { * Wrappers for API methods to simulate missing or future behavior. Unlike the old-style stubs, * these are designed to be transparent wrappers around the corresponding API methods. */ +Lbry.status = function () { + return new Promise(function (resolve, reject) { + apiCall('status', {}, function (status) { + resolve(status); + }, reject); + }); +}; /** * Returns results from the file_list API method, plus dummy entries for pending publishes. @@ -1358,8 +1375,6 @@ var _claims = __webpack_require__(3); var _batchActions = __webpack_require__(8); -var _batchActions2 = _interopRequireDefault(_batchActions); - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } @@ -1501,7 +1516,7 @@ function doFetchFeaturedUris() { success: true } }]; - dispatch(_batchActions2.default.apply(undefined, actions)); + dispatch(_batchActions.batchActions.apply(undefined, actions)); }; var failure = function failure() { @@ -2024,8 +2039,8 @@ var makeSelectBlockDate = exports.makeSelectBlockDate = function makeSelectBlock Object.defineProperty(exports, "__esModule", { value: true }); -exports.selectBlocks = exports.selectDraftTransactionError = exports.selectDraftTransactionAddress = exports.selectDraftTransactionAmount = exports.selectDraftTransaction = exports.selectGettingNewAddress = exports.selectReceiveAddress = exports.selectIsSendingSupport = exports.selectIsFetchingTransactions = exports.selectHasTransactions = exports.selectRecentTransactions = exports.selectTransactionItems = exports.selectTransactionsById = exports.selectBalance = exports.makeSelectBlockDate = exports.selectWunderBarIcon = exports.selectWunderBarAddress = exports.selectSearchUrisByQuery = exports.selectIsSearching = exports.selectSearchQuery = exports.makeSelectSearchUris = exports.selectActiveHistoryEntry = exports.selectHistoryStack = exports.selectHistoryIndex = exports.selectIsForwardDisabled = exports.selectIsBackDisabled = exports.selectPathAfterAuth = undefined; -exports.selectPageTitle = exports.selectHeaderLinks = exports.selectCurrentParams = exports.selectCurrentPage = exports.selectCurrentPath = exports.makeSelectCurrentParam = exports.computePageFromPath = exports.selectTotalDownloadProgress = exports.selectDownloadingFileInfos = exports.selectFileInfosDownloaded = exports.selectUrisLoading = exports.selectDownloadingByOutpoint = exports.selectIsFetchingFileListDownloadedOrPublished = exports.selectIsFetchingFileList = exports.selectFileInfosByOutpoint = exports.makeSelectLoadingForUri = exports.makeSelectDownloadingForUri = exports.makeSelectFileInfoForUri = exports.selectFetchingCostInfo = exports.selectCostForCurrentPageUri = exports.selectAllCostInfoByUri = exports.makeSelectCostInfoForUri = exports.makeSelectFetchingCostInfoForUri = exports.selectRewardContentClaimIds = exports.selectChannelClaimCounts = exports.selectPlayingUri = exports.selectFetchingFeaturedUris = exports.selectFeaturedUris = exports.selectResolvingUris = exports.selectMyChannelClaims = exports.selectFetchingMyChannels = exports.selectMyClaimsOutpoints = exports.selectAllMyClaimsByOutpoint = exports.selectMyClaimsWithoutChannels = exports.selectMyClaims = exports.selectPendingClaims = exports.selectIsFetchingClaimListMine = exports.selectAllFetchingChannelClaims = exports.selectMyActiveClaims = exports.selectAbandoningIds = exports.selectMyClaimsRaw = exports.selectAllClaimsByChannel = exports.selectClaimsByUri = exports.selectClaimsById = exports.makeSelectTotalPagesForChannel = exports.makeSelectTotalItemsForChannel = exports.makeSelectIsUriResolving = exports.makeSelectContentTypeForUri = exports.makeSelectTitleForUri = exports.makeSelectMetadataForUri = exports.makeSelectClaimsInChannelForCurrentPage = exports.makeSelectFetchingChannelClaims = exports.makeSelectClaimIsMine = exports.makeSelectClaimForUri = exports.selectNotification = exports.walletReducer = exports.searchReducer = exports.notificationsReducer = exports.fileInfoReducer = exports.costInfoReducer = exports.claimsReducer = exports.toQueryString = exports.parseQueryParams = exports.batchActions = exports.doSendSupport = exports.doSetDraftTransactionAddress = exports.doSetDraftTransactionAmount = exports.doSendDraftTransaction = exports.doCheckAddressIsMine = exports.doGetNewAddress = exports.doFetchBlock = exports.doFetchTransactions = exports.doBalanceSubscribe = exports.doUpdateBalance = exports.doSearch = exports.doFetchFileInfosAndPublishedClaims = exports.doFileList = exports.doFetchFileInfo = exports.doFetchCostInfoForUri = exports.doFetchRewardedContent = exports.doFetchFeaturedUris = exports.doResolveUri = exports.doResolveUris = exports.doAbandonClaim = exports.doFetchClaimListMine = exports.doShowSnackBar = exports.doCloseModal = exports.doOpenModal = exports.doNotify = exports.isURIClaimable = exports.isURIValid = exports.normalizeURI = exports.buildURI = exports.parseURI = exports.regexAddress = exports.regexInvalidURI = exports.Lbryapi = exports.Lbry = exports.ACTIONS = exports.Notification = undefined; +exports.selectBlocks = exports.selectDraftTransactionError = exports.selectDraftTransactionAddress = exports.selectDraftTransactionAmount = exports.selectDraftTransaction = exports.selectGettingNewAddress = exports.selectReceiveAddress = exports.selectIsSendingSupport = exports.selectIsFetchingTransactions = exports.selectHasTransactions = exports.selectRecentTransactions = exports.selectTransactionItems = exports.selectTransactionsById = exports.selectBalance = exports.makeSelectBlockDate = exports.selectWunderBarIcon = exports.selectWunderBarAddress = exports.selectSearchUrisByQuery = exports.selectIsSearching = exports.selectSearchQuery = exports.makeSelectSearchUris = exports.selectActiveHistoryEntry = exports.selectHistoryStack = exports.selectHistoryIndex = exports.selectIsForwardDisabled = exports.selectIsBackDisabled = exports.selectPathAfterAuth = exports.selectPageTitle = exports.selectHeaderLinks = undefined; +exports.selectCurrentParams = exports.selectCurrentPage = exports.selectCurrentPath = exports.makeSelectCurrentParam = exports.computePageFromPath = exports.selectTotalDownloadProgress = exports.selectDownloadingFileInfos = exports.selectFileInfosDownloaded = exports.selectUrisLoading = exports.selectDownloadingByOutpoint = exports.selectIsFetchingFileListDownloadedOrPublished = exports.selectIsFetchingFileList = exports.selectFileInfosByOutpoint = exports.makeSelectLoadingForUri = exports.makeSelectDownloadingForUri = exports.makeSelectFileInfoForUri = exports.selectFetchingCostInfo = exports.selectCostForCurrentPageUri = exports.selectAllCostInfoByUri = exports.makeSelectCostInfoForUri = exports.makeSelectFetchingCostInfoForUri = exports.selectRewardContentClaimIds = exports.selectChannelClaimCounts = exports.selectPlayingUri = exports.selectFetchingFeaturedUris = exports.selectFeaturedUris = exports.selectResolvingUris = exports.selectMyChannelClaims = exports.selectFetchingMyChannels = exports.selectMyClaimsOutpoints = exports.selectAllMyClaimsByOutpoint = exports.selectMyClaimsWithoutChannels = exports.selectMyClaims = exports.selectPendingClaims = exports.selectIsFetchingClaimListMine = exports.selectAllFetchingChannelClaims = exports.selectMyActiveClaims = exports.selectAbandoningIds = exports.selectMyClaimsRaw = exports.selectAllClaimsByChannel = exports.selectClaimsByUri = exports.selectClaimsById = exports.makeSelectTotalPagesForChannel = exports.makeSelectTotalItemsForChannel = exports.makeSelectIsUriResolving = exports.makeSelectContentTypeForUri = exports.makeSelectTitleForUri = exports.makeSelectMetadataForUri = exports.makeSelectClaimsInChannelForCurrentPage = exports.makeSelectFetchingChannelClaims = exports.makeSelectClaimIsMine = exports.makeSelectClaimForUri = exports.selectNotification = exports.walletReducer = exports.searchReducer = exports.notificationsReducer = exports.fileInfoReducer = exports.costInfoReducer = exports.claimsReducer = exports.formatFullPrice = exports.formatCredits = exports.toQueryString = exports.parseQueryParams = exports.batchActions = exports.doSendSupport = exports.doSetDraftTransactionAddress = exports.doSetDraftTransactionAmount = exports.doSendDraftTransaction = exports.doCheckAddressIsMine = exports.doGetNewAddress = exports.doFetchBlock = exports.doFetchTransactions = exports.doBalanceSubscribe = exports.doUpdateBalance = exports.doSearch = exports.doFetchFileInfosAndPublishedClaims = exports.doFileList = exports.doFetchFileInfo = exports.doFetchCostInfoForUri = exports.doFetchRewardedContent = exports.doFetchFeaturedUris = exports.doResolveUri = exports.doResolveUris = exports.doAbandonClaim = exports.doFetchClaimListMine = exports.doShowSnackBar = exports.doCloseModal = exports.doOpenModal = exports.doNotify = exports.isURIClaimable = exports.isURIValid = exports.normalizeURI = exports.buildURI = exports.parseURI = exports.regexAddress = exports.regexInvalidURI = exports.Lbryapi = exports.Lbry = exports.ACTIONS = exports.Notification = undefined; var _Notification = __webpack_require__(9); @@ -2276,7 +2291,22 @@ Object.defineProperty(exports, 'toQueryString', { } }); -var _claims2 = __webpack_require__(28); +var _formatCredits = __webpack_require__(28); + +Object.defineProperty(exports, 'formatCredits', { + enumerable: true, + get: function get() { + return _formatCredits.formatCredits; + } +}); +Object.defineProperty(exports, 'formatFullPrice', { + enumerable: true, + get: function get() { + return _formatCredits.formatFullPrice; + } +}); + +var _claims2 = __webpack_require__(29); Object.defineProperty(exports, 'claimsReducer', { enumerable: true, @@ -2285,7 +2315,7 @@ Object.defineProperty(exports, 'claimsReducer', { } }); -var _cost_info2 = __webpack_require__(29); +var _cost_info2 = __webpack_require__(30); Object.defineProperty(exports, 'costInfoReducer', { enumerable: true, @@ -2294,7 +2324,7 @@ Object.defineProperty(exports, 'costInfoReducer', { } }); -var _file_info2 = __webpack_require__(30); +var _file_info2 = __webpack_require__(31); Object.defineProperty(exports, 'fileInfoReducer', { enumerable: true, @@ -2303,7 +2333,7 @@ Object.defineProperty(exports, 'fileInfoReducer', { } }); -var _notifications2 = __webpack_require__(31); +var _notifications2 = __webpack_require__(32); Object.defineProperty(exports, 'notificationsReducer', { enumerable: true, @@ -2312,7 +2342,7 @@ Object.defineProperty(exports, 'notificationsReducer', { } }); -var _search2 = __webpack_require__(32); +var _search2 = __webpack_require__(33); Object.defineProperty(exports, 'searchReducer', { enumerable: true, @@ -2321,7 +2351,7 @@ Object.defineProperty(exports, 'searchReducer', { } }); -var _wallet2 = __webpack_require__(33); +var _wallet2 = __webpack_require__(34); Object.defineProperty(exports, 'walletReducer', { enumerable: true, @@ -2330,7 +2360,7 @@ Object.defineProperty(exports, 'walletReducer', { } }); -var _notifications3 = __webpack_require__(34); +var _notifications3 = __webpack_require__(35); Object.defineProperty(exports, 'selectNotification', { enumerable: true, @@ -2528,7 +2558,7 @@ Object.defineProperty(exports, 'selectRewardContentClaimIds', { } }); -var _cost_info3 = __webpack_require__(35); +var _cost_info3 = __webpack_require__(36); Object.defineProperty(exports, 'makeSelectFetchingCostInfoForUri', { enumerable: true, @@ -2711,7 +2741,7 @@ Object.defineProperty(exports, 'selectActiveHistoryEntry', { } }); -var _search3 = __webpack_require__(36); +var _search3 = __webpack_require__(37); Object.defineProperty(exports, 'makeSelectSearchUris', { enumerable: true, @@ -3752,10 +3782,6 @@ var _navigation = __webpack_require__(4); var _batchActions = __webpack_require__(8); -var _batchActions2 = _interopRequireDefault(_batchActions); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } // eslint-disable-next-line import/prefer-default-export @@ -3805,7 +3831,7 @@ function doSearch(rawQuery, currentPageNotSearchHandler) { uris: uris } }); - dispatch(_batchActions2.default.apply(undefined, actions)); + dispatch(_batchActions.batchActions.apply(undefined, actions)); }).catch(function () { dispatch({ type: ACTIONS.SEARCH_CANCELLED @@ -4056,6 +4082,44 @@ var CONFIRM_CLAIM_REVOKE = exports.CONFIRM_CLAIM_REVOKE = 'confirmClaimRevoke'; "use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.formatCredits = formatCredits; +exports.formatFullPrice = formatFullPrice; +function formatCredits(amount, precision) { + return amount.toFixed(precision || 1).replace(/\.?0+$/, ''); +} + +function formatFullPrice(amount) { + var precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; + + var formated = ''; + + var quantity = amount.toString().split('.'); + var fraction = quantity[1]; + + if (fraction) { + var decimals = fraction.split(''); + var first = decimals.filter(function (number) { + return number !== '0'; + })[0]; + var index = decimals.indexOf(first); + + // Set format fraction + formated = '.' + fraction.substring(0, index + precision); + } + + return parseFloat(quantity[0] + formated); +} + +/***/ }), +/* 29 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + Object.defineProperty(exports, "__esModule", { value: true }); @@ -4072,20 +4136,36 @@ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; var reducers = {}; -var defaultState = {}; +var defaultState = { + rewardedContentClaimIds: [], + channelClaimCounts: {} +}; reducers[ACTIONS.RESOLVE_URIS_COMPLETED] = function (state, action) { var resolveInfo = action.data.resolveInfo; var byUri = Object.assign({}, state.claimsByUri); var byId = Object.assign({}, state.byId); + var channelClaimCounts = Object.assign({}, state.channelClaimCounts); Object.entries(resolveInfo).forEach(function (_ref) { var _ref2 = _slicedToArray(_ref, 2), uri = _ref2[0], _ref2$ = _ref2[1], certificate = _ref2$.certificate, - claim = _ref2$.claim; + claimsInChannel = _ref2$.claimsInChannel; + + if (certificate && !Number.isNaN(claimsInChannel)) { + channelClaimCounts[uri] = claimsInChannel; + } + }); + + Object.entries(resolveInfo).forEach(function (_ref3) { + var _ref4 = _slicedToArray(_ref3, 2), + uri = _ref4[0], + _ref4$ = _ref4[1], + certificate = _ref4$.certificate, + claim = _ref4$.claim; if (claim) { byId[claim.claim_id] = claim; @@ -4106,7 +4186,11 @@ reducers[ACTIONS.RESOLVE_URIS_COMPLETED] = function (state, action) { return Object.assign({}, state, { byId: byId, - claimsByUri: byUri + claimsByUri: byUri, + channelClaimCounts: channelClaimCounts, + resolvingUris: (state.resolvingUris || []).filter(function (uri) { + return !resolveInfo[uri]; + }) }); }; @@ -4314,31 +4398,6 @@ reducers[ACTIONS.RESOLVE_URIS_STARTED] = function (state, action) { }); }; -reducers[ACTIONS.RESOLVE_URIS_COMPLETED] = function (state, action) { - var resolveInfo = action.data.resolveInfo; - - var channelClaimCounts = Object.assign({}, state.channelClaimCounts); - - Object.entries(resolveInfo).forEach(function (_ref3) { - var _ref4 = _slicedToArray(_ref3, 2), - uri = _ref4[0], - _ref4$ = _ref4[1], - certificate = _ref4$.certificate, - claimsInChannel = _ref4$.claimsInChannel; - - if (certificate && !Number.isNaN(claimsInChannel)) { - channelClaimCounts[uri] = claimsInChannel; - } - }); - - return Object.assign({}, state, { - channelClaimCounts: channelClaimCounts, - resolvingUris: (state.resolvingUris || []).filter(function (uri) { - return !resolveInfo[uri]; - }) - }); -}; - reducers[ACTIONS.FETCH_CHANNEL_CLAIM_COUNT_COMPLETED] = function (state, action) { var channelClaimCounts = Object.assign({}, state.channelClaimCounts); var _action$data4 = action.data, @@ -4363,7 +4422,7 @@ function claimsReducer() { } /***/ }), -/* 29 */ +/* 30 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4421,7 +4480,7 @@ function costInfoReducer() { } /***/ }), -/* 30 */ +/* 31 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4618,7 +4677,7 @@ function fileInfoReducer() { } /***/ }), -/* 31 */ +/* 32 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4683,7 +4742,7 @@ function notificationsReducer() { } /***/ }), -/* 32 */ +/* 33 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4742,7 +4801,7 @@ function searchReducer() { } /***/ }), -/* 33 */ +/* 34 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4926,7 +4985,7 @@ function walletReducer() { } /***/ }), -/* 34 */ +/* 35 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4948,7 +5007,7 @@ var selectNotification = exports.selectNotification = (0, _reselect.createSelect }); /***/ }), -/* 35 */ +/* 36 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4992,7 +5051,7 @@ var makeSelectFetchingCostInfoForUri = exports.makeSelectFetchingCostInfoForUri }; /***/ }), -/* 36 */ +/* 37 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -5080,4 +5139,5 @@ var selectWunderBarIcon = exports.selectWunderBarIcon = (0, _reselect.createSele }); /***/ }) -/******/ ]); \ No newline at end of file +/******/ ]); +}); \ No newline at end of file diff --git a/src/index.js b/src/index.js index 331c2db..f9d2945 100644 --- a/src/index.js +++ b/src/index.js @@ -60,6 +60,7 @@ export { // utils export { batchActions } from 'util/batchActions'; export { parseQueryParams, toQueryString } from 'util/query_params'; +export { formatCredits, formatFullPrice } from 'util/formatCredits'; // reducers export { claimsReducer } from 'redux/reducers/claims'; diff --git a/src/lbry.js b/src/lbry.js index 61539da..fcc1e6c 100644 --- a/src/lbry.js +++ b/src/lbry.js @@ -102,23 +102,21 @@ Lbry.connect = () => { Lbry.connectPromise = new Promise((resolve, reject) => { let tryNum = 0; - // Check every half second to see if the daemon is accepting connections - function checkDaemonStarted() { + const checkDaemonStarted = (resolve, reject) => { tryNum += 1; - // eslint-disable-next-line no-use-before-define - lbryProxy - .status() - .then(resolve) - .catch(() => { - if (tryNum <= CHECK_DAEMON_STARTED_TRY_NUMBER) { - setTimeout(checkDaemonStarted, tryNum < 50 ? 400 : 1000); - } else { - reject(new Error('Unable to connect to LBRY')); - } - }); - } - - checkDaemonStarted(); + new Promise(() => { + apiCall('status', {}, resolve, reject); + }); + }; + + // Check every half second to see if the daemon is accepting connections + checkDaemonStarted(resolve, () => { + if (tryNum <= CHECK_DAEMON_STARTED_TRY_NUMBER) { + setTimeout(checkDaemonStarted, tryNum < 50 ? 400 : 1000); + } else { + reject(new Error('Unable to connect to LBRY')); + } + }); }); } @@ -188,6 +186,17 @@ Lbry.getMediaType = (contentType, fileName) => { * Wrappers for API methods to simulate missing or future behavior. Unlike the old-style stubs, * these are designed to be transparent wrappers around the corresponding API methods. */ +Lbry.status = () => + new Promise((resolve, reject) => { + apiCall( + 'status', + {}, + status => { + resolve(status); + }, + reject + ); + }); /** * Returns results from the file_list API method, plus dummy entries for pending publishes. diff --git a/src/redux/actions/claims.js b/src/redux/actions/claims.js index b41c578..f8a1c2f 100644 --- a/src/redux/actions/claims.js +++ b/src/redux/actions/claims.js @@ -3,7 +3,7 @@ import Lbry from 'lbry'; import Lbryapi from 'lbryapi'; import { buildURI, normalizeURI } from 'lbryURI'; import { selectMyClaimsRaw, selectResolvingUris } from 'redux/selectors/claims'; -import batchActions from 'util/batchActions'; +import { batchActions } from 'util/batchActions'; export function doResolveUris(uris) { return (dispatch, getState) => { diff --git a/src/redux/actions/search.js b/src/redux/actions/search.js index 9caa5a2..c4d6da7 100644 --- a/src/redux/actions/search.js +++ b/src/redux/actions/search.js @@ -2,7 +2,7 @@ import * as ACTIONS from 'constants/action_types'; import { buildURI } from 'lbryURI'; import { doResolveUri } from 'redux/actions/claims'; import { selectCurrentPage } from 'redux/selectors/navigation'; -import batchActions from 'util/batchActions'; +import { batchActions } from 'util/batchActions'; // eslint-disable-next-line import/prefer-default-export export function doSearch(rawQuery, currentPageNotSearchHandler) { diff --git a/src/redux/reducers/claims.js b/src/redux/reducers/claims.js index 689582e..3ef9884 100644 --- a/src/redux/reducers/claims.js +++ b/src/redux/reducers/claims.js @@ -2,12 +2,22 @@ import * as ACTIONS from 'constants/action_types'; const reducers = {}; -const defaultState = {}; +const defaultState = { + rewardedContentClaimIds: [], + channelClaimCounts: {}, +}; reducers[ACTIONS.RESOLVE_URIS_COMPLETED] = (state, action) => { const { resolveInfo } = action.data; const byUri = Object.assign({}, state.claimsByUri); const byId = Object.assign({}, state.byId); + const channelClaimCounts = Object.assign({}, state.channelClaimCounts); + + Object.entries(resolveInfo).forEach(([uri, { certificate, claimsInChannel }]) => { + if (certificate && !Number.isNaN(claimsInChannel)) { + channelClaimCounts[uri] = claimsInChannel; + } + }); Object.entries(resolveInfo).forEach(([uri, { certificate, claim }]) => { if (claim) { @@ -26,10 +36,12 @@ reducers[ACTIONS.RESOLVE_URIS_COMPLETED] = (state, action) => { byUri[uri] = null; } }); - + return Object.assign({}, state, { byId, claimsByUri: byUri, + channelClaimCounts, + resolvingUris: (state.resolvingUris || []).filter(uri => !resolveInfo[uri]) }); }; @@ -216,22 +228,6 @@ reducers[ACTIONS.RESOLVE_URIS_STARTED] = (state, action) => { }); }; -reducers[ACTIONS.RESOLVE_URIS_COMPLETED] = (state, action) => { - const { resolveInfo } = action.data; - const channelClaimCounts = Object.assign({}, state.channelClaimCounts); - - Object.entries(resolveInfo).forEach(([uri, { certificate, claimsInChannel }]) => { - if (certificate && !Number.isNaN(claimsInChannel)) { - channelClaimCounts[uri] = claimsInChannel; - } - }); - - return Object.assign({}, state, { - channelClaimCounts, - resolvingUris: (state.resolvingUris || []).filter(uri => !resolveInfo[uri]), - }); -}; - reducers[ACTIONS.FETCH_CHANNEL_CLAIM_COUNT_COMPLETED] = (state, action) => { const channelClaimCounts = Object.assign({}, state.channelClaimCounts); const { uri, totalClaims } = action.data; diff --git a/src/util/formatCredits.js b/src/util/formatCredits.js new file mode 100644 index 0000000..98383c0 --- /dev/null +++ b/src/util/formatCredits.js @@ -0,0 +1,21 @@ +export function formatCredits(amount, precision) { + return amount.toFixed(precision || 1).replace(/\.?0+$/, ''); +} + +export function formatFullPrice(amount, precision = 1) { + let formated = ''; + + const quantity = amount.toString().split('.'); + const fraction = quantity[1]; + + if (fraction) { + const decimals = fraction.split(''); + const first = decimals.filter(number => number !== '0')[0]; + const index = decimals.indexOf(first); + + // Set format fraction + formated = `.${fraction.substring(0, index + precision)}`; + } + + return parseFloat(quantity[0] + formated); +} diff --git a/webpack.config.js b/webpack.config.js index 3c8c34b..1bb41cf 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -4,7 +4,7 @@ module.exports = { output: { path: path.resolve(__dirname, 'build'), filename: 'index.js', - libraryTarget: 'commonjs2' + libraryTarget: 'umd' }, module: { rules: [ -- 2.45.3 From 7dc7107f9470b6c60952ffb77b701eafbb79f6ec Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Sun, 11 Mar 2018 07:38:44 +0100 Subject: [PATCH 20/41] some updates --- src/lbry.js | 4 ++-- src/redux/reducers/claims.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lbry.js b/src/lbry.js index fcc1e6c..e78f381 100644 --- a/src/lbry.js +++ b/src/lbry.js @@ -108,7 +108,7 @@ Lbry.connect = () => { apiCall('status', {}, resolve, reject); }); }; - + // Check every half second to see if the daemon is accepting connections checkDaemonStarted(resolve, () => { if (tryNum <= CHECK_DAEMON_STARTED_TRY_NUMBER) { @@ -186,7 +186,7 @@ Lbry.getMediaType = (contentType, fileName) => { * Wrappers for API methods to simulate missing or future behavior. Unlike the old-style stubs, * these are designed to be transparent wrappers around the corresponding API methods. */ -Lbry.status = () => +Lbry.status = () => new Promise((resolve, reject) => { apiCall( 'status', diff --git a/src/redux/reducers/claims.js b/src/redux/reducers/claims.js index 3ef9884..e0df41d 100644 --- a/src/redux/reducers/claims.js +++ b/src/redux/reducers/claims.js @@ -36,12 +36,12 @@ reducers[ACTIONS.RESOLVE_URIS_COMPLETED] = (state, action) => { byUri[uri] = null; } }); - + return Object.assign({}, state, { byId, claimsByUri: byUri, channelClaimCounts, - resolvingUris: (state.resolvingUris || []).filter(uri => !resolveInfo[uri]) + resolvingUris: (state.resolvingUris || []).filter(uri => !resolveInfo[uri]), }); }; -- 2.45.3 From 32838c2274ad9f94f06df035bc74bac033eb9d49 Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Sun, 11 Mar 2018 08:13:01 +0100 Subject: [PATCH 21/41] removed unused dependencies from package.json --- package.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/package.json b/package.json index 1d9025f..a8fff10 100644 --- a/package.json +++ b/package.json @@ -41,10 +41,6 @@ "qrcode.react": "^0.7.2", "rc-progress": "^2.0.6", "react": "^16.2.0", - "react-dom": "^16.2.0", - "react-markdown": "^2.5.0", - "react-modal": "^3.1.7", - "react-paginate": "^5.0.0", "react-redux": "^5.0.3", "react-simplemde-editor": "^3.6.11", "redux": "^3.6.0", -- 2.45.3 From 1501eaab48f0d5d2e2b5c92e195927e2f6e47ea2 Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Sun, 11 Mar 2018 09:41:53 +0100 Subject: [PATCH 22/41] removed jsonrpc --- build/index.js | 251 +++++++++++++++++++------------------------------ src/jsonrpc.js | 83 ---------------- src/lbry.js | 103 ++++++++++++++------ 3 files changed, 171 insertions(+), 266 deletions(-) delete mode 100644 src/jsonrpc.js diff --git a/build/index.js b/build/index.js index b213028..4ca89af 100644 --- a/build/index.js +++ b/build/index.js @@ -1025,13 +1025,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); -var _jsonrpc = __webpack_require__(16); - -var _jsonrpc2 = _interopRequireDefault(_jsonrpc); - -__webpack_require__(17); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +__webpack_require__(16); function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } @@ -1043,8 +1037,43 @@ var Lbry = { pendingPublishTimeout: 20 * 60 * 1000 }; +function checkAndParse(response) { + if (response.status >= 200 && response.status < 300) { + return response.json(); + } else { + return response.json().then(function (json) { + var error = void 0; + if (json.error) { + error = new Error(json.error); + } else { + error = new Error("Protocol error with unknown response signature"); + } + return Promise.reject(error); + }); + } +} + function apiCall(method, params, resolve, reject) { - return _jsonrpc2.default.call(Lbry.daemonConnectionString, method, params, resolve, reject, reject); + var counter = new Date().getTime(); + var options = { + method: "POST", + body: JSON.stringify({ + jsonrpc: "2.0", + method: method, + params: params, + id: counter + }) + }; + + return fetch(Lbry.daemonConnectionString, options).then(checkAndParse).then(function (response) { + var error = response.error || response.result && response.result.error; + + if (error) { + return reject(error); + } else { + return resolve(response.result); + } + }).catch(reject); } function getLocal(key) { @@ -1149,27 +1178,32 @@ function pendingPublishToDummyFileInfo(_ref5) { } // core +Lbry.status = function () { + return new Promise(function (resolve, reject) { + apiCall('status', {}, function (status) { + resolve(status); + }, reject); + }); +}; + Lbry.connectPromise = null; Lbry.connect = function () { if (Lbry.connectPromise === null) { Lbry.connectPromise = new Promise(function (resolve, reject) { var tryNum = 0; - - var checkDaemonStarted = function checkDaemonStarted(resolve, reject) { - tryNum += 1; - new Promise(function () { - apiCall('status', {}, resolve, reject); - }); - }; - // Check every half second to see if the daemon is accepting connections - checkDaemonStarted(resolve, function () { - if (tryNum <= CHECK_DAEMON_STARTED_TRY_NUMBER) { - setTimeout(checkDaemonStarted, tryNum < 50 ? 400 : 1000); - } else { - reject(new Error('Unable to connect to LBRY')); - } - }); + function checkDaemonStarted() { + tryNum += 1; + Lbry.status().then(resolve).catch(function () { + if (tryNum <= CHECK_DAEMON_STARTED_TRY_NUMBER) { + setTimeout(checkDaemonStarted, tryNum < 50 ? 400 : 1000); + } else { + reject(new Error('Unable to connect to LBRY')); + } + }); + } + + checkDaemonStarted(); }); } @@ -1235,13 +1269,6 @@ Lbry.getMediaType = function (contentType, fileName) { * Wrappers for API methods to simulate missing or future behavior. Unlike the old-style stubs, * these are designed to be transparent wrappers around the corresponding API methods. */ -Lbry.status = function () { - return new Promise(function (resolve, reject) { - apiCall('status', {}, function (status) { - resolve(status); - }, reject); - }); -}; /** * Returns results from the file_list API method, plus dummy entries for pending publishes. @@ -1571,7 +1598,7 @@ Object.defineProperty(exports, "__esModule", { var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; -var _querystring = __webpack_require__(20); +var _querystring = __webpack_require__(19); var _querystring2 = _interopRequireDefault(_querystring); @@ -1662,7 +1689,7 @@ Lbryapi.call = function (resource, action) { }; exports.default = Lbryapi; -/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(19))) +/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(18))) /***/ }), /* 8 */ @@ -2165,7 +2192,7 @@ Object.defineProperty(exports, 'doFetchRewardedContent', { } }); -var _cost_info = __webpack_require__(23); +var _cost_info = __webpack_require__(22); Object.defineProperty(exports, 'doFetchCostInfoForUri', { enumerable: true, @@ -2174,7 +2201,7 @@ Object.defineProperty(exports, 'doFetchCostInfoForUri', { } }); -var _file_info = __webpack_require__(24); +var _file_info = __webpack_require__(23); Object.defineProperty(exports, 'doFetchFileInfo', { enumerable: true, @@ -2195,7 +2222,7 @@ Object.defineProperty(exports, 'doFetchFileInfosAndPublishedClaims', { } }); -var _search = __webpack_require__(25); +var _search = __webpack_require__(24); Object.defineProperty(exports, 'doSearch', { enumerable: true, @@ -2204,7 +2231,7 @@ Object.defineProperty(exports, 'doSearch', { } }); -var _wallet = __webpack_require__(26); +var _wallet = __webpack_require__(25); Object.defineProperty(exports, 'doUpdateBalance', { enumerable: true, @@ -2291,7 +2318,7 @@ Object.defineProperty(exports, 'toQueryString', { } }); -var _formatCredits = __webpack_require__(28); +var _formatCredits = __webpack_require__(27); Object.defineProperty(exports, 'formatCredits', { enumerable: true, @@ -2306,7 +2333,7 @@ Object.defineProperty(exports, 'formatFullPrice', { } }); -var _claims2 = __webpack_require__(29); +var _claims2 = __webpack_require__(28); Object.defineProperty(exports, 'claimsReducer', { enumerable: true, @@ -2315,7 +2342,7 @@ Object.defineProperty(exports, 'claimsReducer', { } }); -var _cost_info2 = __webpack_require__(30); +var _cost_info2 = __webpack_require__(29); Object.defineProperty(exports, 'costInfoReducer', { enumerable: true, @@ -2324,7 +2351,7 @@ Object.defineProperty(exports, 'costInfoReducer', { } }); -var _file_info2 = __webpack_require__(31); +var _file_info2 = __webpack_require__(30); Object.defineProperty(exports, 'fileInfoReducer', { enumerable: true, @@ -2333,7 +2360,7 @@ Object.defineProperty(exports, 'fileInfoReducer', { } }); -var _notifications2 = __webpack_require__(32); +var _notifications2 = __webpack_require__(31); Object.defineProperty(exports, 'notificationsReducer', { enumerable: true, @@ -2342,7 +2369,7 @@ Object.defineProperty(exports, 'notificationsReducer', { } }); -var _search2 = __webpack_require__(33); +var _search2 = __webpack_require__(32); Object.defineProperty(exports, 'searchReducer', { enumerable: true, @@ -2351,7 +2378,7 @@ Object.defineProperty(exports, 'searchReducer', { } }); -var _wallet2 = __webpack_require__(34); +var _wallet2 = __webpack_require__(33); Object.defineProperty(exports, 'walletReducer', { enumerable: true, @@ -2360,7 +2387,7 @@ Object.defineProperty(exports, 'walletReducer', { } }); -var _notifications3 = __webpack_require__(35); +var _notifications3 = __webpack_require__(34); Object.defineProperty(exports, 'selectNotification', { enumerable: true, @@ -2558,7 +2585,7 @@ Object.defineProperty(exports, 'selectRewardContentClaimIds', { } }); -var _cost_info3 = __webpack_require__(36); +var _cost_info3 = __webpack_require__(35); Object.defineProperty(exports, 'makeSelectFetchingCostInfoForUri', { enumerable: true, @@ -2741,7 +2768,7 @@ Object.defineProperty(exports, 'selectActiveHistoryEntry', { } }); -var _search3 = __webpack_require__(37); +var _search3 = __webpack_require__(36); Object.defineProperty(exports, 'makeSelectSearchUris', { enumerable: true, @@ -2932,90 +2959,6 @@ function doNotify(data) { /* 16 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -var jsonrpc = {}; - -jsonrpc.call = function (connectionString, method, params, callback, errorCallback, connectFailedCallback) { - function checkAndParse(response) { - if (response.status >= 200 && response.status < 300) { - return response.json(); - } - return response.json().then(function (json) { - var error = void 0; - if (json.error) { - error = new Error(json.error); - } else { - error = new Error('Protocol error with unknown response signature'); - } - return Promise.reject(error); - }); - } - - var url = connectionString; - var options = { - method: 'POST', - body: JSON.stringify({ - jsonrpc: '2.0', - method: method, - params: params, - id: new Date().getTime() - }) - }; - - return fetch(url, options).then(checkAndParse).then(function (response) { - var error = response.error || response.result && response.result.error; - - if (!error && typeof callback === 'function') { - return callback(response.result); - } - - if (error && typeof errorCallback === 'function') { - return errorCallback(error); - } - - var errorEvent = new CustomEvent('unhandledError', { - detail: { - connectionString: connectionString, - method: method, - params: params, - code: error.code, - message: error.message || error, - data: error.data - } - }); - document.dispatchEvent(errorEvent); - - return Promise.resolve(); - }).catch(function (error) { - if (connectFailedCallback) { - return connectFailedCallback(error); - } - - var errorEvent = new CustomEvent('unhandledError', { - detail: { - connectionString: connectionString, - method: method, - params: params, - code: error.response && error.response.status, - message: __('Connection to API server failed') - } - }); - document.dispatchEvent(errorEvent); - return Promise.resolve(); - }); -}; - -exports.default = jsonrpc; - -/***/ }), -/* 17 */ -/***/ (function(module, exports, __webpack_require__) { - "use strict"; /* WEBPACK VAR INJECTION */(function(global) {/* * Copyright 2016 Google Inc. All rights reserved. @@ -3192,10 +3135,10 @@ exports.default = jsonrpc; scope['Proxy'] = scope.Proxy; })(typeof module !== 'undefined' && module['exports'] ? global : window); -/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(18))) +/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(17))) /***/ }), -/* 18 */ +/* 17 */ /***/ (function(module, exports) { var g; @@ -3222,7 +3165,7 @@ module.exports = g; /***/ }), -/* 19 */ +/* 18 */ /***/ (function(module, exports) { // shim for using process in browser @@ -3412,18 +3355,18 @@ process.umask = function() { return 0; }; /***/ }), -/* 20 */ +/* 19 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -exports.decode = exports.parse = __webpack_require__(21); -exports.encode = exports.stringify = __webpack_require__(22); +exports.decode = exports.parse = __webpack_require__(20); +exports.encode = exports.stringify = __webpack_require__(21); /***/ }), -/* 21 */ +/* 20 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3514,7 +3457,7 @@ var isArray = Array.isArray || function (xs) { /***/ }), -/* 22 */ +/* 21 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3606,7 +3549,7 @@ var objectKeys = Object.keys || function (obj) { /***/ }), -/* 23 */ +/* 22 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3666,7 +3609,7 @@ function doFetchCostInfoForUri(uri) { } /***/ }), -/* 24 */ +/* 23 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3759,7 +3702,7 @@ function doFetchFileInfosAndPublishedClaims() { } /***/ }), -/* 25 */ +/* 24 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3842,7 +3785,7 @@ function doSearch(rawQuery, currentPageNotSearchHandler) { } /***/ }), -/* 26 */ +/* 25 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3866,7 +3809,7 @@ var _action_types = __webpack_require__(0); var ACTIONS = _interopRequireWildcard(_action_types); -var _modal_types = __webpack_require__(27); +var _modal_types = __webpack_require__(26); var MODALS = _interopRequireWildcard(_modal_types); @@ -4050,7 +3993,7 @@ function doSendSupport(amount, claimId, uri, successCallback, errorCallback) { } /***/ }), -/* 27 */ +/* 26 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4076,7 +4019,7 @@ var AFFIRM_PURCHASE = exports.AFFIRM_PURCHASE = 'affirm_purchase'; var CONFIRM_CLAIM_REVOKE = exports.CONFIRM_CLAIM_REVOKE = 'confirmClaimRevoke'; /***/ }), -/* 28 */ +/* 27 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4114,7 +4057,7 @@ function formatFullPrice(amount) { } /***/ }), -/* 29 */ +/* 28 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4422,7 +4365,7 @@ function claimsReducer() { } /***/ }), -/* 30 */ +/* 29 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4480,7 +4423,7 @@ function costInfoReducer() { } /***/ }), -/* 31 */ +/* 30 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4677,7 +4620,7 @@ function fileInfoReducer() { } /***/ }), -/* 32 */ +/* 31 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4742,7 +4685,7 @@ function notificationsReducer() { } /***/ }), -/* 33 */ +/* 32 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4801,7 +4744,7 @@ function searchReducer() { } /***/ }), -/* 34 */ +/* 33 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4985,7 +4928,7 @@ function walletReducer() { } /***/ }), -/* 35 */ +/* 34 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -5007,7 +4950,7 @@ var selectNotification = exports.selectNotification = (0, _reselect.createSelect }); /***/ }), -/* 36 */ +/* 35 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -5051,7 +4994,7 @@ var makeSelectFetchingCostInfoForUri = exports.makeSelectFetchingCostInfoForUri }; /***/ }), -/* 37 */ +/* 36 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; diff --git a/src/jsonrpc.js b/src/jsonrpc.js deleted file mode 100644 index 70ec7c9..0000000 --- a/src/jsonrpc.js +++ /dev/null @@ -1,83 +0,0 @@ -const jsonrpc = {}; - -jsonrpc.call = ( - connectionString, - method, - params, - callback, - errorCallback, - connectFailedCallback -) => { - function checkAndParse(response) { - if (response.status >= 200 && response.status < 300) { - return response.json(); - } - return response.json().then(json => { - let error; - if (json.error) { - error = new Error(json.error); - } else { - error = new Error('Protocol error with unknown response signature'); - } - return Promise.reject(error); - }); - } - - const url = connectionString; - const options = { - method: 'POST', - body: JSON.stringify({ - jsonrpc: '2.0', - method, - params, - id: new Date().getTime(), - }), - }; - - return fetch(url, options) - .then(checkAndParse) - .then(response => { - const error = response.error || (response.result && response.result.error); - - if (!error && typeof callback === 'function') { - return callback(response.result); - } - - if (error && typeof errorCallback === 'function') { - return errorCallback(error); - } - - const errorEvent = new CustomEvent('unhandledError', { - detail: { - connectionString, - method, - params, - code: error.code, - message: error.message || error, - data: error.data, - }, - }); - document.dispatchEvent(errorEvent); - - return Promise.resolve(); - }) - .catch(error => { - if (connectFailedCallback) { - return connectFailedCallback(error); - } - - const errorEvent = new CustomEvent('unhandledError', { - detail: { - connectionString, - method, - params, - code: error.response && error.response.status, - message: __('Connection to API server failed'), - }, - }); - document.dispatchEvent(errorEvent); - return Promise.resolve(); - }); -}; - -export default jsonrpc; diff --git a/src/lbry.js b/src/lbry.js index e78f381..8e786fd 100644 --- a/src/lbry.js +++ b/src/lbry.js @@ -1,4 +1,4 @@ -import jsonrpc from 'jsonrpc'; +// @flow import 'proxy-polyfill'; const CHECK_DAEMON_STARTED_TRY_NUMBER = 200; @@ -9,8 +9,52 @@ const Lbry = { pendingPublishTimeout: 20 * 60 * 1000, }; -function apiCall(method, params, resolve, reject) { - return jsonrpc.call(Lbry.daemonConnectionString, method, params, resolve, reject, reject); +function checkAndParse(response) { + if (response.status >= 200 && response.status < 300) { + return response.json(); + } else { + return response.json().then(json => { + let error; + if (json.error) { + error = new Error(json.error); + } else { + error = new Error("Protocol error with unknown response signature"); + } + return Promise.reject(error); + }); + } +} + +function apiCall( + method: string, + params: ?{}, + resolve: Function, + reject: Function +) { + const counter = new Date().getTime(); + const options = { + method: "POST", + body: JSON.stringify({ + jsonrpc: "2.0", + method: method, + params: params, + id: counter, + }), + }; + + return fetch(Lbry.daemonConnectionString, options) + .then(checkAndParse) + .then(response => { + const error = + response.error || (response.result && response.result.error); + + if (error) { + return reject(error); + } else { + return resolve(response.result); + } + }) + .catch(reject); } function getLocal(key, fallback = undefined) { @@ -96,27 +140,39 @@ function pendingPublishToDummyFileInfo({ name, outpoint, claimId }) { } // core +Lbry.status = () => + new Promise((resolve, reject) => { + apiCall( + 'status', + {}, + status => { + resolve(status); + }, + reject + ); + }); + Lbry.connectPromise = null; Lbry.connect = () => { if (Lbry.connectPromise === null) { Lbry.connectPromise = new Promise((resolve, reject) => { let tryNum = 0; - - const checkDaemonStarted = (resolve, reject) => { - tryNum += 1; - new Promise(() => { - apiCall('status', {}, resolve, reject); - }); - }; - // Check every half second to see if the daemon is accepting connections - checkDaemonStarted(resolve, () => { - if (tryNum <= CHECK_DAEMON_STARTED_TRY_NUMBER) { - setTimeout(checkDaemonStarted, tryNum < 50 ? 400 : 1000); - } else { - reject(new Error('Unable to connect to LBRY')); - } - }); + function checkDaemonStarted() { + tryNum += 1; + Lbry + .status() + .then(resolve) + .catch(() => { + if (tryNum <= CHECK_DAEMON_STARTED_TRY_NUMBER) { + setTimeout(checkDaemonStarted, tryNum < 50 ? 400 : 1000); + } else { + reject(new Error('Unable to connect to LBRY')); + } + }); + } + + checkDaemonStarted(); }); } @@ -186,17 +242,6 @@ Lbry.getMediaType = (contentType, fileName) => { * Wrappers for API methods to simulate missing or future behavior. Unlike the old-style stubs, * these are designed to be transparent wrappers around the corresponding API methods. */ -Lbry.status = () => - new Promise((resolve, reject) => { - apiCall( - 'status', - {}, - status => { - resolve(status); - }, - reject - ); - }); /** * Returns results from the file_list API method, plus dummy entries for pending publishes. -- 2.45.3 From b081f465bb8ab0d7b178d194961f07976222fc9f Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Sun, 11 Mar 2018 14:14:04 +0100 Subject: [PATCH 23/41] jsonrpc updates --- build/index.js | 26 ++++++++++++-------------- package.json | 2 +- src/lbry.js | 45 ++++++++++++++++++--------------------------- 3 files changed, 31 insertions(+), 42 deletions(-) diff --git a/build/index.js b/build/index.js index 4ca89af..8b46921 100644 --- a/build/index.js +++ b/build/index.js @@ -1040,25 +1040,24 @@ var Lbry = { function checkAndParse(response) { if (response.status >= 200 && response.status < 300) { return response.json(); - } else { - return response.json().then(function (json) { - var error = void 0; - if (json.error) { - error = new Error(json.error); - } else { - error = new Error("Protocol error with unknown response signature"); - } - return Promise.reject(error); - }); } + return response.json().then(function (json) { + var error = void 0; + if (json.error) { + error = new Error(json.error); + } else { + error = new Error('Protocol error with unknown response signature'); + } + return Promise.reject(error); + }); } function apiCall(method, params, resolve, reject) { var counter = new Date().getTime(); var options = { - method: "POST", + method: 'POST', body: JSON.stringify({ - jsonrpc: "2.0", + jsonrpc: '2.0', method: method, params: params, id: counter @@ -1070,9 +1069,8 @@ function apiCall(method, params, resolve, reject) { if (error) { return reject(error); - } else { - return resolve(response.result); } + return resolve(response.result); }).catch(reject); } diff --git a/package.json b/package.json index a8fff10..8fc7eda 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "proxy-polyfill": "0.1.6", "qrcode.react": "^0.7.2", "rc-progress": "^2.0.6", - "react": "^16.2.0", + "react": "16.2.0", "react-redux": "^5.0.3", "react-simplemde-editor": "^3.6.11", "redux": "^3.6.0", diff --git a/src/lbry.js b/src/lbry.js index 8e786fd..60e1a8b 100644 --- a/src/lbry.js +++ b/src/lbry.js @@ -12,32 +12,26 @@ const Lbry = { function checkAndParse(response) { if (response.status >= 200 && response.status < 300) { return response.json(); - } else { - return response.json().then(json => { - let error; - if (json.error) { - error = new Error(json.error); - } else { - error = new Error("Protocol error with unknown response signature"); - } - return Promise.reject(error); - }); } + return response.json().then(json => { + let error; + if (json.error) { + error = new Error(json.error); + } else { + error = new Error('Protocol error with unknown response signature'); + } + return Promise.reject(error); + }); } -function apiCall( - method: string, - params: ?{}, - resolve: Function, - reject: Function -) { +function apiCall(method: string, params: ?{}, resolve: Function, reject: Function) { const counter = new Date().getTime(); const options = { - method: "POST", + method: 'POST', body: JSON.stringify({ - jsonrpc: "2.0", - method: method, - params: params, + jsonrpc: '2.0', + method, + params, id: counter, }), }; @@ -45,14 +39,12 @@ function apiCall( return fetch(Lbry.daemonConnectionString, options) .then(checkAndParse) .then(response => { - const error = - response.error || (response.result && response.result.error); + const error = response.error || (response.result && response.result.error); if (error) { return reject(error); - } else { - return resolve(response.result); } + return resolve(response.result); }) .catch(reject); } @@ -160,8 +152,7 @@ Lbry.connect = () => { // Check every half second to see if the daemon is accepting connections function checkDaemonStarted() { tryNum += 1; - Lbry - .status() + Lbry.status() .then(resolve) .catch(() => { if (tryNum <= CHECK_DAEMON_STARTED_TRY_NUMBER) { @@ -171,7 +162,7 @@ Lbry.connect = () => { } }); } - + checkDaemonStarted(); }); } -- 2.45.3 From 4c465ffe5f5ff2a4a23b1ce189f5d7a91e13255e Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Sun, 18 Mar 2018 15:38:52 +0100 Subject: [PATCH 24/41] added get call to lbry.js since proxy-polyfill doesn't seem to actually work --- build/index.js | 9 +++++++++ src/lbry.js | 12 ++++++++++++ 2 files changed, 21 insertions(+) diff --git a/build/index.js b/build/index.js index 8b46921..0942721 100644 --- a/build/index.js +++ b/build/index.js @@ -1331,6 +1331,15 @@ Lbry.claim_list_mine = function () { }); }; +Lbry.get = function () { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return new Promise(function (resolve, reject) { + apiCall('get', params, function (streamInfo) { + resolve(streamInfo); + }, reject); + }); +}; + Lbry.resolve = function () { var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; return new Promise(function (resolve, reject) { diff --git a/src/lbry.js b/src/lbry.js index 60e1a8b..48d493b 100644 --- a/src/lbry.js +++ b/src/lbry.js @@ -294,6 +294,18 @@ Lbry.claim_list_mine = (params = {}) => reject ); }); + +Lbry.get = (params = {}) => + new Promise((resolve, reject) => { + apiCall( + 'get', + params, + streamInfo => { + resolve(streamInfo) + }, + reject + ); + }); Lbry.resolve = (params = {}) => new Promise((resolve, reject) => { -- 2.45.3 From f3b06dba9a56280ddb38896042f857bb1abf274c Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Thu, 22 Mar 2018 22:10:26 +0100 Subject: [PATCH 25/41] added export for SETTINGS constants --- build/index.js | 37 +++++++++++++++++++++++++++++++++++-- src/constants/settings.js | 4 ++++ src/index.js | 3 ++- src/lbry.js | 4 ++-- 4 files changed, 43 insertions(+), 5 deletions(-) diff --git a/build/index.js b/build/index.js index 0942721..0004fdb 100644 --- a/build/index.js +++ b/build/index.js @@ -2073,8 +2073,8 @@ var makeSelectBlockDate = exports.makeSelectBlockDate = function makeSelectBlock Object.defineProperty(exports, "__esModule", { value: true }); -exports.selectBlocks = exports.selectDraftTransactionError = exports.selectDraftTransactionAddress = exports.selectDraftTransactionAmount = exports.selectDraftTransaction = exports.selectGettingNewAddress = exports.selectReceiveAddress = exports.selectIsSendingSupport = exports.selectIsFetchingTransactions = exports.selectHasTransactions = exports.selectRecentTransactions = exports.selectTransactionItems = exports.selectTransactionsById = exports.selectBalance = exports.makeSelectBlockDate = exports.selectWunderBarIcon = exports.selectWunderBarAddress = exports.selectSearchUrisByQuery = exports.selectIsSearching = exports.selectSearchQuery = exports.makeSelectSearchUris = exports.selectActiveHistoryEntry = exports.selectHistoryStack = exports.selectHistoryIndex = exports.selectIsForwardDisabled = exports.selectIsBackDisabled = exports.selectPathAfterAuth = exports.selectPageTitle = exports.selectHeaderLinks = undefined; -exports.selectCurrentParams = exports.selectCurrentPage = exports.selectCurrentPath = exports.makeSelectCurrentParam = exports.computePageFromPath = exports.selectTotalDownloadProgress = exports.selectDownloadingFileInfos = exports.selectFileInfosDownloaded = exports.selectUrisLoading = exports.selectDownloadingByOutpoint = exports.selectIsFetchingFileListDownloadedOrPublished = exports.selectIsFetchingFileList = exports.selectFileInfosByOutpoint = exports.makeSelectLoadingForUri = exports.makeSelectDownloadingForUri = exports.makeSelectFileInfoForUri = exports.selectFetchingCostInfo = exports.selectCostForCurrentPageUri = exports.selectAllCostInfoByUri = exports.makeSelectCostInfoForUri = exports.makeSelectFetchingCostInfoForUri = exports.selectRewardContentClaimIds = exports.selectChannelClaimCounts = exports.selectPlayingUri = exports.selectFetchingFeaturedUris = exports.selectFeaturedUris = exports.selectResolvingUris = exports.selectMyChannelClaims = exports.selectFetchingMyChannels = exports.selectMyClaimsOutpoints = exports.selectAllMyClaimsByOutpoint = exports.selectMyClaimsWithoutChannels = exports.selectMyClaims = exports.selectPendingClaims = exports.selectIsFetchingClaimListMine = exports.selectAllFetchingChannelClaims = exports.selectMyActiveClaims = exports.selectAbandoningIds = exports.selectMyClaimsRaw = exports.selectAllClaimsByChannel = exports.selectClaimsByUri = exports.selectClaimsById = exports.makeSelectTotalPagesForChannel = exports.makeSelectTotalItemsForChannel = exports.makeSelectIsUriResolving = exports.makeSelectContentTypeForUri = exports.makeSelectTitleForUri = exports.makeSelectMetadataForUri = exports.makeSelectClaimsInChannelForCurrentPage = exports.makeSelectFetchingChannelClaims = exports.makeSelectClaimIsMine = exports.makeSelectClaimForUri = exports.selectNotification = exports.walletReducer = exports.searchReducer = exports.notificationsReducer = exports.fileInfoReducer = exports.costInfoReducer = exports.claimsReducer = exports.formatFullPrice = exports.formatCredits = exports.toQueryString = exports.parseQueryParams = exports.batchActions = exports.doSendSupport = exports.doSetDraftTransactionAddress = exports.doSetDraftTransactionAmount = exports.doSendDraftTransaction = exports.doCheckAddressIsMine = exports.doGetNewAddress = exports.doFetchBlock = exports.doFetchTransactions = exports.doBalanceSubscribe = exports.doUpdateBalance = exports.doSearch = exports.doFetchFileInfosAndPublishedClaims = exports.doFileList = exports.doFetchFileInfo = exports.doFetchCostInfoForUri = exports.doFetchRewardedContent = exports.doFetchFeaturedUris = exports.doResolveUri = exports.doResolveUris = exports.doAbandonClaim = exports.doFetchClaimListMine = exports.doShowSnackBar = exports.doCloseModal = exports.doOpenModal = exports.doNotify = exports.isURIClaimable = exports.isURIValid = exports.normalizeURI = exports.buildURI = exports.parseURI = exports.regexAddress = exports.regexInvalidURI = exports.Lbryapi = exports.Lbry = exports.ACTIONS = exports.Notification = undefined; +exports.selectBlocks = exports.selectDraftTransactionError = exports.selectDraftTransactionAddress = exports.selectDraftTransactionAmount = exports.selectDraftTransaction = exports.selectGettingNewAddress = exports.selectReceiveAddress = exports.selectIsSendingSupport = exports.selectIsFetchingTransactions = exports.selectHasTransactions = exports.selectRecentTransactions = exports.selectTransactionItems = exports.selectTransactionsById = exports.selectBalance = exports.makeSelectBlockDate = exports.selectWunderBarIcon = exports.selectWunderBarAddress = exports.selectSearchUrisByQuery = exports.selectIsSearching = exports.selectSearchQuery = exports.makeSelectSearchUris = exports.selectActiveHistoryEntry = exports.selectHistoryStack = exports.selectHistoryIndex = exports.selectIsForwardDisabled = exports.selectIsBackDisabled = exports.selectPathAfterAuth = exports.selectPageTitle = exports.selectHeaderLinks = exports.selectCurrentParams = undefined; +exports.selectCurrentPage = exports.selectCurrentPath = exports.makeSelectCurrentParam = exports.computePageFromPath = exports.selectTotalDownloadProgress = exports.selectDownloadingFileInfos = exports.selectFileInfosDownloaded = exports.selectUrisLoading = exports.selectDownloadingByOutpoint = exports.selectIsFetchingFileListDownloadedOrPublished = exports.selectIsFetchingFileList = exports.selectFileInfosByOutpoint = exports.makeSelectLoadingForUri = exports.makeSelectDownloadingForUri = exports.makeSelectFileInfoForUri = exports.selectFetchingCostInfo = exports.selectCostForCurrentPageUri = exports.selectAllCostInfoByUri = exports.makeSelectCostInfoForUri = exports.makeSelectFetchingCostInfoForUri = exports.selectRewardContentClaimIds = exports.selectChannelClaimCounts = exports.selectPlayingUri = exports.selectFetchingFeaturedUris = exports.selectFeaturedUris = exports.selectResolvingUris = exports.selectMyChannelClaims = exports.selectFetchingMyChannels = exports.selectMyClaimsOutpoints = exports.selectAllMyClaimsByOutpoint = exports.selectMyClaimsWithoutChannels = exports.selectMyClaims = exports.selectPendingClaims = exports.selectIsFetchingClaimListMine = exports.selectAllFetchingChannelClaims = exports.selectMyActiveClaims = exports.selectAbandoningIds = exports.selectMyClaimsRaw = exports.selectAllClaimsByChannel = exports.selectClaimsByUri = exports.selectClaimsById = exports.makeSelectTotalPagesForChannel = exports.makeSelectTotalItemsForChannel = exports.makeSelectIsUriResolving = exports.makeSelectContentTypeForUri = exports.makeSelectTitleForUri = exports.makeSelectMetadataForUri = exports.makeSelectClaimsInChannelForCurrentPage = exports.makeSelectFetchingChannelClaims = exports.makeSelectClaimIsMine = exports.makeSelectClaimForUri = exports.selectNotification = exports.walletReducer = exports.searchReducer = exports.notificationsReducer = exports.fileInfoReducer = exports.costInfoReducer = exports.claimsReducer = exports.formatFullPrice = exports.formatCredits = exports.toQueryString = exports.parseQueryParams = exports.batchActions = exports.doSendSupport = exports.doSetDraftTransactionAddress = exports.doSetDraftTransactionAmount = exports.doSendDraftTransaction = exports.doCheckAddressIsMine = exports.doGetNewAddress = exports.doFetchBlock = exports.doFetchTransactions = exports.doBalanceSubscribe = exports.doUpdateBalance = exports.doSearch = exports.doFetchFileInfosAndPublishedClaims = exports.doFileList = exports.doFetchFileInfo = exports.doFetchCostInfoForUri = exports.doFetchRewardedContent = exports.doFetchFeaturedUris = exports.doResolveUri = exports.doResolveUris = exports.doAbandonClaim = exports.doFetchClaimListMine = exports.doShowSnackBar = exports.doCloseModal = exports.doOpenModal = exports.doNotify = exports.isURIClaimable = exports.isURIValid = exports.normalizeURI = exports.buildURI = exports.parseURI = exports.regexAddress = exports.regexInvalidURI = exports.Lbryapi = exports.Lbry = exports.SETTINGS = exports.ACTIONS = exports.Notification = undefined; var _Notification = __webpack_require__(9); @@ -2911,6 +2911,10 @@ var _action_types = __webpack_require__(0); var ACTIONS = _interopRequireWildcard(_action_types); +var _settings = __webpack_require__(37); + +var SETTINGS = _interopRequireWildcard(_settings); + var _lbry = __webpack_require__(5); var _lbry2 = _interopRequireDefault(_lbry); @@ -2925,6 +2929,7 @@ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; // constants exports.ACTIONS = ACTIONS; +exports.SETTINGS = SETTINGS; // common @@ -5088,6 +5093,34 @@ var selectWunderBarIcon = exports.selectWunderBarIcon = (0, _reselect.createSele } }); +/***/ }), +/* 37 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +/* hardcoded names still exist for these in reducers/settings.js - only discovered when debugging */ +/* Many SETTINGS are stored in the localStorage by their name - + be careful about changing the value of a SETTINGS constant, as doing so can invalidate existing SETTINGS */ +var CREDIT_REQUIRED_ACKNOWLEDGED = exports.CREDIT_REQUIRED_ACKNOWLEDGED = 'credit_required_acknowledged'; +var NEW_USER_ACKNOWLEDGED = exports.NEW_USER_ACKNOWLEDGED = 'welcome_acknowledged'; +var EMAIL_COLLECTION_ACKNOWLEDGED = exports.EMAIL_COLLECTION_ACKNOWLEDGED = 'email_collection_acknowledged'; +var LANGUAGE = exports.LANGUAGE = 'language'; +var SHOW_NSFW = exports.SHOW_NSFW = 'showNsfw'; +var SHOW_UNAVAILABLE = exports.SHOW_UNAVAILABLE = 'showUnavailable'; +var INSTANT_PURCHASE_ENABLED = exports.INSTANT_PURCHASE_ENABLED = 'instantPurchaseEnabled'; +var INSTANT_PURCHASE_MAX = exports.INSTANT_PURCHASE_MAX = 'instantPurchaseMax'; +var THEME = exports.THEME = 'theme'; +var THEMES = exports.THEMES = 'themes'; +var AUTOMATIC_DARK_MODE_ENABLED = exports.AUTOMATIC_DARK_MODE_ENABLED = 'automaticDarkModeEnabled'; + +// mobile settings +var KEEP_DAEMON_RUNNING = exports.KEEP_DAEMON_RUNNING = 'keepDaemonRunning'; + /***/ }) /******/ ]); }); \ No newline at end of file diff --git a/src/constants/settings.js b/src/constants/settings.js index dcb90ab..2cb43c2 100644 --- a/src/constants/settings.js +++ b/src/constants/settings.js @@ -11,3 +11,7 @@ export const INSTANT_PURCHASE_ENABLED = 'instantPurchaseEnabled'; export const INSTANT_PURCHASE_MAX = 'instantPurchaseMax'; export const THEME = 'theme'; export const THEMES = 'themes'; +export const AUTOMATIC_DARK_MODE_ENABLED = 'automaticDarkModeEnabled'; + +// mobile settings +export const KEEP_DAEMON_RUNNING = 'keepDaemonRunning'; \ No newline at end of file diff --git a/src/index.js b/src/index.js index f9d2945..537abcc 100644 --- a/src/index.js +++ b/src/index.js @@ -1,4 +1,5 @@ import * as ACTIONS from 'constants/action_types'; +import * as SETTINGS from 'constants/settings'; import Lbry from 'lbry'; import Lbryapi from 'lbryapi'; @@ -6,7 +7,7 @@ import Lbryapi from 'lbryapi'; export { Notification } from 'types/Notification'; // constants -export { ACTIONS }; +export { ACTIONS, SETTINGS }; // common export { Lbry, Lbryapi }; diff --git a/src/lbry.js b/src/lbry.js index 48d493b..edefe7c 100644 --- a/src/lbry.js +++ b/src/lbry.js @@ -294,14 +294,14 @@ Lbry.claim_list_mine = (params = {}) => reject ); }); - + Lbry.get = (params = {}) => new Promise((resolve, reject) => { apiCall( 'get', params, streamInfo => { - resolve(streamInfo) + resolve(streamInfo); }, reject ); -- 2.45.3 From eb0799dc30da2b51ee836c74f95453d0d078e497 Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Fri, 23 Mar 2018 16:15:54 +0100 Subject: [PATCH 26/41] added mobile settings constant --- src/constants/settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/constants/settings.js b/src/constants/settings.js index 2cb43c2..ca6652c 100644 --- a/src/constants/settings.js +++ b/src/constants/settings.js @@ -14,4 +14,4 @@ export const THEMES = 'themes'; export const AUTOMATIC_DARK_MODE_ENABLED = 'automaticDarkModeEnabled'; // mobile settings -export const KEEP_DAEMON_RUNNING = 'keepDaemonRunning'; \ No newline at end of file +export const KEEP_DAEMON_RUNNING = 'keepDaemonRunning'; -- 2.45.3 From 37ccdd4fe413ff8fb12008547320f42a429497e7 Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Fri, 23 Mar 2018 18:50:40 +0100 Subject: [PATCH 27/41] updated action_types constants --- build/index.js | 22 ++++++++++++++++------ src/constants/action_types.js | 22 ++++++++++++++++------ 2 files changed, 32 insertions(+), 12 deletions(-) diff --git a/build/index.js b/build/index.js index 0004fdb..9cd8ed2 100644 --- a/build/index.js +++ b/build/index.js @@ -113,6 +113,8 @@ var UPDATE_VERSION = exports.UPDATE_VERSION = 'UPDATE_VERSION'; var UPDATE_REMOTE_VERSION = exports.UPDATE_REMOTE_VERSION = 'UPDATE_REMOTE_VERSION'; var SKIP_UPGRADE = exports.SKIP_UPGRADE = 'SKIP_UPGRADE'; var START_UPGRADE = exports.START_UPGRADE = 'START_UPGRADE'; +var AUTO_UPDATE_DECLINED = exports.AUTO_UPDATE_DECLINED = 'AUTO_UPDATE_DECLINED'; +var AUTO_UPDATE_DOWNLOADED = exports.AUTO_UPDATE_DOWNLOADED = 'AUTO_UPDATE_DOWNLOADED'; // Wallet var GET_NEW_ADDRESS_STARTED = exports.GET_NEW_ADDRESS_STARTED = 'GET_NEW_ADDRESS_STARTED'; @@ -145,8 +147,8 @@ var FETCH_CLAIM_LIST_MINE_STARTED = exports.FETCH_CLAIM_LIST_MINE_STARTED = 'FET var FETCH_CLAIM_LIST_MINE_COMPLETED = exports.FETCH_CLAIM_LIST_MINE_COMPLETED = 'FETCH_CLAIM_LIST_MINE_COMPLETED'; var ABANDON_CLAIM_STARTED = exports.ABANDON_CLAIM_STARTED = 'ABANDON_CLAIM_STARTED'; var ABANDON_CLAIM_SUCCEEDED = exports.ABANDON_CLAIM_SUCCEEDED = 'ABANDON_CLAIM_SUCCEEDED'; -var FETCH_CHANNEL_LIST_MINE_STARTED = exports.FETCH_CHANNEL_LIST_MINE_STARTED = 'FETCH_CHANNEL_LIST_MINE_STARTED'; -var FETCH_CHANNEL_LIST_MINE_COMPLETED = exports.FETCH_CHANNEL_LIST_MINE_COMPLETED = 'FETCH_CHANNEL_LIST_MINE_COMPLETED'; +var FETCH_CHANNEL_LIST_STARTED = exports.FETCH_CHANNEL_LIST_STARTED = 'FETCH_CHANNEL_LIST_STARTED'; +var FETCH_CHANNEL_LIST_COMPLETED = exports.FETCH_CHANNEL_LIST_COMPLETED = 'FETCH_CHANNEL_LIST_COMPLETED'; var CREATE_CHANNEL_STARTED = exports.CREATE_CHANNEL_STARTED = 'CREATE_CHANNEL_STARTED'; var CREATE_CHANNEL_COMPLETED = exports.CREATE_CHANNEL_COMPLETED = 'CREATE_CHANNEL_COMPLETED'; var PUBLISH_STARTED = exports.PUBLISH_STARTED = 'PUBLISH_STARTED'; @@ -180,6 +182,7 @@ var SEARCH_CANCELLED = exports.SEARCH_CANCELLED = 'SEARCH_CANCELLED'; // Settings var DAEMON_SETTINGS_RECEIVED = exports.DAEMON_SETTINGS_RECEIVED = 'DAEMON_SETTINGS_RECEIVED'; var CLIENT_SETTING_CHANGED = exports.CLIENT_SETTING_CHANGED = 'CLIENT_SETTING_CHANGED'; +var UPDATE_IS_NIGHT = exports.UPDATE_IS_NIGHT = 'UPDATE_IS_NIGHT'; // User var AUTHENTICATION_STARTED = exports.AUTHENTICATION_STARTED = 'AUTHENTICATION_STARTED'; @@ -193,6 +196,13 @@ var USER_EMAIL_NEW_FAILURE = exports.USER_EMAIL_NEW_FAILURE = 'USER_EMAIL_NEW_FA var USER_EMAIL_VERIFY_STARTED = exports.USER_EMAIL_VERIFY_STARTED = 'USER_EMAIL_VERIFY_STARTED'; var USER_EMAIL_VERIFY_SUCCESS = exports.USER_EMAIL_VERIFY_SUCCESS = 'USER_EMAIL_VERIFY_SUCCESS'; var USER_EMAIL_VERIFY_FAILURE = exports.USER_EMAIL_VERIFY_FAILURE = 'USER_EMAIL_VERIFY_FAILURE'; +var USER_PHONE_RESET = exports.USER_PHONE_RESET = 'USER_PHONE_RESET'; +var USER_PHONE_NEW_STARTED = exports.USER_PHONE_NEW_STARTED = 'USER_PHONE_NEW_STARTED'; +var USER_PHONE_NEW_SUCCESS = exports.USER_PHONE_NEW_SUCCESS = 'USER_PHONE_NEW_SUCCESS'; +var USER_PHONE_NEW_FAILURE = exports.USER_PHONE_NEW_FAILURE = 'USER_PHONE_NEW_FAILURE'; +var USER_PHONE_VERIFY_STARTED = exports.USER_PHONE_VERIFY_STARTED = 'USER_PHONE_VERIFY_STARTED'; +var USER_PHONE_VERIFY_SUCCESS = exports.USER_PHONE_VERIFY_SUCCESS = 'USER_PHONE_VERIFY_SUCCESS'; +var USER_PHONE_VERIFY_FAILURE = exports.USER_PHONE_VERIFY_FAILURE = 'USER_PHONE_VERIFY_FAILURE'; var USER_IDENTITY_VERIFY_STARTED = exports.USER_IDENTITY_VERIFY_STARTED = 'USER_IDENTITY_VERIFY_STARTED'; var USER_IDENTITY_VERIFY_SUCCESS = exports.USER_IDENTITY_VERIFY_SUCCESS = 'USER_IDENTITY_VERIFY_SUCCESS'; var USER_IDENTITY_VERIFY_FAILURE = exports.USER_IDENTITY_VERIFY_FAILURE = 'USER_IDENTITY_VERIFY_FAILURE'; @@ -239,6 +249,10 @@ var CLEAR_SHAPE_SHIFT = exports.CLEAR_SHAPE_SHIFT = 'CLEAR_SHAPE_SHIFT'; var CHANNEL_SUBSCRIBE = exports.CHANNEL_SUBSCRIBE = 'CHANNEL_SUBSCRIBE'; var CHANNEL_UNSUBSCRIBE = exports.CHANNEL_UNSUBSCRIBE = 'CHANNEL_UNSUBSCRIBE'; var HAS_FETCHED_SUBSCRIPTIONS = exports.HAS_FETCHED_SUBSCRIPTIONS = 'HAS_FETCHED_SUBSCRIPTIONS'; +var SET_SUBSCRIPTION_LATEST = exports.SET_SUBSCRIPTION_LATEST = 'SET_SUBSCRIPTION_LATEST'; +var CHECK_SUBSCRIPTION_STARTED = exports.CHECK_SUBSCRIPTION_STARTED = 'CHECK_SUBSCRIPTION_STARTED'; +var CHECK_SUBSCRIPTION_COMPLETED = exports.CHECK_SUBSCRIPTION_COMPLETED = 'CHECK_SUBSCRIPTION_COMPLETED'; +var CHECK_SUBSCRIPTIONS_SUBSCRIBE = exports.CHECK_SUBSCRIPTIONS_SUBSCRIBE = 'CHECK_SUBSCRIPTIONS_SUBSCRIBE'; // Video controls var SET_VIDEO_PAUSE = exports.SET_VIDEO_PAUSE = 'SET_VIDEO_PAUSE'; @@ -248,10 +262,6 @@ var MEDIA_PLAY = exports.MEDIA_PLAY = 'MEDIA_PLAY'; var MEDIA_PAUSE = exports.MEDIA_PAUSE = 'MEDIA_PAUSE'; var MEDIA_POSITION = exports.MEDIA_POSITION = 'MEDIA_POSITION'; -// Notifications -var NOTIFICATION_CREATED = exports.NOTIFICATION_CREATED = 'NOTIFICATION_CREATED'; -var NOTIFICATION_DISPLAYED = exports.NOTIFICATION_DISPLAYED = 'NOTIFICATION_DISPLAYED'; - /***/ }), /* 1 */ /***/ (function(module, exports, __webpack_require__) { diff --git a/src/constants/action_types.js b/src/constants/action_types.js index 49b5190..f4a9931 100644 --- a/src/constants/action_types.js +++ b/src/constants/action_types.js @@ -28,6 +28,8 @@ export const UPDATE_VERSION = 'UPDATE_VERSION'; export const UPDATE_REMOTE_VERSION = 'UPDATE_REMOTE_VERSION'; export const SKIP_UPGRADE = 'SKIP_UPGRADE'; export const START_UPGRADE = 'START_UPGRADE'; +export const AUTO_UPDATE_DECLINED = 'AUTO_UPDATE_DECLINED'; +export const AUTO_UPDATE_DOWNLOADED = 'AUTO_UPDATE_DOWNLOADED'; // Wallet export const GET_NEW_ADDRESS_STARTED = 'GET_NEW_ADDRESS_STARTED'; @@ -60,8 +62,8 @@ export const FETCH_CLAIM_LIST_MINE_STARTED = 'FETCH_CLAIM_LIST_MINE_STARTED'; export const FETCH_CLAIM_LIST_MINE_COMPLETED = 'FETCH_CLAIM_LIST_MINE_COMPLETED'; export const ABANDON_CLAIM_STARTED = 'ABANDON_CLAIM_STARTED'; export const ABANDON_CLAIM_SUCCEEDED = 'ABANDON_CLAIM_SUCCEEDED'; -export const FETCH_CHANNEL_LIST_MINE_STARTED = 'FETCH_CHANNEL_LIST_MINE_STARTED'; -export const FETCH_CHANNEL_LIST_MINE_COMPLETED = 'FETCH_CHANNEL_LIST_MINE_COMPLETED'; +export const FETCH_CHANNEL_LIST_STARTED = 'FETCH_CHANNEL_LIST_STARTED'; +export const FETCH_CHANNEL_LIST_COMPLETED = 'FETCH_CHANNEL_LIST_COMPLETED'; export const CREATE_CHANNEL_STARTED = 'CREATE_CHANNEL_STARTED'; export const CREATE_CHANNEL_COMPLETED = 'CREATE_CHANNEL_COMPLETED'; export const PUBLISH_STARTED = 'PUBLISH_STARTED'; @@ -95,6 +97,7 @@ export const SEARCH_CANCELLED = 'SEARCH_CANCELLED'; // Settings export const DAEMON_SETTINGS_RECEIVED = 'DAEMON_SETTINGS_RECEIVED'; export const CLIENT_SETTING_CHANGED = 'CLIENT_SETTING_CHANGED'; +export const UPDATE_IS_NIGHT = 'UPDATE_IS_NIGHT'; // User export const AUTHENTICATION_STARTED = 'AUTHENTICATION_STARTED'; @@ -108,6 +111,13 @@ export const USER_EMAIL_NEW_FAILURE = 'USER_EMAIL_NEW_FAILURE'; export const USER_EMAIL_VERIFY_STARTED = 'USER_EMAIL_VERIFY_STARTED'; export const USER_EMAIL_VERIFY_SUCCESS = 'USER_EMAIL_VERIFY_SUCCESS'; export const USER_EMAIL_VERIFY_FAILURE = 'USER_EMAIL_VERIFY_FAILURE'; +export const USER_PHONE_RESET = 'USER_PHONE_RESET'; +export const USER_PHONE_NEW_STARTED = 'USER_PHONE_NEW_STARTED'; +export const USER_PHONE_NEW_SUCCESS = 'USER_PHONE_NEW_SUCCESS'; +export const USER_PHONE_NEW_FAILURE = 'USER_PHONE_NEW_FAILURE'; +export const USER_PHONE_VERIFY_STARTED = 'USER_PHONE_VERIFY_STARTED'; +export const USER_PHONE_VERIFY_SUCCESS = 'USER_PHONE_VERIFY_SUCCESS'; +export const USER_PHONE_VERIFY_FAILURE = 'USER_PHONE_VERIFY_FAILURE'; export const USER_IDENTITY_VERIFY_STARTED = 'USER_IDENTITY_VERIFY_STARTED'; export const USER_IDENTITY_VERIFY_SUCCESS = 'USER_IDENTITY_VERIFY_SUCCESS'; export const USER_IDENTITY_VERIFY_FAILURE = 'USER_IDENTITY_VERIFY_FAILURE'; @@ -154,6 +164,10 @@ export const CLEAR_SHAPE_SHIFT = 'CLEAR_SHAPE_SHIFT'; export const CHANNEL_SUBSCRIBE = 'CHANNEL_SUBSCRIBE'; export const CHANNEL_UNSUBSCRIBE = 'CHANNEL_UNSUBSCRIBE'; export const HAS_FETCHED_SUBSCRIPTIONS = 'HAS_FETCHED_SUBSCRIPTIONS'; +export const SET_SUBSCRIPTION_LATEST = 'SET_SUBSCRIPTION_LATEST'; +export const CHECK_SUBSCRIPTION_STARTED = 'CHECK_SUBSCRIPTION_STARTED'; +export const CHECK_SUBSCRIPTION_COMPLETED = 'CHECK_SUBSCRIPTION_COMPLETED'; +export const CHECK_SUBSCRIPTIONS_SUBSCRIBE = 'CHECK_SUBSCRIPTIONS_SUBSCRIBE'; // Video controls export const SET_VIDEO_PAUSE = 'SET_VIDEO_PAUSE'; @@ -162,7 +176,3 @@ export const SET_VIDEO_PAUSE = 'SET_VIDEO_PAUSE'; export const MEDIA_PLAY = 'MEDIA_PLAY'; export const MEDIA_PAUSE = 'MEDIA_PAUSE'; export const MEDIA_POSITION = 'MEDIA_POSITION'; - -// Notifications -export const NOTIFICATION_CREATED = 'NOTIFICATION_CREATED'; -export const NOTIFICATION_DISPLAYED = 'NOTIFICATION_DISPLAYED'; -- 2.45.3 From 12d4b6c775ac7eb952a19f62d35889ded9ded7ff Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Wed, 28 Mar 2018 05:53:32 +0100 Subject: [PATCH 28/41] changes after redesign merge --- build/index.js | 1116 +++++++++++++++++++---------- src/constants/action_types.js | 22 +- src/constants/search.js | 3 + src/index.js | 7 +- src/redux/actions/search.js | 217 ++++-- src/redux/actions/wallet.js | 4 +- src/redux/reducers/search.js | 119 ++- src/redux/reducers/wallet.js | 5 +- src/redux/selectors/file_info.js | 91 ++- src/redux/selectors/navigation.js | 261 ++++--- src/redux/selectors/search.js | 62 +- src/util/handle-fetch.js | 5 + src/util/redux-utils.js | 17 + 13 files changed, 1294 insertions(+), 635 deletions(-) create mode 100644 src/constants/search.js create mode 100644 src/util/handle-fetch.js create mode 100644 src/util/redux-utils.js diff --git a/build/index.js b/build/index.js index 9cd8ed2..8fdd51a 100644 --- a/build/index.js +++ b/build/index.js @@ -70,7 +70,7 @@ return /******/ (function(modules) { // webpackBootstrap /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 14); +/******/ return __webpack_require__(__webpack_require__.s = 15); /******/ }) /************************************************************************/ /******/ ([ @@ -124,8 +124,6 @@ var FETCH_TRANSACTIONS_COMPLETED = exports.FETCH_TRANSACTIONS_COMPLETED = 'FETCH var UPDATE_BALANCE = exports.UPDATE_BALANCE = 'UPDATE_BALANCE'; var CHECK_ADDRESS_IS_MINE_STARTED = exports.CHECK_ADDRESS_IS_MINE_STARTED = 'CHECK_ADDRESS_IS_MINE_STARTED'; var CHECK_ADDRESS_IS_MINE_COMPLETED = exports.CHECK_ADDRESS_IS_MINE_COMPLETED = 'CHECK_ADDRESS_IS_MINE_COMPLETED'; -var SET_DRAFT_TRANSACTION_AMOUNT = exports.SET_DRAFT_TRANSACTION_AMOUNT = 'SET_DRAFT_TRANSACTION_AMOUNT'; -var SET_DRAFT_TRANSACTION_ADDRESS = exports.SET_DRAFT_TRANSACTION_ADDRESS = 'SET_DRAFT_TRANSACTION_ADDRESS'; var SEND_TRANSACTION_STARTED = exports.SEND_TRANSACTION_STARTED = 'SEND_TRANSACTION_STARTED'; var SEND_TRANSACTION_COMPLETED = exports.SEND_TRANSACTION_COMPLETED = 'SEND_TRANSACTION_COMPLETED'; var SEND_TRANSACTION_FAILED = exports.SEND_TRANSACTION_FAILED = 'SEND_TRANSACTION_FAILED'; @@ -175,9 +173,11 @@ var FETCH_AVAILABILITY_COMPLETED = exports.FETCH_AVAILABILITY_COMPLETED = 'FETCH var FILE_DELETE = exports.FILE_DELETE = 'FILE_DELETE'; // Search -var SEARCH_STARTED = exports.SEARCH_STARTED = 'SEARCH_STARTED'; -var SEARCH_COMPLETED = exports.SEARCH_COMPLETED = 'SEARCH_COMPLETED'; -var SEARCH_CANCELLED = exports.SEARCH_CANCELLED = 'SEARCH_CANCELLED'; +var SEARCH_START = exports.SEARCH_START = 'SEARCH_START'; +var SEARCH_SUCCESS = exports.SEARCH_SUCCESS = 'SEARCH_SUCCESS'; +var SEARCH_FAIL = exports.SEARCH_FAIL = 'SEARCH_FAIL'; +var UPDATE_SEARCH_QUERY = exports.UPDATE_SEARCH_QUERY = 'UPDATE_SEARCH_QUERY'; +var UPDATE_SEARCH_SUGGESTIONS = exports.UPDATE_SEARCH_SUGGESTIONS = 'UPDATE_SEARCH_SUGGESTIONS'; // Settings var DAEMON_SETTINGS_RECEIVED = exports.DAEMON_SETTINGS_RECEIVED = 'DAEMON_SETTINGS_RECEIVED'; @@ -250,6 +250,8 @@ var CHANNEL_SUBSCRIBE = exports.CHANNEL_SUBSCRIBE = 'CHANNEL_SUBSCRIBE'; var CHANNEL_UNSUBSCRIBE = exports.CHANNEL_UNSUBSCRIBE = 'CHANNEL_UNSUBSCRIBE'; var HAS_FETCHED_SUBSCRIPTIONS = exports.HAS_FETCHED_SUBSCRIPTIONS = 'HAS_FETCHED_SUBSCRIPTIONS'; var SET_SUBSCRIPTION_LATEST = exports.SET_SUBSCRIPTION_LATEST = 'SET_SUBSCRIPTION_LATEST'; +var SET_SUBSCRIPTION_NOTIFICATION = exports.SET_SUBSCRIPTION_NOTIFICATION = 'SET_SUBSCRIPTION_NOTIFICATION'; +var SET_SUBSCRIPTION_NOTIFICATIONS = exports.SET_SUBSCRIPTION_NOTIFICATIONS = 'SET_SUBSCRIPTION_NOTIFICATIONS'; var CHECK_SUBSCRIPTION_STARTED = exports.CHECK_SUBSCRIPTION_STARTED = 'CHECK_SUBSCRIPTION_STARTED'; var CHECK_SUBSCRIPTION_COMPLETED = exports.CHECK_SUBSCRIPTION_COMPLETED = 'CHECK_SUBSCRIPTION_COMPLETED'; var CHECK_SUBSCRIPTIONS_SUBSCRIBE = exports.CHECK_SUBSCRIPTIONS_SUBSCRIBE = 'CHECK_SUBSCRIPTIONS_SUBSCRIBE'; @@ -262,6 +264,16 @@ var MEDIA_PLAY = exports.MEDIA_PLAY = 'MEDIA_PLAY'; var MEDIA_PAUSE = exports.MEDIA_PAUSE = 'MEDIA_PAUSE'; var MEDIA_POSITION = exports.MEDIA_POSITION = 'MEDIA_POSITION'; +// Publishing +var CLEAR_PUBLISH = exports.CLEAR_PUBLISH = 'CLEAR_PUBLISH'; +var UPDATE_PUBLISH_FORM = exports.UPDATE_PUBLISH_FORM = 'UPDATE_PUBLISH_FORM'; +var PUBLISH_START = exports.PUBLISH_START = 'PUBLISH_START'; +var PUBLISH_SUCCESS = exports.PUBLISH_SUCCESS = 'PUBLISH_SUCCESS'; +var PUBLISH_FAIL = exports.PUBLISH_FAIL = 'PUBLISH_FAIL'; +var CLEAR_PUBLISH_ERROR = exports.CLEAR_PUBLISH_ERROR = 'CLEAR_PUBLISH_ERROR'; +var REMOVE_PENDING_PUBLISH = exports.REMOVE_PENDING_PUBLISH = 'REMOVE_PENDING_PUBLISH'; +var DO_PREPARE_EDIT = exports.DO_PREPARE_EDIT = 'DO_PREPARE_EDIT'; + /***/ }), /* 1 */ /***/ (function(module, exports, __webpack_require__) { @@ -643,7 +655,7 @@ exports.selectRewardContentClaimIds = exports.makeSelectTotalPagesForChannel = e var _lbryURI = __webpack_require__(2); -var _navigation = __webpack_require__(4); +var _navigation = __webpack_require__(5); var _reselect = __webpack_require__(1); @@ -868,174 +880,8 @@ var selectRewardContentClaimIds = exports.selectRewardContentClaimIds = (0, _res Object.defineProperty(exports, "__esModule", { value: true }); -exports.selectActiveHistoryEntry = exports.selectHistoryStack = exports.selectHistoryIndex = exports.selectIsForwardDisabled = exports.selectIsBackDisabled = exports.selectPathAfterAuth = exports.selectPageTitle = exports.selectHeaderLinks = exports.makeSelectCurrentParam = exports.selectCurrentParams = exports.selectCurrentPage = exports.computePageFromPath = exports.selectCurrentPath = exports.selectState = undefined; -var _reselect = __webpack_require__(1); - -var _lbryURI = __webpack_require__(2); - -var _query_params = __webpack_require__(11); - -var selectState = exports.selectState = function selectState(state) { - return state.navigation || {}; -}; - -var selectCurrentPath = exports.selectCurrentPath = (0, _reselect.createSelector)(selectState, function (state) { - return state.currentPath; -}); - -var computePageFromPath = exports.computePageFromPath = function computePageFromPath(path) { - return path.replace(/^\//, '').split('?')[0]; -}; - -var selectCurrentPage = exports.selectCurrentPage = (0, _reselect.createSelector)(selectCurrentPath, function (path) { - return computePageFromPath(path); -}); - -var selectCurrentParams = exports.selectCurrentParams = (0, _reselect.createSelector)(selectCurrentPath, function (path) { - if (path === undefined) return {}; - if (!path.match(/\?/)) return {}; - - return (0, _query_params.parseQueryParams)(path.split('?')[1]); -}); - -var makeSelectCurrentParam = exports.makeSelectCurrentParam = function makeSelectCurrentParam(param) { - return (0, _reselect.createSelector)(selectCurrentParams, function (params) { - return params ? params[param] : undefined; - }); -}; - -var selectHeaderLinks = exports.selectHeaderLinks = (0, _reselect.createSelector)(selectCurrentPage, function (page) { - // This contains intentional fall throughs - switch (page) { - case 'wallet': - case 'history': - case 'send': - case 'getcredits': - case 'invite': - case 'rewards': - case 'backup': - return { - wallet: __('Overview'), - getcredits: __('Get Credits'), - send: __('Send / Receive'), - rewards: __('Rewards'), - invite: __('Invites'), - history: __('History') - }; - case 'downloaded': - case 'published': - return { - downloaded: __('Downloaded'), - published: __('Published') - }; - case 'settings': - case 'help': - return { - settings: __('Settings'), - help: __('Help') - }; - case 'discover': - case 'subscriptions': - return { - discover: __('Discover'), - subscriptions: __('Subscriptions') - }; - default: - return null; - } -}); - -var selectPageTitle = exports.selectPageTitle = (0, _reselect.createSelector)(selectCurrentPage, selectCurrentParams, function (page, params) { - switch (page) { - case 'settings': - return __('Settings'); - case 'report': - return __('Report'); - case 'wallet': - return __('Wallet'); - case 'send': - return __('Send or Receive LBRY Credits'); - case 'getcredits': - return __('Get LBRY Credits'); - case 'backup': - return __('Backup Your Wallet'); - case 'rewards': - return __('Rewards'); - case 'invite': - return __('Invites'); - case 'start': - return __('Start'); - case 'publish': - return params.id ? __('Edit') : __('Publish'); - case 'help': - return __('Help'); - case 'developer': - return __('Developer'); - case 'show': - { - var parts = [(0, _lbryURI.normalizeURI)(params.uri)]; - // If the params has any keys other than "uri" - if (Object.keys(params).length > 1) { - parts.push((0, _query_params.toQueryString)(Object.assign({}, params, { uri: null }))); - } - return parts.join('?'); - } - case 'downloaded': - return __('Downloads & Purchases'); - case 'published': - return __('Publications'); - case 'search': - return params.query ? __('Search results for %s', params.query) : __('Search'); - case 'subscriptions': - return __('Your Subscriptions'); - case 'discover': - case false: - case null: - case '': - return ''; - default: - return page[0].toUpperCase() + (page.length > 0 ? page.substr(1) : ''); - } -}); - -var selectPathAfterAuth = exports.selectPathAfterAuth = (0, _reselect.createSelector)(selectState, function (state) { - return state.pathAfterAuth; -}); - -var selectIsBackDisabled = exports.selectIsBackDisabled = (0, _reselect.createSelector)(selectState, function (state) { - return state.index === 0; -}); - -var selectIsForwardDisabled = exports.selectIsForwardDisabled = (0, _reselect.createSelector)(selectState, function (state) { - return state.index === state.stack.length - 1; -}); - -var selectHistoryIndex = exports.selectHistoryIndex = (0, _reselect.createSelector)(selectState, function (state) { - return state.index; -}); - -var selectHistoryStack = exports.selectHistoryStack = (0, _reselect.createSelector)(selectState, function (state) { - return state.stack; -}); - -// returns current page attributes (scrollY, path) -var selectActiveHistoryEntry = exports.selectActiveHistoryEntry = (0, _reselect.createSelector)(selectState, function (state) { - return state.stack[state.index]; -}); - -/***/ }), -/* 5 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -__webpack_require__(16); +__webpack_require__(17); function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } @@ -1381,6 +1227,212 @@ var lbryProxy = new Proxy(Lbry, { exports.default = lbryProxy; +/***/ }), +/* 5 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.selectNavLinks = exports.selectPageTitle = exports.selectActiveHistoryEntry = exports.selectHistoryStack = exports.selectHistoryIndex = exports.selectIsHome = exports.selectIsForwardDisabled = exports.selectIsBackDisabled = exports.selectPathAfterAuth = exports.makeSelectCurrentParam = exports.selectCurrentParams = exports.selectCurrentPage = exports.computePageFromPath = exports.selectCurrentPath = exports.selectState = undefined; + +var _reselect = __webpack_require__(1); + +var _query_params = __webpack_require__(11); + +var selectState = exports.selectState = function selectState(state) { + return state.navigation || {}; +}; + +var selectCurrentPath = exports.selectCurrentPath = (0, _reselect.createSelector)(selectState, function (state) { + return state.currentPath; +}); + +var computePageFromPath = exports.computePageFromPath = function computePageFromPath(path) { + return path.replace(/^\//, '').split('?')[0]; +}; + +var selectCurrentPage = exports.selectCurrentPage = (0, _reselect.createSelector)(selectCurrentPath, function (path) { + return computePageFromPath(path); +}); + +var selectCurrentParams = exports.selectCurrentParams = (0, _reselect.createSelector)(selectCurrentPath, function (path) { + if (path === undefined) return {}; + if (!path.match(/\?/)) return {}; + + return (0, _query_params.parseQueryParams)(path.split('?')[1]); +}); + +var makeSelectCurrentParam = exports.makeSelectCurrentParam = function makeSelectCurrentParam(param) { + return (0, _reselect.createSelector)(selectCurrentParams, function (params) { + return params ? params[param] : undefined; + }); +}; + +var selectPathAfterAuth = exports.selectPathAfterAuth = (0, _reselect.createSelector)(selectState, function (state) { + return state.pathAfterAuth; +}); + +var selectIsBackDisabled = exports.selectIsBackDisabled = (0, _reselect.createSelector)(selectState, function (state) { + return state.index === 0; +}); + +var selectIsForwardDisabled = exports.selectIsForwardDisabled = (0, _reselect.createSelector)(selectState, function (state) { + return state.index === state.stack.length - 1; +}); + +var selectIsHome = exports.selectIsHome = (0, _reselect.createSelector)(selectCurrentPage, function (page) { + return page === 'discover'; +}); + +var selectHistoryIndex = exports.selectHistoryIndex = (0, _reselect.createSelector)(selectState, function (state) { + return state.index; +}); + +var selectHistoryStack = exports.selectHistoryStack = (0, _reselect.createSelector)(selectState, function (state) { + return state.stack; +}); + +// returns current page attributes (scrollY, path) +var selectActiveHistoryEntry = exports.selectActiveHistoryEntry = (0, _reselect.createSelector)(selectState, function (state) { + return state.stack[state.index]; +}); + +var selectPageTitle = exports.selectPageTitle = (0, _reselect.createSelector)(selectCurrentPage, function (page) { + switch (page) { + default: + return ''; + } +}); + +var selectNavLinks = exports.selectNavLinks = (0, _reselect.createSelector)(selectCurrentPage, selectHistoryStack, function (currentPage, historyStack) { + var isWalletPage = function isWalletPage(page) { + return page === 'wallet' || page === 'send' || page === 'getcredits' || page === 'rewards' || page === 'history' || page === 'invite'; + }; + + var isMyLbryPage = function isMyLbryPage(page) { + return page === 'downloaded' || page === 'published' || page === 'settings'; + }; + + var previousStack = historyStack.slice().reverse(); + + var getPreviousSubLinkPath = function getPreviousSubLinkPath(checkIfValidPage) { + for (var i = 0; i < previousStack.length; i += 1) { + var currentStackItem = previousStack[i]; + + // Trim off the "/" from the path + var pageInStack = currentStackItem.path.slice(1); + if (checkIfValidPage(pageInStack)) { + return currentStackItem.path; + } + } + + return undefined; + }; + + // Gets the last active sublink in a section + var getActiveSublink = function getActiveSublink(category) { + if (category === 'wallet') { + var previousPath = getPreviousSubLinkPath(isWalletPage); + return previousPath || '/wallet'; + } else if (category === 'myLbry') { + var _previousPath = getPreviousSubLinkPath(isMyLbryPage); + return _previousPath || '/downloaded'; + } + + return undefined; + }; + + var isCurrentlyWalletPage = isWalletPage(currentPage); + var isCurrentlyMyLbryPage = isMyLbryPage(currentPage); + + var walletSubLinks = [{ + label: 'Overview', + path: '/wallet', + active: currentPage === 'wallet' + }, { + label: 'Send & Recieve', + path: '/send', + active: currentPage === 'send' + }, { + label: 'Get Credits', + path: '/getcredits', + active: currentPage === 'getcredits' + }, { + label: 'Rewards', + path: '/rewards', + active: currentPage === 'rewards' + }, { + label: 'Invites', + path: '/invite', + active: currentPage === 'invite' + }, { + label: 'Transactions', + path: '/history', + active: currentPage === 'history' + }]; + + var myLbrySubLinks = [{ + label: 'Downloads', + path: '/downloaded', + active: currentPage === 'downloaded' + }, { + label: 'Publishes', + path: '/published', + active: currentPage === 'published' + }, { + label: 'Settings', + path: '/settings', + active: currentPage === 'settings' + }, { + label: 'Backup', + path: '/backup', + active: currentPage === 'backup' + }]; + + var navLinks = { + primary: [{ + label: 'Explore', + path: '/discover', + active: currentPage === 'discover', + icon: 'Compass' + }, { + label: 'Subscriptions', + path: '/subscriptions', + active: currentPage === 'subscriptions', + icon: 'AtSign' + }], + secondary: [{ + label: 'Wallet', + icon: 'CreditCard', + subLinks: walletSubLinks, + path: isCurrentlyWalletPage ? '/wallet' : getActiveSublink('wallet'), + active: isWalletPage(currentPage) + }, { + label: 'My LBRY', + icon: 'Settings', + subLinks: myLbrySubLinks, + path: isCurrentlyMyLbryPage ? '/downloaded' : getActiveSublink('myLbry'), + active: isMyLbryPage(currentPage) + }, { + label: 'Publish', + icon: 'UploadCloud', + path: '/publish', + active: currentPage === 'publish' + }, { + label: 'Help', + path: '/help', + active: currentPage === 'help', + icon: 'HelpCircle' + }] + }; + + return navLinks; +}); + /***/ }), /* 6 */ /***/ (function(module, exports, __webpack_require__) { @@ -1405,7 +1457,7 @@ var _action_types = __webpack_require__(0); var ACTIONS = _interopRequireWildcard(_action_types); -var _lbry = __webpack_require__(5); +var _lbry = __webpack_require__(4); var _lbry2 = _interopRequireDefault(_lbry); @@ -1615,7 +1667,7 @@ Object.defineProperty(exports, "__esModule", { var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; -var _querystring = __webpack_require__(19); +var _querystring = __webpack_require__(20); var _querystring2 = _interopRequireDefault(_querystring); @@ -1706,7 +1758,7 @@ Lbryapi.call = function (resource, action) { }; exports.default = Lbryapi; -/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(18))) +/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(19))) /***/ }), /* 8 */ @@ -1838,10 +1890,12 @@ function toQueryString(params) { Object.defineProperty(exports, "__esModule", { value: true }); -exports.selectTotalDownloadProgress = exports.selectDownloadingFileInfos = exports.selectFileInfosDownloaded = exports.makeSelectLoadingForUri = exports.selectUrisLoading = exports.makeSelectDownloadingForUri = exports.selectDownloadingByOutpoint = exports.makeSelectFileInfoForUri = exports.selectIsFetchingFileListDownloadedOrPublished = exports.selectIsFetchingFileList = exports.selectFileInfosByOutpoint = exports.selectState = undefined; +exports.selectSearchDownloadUris = exports.selectTotalDownloadProgress = exports.selectDownloadingFileInfos = exports.selectFileInfosDownloaded = exports.makeSelectLoadingForUri = exports.selectUrisLoading = exports.makeSelectDownloadingForUri = exports.selectDownloadingByOutpoint = exports.makeSelectFileInfoForUri = exports.selectIsFetchingFileListDownloadedOrPublished = exports.selectIsFetchingFileList = exports.selectFileInfosByOutpoint = exports.selectState = undefined; var _claims = __webpack_require__(3); +var _lbryURI = __webpack_require__(2); + var _reselect = __webpack_require__(1); var selectState = exports.selectState = function selectState(state) { @@ -1864,7 +1918,6 @@ var makeSelectFileInfoForUri = exports.makeSelectFileInfoForUri = function makeS return (0, _reselect.createSelector)(_claims.selectClaimsByUri, selectFileInfosByOutpoint, function (claims, byOutpoint) { var claim = claims[uri]; var outpoint = claim ? claim.txid + ':' + claim.nout : undefined; - return outpoint ? byOutpoint[outpoint] : undefined; }); }; @@ -1937,6 +1990,98 @@ var selectTotalDownloadProgress = exports.selectTotalDownloadProgress = (0, _res return -1; }); +var selectSearchDownloadUris = exports.selectSearchDownloadUris = function selectSearchDownloadUris(query) { + return (0, _reselect.createSelector)(selectFileInfosDownloaded, function (fileInfos) { + if (!query || !fileInfos.length) { + return null; + } + + var queryParts = query.toLowerCase().split(' '); + var searchQueryDictionary = {}; + queryParts.forEach(function (subQuery) { + searchQueryDictionary[subQuery] = subQuery; + }); + + var arrayContainsQueryPart = function arrayContainsQueryPart(array) { + for (var i = 0; i < array.length; i += 1) { + var subQuery = array[i]; + if (searchQueryDictionary[subQuery]) { + return true; + } + } + return false; + }; + + var downloadResultsFromQuery = []; + fileInfos.forEach(function (fileInfo) { + var channel_name = fileInfo.channel_name, + claim_name = fileInfo.claim_name, + metadata = fileInfo.metadata; + var author = metadata.author, + description = metadata.description, + title = metadata.title; + + + if (channel_name) { + var channelName = channel_name.toLowerCase(); + var strippedOutChannelName = channelName.slice(1); // trim off the @ + if (searchQueryDictionary[channel_name] || searchQueryDictionary[strippedOutChannelName]) { + downloadResultsFromQuery.push(fileInfo); + return; + } + } + + var nameParts = claim_name.toLowerCase().split('-'); + if (arrayContainsQueryPart(nameParts)) { + downloadResultsFromQuery.push(fileInfo); + return; + } + + var titleParts = title.toLowerCase().split(' '); + if (arrayContainsQueryPart(titleParts)) { + downloadResultsFromQuery.push(fileInfo); + return; + } + + if (author) { + var authorParts = author.toLowerCase().split(' '); + if (arrayContainsQueryPart(authorParts)) { + downloadResultsFromQuery.push(fileInfo); + return; + } + } + + if (description) { + var descriptionParts = description.toLowerCase().split(' '); + if (arrayContainsQueryPart(descriptionParts)) { + downloadResultsFromQuery.push(fileInfo); + } + } + }); + + return downloadResultsFromQuery.length ? downloadResultsFromQuery.map(function (fileInfo) { + var channelName = fileInfo.channel_name, + claimId = fileInfo.claim_id, + claimName = fileInfo.claim_name, + value = fileInfo.value, + metadata = fileInfo.metadata; + + var uriParams = {}; + + if (channelName) { + uriParams.channelName = channelName; + } + + uriParams.claimId = claimId; + uriParams.claimId = claimId; + uriParams.contentName = claimName; + + var uri = (0, _lbryURI.buildURI)(uriParams); + return uri; + }) : null; + }); +}; + /***/ }), /* 13 */ /***/ (function(module, exports, __webpack_require__) { @@ -1944,6 +2089,62 @@ var selectTotalDownloadProgress = exports.selectTotalDownloadProgress = (0, _res "use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.selectWunderBarAddress = exports.makeSelectSearchUris = exports.selectSearchUrisByQuery = exports.selectIsSearching = exports.selectSearchQuery = exports.selectSearchValue = exports.selectSearchState = exports.selectState = undefined; + +var _navigation = __webpack_require__(5); + +var _reselect = __webpack_require__(1); + +var selectState = exports.selectState = function selectState(state) { + return state.search || {}; +}; + +var selectSearchState = exports.selectSearchState = selectState; + +var selectSearchValue = exports.selectSearchValue = (0, _reselect.createSelector)(selectState, function (state) { + return state.searchQuery; +}); + +var selectSearchQuery = exports.selectSearchQuery = (0, _reselect.createSelector)(_navigation.selectCurrentPage, _navigation.selectCurrentParams, function (page, params) { + return page === 'search' ? params && params.query : null; +}); + +var selectIsSearching = exports.selectIsSearching = (0, _reselect.createSelector)(selectState, function (state) { + return state.searching; +}); + +var selectSearchUrisByQuery = exports.selectSearchUrisByQuery = (0, _reselect.createSelector)(selectState, function (state) { + return state.urisByQuery; +}); + +var makeSelectSearchUris = exports.makeSelectSearchUris = function makeSelectSearchUris(query) { + return ( + // replace statement below is kind of ugly, and repeated in doSearch action + (0, _reselect.createSelector)(selectSearchUrisByQuery, function (byQuery) { + return byQuery[query ? query.replace(/^lbry:\/\//i, '') : query]; + }) + ); +}; + +var selectWunderBarAddress = exports.selectWunderBarAddress = (0, _reselect.createSelector)(_navigation.selectCurrentPage, selectSearchQuery, _navigation.selectCurrentParams, function (page, query, params) { + // only populate the wunderbar address if we are on the file/channel pages + // or show the search query + if (page === 'show') { + return params.uri; + } + return query; +}); + +/***/ }), +/* 14 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + Object.defineProperty(exports, "__esModule", { value: true }); @@ -2074,7 +2275,7 @@ var makeSelectBlockDate = exports.makeSelectBlockDate = function makeSelectBlock }; /***/ }), -/* 14 */ +/* 15 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2083,8 +2284,8 @@ var makeSelectBlockDate = exports.makeSelectBlockDate = function makeSelectBlock Object.defineProperty(exports, "__esModule", { value: true }); -exports.selectBlocks = exports.selectDraftTransactionError = exports.selectDraftTransactionAddress = exports.selectDraftTransactionAmount = exports.selectDraftTransaction = exports.selectGettingNewAddress = exports.selectReceiveAddress = exports.selectIsSendingSupport = exports.selectIsFetchingTransactions = exports.selectHasTransactions = exports.selectRecentTransactions = exports.selectTransactionItems = exports.selectTransactionsById = exports.selectBalance = exports.makeSelectBlockDate = exports.selectWunderBarIcon = exports.selectWunderBarAddress = exports.selectSearchUrisByQuery = exports.selectIsSearching = exports.selectSearchQuery = exports.makeSelectSearchUris = exports.selectActiveHistoryEntry = exports.selectHistoryStack = exports.selectHistoryIndex = exports.selectIsForwardDisabled = exports.selectIsBackDisabled = exports.selectPathAfterAuth = exports.selectPageTitle = exports.selectHeaderLinks = exports.selectCurrentParams = undefined; -exports.selectCurrentPage = exports.selectCurrentPath = exports.makeSelectCurrentParam = exports.computePageFromPath = exports.selectTotalDownloadProgress = exports.selectDownloadingFileInfos = exports.selectFileInfosDownloaded = exports.selectUrisLoading = exports.selectDownloadingByOutpoint = exports.selectIsFetchingFileListDownloadedOrPublished = exports.selectIsFetchingFileList = exports.selectFileInfosByOutpoint = exports.makeSelectLoadingForUri = exports.makeSelectDownloadingForUri = exports.makeSelectFileInfoForUri = exports.selectFetchingCostInfo = exports.selectCostForCurrentPageUri = exports.selectAllCostInfoByUri = exports.makeSelectCostInfoForUri = exports.makeSelectFetchingCostInfoForUri = exports.selectRewardContentClaimIds = exports.selectChannelClaimCounts = exports.selectPlayingUri = exports.selectFetchingFeaturedUris = exports.selectFeaturedUris = exports.selectResolvingUris = exports.selectMyChannelClaims = exports.selectFetchingMyChannels = exports.selectMyClaimsOutpoints = exports.selectAllMyClaimsByOutpoint = exports.selectMyClaimsWithoutChannels = exports.selectMyClaims = exports.selectPendingClaims = exports.selectIsFetchingClaimListMine = exports.selectAllFetchingChannelClaims = exports.selectMyActiveClaims = exports.selectAbandoningIds = exports.selectMyClaimsRaw = exports.selectAllClaimsByChannel = exports.selectClaimsByUri = exports.selectClaimsById = exports.makeSelectTotalPagesForChannel = exports.makeSelectTotalItemsForChannel = exports.makeSelectIsUriResolving = exports.makeSelectContentTypeForUri = exports.makeSelectTitleForUri = exports.makeSelectMetadataForUri = exports.makeSelectClaimsInChannelForCurrentPage = exports.makeSelectFetchingChannelClaims = exports.makeSelectClaimIsMine = exports.makeSelectClaimForUri = exports.selectNotification = exports.walletReducer = exports.searchReducer = exports.notificationsReducer = exports.fileInfoReducer = exports.costInfoReducer = exports.claimsReducer = exports.formatFullPrice = exports.formatCredits = exports.toQueryString = exports.parseQueryParams = exports.batchActions = exports.doSendSupport = exports.doSetDraftTransactionAddress = exports.doSetDraftTransactionAmount = exports.doSendDraftTransaction = exports.doCheckAddressIsMine = exports.doGetNewAddress = exports.doFetchBlock = exports.doFetchTransactions = exports.doBalanceSubscribe = exports.doUpdateBalance = exports.doSearch = exports.doFetchFileInfosAndPublishedClaims = exports.doFileList = exports.doFetchFileInfo = exports.doFetchCostInfoForUri = exports.doFetchRewardedContent = exports.doFetchFeaturedUris = exports.doResolveUri = exports.doResolveUris = exports.doAbandonClaim = exports.doFetchClaimListMine = exports.doShowSnackBar = exports.doCloseModal = exports.doOpenModal = exports.doNotify = exports.isURIClaimable = exports.isURIValid = exports.normalizeURI = exports.buildURI = exports.parseURI = exports.regexAddress = exports.regexInvalidURI = exports.Lbryapi = exports.Lbry = exports.SETTINGS = exports.ACTIONS = exports.Notification = undefined; +exports.selectBlocks = exports.selectDraftTransactionError = exports.selectDraftTransactionAddress = exports.selectDraftTransactionAmount = exports.selectDraftTransaction = exports.selectGettingNewAddress = exports.selectReceiveAddress = exports.selectIsSendingSupport = exports.selectIsFetchingTransactions = exports.selectHasTransactions = exports.selectRecentTransactions = exports.selectTransactionItems = exports.selectTransactionsById = exports.selectBalance = exports.makeSelectBlockDate = exports.selectWunderBarAddress = exports.selectSearchUrisByQuery = exports.selectIsSearching = exports.selectSearchValue = exports.selectSearchQuery = exports.selectSearchState = exports.makeSelectSearchUris = exports.selectNavLinks = exports.selectActiveHistoryEntry = exports.selectHistoryStack = exports.selectHistoryIndex = exports.selectIsForwardDisabled = exports.selectIsBackDisabled = exports.selectPathAfterAuth = exports.selectPageTitle = exports.selectHeaderLinks = exports.selectCurrentParams = exports.selectCurrentPage = exports.selectCurrentPath = undefined; +exports.makeSelectCurrentParam = exports.computePageFromPath = exports.selectSearchDownloadUris = exports.selectTotalDownloadProgress = exports.selectDownloadingFileInfos = exports.selectFileInfosDownloaded = exports.selectUrisLoading = exports.selectDownloadingByOutpoint = exports.selectIsFetchingFileListDownloadedOrPublished = exports.selectIsFetchingFileList = exports.selectFileInfosByOutpoint = exports.makeSelectLoadingForUri = exports.makeSelectDownloadingForUri = exports.makeSelectFileInfoForUri = exports.selectFetchingCostInfo = exports.selectCostForCurrentPageUri = exports.selectAllCostInfoByUri = exports.makeSelectCostInfoForUri = exports.makeSelectFetchingCostInfoForUri = exports.selectRewardContentClaimIds = exports.selectChannelClaimCounts = exports.selectPlayingUri = exports.selectFetchingFeaturedUris = exports.selectFeaturedUris = exports.selectResolvingUris = exports.selectMyChannelClaims = exports.selectFetchingMyChannels = exports.selectMyClaimsOutpoints = exports.selectAllMyClaimsByOutpoint = exports.selectMyClaimsWithoutChannels = exports.selectMyClaims = exports.selectPendingClaims = exports.selectIsFetchingClaimListMine = exports.selectAllFetchingChannelClaims = exports.selectMyActiveClaims = exports.selectAbandoningIds = exports.selectMyClaimsRaw = exports.selectAllClaimsByChannel = exports.selectClaimsByUri = exports.selectClaimsById = exports.makeSelectTotalPagesForChannel = exports.makeSelectTotalItemsForChannel = exports.makeSelectIsUriResolving = exports.makeSelectContentTypeForUri = exports.makeSelectTitleForUri = exports.makeSelectMetadataForUri = exports.makeSelectClaimsInChannelForCurrentPage = exports.makeSelectFetchingChannelClaims = exports.makeSelectClaimIsMine = exports.makeSelectClaimForUri = exports.selectNotification = exports.walletReducer = exports.searchReducer = exports.notificationsReducer = exports.fileInfoReducer = exports.costInfoReducer = exports.claimsReducer = exports.formatFullPrice = exports.formatCredits = exports.toQueryString = exports.parseQueryParams = exports.batchActions = exports.doSendSupport = exports.doSetDraftTransactionAddress = exports.doSetDraftTransactionAmount = exports.doSendDraftTransaction = exports.doCheckAddressIsMine = exports.doGetNewAddress = exports.doFetchBlock = exports.doFetchTransactions = exports.doBalanceSubscribe = exports.doUpdateBalance = exports.doUpdateSearchQuery = exports.doSearch = exports.doFetchFileInfosAndPublishedClaims = exports.doFileList = exports.doFetchFileInfo = exports.doFetchCostInfoForUri = exports.doFetchRewardedContent = exports.doFetchFeaturedUris = exports.doResolveUri = exports.doResolveUris = exports.doAbandonClaim = exports.doFetchClaimListMine = exports.doShowSnackBar = exports.doCloseModal = exports.doOpenModal = exports.doNotify = exports.isURIClaimable = exports.isURIValid = exports.normalizeURI = exports.buildURI = exports.parseURI = exports.regexAddress = exports.regexInvalidURI = exports.Lbryapi = exports.Lbry = exports.SETTINGS = exports.ACTIONS = exports.Notification = undefined; var _Notification = __webpack_require__(9); @@ -2140,7 +2341,7 @@ Object.defineProperty(exports, 'isURIClaimable', { } }); -var _notifications = __webpack_require__(15); +var _notifications = __webpack_require__(16); Object.defineProperty(exports, 'doNotify', { enumerable: true, @@ -2209,7 +2410,7 @@ Object.defineProperty(exports, 'doFetchRewardedContent', { } }); -var _cost_info = __webpack_require__(22); +var _cost_info = __webpack_require__(23); Object.defineProperty(exports, 'doFetchCostInfoForUri', { enumerable: true, @@ -2218,7 +2419,7 @@ Object.defineProperty(exports, 'doFetchCostInfoForUri', { } }); -var _file_info = __webpack_require__(23); +var _file_info = __webpack_require__(24); Object.defineProperty(exports, 'doFetchFileInfo', { enumerable: true, @@ -2239,7 +2440,7 @@ Object.defineProperty(exports, 'doFetchFileInfosAndPublishedClaims', { } }); -var _search = __webpack_require__(24); +var _search = __webpack_require__(25); Object.defineProperty(exports, 'doSearch', { enumerable: true, @@ -2247,8 +2448,14 @@ Object.defineProperty(exports, 'doSearch', { return _search.doSearch; } }); +Object.defineProperty(exports, 'doUpdateSearchQuery', { + enumerable: true, + get: function get() { + return _search.doUpdateSearchQuery; + } +}); -var _wallet = __webpack_require__(25); +var _wallet = __webpack_require__(28); Object.defineProperty(exports, 'doUpdateBalance', { enumerable: true, @@ -2335,7 +2542,7 @@ Object.defineProperty(exports, 'toQueryString', { } }); -var _formatCredits = __webpack_require__(27); +var _formatCredits = __webpack_require__(30); Object.defineProperty(exports, 'formatCredits', { enumerable: true, @@ -2350,7 +2557,7 @@ Object.defineProperty(exports, 'formatFullPrice', { } }); -var _claims2 = __webpack_require__(28); +var _claims2 = __webpack_require__(31); Object.defineProperty(exports, 'claimsReducer', { enumerable: true, @@ -2359,7 +2566,7 @@ Object.defineProperty(exports, 'claimsReducer', { } }); -var _cost_info2 = __webpack_require__(29); +var _cost_info2 = __webpack_require__(32); Object.defineProperty(exports, 'costInfoReducer', { enumerable: true, @@ -2368,7 +2575,7 @@ Object.defineProperty(exports, 'costInfoReducer', { } }); -var _file_info2 = __webpack_require__(30); +var _file_info2 = __webpack_require__(33); Object.defineProperty(exports, 'fileInfoReducer', { enumerable: true, @@ -2377,7 +2584,7 @@ Object.defineProperty(exports, 'fileInfoReducer', { } }); -var _notifications2 = __webpack_require__(31); +var _notifications2 = __webpack_require__(34); Object.defineProperty(exports, 'notificationsReducer', { enumerable: true, @@ -2386,7 +2593,7 @@ Object.defineProperty(exports, 'notificationsReducer', { } }); -var _search2 = __webpack_require__(32); +var _search2 = __webpack_require__(35); Object.defineProperty(exports, 'searchReducer', { enumerable: true, @@ -2395,7 +2602,7 @@ Object.defineProperty(exports, 'searchReducer', { } }); -var _wallet2 = __webpack_require__(33); +var _wallet2 = __webpack_require__(37); Object.defineProperty(exports, 'walletReducer', { enumerable: true, @@ -2404,7 +2611,7 @@ Object.defineProperty(exports, 'walletReducer', { } }); -var _notifications3 = __webpack_require__(34); +var _notifications3 = __webpack_require__(38); Object.defineProperty(exports, 'selectNotification', { enumerable: true, @@ -2602,7 +2809,7 @@ Object.defineProperty(exports, 'selectRewardContentClaimIds', { } }); -var _cost_info3 = __webpack_require__(35); +var _cost_info3 = __webpack_require__(39); Object.defineProperty(exports, 'makeSelectFetchingCostInfoForUri', { enumerable: true, @@ -2703,8 +2910,14 @@ Object.defineProperty(exports, 'selectTotalDownloadProgress', { return _file_info3.selectTotalDownloadProgress; } }); +Object.defineProperty(exports, 'selectSearchDownloadUris', { + enumerable: true, + get: function get() { + return _file_info3.selectSearchDownloadUris; + } +}); -var _navigation = __webpack_require__(4); +var _navigation = __webpack_require__(5); Object.defineProperty(exports, 'computePageFromPath', { enumerable: true, @@ -2784,8 +2997,14 @@ Object.defineProperty(exports, 'selectActiveHistoryEntry', { return _navigation.selectActiveHistoryEntry; } }); +Object.defineProperty(exports, 'selectNavLinks', { + enumerable: true, + get: function get() { + return _navigation.selectNavLinks; + } +}); -var _search3 = __webpack_require__(36); +var _search3 = __webpack_require__(13); Object.defineProperty(exports, 'makeSelectSearchUris', { enumerable: true, @@ -2793,12 +3012,24 @@ Object.defineProperty(exports, 'makeSelectSearchUris', { return _search3.makeSelectSearchUris; } }); +Object.defineProperty(exports, 'selectSearchState', { + enumerable: true, + get: function get() { + return _search3.selectSearchState; + } +}); Object.defineProperty(exports, 'selectSearchQuery', { enumerable: true, get: function get() { return _search3.selectSearchQuery; } }); +Object.defineProperty(exports, 'selectSearchValue', { + enumerable: true, + get: function get() { + return _search3.selectSearchValue; + } +}); Object.defineProperty(exports, 'selectIsSearching', { enumerable: true, get: function get() { @@ -2817,14 +3048,8 @@ Object.defineProperty(exports, 'selectWunderBarAddress', { return _search3.selectWunderBarAddress; } }); -Object.defineProperty(exports, 'selectWunderBarIcon', { - enumerable: true, - get: function get() { - return _search3.selectWunderBarIcon; - } -}); -var _wallet3 = __webpack_require__(13); +var _wallet3 = __webpack_require__(14); Object.defineProperty(exports, 'makeSelectBlockDate', { enumerable: true, @@ -2921,11 +3146,11 @@ var _action_types = __webpack_require__(0); var ACTIONS = _interopRequireWildcard(_action_types); -var _settings = __webpack_require__(37); +var _settings = __webpack_require__(40); var SETTINGS = _interopRequireWildcard(_settings); -var _lbry = __webpack_require__(5); +var _lbry = __webpack_require__(4); var _lbry2 = _interopRequireDefault(_lbry); @@ -2947,7 +3172,7 @@ exports.Lbry = _lbry2.default; exports.Lbryapi = _lbryapi2.default; /***/ }), -/* 15 */ +/* 16 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2978,7 +3203,7 @@ function doNotify(data) { } /***/ }), -/* 16 */ +/* 17 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3157,10 +3382,10 @@ function doNotify(data) { scope['Proxy'] = scope.Proxy; })(typeof module !== 'undefined' && module['exports'] ? global : window); -/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(17))) +/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(18))) /***/ }), -/* 17 */ +/* 18 */ /***/ (function(module, exports) { var g; @@ -3187,7 +3412,7 @@ module.exports = g; /***/ }), -/* 18 */ +/* 19 */ /***/ (function(module, exports) { // shim for using process in browser @@ -3377,18 +3602,18 @@ process.umask = function() { return 0; }; /***/ }), -/* 19 */ +/* 20 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -exports.decode = exports.parse = __webpack_require__(20); -exports.encode = exports.stringify = __webpack_require__(21); +exports.decode = exports.parse = __webpack_require__(21); +exports.encode = exports.stringify = __webpack_require__(22); /***/ }), -/* 20 */ +/* 21 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3479,7 +3704,7 @@ var isArray = Array.isArray || function (xs) { /***/ }), -/* 21 */ +/* 22 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3571,7 +3796,7 @@ var objectKeys = Object.keys || function (obj) { /***/ }), -/* 22 */ +/* 23 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3631,7 +3856,7 @@ function doFetchCostInfoForUri(uri) { } /***/ }), -/* 23 */ +/* 24 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3648,7 +3873,7 @@ var _action_types = __webpack_require__(0); var ACTIONS = _interopRequireWildcard(_action_types); -var _lbry = __webpack_require__(5); +var _lbry = __webpack_require__(4); var _lbry2 = _interopRequireDefault(_lbry); @@ -3724,7 +3949,7 @@ function doFetchFileInfosAndPublishedClaims() { } /***/ }), -/* 24 */ +/* 25 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3733,81 +3958,230 @@ function doFetchFileInfosAndPublishedClaims() { Object.defineProperty(exports, "__esModule", { value: true }); -exports.doSearch = doSearch; +exports.getSearchSuggestions = exports.doUpdateSearchQuery = exports.doSearch = undefined; var _action_types = __webpack_require__(0); var ACTIONS = _interopRequireWildcard(_action_types); +var _search = __webpack_require__(26); + +var SEARCH_TYPES = _interopRequireWildcard(_search); + var _lbryURI = __webpack_require__(2); var _claims = __webpack_require__(6); -var _navigation = __webpack_require__(4); - var _batchActions = __webpack_require__(8); +var _search2 = __webpack_require__(13); + +var _handleFetch = __webpack_require__(27); + +var _handleFetch2 = _interopRequireDefault(_handleFetch); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } -// eslint-disable-next-line import/prefer-default-export -function doSearch(rawQuery, currentPageNotSearchHandler) { +var doSearch = exports.doSearch = function doSearch(rawQuery) { return function (dispatch, getState) { var state = getState(); - var page = (0, _navigation.selectCurrentPage)(state); - var query = rawQuery.replace(/^lbry:\/\//i, ''); if (!query) { dispatch({ - type: ACTIONS.SEARCH_CANCELLED + type: ACTIONS.SEARCH_FAIL }); return; } + // If we have already searched for something, we don't need to do anything + var urisForQuery = (0, _search2.makeSelectSearchUris)(query)(state); + if (urisForQuery && !!urisForQuery.length) { + return; + } + dispatch({ - type: ACTIONS.SEARCH_STARTED, + type: ACTIONS.SEARCH_START + }); + + // If the user is on the file page with a pre-populated uri and they select + // the search option without typing anything, searchQuery will be empty + // We need to populate it so the input is filled on the search page + if (!state.search.searchQuery) { + dispatch({ + type: ACTIONS.UPDATE_SEARCH_QUERY, + data: { searchQuery: query } + }); + } + + fetch('https://lighthouse.lbry.io/search?s=' + query).then(_handleFetch2.default).then(function (data) { + var uris = []; + var actions = []; + + data.forEach(function (result) { + var uri = (0, _lbryURI.buildURI)({ + claimName: result.name, + claimId: result.claimId + }); + actions.push((0, _claims.doResolveUri)(uri)); + uris.push(uri); + }); + + actions.push({ + type: ACTIONS.SEARCH_SUCCESS, + data: { + query: query, + uris: uris + } + }); + dispatch(_batchActions.batchActions.apply(undefined, actions)); + }).catch(function () { + dispatch({ + type: ACTIONS.SEARCH_FAIL + }); + }); + }; +}; + +var doUpdateSearchQuery = exports.doUpdateSearchQuery = function doUpdateSearchQuery(query, shouldSkipSuggestions) { + return function (dispatch) { + dispatch({ + type: ACTIONS.UPDATE_SEARCH_QUERY, data: { query: query } }); - if (page !== 'search') { - if (currentPageNotSearchHandler) { - currentPageNotSearchHandler(); - } - } else { - fetch('https://lighthouse.lbry.io/search?s=' + query).then(function (response) { - return response.status === 200 ? Promise.resolve(response.json()) : Promise.reject(new Error(response.statusText)); - }).then(function (data) { - var uris = []; - var actions = []; - - data.forEach(function (result) { - var uri = (0, _lbryURI.buildURI)({ - name: result.name, - claimId: result.claimId - }); - actions.push((0, _claims.doResolveUri)(uri)); - uris.push(uri); - }); - - actions.push({ - type: ACTIONS.SEARCH_COMPLETED, - data: { - query: query, - uris: uris - } - }); - dispatch(_batchActions.batchActions.apply(undefined, actions)); - }).catch(function () { - dispatch({ - type: ACTIONS.SEARCH_CANCELLED - }); - }); + // Don't fetch new suggestions if the user just added a space + if (!query.endsWith(' ') || !shouldSkipSuggestions) { + dispatch(getSearchSuggestions(query)); } }; +}; + +var getSearchSuggestions = exports.getSearchSuggestions = function getSearchSuggestions(value) { + return function (dispatch) { + var query = value.trim(); + + var isPrefix = function isPrefix() { + return query === '@' || query === 'lbry:' || query === 'lbry:/' || query === 'lbry://'; + }; + + if (!query || isPrefix()) { + dispatch({ + type: ACTIONS.UPDATE_SEARCH_SUGGESTIONS, + data: { suggestions: [] } + }); + return; + } + + var suggestions = []; + try { + // If the user is about to manually add the claim id ignore it until they + // actually add one. This would hardly ever happen, but then the search + // suggestions won't change just from adding a '#' after a uri + var uriQuery = query; + if (uriQuery.endsWith('#')) { + uriQuery = uriQuery.slice(0, -1); + } + + var uri = (0, _lbryURI.normalizeURI)(uriQuery); + + var _parseURI = (0, _lbryURI.parseURI)(uri), + claimName = _parseURI.claimName, + isChannel = _parseURI.isChannel; + + suggestions.push({ + value: uri, + shorthand: isChannel ? claimName.slice(1) : claimName, + type: isChannel ? SEARCH_TYPES.CHANNEL : SEARCH_TYPES.FILE + }, { + value: claimName, + type: SEARCH_TYPES.SEARCH + }); + + // If it's a valid url, don't fetch any extra search results + return dispatch({ + type: ACTIONS.UPDATE_SEARCH_SUGGESTIONS, + data: { suggestions: suggestions } + }); + } catch (e) { + suggestions.push({ + value: query, + type: SEARCH_TYPES.SEARCH + }); + } + + // Populate the current search query suggestion before fetching results + dispatch({ + type: ACTIONS.UPDATE_SEARCH_SUGGESTIONS, + data: { suggestions: suggestions } + }); + + // strip out any basic stuff for more accurate search results + var searchValue = value.replace(/lbry:\/\//g, '').replace(/-/g, ' '); + if (searchValue.includes('#')) { + // This should probably be more robust, but I think it's fine for now + // Remove everything after # to get rid of the claim id + searchValue = searchValue.substring(0, searchValue.indexOf('#')); + } + + return fetch('https://lighthouse.lbry.io/autocomplete?s=' + searchValue).then(_handleFetch2.default).then(function (apiSuggestions) { + var formattedSuggestions = apiSuggestions.slice(0, 6).map(function (suggestion) { + // This will need to be more robust when the api starts returning lbry uris + var isChannel = suggestion.startsWith('@'); + var suggestionObj = { + value: isChannel ? 'lbry://' + suggestion : suggestion, + shorthand: isChannel ? suggestion.slice(1) : '', + type: isChannel ? 'channel' : 'search' + }; + + return suggestionObj; + }); + + suggestions = suggestions.concat(formattedSuggestions); + dispatch({ + type: ACTIONS.UPDATE_SEARCH_SUGGESTIONS, + data: { suggestions: suggestions } + }); + }).catch(function () { + // If the fetch fails, do nothing + // Basic search suggestions are already populated at this point + }); + }; +}; + +/***/ }), +/* 26 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +var FILE = exports.FILE = 'file'; +var CHANNEL = exports.CHANNEL = 'channel'; +var SEARCH = exports.SEARCH = 'search'; + +/***/ }), +/* 27 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = handleFetchResponse; +function handleFetchResponse(response) { + return response.status === 200 ? Promise.resolve(response.json()) : Promise.reject(new Error(response.statusText)); } /***/ }), -/* 25 */ +/* 28 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3831,17 +4205,17 @@ var _action_types = __webpack_require__(0); var ACTIONS = _interopRequireWildcard(_action_types); -var _modal_types = __webpack_require__(26); +var _modal_types = __webpack_require__(29); var MODALS = _interopRequireWildcard(_modal_types); -var _lbry = __webpack_require__(5); +var _lbry = __webpack_require__(4); var _lbry2 = _interopRequireDefault(_lbry); var _app = __webpack_require__(10); -var _wallet = __webpack_require__(13); +var _wallet = __webpack_require__(14); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -3875,7 +4249,7 @@ function doFetchTransactions() { type: ACTIONS.FETCH_TRANSACTIONS_STARTED }); - _lbry2.default.transaction_list({ include_tip_info: true }).then(function (results) { + _lbry2.default.transaction_list().then(function (results) { dispatch({ type: ACTIONS.FETCH_TRANSACTIONS_COMPLETED, data: { @@ -4015,7 +4389,7 @@ function doSendSupport(amount, claimId, uri, successCallback, errorCallback) { } /***/ }), -/* 26 */ +/* 29 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4041,7 +4415,7 @@ var AFFIRM_PURCHASE = exports.AFFIRM_PURCHASE = 'affirm_purchase'; var CONFIRM_CLAIM_REVOKE = exports.CONFIRM_CLAIM_REVOKE = 'confirmClaimRevoke'; /***/ }), -/* 27 */ +/* 30 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4079,7 +4453,7 @@ function formatFullPrice(amount) { } /***/ }), -/* 28 */ +/* 31 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4387,7 +4761,7 @@ function claimsReducer() { } /***/ }), -/* 29 */ +/* 32 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4445,7 +4819,7 @@ function costInfoReducer() { } /***/ }), -/* 30 */ +/* 33 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4642,7 +5016,7 @@ function fileInfoReducer() { } /***/ }), -/* 31 */ +/* 34 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4707,7 +5081,7 @@ function notificationsReducer() { } /***/ }), -/* 32 */ +/* 35 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4716,57 +5090,103 @@ function notificationsReducer() { Object.defineProperty(exports, "__esModule", { value: true }); -exports.searchReducer = searchReducer; +exports.searchReducer = undefined; + +var _handleActions; + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _action_types = __webpack_require__(0); var ACTIONS = _interopRequireWildcard(_action_types); +var _reduxUtils = __webpack_require__(36); + function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } -var reducers = {}; var defaultState = { - urisByQuery: {}, - searching: false + isActive: false, + searchQuery: '', // needs to be an empty string for input focusing + suggestions: [], + urisByQuery: {} }; -reducers[ACTIONS.SEARCH_STARTED] = function (state) { - return Object.assign({}, state, { +var searchReducer = exports.searchReducer = (0, _reduxUtils.handleActions)((_handleActions = {}, _defineProperty(_handleActions, ACTIONS.SEARCH_START, function (state) { + return _extends({}, state, { searching: true }); -}; - -reducers[ACTIONS.SEARCH_COMPLETED] = function (state, action) { +}), _defineProperty(_handleActions, ACTIONS.SEARCH_SUCCESS, function (state, action) { var _action$data = action.data, query = _action$data.query, uris = _action$data.uris; - return Object.assign({}, state, { + return _extends({}, state, { searching: false, urisByQuery: Object.assign({}, state.urisByQuery, _defineProperty({}, query, uris)) }); -}; - -reducers[ACTIONS.SEARCH_CANCELLED] = function (state) { - return Object.assign({}, state, { +}), _defineProperty(_handleActions, ACTIONS.SEARCH_FAIL, function (state) { + return _extends({}, state, { searching: false }); -}; - -function searchReducer() { - var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultState; - var action = arguments[1]; - - var handler = reducers[action.type]; - if (handler) return handler(state, action); - return state; -} +}), _defineProperty(_handleActions, ACTIONS.UPDATE_SEARCH_QUERY, function (state, action) { + return _extends({}, state, { + searchQuery: action.data.query, + isActive: true + }); +}), _defineProperty(_handleActions, ACTIONS.UPDATE_SEARCH_SUGGESTIONS, function (state, action) { + return _extends({}, state, { + suggestions: action.data.suggestions + }); +}), _defineProperty(_handleActions, ACTIONS.HISTORY_NAVIGATE, function (state) { + return _extends({}, state, { + searchQuery: '', + suggestions: [], + isActive: false + }); +}), _defineProperty(_handleActions, ACTIONS.CLOSE_MODAL, function (state) { + return _extends({}, state, { + isActive: false + }); +}), _handleActions), defaultState); /***/ }), -/* 33 */ +/* 36 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +// util for creating reducers +// based off of redux-actions +// https://redux-actions.js.org/docs/api/handleAction.html#handleactions + +// eslint-disable-next-line import/prefer-default-export +var handleActions = exports.handleActions = function handleActions(actionMap, defaultState) { + return function () { + var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultState; + var action = arguments[1]; + + var handler = actionMap[action.type]; + + if (handler) { + var newState = handler(state, action); + return Object.assign({}, state, newState); + } + + // just return the original state if no handler + // returning a copy here breaks redux-persist + return state; + }; +}; + +/***/ }), +/* 37 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4950,7 +5370,7 @@ function walletReducer() { } /***/ }), -/* 34 */ +/* 38 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4972,7 +5392,7 @@ var selectNotification = exports.selectNotification = (0, _reselect.createSelect }); /***/ }), -/* 35 */ +/* 39 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4985,7 +5405,7 @@ exports.makeSelectFetchingCostInfoForUri = exports.selectFetchingCostInfo = expo var _reselect = __webpack_require__(1); -var _navigation = __webpack_require__(4); +var _navigation = __webpack_require__(5); var selectState = exports.selectState = function selectState(state) { return state.costInfo || {}; @@ -5016,95 +5436,7 @@ var makeSelectFetchingCostInfoForUri = exports.makeSelectFetchingCostInfoForUri }; /***/ }), -/* 36 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.selectWunderBarIcon = exports.selectWunderBarAddress = exports.makeSelectSearchUris = exports.selectSearchUrisByQuery = exports.selectIsSearching = exports.selectSearchQuery = exports.selectState = undefined; - -var _navigation = __webpack_require__(4); - -var _reselect = __webpack_require__(1); - -var selectState = exports.selectState = function selectState(state) { - return state.search || {}; -}; - -var selectSearchQuery = exports.selectSearchQuery = (0, _reselect.createSelector)(_navigation.selectCurrentPage, _navigation.selectCurrentParams, function (page, params) { - return page === 'search' ? params && params.query : null; -}); - -var selectIsSearching = exports.selectIsSearching = (0, _reselect.createSelector)(selectState, function (state) { - return state.searching; -}); - -var selectSearchUrisByQuery = exports.selectSearchUrisByQuery = (0, _reselect.createSelector)(selectState, function (state) { - return state.urisByQuery; -}); - -var makeSelectSearchUris = exports.makeSelectSearchUris = function makeSelectSearchUris(query) { - return ( - // replace statement below is kind of ugly, and repeated in doSearch action - (0, _reselect.createSelector)(selectSearchUrisByQuery, function (byQuery) { - return byQuery[query ? query.replace(/^lbry:\/\//i, '') : query]; - }) - ); -}; - -var selectWunderBarAddress = exports.selectWunderBarAddress = (0, _reselect.createSelector)(_navigation.selectCurrentPage, _navigation.selectPageTitle, selectSearchQuery, function (page, title, query) { - return page !== 'search' ? title : query || title; -}); - -var selectWunderBarIcon = exports.selectWunderBarIcon = (0, _reselect.createSelector)(_navigation.selectCurrentPage, _navigation.selectCurrentParams, function (page, params) { - switch (page) { - case 'auth': - return 'icon-user'; - case 'settings': - return 'icon-gear'; - case 'help': - return 'icon-question'; - case 'report': - return 'icon-file'; - case 'downloaded': - return 'icon-folder'; - case 'published': - return 'icon-folder'; - case 'history': - return 'icon-history'; - case 'send': - return 'icon-send'; - case 'rewards': - return 'icon-rocket'; - case 'invite': - return 'icon-envelope-open'; - case 'getcredits': - return 'icon-shopping-cart'; - case 'wallet': - case 'backup': - return 'icon-bank'; - case 'show': - return 'icon-file'; - case 'publish': - return params.id ? __('icon-pencil') : __('icon-upload'); - case 'developer': - return 'icon-code'; - case 'discover': - case 'search': - return 'icon-search'; - case 'subscriptions': - return 'icon-th-list'; - default: - return 'icon-file'; - } -}); - -/***/ }), -/* 37 */ +/* 40 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; diff --git a/src/constants/action_types.js b/src/constants/action_types.js index f4a9931..1c71858 100644 --- a/src/constants/action_types.js +++ b/src/constants/action_types.js @@ -39,8 +39,6 @@ export const FETCH_TRANSACTIONS_COMPLETED = 'FETCH_TRANSACTIONS_COMPLETED'; export const UPDATE_BALANCE = 'UPDATE_BALANCE'; export const CHECK_ADDRESS_IS_MINE_STARTED = 'CHECK_ADDRESS_IS_MINE_STARTED'; export const CHECK_ADDRESS_IS_MINE_COMPLETED = 'CHECK_ADDRESS_IS_MINE_COMPLETED'; -export const SET_DRAFT_TRANSACTION_AMOUNT = 'SET_DRAFT_TRANSACTION_AMOUNT'; -export const SET_DRAFT_TRANSACTION_ADDRESS = 'SET_DRAFT_TRANSACTION_ADDRESS'; export const SEND_TRANSACTION_STARTED = 'SEND_TRANSACTION_STARTED'; export const SEND_TRANSACTION_COMPLETED = 'SEND_TRANSACTION_COMPLETED'; export const SEND_TRANSACTION_FAILED = 'SEND_TRANSACTION_FAILED'; @@ -90,9 +88,11 @@ export const FETCH_AVAILABILITY_COMPLETED = 'FETCH_AVAILABILITY_COMPLETED'; export const FILE_DELETE = 'FILE_DELETE'; // Search -export const SEARCH_STARTED = 'SEARCH_STARTED'; -export const SEARCH_COMPLETED = 'SEARCH_COMPLETED'; -export const SEARCH_CANCELLED = 'SEARCH_CANCELLED'; +export const SEARCH_START = 'SEARCH_START'; +export const SEARCH_SUCCESS = 'SEARCH_SUCCESS'; +export const SEARCH_FAIL = 'SEARCH_FAIL'; +export const UPDATE_SEARCH_QUERY = 'UPDATE_SEARCH_QUERY'; +export const UPDATE_SEARCH_SUGGESTIONS = 'UPDATE_SEARCH_SUGGESTIONS'; // Settings export const DAEMON_SETTINGS_RECEIVED = 'DAEMON_SETTINGS_RECEIVED'; @@ -165,6 +165,8 @@ export const CHANNEL_SUBSCRIBE = 'CHANNEL_SUBSCRIBE'; export const CHANNEL_UNSUBSCRIBE = 'CHANNEL_UNSUBSCRIBE'; export const HAS_FETCHED_SUBSCRIPTIONS = 'HAS_FETCHED_SUBSCRIPTIONS'; export const SET_SUBSCRIPTION_LATEST = 'SET_SUBSCRIPTION_LATEST'; +export const SET_SUBSCRIPTION_NOTIFICATION = 'SET_SUBSCRIPTION_NOTIFICATION'; +export const SET_SUBSCRIPTION_NOTIFICATIONS = 'SET_SUBSCRIPTION_NOTIFICATIONS'; export const CHECK_SUBSCRIPTION_STARTED = 'CHECK_SUBSCRIPTION_STARTED'; export const CHECK_SUBSCRIPTION_COMPLETED = 'CHECK_SUBSCRIPTION_COMPLETED'; export const CHECK_SUBSCRIPTIONS_SUBSCRIBE = 'CHECK_SUBSCRIPTIONS_SUBSCRIBE'; @@ -176,3 +178,13 @@ export const SET_VIDEO_PAUSE = 'SET_VIDEO_PAUSE'; export const MEDIA_PLAY = 'MEDIA_PLAY'; export const MEDIA_PAUSE = 'MEDIA_PAUSE'; export const MEDIA_POSITION = 'MEDIA_POSITION'; + +// Publishing +export const CLEAR_PUBLISH = 'CLEAR_PUBLISH'; +export const UPDATE_PUBLISH_FORM = 'UPDATE_PUBLISH_FORM'; +export const PUBLISH_START = 'PUBLISH_START'; +export const PUBLISH_SUCCESS = 'PUBLISH_SUCCESS'; +export const PUBLISH_FAIL = 'PUBLISH_FAIL'; +export const CLEAR_PUBLISH_ERROR = 'CLEAR_PUBLISH_ERROR'; +export const REMOVE_PENDING_PUBLISH = 'REMOVE_PENDING_PUBLISH'; +export const DO_PREPARE_EDIT = 'DO_PREPARE_EDIT'; diff --git a/src/constants/search.js b/src/constants/search.js new file mode 100644 index 0000000..5bdbcd1 --- /dev/null +++ b/src/constants/search.js @@ -0,0 +1,3 @@ +export const FILE = 'file'; +export const CHANNEL = 'channel'; +export const SEARCH = 'search'; diff --git a/src/index.js b/src/index.js index 537abcc..e6ba208 100644 --- a/src/index.js +++ b/src/index.js @@ -43,7 +43,7 @@ export { doFetchFileInfosAndPublishedClaims, } from 'redux/actions/file_info'; -export { doSearch } from 'redux/actions/search'; +export { doSearch, doUpdateSearchQuery } from 'redux/actions/search'; export { doUpdateBalance, @@ -128,6 +128,7 @@ export { selectFileInfosDownloaded, selectDownloadingFileInfos, selectTotalDownloadProgress, + selectSearchDownloadUris, } from 'redux/selectors/file_info'; export { @@ -144,15 +145,17 @@ export { selectHistoryIndex, selectHistoryStack, selectActiveHistoryEntry, + selectNavLinks, } from 'redux/selectors/navigation'; export { makeSelectSearchUris, + selectSearchState, selectSearchQuery, + selectSearchValue, selectIsSearching, selectSearchUrisByQuery, selectWunderBarAddress, - selectWunderBarIcon, } from 'redux/selectors/search'; export { diff --git a/src/redux/actions/search.js b/src/redux/actions/search.js index c4d6da7..e3ec1ac 100644 --- a/src/redux/actions/search.js +++ b/src/redux/actions/search.js @@ -1,68 +1,173 @@ import * as ACTIONS from 'constants/action_types'; -import { buildURI } from 'lbryURI'; +import * as SEARCH_TYPES from 'constants/search'; +import { buildURI, normalizeURI, parseURI } from 'lbryURI'; import { doResolveUri } from 'redux/actions/claims'; -import { selectCurrentPage } from 'redux/selectors/navigation'; import { batchActions } from 'util/batchActions'; +import { makeSelectSearchUris } from 'redux/selectors/search'; +import handleFetchResponse from 'util/handle-fetch'; -// eslint-disable-next-line import/prefer-default-export -export function doSearch(rawQuery, currentPageNotSearchHandler) { - return (dispatch, getState) => { - const state = getState(); - const page = selectCurrentPage(state); - - const query = rawQuery.replace(/^lbry:\/\//i, ''); - - if (!query) { - dispatch({ - type: ACTIONS.SEARCH_CANCELLED, - }); - return; - } +export const doSearch = rawQuery => (dispatch, getState) => { + const state = getState(); + const query = rawQuery.replace(/^lbry:\/\//i, ''); + if (!query) { dispatch({ - type: ACTIONS.SEARCH_STARTED, - data: { query }, + type: ACTIONS.SEARCH_FAIL, }); + return; + } - if (page !== 'search') { - if (currentPageNotSearchHandler) { - currentPageNotSearchHandler(); - } - } else { - fetch(`https://lighthouse.lbry.io/search?s=${query}`) - .then( - response => - response.status === 200 - ? Promise.resolve(response.json()) - : Promise.reject(new Error(response.statusText)) - ) - .then(data => { - const uris = []; - const actions = []; + // If we have already searched for something, we don't need to do anything + const urisForQuery = makeSelectSearchUris(query)(state); + if (urisForQuery && !!urisForQuery.length) { + return; + } - data.forEach(result => { - const uri = buildURI({ - name: result.name, - claimId: result.claimId, - }); - actions.push(doResolveUri(uri)); - uris.push(uri); - }); + dispatch({ + type: ACTIONS.SEARCH_START, + }); - actions.push({ - type: ACTIONS.SEARCH_COMPLETED, - data: { - query, - uris, - }, - }); - dispatch(batchActions(...actions)); - }) - .catch(() => { - dispatch({ - type: ACTIONS.SEARCH_CANCELLED, - }); + // If the user is on the file page with a pre-populated uri and they select + // the search option without typing anything, searchQuery will be empty + // We need to populate it so the input is filled on the search page + if (!state.search.searchQuery) { + dispatch({ + type: ACTIONS.UPDATE_SEARCH_QUERY, + data: { searchQuery: query }, + }); + } + + fetch(`https://lighthouse.lbry.io/search?s=${query}`) + .then(handleFetchResponse) + .then(data => { + const uris = []; + const actions = []; + + data.forEach(result => { + const uri = buildURI({ + claimName: result.name, + claimId: result.claimId, }); + actions.push(doResolveUri(uri)); + uris.push(uri); + }); + + actions.push({ + type: ACTIONS.SEARCH_SUCCESS, + data: { + query, + uris, + }, + }); + dispatch(batchActions(...actions)); + }) + .catch(() => { + dispatch({ + type: ACTIONS.SEARCH_FAIL, + }); + }); +}; + +export const doUpdateSearchQuery = (query: string, shouldSkipSuggestions: ?boolean) => dispatch => { + dispatch({ + type: ACTIONS.UPDATE_SEARCH_QUERY, + data: { query }, + }); + + // Don't fetch new suggestions if the user just added a space + if (!query.endsWith(' ') || !shouldSkipSuggestions) { + dispatch(getSearchSuggestions(query)); + } +}; + +export const getSearchSuggestions = (value: string) => dispatch => { + const query = value.trim(); + + const isPrefix = () => + query === '@' || query === 'lbry:' || query === 'lbry:/' || query === 'lbry://'; + + if (!query || isPrefix()) { + dispatch({ + type: ACTIONS.UPDATE_SEARCH_SUGGESTIONS, + data: { suggestions: [] }, + }); + return; + } + + let suggestions = []; + try { + // If the user is about to manually add the claim id ignore it until they + // actually add one. This would hardly ever happen, but then the search + // suggestions won't change just from adding a '#' after a uri + let uriQuery = query; + if (uriQuery.endsWith('#')) { + uriQuery = uriQuery.slice(0, -1); } - }; -} + + const uri = normalizeURI(uriQuery); + const { claimName, isChannel } = parseURI(uri); + + suggestions.push( + { + value: uri, + shorthand: isChannel ? claimName.slice(1) : claimName, + type: isChannel ? SEARCH_TYPES.CHANNEL : SEARCH_TYPES.FILE, + }, + { + value: claimName, + type: SEARCH_TYPES.SEARCH, + } + ); + + // If it's a valid url, don't fetch any extra search results + return dispatch({ + type: ACTIONS.UPDATE_SEARCH_SUGGESTIONS, + data: { suggestions }, + }); + } catch (e) { + suggestions.push({ + value: query, + type: SEARCH_TYPES.SEARCH, + }); + } + + // Populate the current search query suggestion before fetching results + dispatch({ + type: ACTIONS.UPDATE_SEARCH_SUGGESTIONS, + data: { suggestions }, + }); + + // strip out any basic stuff for more accurate search results + let searchValue = value.replace(/lbry:\/\//g, '').replace(/-/g, ' '); + if (searchValue.includes('#')) { + // This should probably be more robust, but I think it's fine for now + // Remove everything after # to get rid of the claim id + searchValue = searchValue.substring(0, searchValue.indexOf('#')); + } + + return fetch(`https://lighthouse.lbry.io/autocomplete?s=${searchValue}`) + .then(handleFetchResponse) + .then(apiSuggestions => { + const formattedSuggestions = apiSuggestions.slice(0, 6).map(suggestion => { + // This will need to be more robust when the api starts returning lbry uris + const isChannel = suggestion.startsWith('@'); + const suggestionObj = { + value: isChannel ? `lbry://${suggestion}` : suggestion, + shorthand: isChannel ? suggestion.slice(1) : '', + type: isChannel ? 'channel' : 'search', + }; + + return suggestionObj; + }); + + suggestions = suggestions.concat(formattedSuggestions); + dispatch({ + type: ACTIONS.UPDATE_SEARCH_SUGGESTIONS, + data: { suggestions }, + }); + }) + .catch(() => { + // If the fetch fails, do nothing + // Basic search suggestions are already populated at this point + }); +}; diff --git a/src/redux/actions/wallet.js b/src/redux/actions/wallet.js index 4bd5ca5..1a3ebb5 100644 --- a/src/redux/actions/wallet.js +++ b/src/redux/actions/wallet.js @@ -34,7 +34,7 @@ export function doFetchTransactions() { type: ACTIONS.FETCH_TRANSACTIONS_STARTED, }); - Lbry.transaction_list({ include_tip_info: true }).then(results => { + Lbry.transaction_list().then(results => { dispatch({ type: ACTIONS.FETCH_TRANSACTIONS_COMPLETED, data: { @@ -62,8 +62,8 @@ export function doGetNewAddress() { type: ACTIONS.GET_NEW_ADDRESS_STARTED, }); + // Removed localStorage use, since address is expected to be stored in redux store Lbry.wallet_new_address().then(address => { - // localStorage.setItem('wallet_address', address); dispatch({ type: ACTIONS.GET_NEW_ADDRESS_COMPLETED, data: { address }, diff --git a/src/redux/reducers/search.js b/src/redux/reducers/search.js index cddf8fc..908cf28 100644 --- a/src/redux/reducers/search.js +++ b/src/redux/reducers/search.js @@ -1,32 +1,103 @@ +// @flow import * as ACTIONS from 'constants/action_types'; +import { handleActions } from 'util/redux-utils'; -const reducers = {}; -const defaultState = { +type SearchSuccess = { + type: ACTIONS.SEARCH_SUCCESS, + data: { + query: string, + uris: Array, + }, +}; + +type UpdateSearchQuery = { + type: ACTIONS.UPDATE_SEARCH_QUERY, + data: { + query: string, + }, +}; + +type SearchSuggestion = { + value: string, + shorthand: string, + type: string, +}; + +type UpdateSearchSuggestions = { + type: ACTIONS.UPDATE_SEARCH_SUGGESTIONS, + data: { + suggestions: Array, + }, +}; + +type SearchState = { + isActive: boolean, + searchQuery: string, + suggestions: Array, urisByQuery: {}, - searching: false, }; -reducers[ACTIONS.SEARCH_STARTED] = state => - Object.assign({}, state, { - searching: true, - }); - -reducers[ACTIONS.SEARCH_COMPLETED] = (state, action) => { - const { query, uris } = action.data; - - return Object.assign({}, state, { - searching: false, - urisByQuery: Object.assign({}, state.urisByQuery, { [query]: uris }), - }); +const defaultState = { + isActive: false, + searchQuery: '', // needs to be an empty string for input focusing + suggestions: [], + urisByQuery: {}, }; -reducers[ACTIONS.SEARCH_CANCELLED] = state => - Object.assign({}, state, { - searching: false, - }); +export const searchReducer = handleActions( + { + [ACTIONS.SEARCH_START]: (state: SearchState): SearchState => ({ + ...state, + searching: true, + }), + [ACTIONS.SEARCH_SUCCESS]: (state: SearchState, action: SearchSuccess): SearchState => { + const { query, uris } = action.data; -export function searchReducer(state = defaultState, action) { - const handler = reducers[action.type]; - if (handler) return handler(state, action); - return state; -} + return { + ...state, + searching: false, + urisByQuery: Object.assign({}, state.urisByQuery, { [query]: uris }), + }; + }, + + [ACTIONS.SEARCH_FAIL]: (state: SearchState): SearchState => ({ + ...state, + searching: false, + }), + + [ACTIONS.UPDATE_SEARCH_QUERY]: ( + state: SearchState, + action: UpdateSearchQuery + ): SearchState => ({ + ...state, + searchQuery: action.data.query, + isActive: true, + }), + + [ACTIONS.UPDATE_SEARCH_SUGGESTIONS]: ( + state: SearchState, + action: UpdateSearchSuggestions + ): SearchState => ({ + ...state, + suggestions: action.data.suggestions, + }), + + // clear the searchQuery on back/forward + // it may be populated by the page title for search/file pages + // if going home, it should be blank + [ACTIONS.HISTORY_NAVIGATE]: (state: SearchState): SearchState => ({ + ...state, + searchQuery: '', + suggestions: [], + isActive: false, + }), + // sets isActive to false so the uri will be populated correctly if the + // user is on a file page. The search query will still be present on any + // other page + [ACTIONS.CLOSE_MODAL]: (state: SearchState): SearchState => ({ + ...state, + isActive: false, + }), + }, + defaultState +); diff --git a/src/redux/reducers/wallet.js b/src/redux/reducers/wallet.js index b2fe9d1..cd5bf31 100644 --- a/src/redux/reducers/wallet.js +++ b/src/redux/reducers/wallet.js @@ -1,7 +1,6 @@ import * as ACTIONS from 'constants/action_types'; const reducers = {}; -const receiveAddress = null; // localStorage.getItem('receiveAddress'); const buildDraftTransaction = () => ({ amount: undefined, address: undefined, @@ -12,7 +11,7 @@ const defaultState = { blocks: {}, transactions: {}, fetchingTransactions: false, - receiveAddress, + receiveAddress: null, gettingNewAddress: false, draftTransaction: buildDraftTransaction(), sendingSupport: false, @@ -46,7 +45,7 @@ reducers[ACTIONS.GET_NEW_ADDRESS_STARTED] = state => reducers[ACTIONS.GET_NEW_ADDRESS_COMPLETED] = (state, action) => { const { address } = action.data; - // localStorage.setItem('receiveAddress', address); + // Say no to localStorage! return Object.assign({}, state, { gettingNewAddress: false, receiveAddress: address, diff --git a/src/redux/selectors/file_info.js b/src/redux/selectors/file_info.js index f760bb3..5f346de 100644 --- a/src/redux/selectors/file_info.js +++ b/src/redux/selectors/file_info.js @@ -3,6 +3,7 @@ import { selectIsFetchingClaimListMine, selectMyClaims, } from 'redux/selectors/claims'; +import { buildURI } from 'lbryURI'; import { createSelector } from 'reselect'; export const selectState = state => state.fileInfo || {}; @@ -27,7 +28,6 @@ export const makeSelectFileInfoForUri = uri => createSelector(selectClaimsByUri, selectFileInfosByOutpoint, (claims, byOutpoint) => { const claim = claims[uri]; const outpoint = claim ? `${claim.txid}:${claim.nout}` : undefined; - return outpoint ? byOutpoint[outpoint] : undefined; }); @@ -104,3 +104,92 @@ export const selectTotalDownloadProgress = createSelector(selectDownloadingFileI if (fileInfos.length > 0) return totalProgress / fileInfos.length / 100.0; return -1; }); + +export const selectSearchDownloadUris = query => + createSelector(selectFileInfosDownloaded, fileInfos => { + if (!query || !fileInfos.length) { + return null; + } + + const queryParts = query.toLowerCase().split(' '); + const searchQueryDictionary = {}; + queryParts.forEach(subQuery => { + searchQueryDictionary[subQuery] = subQuery; + }); + + const arrayContainsQueryPart = array => { + for (let i = 0; i < array.length; i += 1) { + const subQuery = array[i]; + if (searchQueryDictionary[subQuery]) { + return true; + } + } + return false; + }; + + const downloadResultsFromQuery = []; + fileInfos.forEach(fileInfo => { + const { channel_name, claim_name, metadata } = fileInfo; + const { author, description, title } = metadata; + + if (channel_name) { + const channelName = channel_name.toLowerCase(); + const strippedOutChannelName = channelName.slice(1); // trim off the @ + if (searchQueryDictionary[channel_name] || searchQueryDictionary[strippedOutChannelName]) { + downloadResultsFromQuery.push(fileInfo); + return; + } + } + + const nameParts = claim_name.toLowerCase().split('-'); + if (arrayContainsQueryPart(nameParts)) { + downloadResultsFromQuery.push(fileInfo); + return; + } + + const titleParts = title.toLowerCase().split(' '); + if (arrayContainsQueryPart(titleParts)) { + downloadResultsFromQuery.push(fileInfo); + return; + } + + if (author) { + const authorParts = author.toLowerCase().split(' '); + if (arrayContainsQueryPart(authorParts)) { + downloadResultsFromQuery.push(fileInfo); + return; + } + } + + if (description) { + const descriptionParts = description.toLowerCase().split(' '); + if (arrayContainsQueryPart(descriptionParts)) { + downloadResultsFromQuery.push(fileInfo); + } + } + }); + + return downloadResultsFromQuery.length + ? downloadResultsFromQuery.map(fileInfo => { + const { + channel_name: channelName, + claim_id: claimId, + claim_name: claimName, + value, + metadata, + } = fileInfo; + const uriParams = {}; + + if (channelName) { + uriParams.channelName = channelName; + } + + uriParams.claimId = claimId; + uriParams.claimId = claimId; + uriParams.contentName = claimName; + + const uri = buildURI(uriParams); + return uri; + }) + : null; + }); diff --git a/src/redux/selectors/navigation.js b/src/redux/selectors/navigation.js index fa9fa3b..f4acc30 100644 --- a/src/redux/selectors/navigation.js +++ b/src/redux/selectors/navigation.js @@ -1,6 +1,5 @@ import { createSelector } from 'reselect'; -import { normalizeURI } from 'lbryURI'; -import { parseQueryParams, toQueryString } from 'util/query_params'; +import { parseQueryParams } from 'util/query_params'; export const selectState = state => state.navigation || {}; @@ -22,103 +21,6 @@ export const selectCurrentParams = createSelector(selectCurrentPath, path => { export const makeSelectCurrentParam = param => createSelector(selectCurrentParams, params => (params ? params[param] : undefined)); -export const selectHeaderLinks = createSelector(selectCurrentPage, page => { - // This contains intentional fall throughs - switch (page) { - case 'wallet': - case 'history': - case 'send': - case 'getcredits': - case 'invite': - case 'rewards': - case 'backup': - return { - wallet: __('Overview'), - getcredits: __('Get Credits'), - send: __('Send / Receive'), - rewards: __('Rewards'), - invite: __('Invites'), - history: __('History'), - }; - case 'downloaded': - case 'published': - return { - downloaded: __('Downloaded'), - published: __('Published'), - }; - case 'settings': - case 'help': - return { - settings: __('Settings'), - help: __('Help'), - }; - case 'discover': - case 'subscriptions': - return { - discover: __('Discover'), - subscriptions: __('Subscriptions'), - }; - default: - return null; - } -}); - -export const selectPageTitle = createSelector( - selectCurrentPage, - selectCurrentParams, - (page, params) => { - switch (page) { - case 'settings': - return __('Settings'); - case 'report': - return __('Report'); - case 'wallet': - return __('Wallet'); - case 'send': - return __('Send or Receive LBRY Credits'); - case 'getcredits': - return __('Get LBRY Credits'); - case 'backup': - return __('Backup Your Wallet'); - case 'rewards': - return __('Rewards'); - case 'invite': - return __('Invites'); - case 'start': - return __('Start'); - case 'publish': - return params.id ? __('Edit') : __('Publish'); - case 'help': - return __('Help'); - case 'developer': - return __('Developer'); - case 'show': { - const parts = [normalizeURI(params.uri)]; - // If the params has any keys other than "uri" - if (Object.keys(params).length > 1) { - parts.push(toQueryString(Object.assign({}, params, { uri: null }))); - } - return parts.join('?'); - } - case 'downloaded': - return __('Downloads & Purchases'); - case 'published': - return __('Publications'); - case 'search': - return params.query ? __('Search results for %s', params.query) : __('Search'); - case 'subscriptions': - return __('Your Subscriptions'); - case 'discover': - case false: - case null: - case '': - return ''; - default: - return page[0].toUpperCase() + (page.length > 0 ? page.substr(1) : ''); - } - } -); - export const selectPathAfterAuth = createSelector(selectState, state => state.pathAfterAuth); export const selectIsBackDisabled = createSelector(selectState, state => state.index === 0); @@ -128,6 +30,8 @@ export const selectIsForwardDisabled = createSelector( state => state.index === state.stack.length - 1 ); +export const selectIsHome = createSelector(selectCurrentPage, page => page === 'discover'); + export const selectHistoryIndex = createSelector(selectState, state => state.index); export const selectHistoryStack = createSelector(selectState, state => state.stack); @@ -137,3 +41,162 @@ export const selectActiveHistoryEntry = createSelector( selectState, state => state.stack[state.index] ); + +export const selectPageTitle = createSelector(selectCurrentPage, page => { + switch (page) { + default: + return ''; + } +}); + +export const selectNavLinks = createSelector( + selectCurrentPage, + selectHistoryStack, + (currentPage, historyStack) => { + const isWalletPage = page => + page === 'wallet' || + page === 'send' || + page === 'getcredits' || + page === 'rewards' || + page === 'history' || + page === 'invite'; + + const isMyLbryPage = page => + page === 'downloaded' || page === 'published' || page === 'settings'; + + const previousStack = historyStack.slice().reverse(); + + const getPreviousSubLinkPath = checkIfValidPage => { + for (let i = 0; i < previousStack.length; i += 1) { + const currentStackItem = previousStack[i]; + + // Trim off the "/" from the path + const pageInStack = currentStackItem.path.slice(1); + if (checkIfValidPage(pageInStack)) { + return currentStackItem.path; + } + } + + return undefined; + }; + + // Gets the last active sublink in a section + const getActiveSublink = category => { + if (category === 'wallet') { + const previousPath = getPreviousSubLinkPath(isWalletPage); + return previousPath || '/wallet'; + } else if (category === 'myLbry') { + const previousPath = getPreviousSubLinkPath(isMyLbryPage); + return previousPath || '/downloaded'; + } + + return undefined; + }; + + const isCurrentlyWalletPage = isWalletPage(currentPage); + const isCurrentlyMyLbryPage = isMyLbryPage(currentPage); + + const walletSubLinks = [ + { + label: 'Overview', + path: '/wallet', + active: currentPage === 'wallet', + }, + { + label: 'Send & Recieve', + path: '/send', + active: currentPage === 'send', + }, + { + label: 'Get Credits', + path: '/getcredits', + active: currentPage === 'getcredits', + }, + { + label: 'Rewards', + path: '/rewards', + active: currentPage === 'rewards', + }, + { + label: 'Invites', + path: '/invite', + active: currentPage === 'invite', + }, + { + label: 'Transactions', + path: '/history', + active: currentPage === 'history', + }, + ]; + + const myLbrySubLinks = [ + { + label: 'Downloads', + path: '/downloaded', + active: currentPage === 'downloaded', + }, + { + label: 'Publishes', + path: '/published', + active: currentPage === 'published', + }, + { + label: 'Settings', + path: '/settings', + active: currentPage === 'settings', + }, + { + label: 'Backup', + path: '/backup', + active: currentPage === 'backup', + }, + ]; + + const navLinks = { + primary: [ + { + label: 'Explore', + path: '/discover', + active: currentPage === 'discover', + icon: 'Compass', + }, + { + label: 'Subscriptions', + path: '/subscriptions', + active: currentPage === 'subscriptions', + icon: 'AtSign', + }, + ], + secondary: [ + { + label: 'Wallet', + icon: 'CreditCard', + subLinks: walletSubLinks, + path: isCurrentlyWalletPage ? '/wallet' : getActiveSublink('wallet'), + active: isWalletPage(currentPage), + }, + { + label: 'My LBRY', + icon: 'Settings', + subLinks: myLbrySubLinks, + path: isCurrentlyMyLbryPage ? '/downloaded' : getActiveSublink('myLbry'), + active: isMyLbryPage(currentPage), + }, + { + label: 'Publish', + icon: 'UploadCloud', + path: '/publish', + active: currentPage === 'publish', + }, + { + label: 'Help', + path: '/help', + active: currentPage === 'help', + icon: 'HelpCircle', + }, + ], + }; + + return navLinks; + } +); diff --git a/src/redux/selectors/search.js b/src/redux/selectors/search.js index 4e49f47..5dcc1f4 100644 --- a/src/redux/selectors/search.js +++ b/src/redux/selectors/search.js @@ -1,12 +1,12 @@ -import { - selectCurrentPage, - selectCurrentParams, - selectPageTitle, -} from 'redux/selectors/navigation'; +import { selectCurrentPage, selectCurrentParams } from 'redux/selectors/navigation'; import { createSelector } from 'reselect'; export const selectState = state => state.search || {}; +export const selectSearchState = selectState; + +export const selectSearchValue = createSelector(selectState, state => state.searchQuery); + export const selectSearchQuery = createSelector( selectCurrentPage, selectCurrentParams, @@ -26,54 +26,14 @@ export const makeSelectSearchUris = query => export const selectWunderBarAddress = createSelector( selectCurrentPage, - selectPageTitle, selectSearchQuery, - (page, title, query) => (page !== 'search' ? title : query || title) -); - -export const selectWunderBarIcon = createSelector( - selectCurrentPage, selectCurrentParams, - (page, params) => { - switch (page) { - case 'auth': - return 'icon-user'; - case 'settings': - return 'icon-gear'; - case 'help': - return 'icon-question'; - case 'report': - return 'icon-file'; - case 'downloaded': - return 'icon-folder'; - case 'published': - return 'icon-folder'; - case 'history': - return 'icon-history'; - case 'send': - return 'icon-send'; - case 'rewards': - return 'icon-rocket'; - case 'invite': - return 'icon-envelope-open'; - case 'getcredits': - return 'icon-shopping-cart'; - case 'wallet': - case 'backup': - return 'icon-bank'; - case 'show': - return 'icon-file'; - case 'publish': - return params.id ? __('icon-pencil') : __('icon-upload'); - case 'developer': - return 'icon-code'; - case 'discover': - case 'search': - return 'icon-search'; - case 'subscriptions': - return 'icon-th-list'; - default: - return 'icon-file'; + (page, query, params) => { + // only populate the wunderbar address if we are on the file/channel pages + // or show the search query + if (page === 'show') { + return params.uri; } + return query; } ); diff --git a/src/util/handle-fetch.js b/src/util/handle-fetch.js new file mode 100644 index 0000000..96ce44a --- /dev/null +++ b/src/util/handle-fetch.js @@ -0,0 +1,5 @@ +export default function handleFetchResponse(response) { + return response.status === 200 + ? Promise.resolve(response.json()) + : Promise.reject(new Error(response.statusText)); +} diff --git a/src/util/redux-utils.js b/src/util/redux-utils.js new file mode 100644 index 0000000..bf9c171 --- /dev/null +++ b/src/util/redux-utils.js @@ -0,0 +1,17 @@ +// util for creating reducers +// based off of redux-actions +// https://redux-actions.js.org/docs/api/handleAction.html#handleactions + +// eslint-disable-next-line import/prefer-default-export +export const handleActions = (actionMap, defaultState) => (state = defaultState, action) => { + const handler = actionMap[action.type]; + + if (handler) { + const newState = handler(state, action); + return Object.assign({}, state, newState); + } + + // just return the original state if no handler + // returning a copy here breaks redux-persist + return state; +}; -- 2.45.3 From affbbee01c7e49050fd4a4edc28ad5f13771af72 Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Wed, 28 Mar 2018 05:53:56 +0100 Subject: [PATCH 29/41] changes after redesign merge --- build/index.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/build/index.js b/build/index.js index 8fdd51a..2b2f588 100644 --- a/build/index.js +++ b/build/index.js @@ -4277,8 +4277,8 @@ function doGetNewAddress() { type: ACTIONS.GET_NEW_ADDRESS_STARTED }); + // Removed localStorage use, since address is expected to be stored in redux store _lbry2.default.wallet_new_address().then(function (address) { - // localStorage.setItem('wallet_address', address); dispatch({ type: ACTIONS.GET_NEW_ADDRESS_COMPLETED, data: { address: address } @@ -5204,7 +5204,6 @@ var ACTIONS = _interopRequireWildcard(_action_types); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } var reducers = {}; -var receiveAddress = null; // localStorage.getItem('receiveAddress'); var buildDraftTransaction = function buildDraftTransaction() { return { amount: undefined, @@ -5217,7 +5216,7 @@ var defaultState = { blocks: {}, transactions: {}, fetchingTransactions: false, - receiveAddress: receiveAddress, + receiveAddress: null, gettingNewAddress: false, draftTransaction: buildDraftTransaction(), sendingSupport: false @@ -5254,7 +5253,7 @@ reducers[ACTIONS.GET_NEW_ADDRESS_STARTED] = function (state) { reducers[ACTIONS.GET_NEW_ADDRESS_COMPLETED] = function (state, action) { var address = action.data.address; - // localStorage.setItem('receiveAddress', address); + // Say no to localStorage! return Object.assign({}, state, { gettingNewAddress: false, -- 2.45.3 From e622db2fa6da0314b1adbe918c71f29fbd84ec89 Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Wed, 28 Mar 2018 06:00:59 +0100 Subject: [PATCH 30/41] updated wallet reducer defaultState --- build/index.js | 1 - src/redux/reducers/wallet.js | 1 - 2 files changed, 2 deletions(-) diff --git a/build/index.js b/build/index.js index 2b2f588..e29a668 100644 --- a/build/index.js +++ b/build/index.js @@ -5216,7 +5216,6 @@ var defaultState = { blocks: {}, transactions: {}, fetchingTransactions: false, - receiveAddress: null, gettingNewAddress: false, draftTransaction: buildDraftTransaction(), sendingSupport: false diff --git a/src/redux/reducers/wallet.js b/src/redux/reducers/wallet.js index cd5bf31..c57ecc7 100644 --- a/src/redux/reducers/wallet.js +++ b/src/redux/reducers/wallet.js @@ -11,7 +11,6 @@ const defaultState = { blocks: {}, transactions: {}, fetchingTransactions: false, - receiveAddress: null, gettingNewAddress: false, draftTransaction: buildDraftTransaction(), sendingSupport: false, -- 2.45.3 From 2ce9a5a600ba3bf50fcc3a15febeeca377501cb0 Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Wed, 28 Mar 2018 12:25:21 +0100 Subject: [PATCH 31/41] added lbryURI search fixes from lbry-app master --- build/index.js | 61 ++++++++++++++++------------------- package.json | 12 +------ src/index.js | 3 +- src/lbryURI.js | 42 ++++++++++++------------ src/redux/actions/search.js | 9 +++--- src/redux/selectors/search.js | 2 -- 6 files changed, 57 insertions(+), 72 deletions(-) diff --git a/build/index.js b/build/index.js index e29a668..1350800 100644 --- a/build/index.js +++ b/build/index.js @@ -459,7 +459,7 @@ function parseURI(URI) { // Break into components. Empty sub-matches are converted to null var componentsRegex = new RegExp('^((?:lbry://)?)' + // protocol - '([^:$#/]*)' + // name (stops at the first separator or end) + '([^:$#/]*)' + // claim name (stops at the first separator or end) '([:$#]?)([^/]*)' + // modifier separator, modifier (stops at the first path separator or end) '(/?)(.*)' // path separator, path ); @@ -469,7 +469,7 @@ function parseURI(URI) { }), _componentsRegex$exec2 = _slicedToArray(_componentsRegex$exec, 6), proto = _componentsRegex$exec2[0], - name = _componentsRegex$exec2[1], + claimName = _componentsRegex$exec2[1], modSep = _componentsRegex$exec2[2], modVal = _componentsRegex$exec2[3], pathSep = _componentsRegex$exec2[4], @@ -483,12 +483,12 @@ function parseURI(URI) { } // Validate and process name - if (!name) { + if (!claimName) { throw new Error(__('URI does not include name.')); } - var isChannel = name.startsWith('@'); - var channelName = isChannel ? name.slice(1) : name; + var isChannel = claimName.startsWith('@'); + var channelName = isChannel ? claimName.slice(1) : claimName; if (isChannel) { if (!channelName) { @@ -502,7 +502,7 @@ function parseURI(URI) { contentName = path; } - var nameBadChars = (channelName || name).match(regexInvalidURI); + var nameBadChars = (channelName || claimName).match(regexInvalidURI); if (nameBadChars) { throw new Error(__('Invalid character %s in name: %s.', nameBadChars.length === 1 ? '' : 's', nameBadChars.join(', '))); } @@ -555,7 +555,7 @@ function parseURI(URI) { } return _extends({ - name: name, + claimName: claimName, path: path, isChannel: isChannel }, contentName ? { contentName: contentName } : {}, channelName ? { channelName: channelName } : {}, claimSequence ? { claimSequence: parseInt(claimSequence, 10) } : {}, bidPosition ? { bidPosition: parseInt(bidPosition, 10) } : {}, claimId ? { claimId: claimId } : {}, path ? { path: path } : {}); @@ -573,22 +573,22 @@ function buildURI(URIObj) { bidPosition = URIObj.bidPosition, contentName = URIObj.contentName, channelName = URIObj.channelName; - var name = URIObj.name, + var claimName = URIObj.claimName, path = URIObj.path; if (channelName) { var channelNameFormatted = channelName.startsWith('@') ? channelName : '@' + channelName; - if (!name) { - name = channelNameFormatted; - } else if (name !== channelNameFormatted) { - throw new Error(__('Received a channel content URI, but name and channelName do not match. "name" represents the value in the name position of the URI (lbry://name...), which for channel content will be the channel name. In most cases, to construct a channel URI you should just pass channelName and contentName.')); + if (!claimName) { + claimName = channelNameFormatted; + } else if (claimName !== channelNameFormatted) { + throw new Error(__('Received a channel content URI, but claim name and channelName do not match. "name" represents the value in the name position of the URI (lbry://name...), which for channel content will be the channel name. In most cases, to construct a channel URI you should just pass channelName and contentName.')); } } if (contentName) { - if (!name) { - name = contentName; + if (!claimName) { + claimName = contentName; } else if (!path) { path = contentName; } @@ -597,7 +597,7 @@ function buildURI(URIObj) { } } - return (includeProto ? 'lbry://' : '') + name + (claimId ? '#' + claimId : '') + (claimSequence ? ':' + claimSequence : '') + (bidPosition ? '' + bidPosition : '') + (path ? '/' + path : ''); + return (includeProto ? 'lbry://' : '') + claimName + (claimId ? '#' + claimId : '') + (claimSequence ? ':' + claimSequence : '') + (bidPosition ? '' + bidPosition : '') + (path ? '/' + path : ''); } /* Takes a parseable LBRY URI and converts it to standard, canonical format */ @@ -605,13 +605,13 @@ function normalizeURI(URI) { if (URI.match(/pending_claim/)) return URI; var _parseURI = parseURI(URI), - name = _parseURI.name, + claimName = _parseURI.claimName, path = _parseURI.path, bidPosition = _parseURI.bidPosition, claimSequence = _parseURI.claimSequence, claimId = _parseURI.claimId; - return buildURI({ name: name, path: path, claimSequence: claimSequence, bidPosition: bidPosition, claimId: claimId }); + return buildURI({ claimName: claimName, path: path, claimSequence: claimSequence, bidPosition: bidPosition, claimId: claimId }); } function isURIValid(URI) { @@ -621,14 +621,14 @@ function isURIValid(URI) { } catch (error) { return false; } - return parts && parts.name; + return parts && parts.claimName; } -function isNameValid(name) { +function isNameValid(claimName) { var checkCase = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; var regexp = new RegExp('^[a-z0-9-]+$', checkCase ? '' : 'i'); - return regexp.test(name); + return regexp.test(claimName); } function isURIClaimable(URI) { @@ -638,7 +638,7 @@ function isURIClaimable(URI) { } catch (error) { return false; } - return parts && parts.name && !parts.claimId && !parts.bidPosition && !parts.claimSequence && !parts.isChannel && !parts.path; + return parts && parts.claimName && !parts.claimId && !parts.bidPosition && !parts.claimSequence && !parts.isChannel && !parts.path; } /***/ }), @@ -2092,7 +2092,7 @@ var selectSearchDownloadUris = exports.selectSearchDownloadUris = function selec Object.defineProperty(exports, "__esModule", { value: true }); -exports.selectWunderBarAddress = exports.makeSelectSearchUris = exports.selectSearchUrisByQuery = exports.selectIsSearching = exports.selectSearchQuery = exports.selectSearchValue = exports.selectSearchState = exports.selectState = undefined; +exports.selectWunderBarAddress = exports.makeSelectSearchUris = exports.selectSearchUrisByQuery = exports.selectIsSearching = exports.selectSearchQuery = exports.selectSearchValue = exports.selectState = undefined; var _navigation = __webpack_require__(5); @@ -2102,8 +2102,6 @@ var selectState = exports.selectState = function selectState(state) { return state.search || {}; }; -var selectSearchState = exports.selectSearchState = selectState; - var selectSearchValue = exports.selectSearchValue = (0, _reselect.createSelector)(selectState, function (state) { return state.searchQuery; }); @@ -2284,7 +2282,7 @@ var makeSelectBlockDate = exports.makeSelectBlockDate = function makeSelectBlock Object.defineProperty(exports, "__esModule", { value: true }); -exports.selectBlocks = exports.selectDraftTransactionError = exports.selectDraftTransactionAddress = exports.selectDraftTransactionAmount = exports.selectDraftTransaction = exports.selectGettingNewAddress = exports.selectReceiveAddress = exports.selectIsSendingSupport = exports.selectIsFetchingTransactions = exports.selectHasTransactions = exports.selectRecentTransactions = exports.selectTransactionItems = exports.selectTransactionsById = exports.selectBalance = exports.makeSelectBlockDate = exports.selectWunderBarAddress = exports.selectSearchUrisByQuery = exports.selectIsSearching = exports.selectSearchValue = exports.selectSearchQuery = exports.selectSearchState = exports.makeSelectSearchUris = exports.selectNavLinks = exports.selectActiveHistoryEntry = exports.selectHistoryStack = exports.selectHistoryIndex = exports.selectIsForwardDisabled = exports.selectIsBackDisabled = exports.selectPathAfterAuth = exports.selectPageTitle = exports.selectHeaderLinks = exports.selectCurrentParams = exports.selectCurrentPage = exports.selectCurrentPath = undefined; +exports.selectBlocks = exports.selectDraftTransactionError = exports.selectDraftTransactionAddress = exports.selectDraftTransactionAmount = exports.selectDraftTransaction = exports.selectGettingNewAddress = exports.selectReceiveAddress = exports.selectIsSendingSupport = exports.selectIsFetchingTransactions = exports.selectHasTransactions = exports.selectRecentTransactions = exports.selectTransactionItems = exports.selectTransactionsById = exports.selectBalance = exports.makeSelectBlockDate = exports.selectWunderBarAddress = exports.selectSearchUrisByQuery = exports.selectIsSearching = exports.selectSearchValue = exports.selectSearchQuery = exports.makeSelectSearchUris = exports.selectSearchState = exports.selectNavLinks = exports.selectActiveHistoryEntry = exports.selectHistoryStack = exports.selectHistoryIndex = exports.selectIsForwardDisabled = exports.selectIsBackDisabled = exports.selectPathAfterAuth = exports.selectPageTitle = exports.selectHeaderLinks = exports.selectCurrentParams = exports.selectCurrentPage = exports.selectCurrentPath = undefined; exports.makeSelectCurrentParam = exports.computePageFromPath = exports.selectSearchDownloadUris = exports.selectTotalDownloadProgress = exports.selectDownloadingFileInfos = exports.selectFileInfosDownloaded = exports.selectUrisLoading = exports.selectDownloadingByOutpoint = exports.selectIsFetchingFileListDownloadedOrPublished = exports.selectIsFetchingFileList = exports.selectFileInfosByOutpoint = exports.makeSelectLoadingForUri = exports.makeSelectDownloadingForUri = exports.makeSelectFileInfoForUri = exports.selectFetchingCostInfo = exports.selectCostForCurrentPageUri = exports.selectAllCostInfoByUri = exports.makeSelectCostInfoForUri = exports.makeSelectFetchingCostInfoForUri = exports.selectRewardContentClaimIds = exports.selectChannelClaimCounts = exports.selectPlayingUri = exports.selectFetchingFeaturedUris = exports.selectFeaturedUris = exports.selectResolvingUris = exports.selectMyChannelClaims = exports.selectFetchingMyChannels = exports.selectMyClaimsOutpoints = exports.selectAllMyClaimsByOutpoint = exports.selectMyClaimsWithoutChannels = exports.selectMyClaims = exports.selectPendingClaims = exports.selectIsFetchingClaimListMine = exports.selectAllFetchingChannelClaims = exports.selectMyActiveClaims = exports.selectAbandoningIds = exports.selectMyClaimsRaw = exports.selectAllClaimsByChannel = exports.selectClaimsByUri = exports.selectClaimsById = exports.makeSelectTotalPagesForChannel = exports.makeSelectTotalItemsForChannel = exports.makeSelectIsUriResolving = exports.makeSelectContentTypeForUri = exports.makeSelectTitleForUri = exports.makeSelectMetadataForUri = exports.makeSelectClaimsInChannelForCurrentPage = exports.makeSelectFetchingChannelClaims = exports.makeSelectClaimIsMine = exports.makeSelectClaimForUri = exports.selectNotification = exports.walletReducer = exports.searchReducer = exports.notificationsReducer = exports.fileInfoReducer = exports.costInfoReducer = exports.claimsReducer = exports.formatFullPrice = exports.formatCredits = exports.toQueryString = exports.parseQueryParams = exports.batchActions = exports.doSendSupport = exports.doSetDraftTransactionAddress = exports.doSetDraftTransactionAmount = exports.doSendDraftTransaction = exports.doCheckAddressIsMine = exports.doGetNewAddress = exports.doFetchBlock = exports.doFetchTransactions = exports.doBalanceSubscribe = exports.doUpdateBalance = exports.doUpdateSearchQuery = exports.doSearch = exports.doFetchFileInfosAndPublishedClaims = exports.doFileList = exports.doFetchFileInfo = exports.doFetchCostInfoForUri = exports.doFetchRewardedContent = exports.doFetchFeaturedUris = exports.doResolveUri = exports.doResolveUris = exports.doAbandonClaim = exports.doFetchClaimListMine = exports.doShowSnackBar = exports.doCloseModal = exports.doOpenModal = exports.doNotify = exports.isURIClaimable = exports.isURIValid = exports.normalizeURI = exports.buildURI = exports.parseURI = exports.regexAddress = exports.regexInvalidURI = exports.Lbryapi = exports.Lbry = exports.SETTINGS = exports.ACTIONS = exports.Notification = undefined; var _Notification = __webpack_require__(9); @@ -3012,12 +3010,6 @@ Object.defineProperty(exports, 'makeSelectSearchUris', { return _search3.makeSelectSearchUris; } }); -Object.defineProperty(exports, 'selectSearchState', { - enumerable: true, - get: function get() { - return _search3.selectSearchState; - } -}); Object.defineProperty(exports, 'selectSearchQuery', { enumerable: true, get: function get() { @@ -3170,6 +3162,7 @@ exports.SETTINGS = SETTINGS; exports.Lbry = _lbry2.default; exports.Lbryapi = _lbryapi2.default; +exports.selectSearchState = _search3.selectState; /***/ }), /* 16 */ @@ -3972,9 +3965,11 @@ var _lbryURI = __webpack_require__(2); var _claims = __webpack_require__(6); +var _search2 = __webpack_require__(13); + var _batchActions = __webpack_require__(8); -var _search2 = __webpack_require__(13); +var _batchActions2 = _interopRequireDefault(_batchActions); var _handleFetch = __webpack_require__(27); @@ -4036,7 +4031,7 @@ var doSearch = exports.doSearch = function doSearch(rawQuery) { uris: uris } }); - dispatch(_batchActions.batchActions.apply(undefined, actions)); + dispatch(_batchActions2.default.apply(undefined, actions)); }).catch(function () { dispatch({ type: ACTIONS.SEARCH_FAIL diff --git a/package.json b/package.json index 8fc7eda..f0c3be8 100644 --- a/package.json +++ b/package.json @@ -29,32 +29,22 @@ "bluebird": "^3.5.1", "classnames": "^2.2.5", "electron-dl": "^1.6.0", - "formik": "^0.10.4", "from2": "^2.3.0", "install": "^0.10.2", "jayson": "^2.0.2", "jshashes": "^1.0.7", - "keytar": "^4.0.3", - "localforage": "^1.5.0", - "npm": "^5.5.1", "proxy-polyfill": "0.1.6", - "qrcode.react": "^0.7.2", "rc-progress": "^2.0.6", - "react": "16.2.0", + "react": "^16.2.0", "react-redux": "^5.0.3", - "react-simplemde-editor": "^3.6.11", "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", "semver": "^5.3.0", - "shapeshift.io": "^1.3.1", - "source-map-support": "^0.5.0", "tree-kill": "^1.1.0", "y18n": "^4.0.0" }, diff --git a/src/index.js b/src/index.js index e6ba208..06f21c7 100644 --- a/src/index.js +++ b/src/index.js @@ -148,9 +148,10 @@ export { selectNavLinks, } from 'redux/selectors/navigation'; +import { selectState as selectSearchState } from 'redux/selectors/search'; +export { selectSearchState }; export { makeSelectSearchUris, - selectSearchState, selectSearchQuery, selectSearchValue, selectIsSearching, diff --git a/src/lbryURI.js b/src/lbryURI.js index e069196..9fd136b 100644 --- a/src/lbryURI.js +++ b/src/lbryURI.js @@ -30,11 +30,11 @@ export function parseURI(URI, requireProto = false) { // Break into components. Empty sub-matches are converted to null const componentsRegex = new RegExp( '^((?:lbry://)?)' + // protocol - '([^:$#/]*)' + // name (stops at the first separator or end) + '([^:$#/]*)' + // claim name (stops at the first separator or end) '([:$#]?)([^/]*)' + // modifier separator, modifier (stops at the first path separator or end) '(/?)(.*)' // path separator, path ); - const [proto, name, modSep, modVal, pathSep, path] = componentsRegex + const [proto, claimName, modSep, modVal, pathSep, path] = componentsRegex .exec(URI) .slice(1) .map(match => match || null); @@ -47,12 +47,12 @@ export function parseURI(URI, requireProto = false) { } // Validate and process name - if (!name) { + if (!claimName) { throw new Error(__('URI does not include name.')); } - const isChannel = name.startsWith('@'); - const channelName = isChannel ? name.slice(1) : name; + const isChannel = claimName.startsWith('@'); + const channelName = isChannel ? claimName.slice(1) : claimName; if (isChannel) { if (!channelName) { @@ -66,7 +66,7 @@ export function parseURI(URI, requireProto = false) { contentName = path; } - const nameBadChars = (channelName || name).match(regexInvalidURI); + const nameBadChars = (channelName || claimName).match(regexInvalidURI); if (nameBadChars) { throw new Error( __( @@ -128,7 +128,7 @@ export function parseURI(URI, requireProto = false) { } return { - name, + claimName, path, isChannel, ...(contentName ? { contentName } : {}), @@ -148,24 +148,24 @@ export function parseURI(URI, requireProto = false) { export function buildURI(URIObj, includeProto = true) { const { claimId, claimSequence, bidPosition, contentName, channelName } = URIObj; - let { name, path } = URIObj; + let { claimName, path } = URIObj; if (channelName) { const channelNameFormatted = channelName.startsWith('@') ? channelName : `@${channelName}`; - if (!name) { - name = channelNameFormatted; - } else if (name !== channelNameFormatted) { + if (!claimName) { + claimName = channelNameFormatted; + } else if (claimName !== channelNameFormatted) { throw new Error( __( - 'Received a channel content URI, but name and channelName do not match. "name" represents the value in the name position of the URI (lbry://name...), which for channel content will be the channel name. In most cases, to construct a channel URI you should just pass channelName and contentName.' + 'Received a channel content URI, but claim name and channelName do not match. "name" represents the value in the name position of the URI (lbry://name...), which for channel content will be the channel name. In most cases, to construct a channel URI you should just pass channelName and contentName.' ) ); } } if (contentName) { - if (!name) { - name = contentName; + if (!claimName) { + claimName = contentName; } else if (!path) { path = contentName; } @@ -180,7 +180,7 @@ export function buildURI(URIObj, includeProto = true) { return ( (includeProto ? 'lbry://' : '') + - name + + claimName + (claimId ? `#${claimId}` : '') + (claimSequence ? `:${claimSequence}` : '') + (bidPosition ? `${bidPosition}` : '') + @@ -192,8 +192,8 @@ export function buildURI(URIObj, includeProto = true) { export function normalizeURI(URI) { if (URI.match(/pending_claim/)) return URI; - const { name, path, bidPosition, claimSequence, claimId } = parseURI(URI); - return buildURI({ name, path, claimSequence, bidPosition, claimId }); + const { claimName, path, bidPosition, claimSequence, claimId } = parseURI(URI); + return buildURI({ claimName, path, claimSequence, bidPosition, claimId }); } export function isURIValid(URI) { @@ -203,12 +203,12 @@ export function isURIValid(URI) { } catch (error) { return false; } - return parts && parts.name; + return parts && parts.claimName; } -export function isNameValid(name, checkCase = true) { +export function isNameValid(claimName, checkCase = true) { const regexp = new RegExp('^[a-z0-9-]+$', checkCase ? '' : 'i'); - return regexp.test(name); + return regexp.test(claimName); } export function isURIClaimable(URI) { @@ -220,7 +220,7 @@ export function isURIClaimable(URI) { } return ( parts && - parts.name && + parts.claimName && !parts.claimId && !parts.bidPosition && !parts.claimSequence && diff --git a/src/redux/actions/search.js b/src/redux/actions/search.js index e3ec1ac..c96d4a4 100644 --- a/src/redux/actions/search.js +++ b/src/redux/actions/search.js @@ -1,9 +1,9 @@ import * as ACTIONS from 'constants/action_types'; import * as SEARCH_TYPES from 'constants/search'; -import { buildURI, normalizeURI, parseURI } from 'lbryURI'; +import { normalizeURI, buildURI, parseURI } from 'lbryURI'; import { doResolveUri } from 'redux/actions/claims'; -import { batchActions } from 'util/batchActions'; import { makeSelectSearchUris } from 'redux/selectors/search'; +import batchActions from 'util/batchActions'; import handleFetchResponse from 'util/handle-fetch'; export const doSearch = rawQuery => (dispatch, getState) => { @@ -83,8 +83,9 @@ export const doUpdateSearchQuery = (query: string, shouldSkipSuggestions: ?boole export const getSearchSuggestions = (value: string) => dispatch => { const query = value.trim(); - const isPrefix = () => - query === '@' || query === 'lbry:' || query === 'lbry:/' || query === 'lbry://'; + const isPrefix = () => { + return query === '@' || query === 'lbry:' || query === 'lbry:/' || query === 'lbry://'; + }; if (!query || isPrefix()) { dispatch({ diff --git a/src/redux/selectors/search.js b/src/redux/selectors/search.js index 5dcc1f4..20367c0 100644 --- a/src/redux/selectors/search.js +++ b/src/redux/selectors/search.js @@ -3,8 +3,6 @@ import { createSelector } from 'reselect'; export const selectState = state => state.search || {}; -export const selectSearchState = selectState; - export const selectSearchValue = createSelector(selectState, state => state.searchQuery); export const selectSearchQuery = createSelector( -- 2.45.3 From 7444b37f82f324b0508d0de9bec36ed70e694470 Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Wed, 28 Mar 2018 12:58:34 +0100 Subject: [PATCH 32/41] some fixes for search --- build/index.js | 6 ++---- src/index.js | 2 +- src/redux/actions/search.js | 6 +++--- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/build/index.js b/build/index.js index 1350800..04b9ab6 100644 --- a/build/index.js +++ b/build/index.js @@ -3969,8 +3969,6 @@ var _search2 = __webpack_require__(13); var _batchActions = __webpack_require__(8); -var _batchActions2 = _interopRequireDefault(_batchActions); - var _handleFetch = __webpack_require__(27); var _handleFetch2 = _interopRequireDefault(_handleFetch); @@ -4031,8 +4029,8 @@ var doSearch = exports.doSearch = function doSearch(rawQuery) { uris: uris } }); - dispatch(_batchActions2.default.apply(undefined, actions)); - }).catch(function () { + dispatch(_batchActions.batchActions.apply(undefined, actions)); + }).catch(function (e) { dispatch({ type: ACTIONS.SEARCH_FAIL }); diff --git a/src/index.js b/src/index.js index 06f21c7..92507d4 100644 --- a/src/index.js +++ b/src/index.js @@ -2,6 +2,7 @@ import * as ACTIONS from 'constants/action_types'; import * as SETTINGS from 'constants/settings'; import Lbry from 'lbry'; import Lbryapi from 'lbryapi'; +import { selectState as selectSearchState } from 'redux/selectors/search'; // types export { Notification } from 'types/Notification'; @@ -148,7 +149,6 @@ export { selectNavLinks, } from 'redux/selectors/navigation'; -import { selectState as selectSearchState } from 'redux/selectors/search'; export { selectSearchState }; export { makeSelectSearchUris, diff --git a/src/redux/actions/search.js b/src/redux/actions/search.js index c96d4a4..5908f1f 100644 --- a/src/redux/actions/search.js +++ b/src/redux/actions/search.js @@ -1,3 +1,4 @@ +// @flow import * as ACTIONS from 'constants/action_types'; import * as SEARCH_TYPES from 'constants/search'; import { normalizeURI, buildURI, parseURI } from 'lbryURI'; @@ -83,9 +84,8 @@ export const doUpdateSearchQuery = (query: string, shouldSkipSuggestions: ?boole export const getSearchSuggestions = (value: string) => dispatch => { const query = value.trim(); - const isPrefix = () => { - return query === '@' || query === 'lbry:' || query === 'lbry:/' || query === 'lbry://'; - }; + const isPrefix = () => + query === '@' || query === 'lbry:' || query === 'lbry:/' || query === 'lbry://'; if (!query || isPrefix()) { dispatch({ -- 2.45.3 From ab452de347054aa54556c147b760fe411d291577 Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Thu, 29 Mar 2018 18:18:26 +0100 Subject: [PATCH 33/41] Added DOWNLOADING_CANCELED action constant --- build/index.js | 14 +++++++++++--- src/constants/action_types.js | 1 + src/lbry.js | 10 ++++++++++ 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/build/index.js b/build/index.js index 04b9ab6..1c8f2f1 100644 --- a/build/index.js +++ b/build/index.js @@ -1040,6 +1040,13 @@ Lbry.status = function () { }); }; +Lbry.file_delete = function () { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return new Promise(function (resolve, reject) { + apiCall('file_delete', params, resolve, reject); + }); +}; + Lbry.connectPromise = null; Lbry.connect = function () { if (Lbry.connectPromise === null) { @@ -3969,6 +3976,8 @@ var _search2 = __webpack_require__(13); var _batchActions = __webpack_require__(8); +var _batchActions2 = _interopRequireDefault(_batchActions); + var _handleFetch = __webpack_require__(27); var _handleFetch2 = _interopRequireDefault(_handleFetch); @@ -4029,15 +4038,14 @@ var doSearch = exports.doSearch = function doSearch(rawQuery) { uris: uris } }); - dispatch(_batchActions.batchActions.apply(undefined, actions)); - }).catch(function (e) { + dispatch(_batchActions2.default.apply(undefined, actions)); + }).catch(function () { dispatch({ type: ACTIONS.SEARCH_FAIL }); }); }; }; - var doUpdateSearchQuery = exports.doUpdateSearchQuery = function doUpdateSearchQuery(query, shouldSkipSuggestions) { return function (dispatch) { dispatch({ diff --git a/src/constants/action_types.js b/src/constants/action_types.js index 1c71858..dce993d 100644 --- a/src/constants/action_types.js +++ b/src/constants/action_types.js @@ -82,6 +82,7 @@ export const LOADING_VIDEO_FAILED = 'LOADING_VIDEO_FAILED'; export const DOWNLOADING_STARTED = 'DOWNLOADING_STARTED'; export const DOWNLOADING_PROGRESSED = 'DOWNLOADING_PROGRESSED'; export const DOWNLOADING_COMPLETED = 'DOWNLOADING_COMPLETED'; +export const DOWNLOADING_CANCELED = 'DOWNLOADING_CANCELED'; export const PLAY_VIDEO_STARTED = 'PLAY_VIDEO_STARTED'; export const FETCH_AVAILABILITY_STARTED = 'FETCH_AVAILABILITY_STARTED'; export const FETCH_AVAILABILITY_COMPLETED = 'FETCH_AVAILABILITY_COMPLETED'; diff --git a/src/lbry.js b/src/lbry.js index edefe7c..e70dec6 100644 --- a/src/lbry.js +++ b/src/lbry.js @@ -143,6 +143,16 @@ Lbry.status = () => reject ); }); + +Lbry.file_delete = (params = {}) => + new Promise((resolve, reject) => { + apiCall( + 'file_delete', + params, + resolve, + reject + ); + }); Lbry.connectPromise = null; Lbry.connect = () => { -- 2.45.3 From 315e8702c0bc21acff1a55689b0b805c3dd3645a Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Thu, 29 Mar 2018 20:00:20 +0100 Subject: [PATCH 34/41] proxy-polyfill still doesn't seem to work. Added file_set_status to lbry.js --- build/index.js | 8 ++++++++ src/lbry.js | 14 +++++++------- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/build/index.js b/build/index.js index 1c8f2f1..bef0f1f 100644 --- a/build/index.js +++ b/build/index.js @@ -167,6 +167,7 @@ var LOADING_VIDEO_FAILED = exports.LOADING_VIDEO_FAILED = 'LOADING_VIDEO_FAILED' var DOWNLOADING_STARTED = exports.DOWNLOADING_STARTED = 'DOWNLOADING_STARTED'; var DOWNLOADING_PROGRESSED = exports.DOWNLOADING_PROGRESSED = 'DOWNLOADING_PROGRESSED'; var DOWNLOADING_COMPLETED = exports.DOWNLOADING_COMPLETED = 'DOWNLOADING_COMPLETED'; +var DOWNLOADING_CANCELED = exports.DOWNLOADING_CANCELED = 'DOWNLOADING_CANCELED'; var PLAY_VIDEO_STARTED = exports.PLAY_VIDEO_STARTED = 'PLAY_VIDEO_STARTED'; var FETCH_AVAILABILITY_STARTED = exports.FETCH_AVAILABILITY_STARTED = 'FETCH_AVAILABILITY_STARTED'; var FETCH_AVAILABILITY_COMPLETED = exports.FETCH_AVAILABILITY_COMPLETED = 'FETCH_AVAILABILITY_COMPLETED'; @@ -1047,6 +1048,13 @@ Lbry.file_delete = function () { }); }; +Lbry.file_set_status = function () { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return new Promise(function (resolve, reject) { + apiCall('file_set_status', params, resolve, reject); + }); +}; + Lbry.connectPromise = null; Lbry.connect = function () { if (Lbry.connectPromise === null) { diff --git a/src/lbry.js b/src/lbry.js index e70dec6..e072c98 100644 --- a/src/lbry.js +++ b/src/lbry.js @@ -143,15 +143,15 @@ Lbry.status = () => reject ); }); - + Lbry.file_delete = (params = {}) => new Promise((resolve, reject) => { - apiCall( - 'file_delete', - params, - resolve, - reject - ); + apiCall('file_delete', params, resolve, reject); + }); + +Lbry.file_set_status = (params = {}) => + new Promise((resolve, reject) => { + apiCall('file_set_status', params, resolve, reject); }); Lbry.connectPromise = null; -- 2.45.3 From 0759a086e2a4b6d191072429b7a559b149e87fdb Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Wed, 4 Apr 2018 08:34:23 +0100 Subject: [PATCH 35/41] Removed redux/actions/app.js. Removed obsolete pending publish code. --- src/lbry.js | 137 +-------------------------------------- src/redux/actions/app.js | 24 ------- 2 files changed, 3 insertions(+), 158 deletions(-) delete mode 100644 src/redux/actions/app.js diff --git a/src/lbry.js b/src/lbry.js index e072c98..ad1a962 100644 --- a/src/lbry.js +++ b/src/lbry.js @@ -59,78 +59,6 @@ function setLocal(key, value) { // localStorage.setItem(key, JSON.stringify(value)); } -/** - * Records a publish attempt in local storage. Returns a dictionary with all the data needed to - * needed to make a dummy claim or file info object. - */ -let pendingId = 0; -function savePendingPublish({ name, channelName }) { - pendingId += 1; - const pendingPublishes = getLocal('pendingPublishes') || []; - const newPendingPublish = { - name, - channelName, - claim_id: `pending-${pendingId}`, - txid: `pending-${pendingId}`, - nout: 0, - outpoint: `pending-${pendingId}:0`, - time: Date.now(), - }; - setLocal('pendingPublishes', [...pendingPublishes, newPendingPublish]); - return newPendingPublish; -} - -/** - * If there is a pending publish with the given name or outpoint, remove it. - * A channel name may also be provided along with name. - */ -function removePendingPublishIfNeeded({ name, channelName, outpoint }) { - function pubMatches(pub) { - return ( - pub.outpoint === outpoint || - (pub.name === name && (!channelName || pub.channel_name === channelName)) - ); - } - - setLocal('pendingPublishes', Lbry.getPendingPublishes().filter(pub => !pubMatches(pub))); -} - -/** - * Gets the current list of pending publish attempts. Filters out any that have timed out and - * removes them from the list. - */ -Lbry.getPendingPublishes = () => { - const pendingPublishes = getLocal('pendingPublishes') || []; - const newPendingPublishes = pendingPublishes.filter( - pub => Date.now() - pub.time <= Lbry.pendingPublishTimeout - ); - setLocal('pendingPublishes', newPendingPublishes); - return newPendingPublishes; -}; - -/** - * Gets a pending publish attempt by its name or (fake) outpoint. A channel name can also be - * provided along withe the name. If no pending publish is found, returns null. - */ -function getPendingPublish({ name, channelName, outpoint }) { - const pendingPublishes = Lbry.getPendingPublishes(); - return ( - pendingPublishes.find( - pub => - pub.outpoint === outpoint || - (pub.name === name && (!channelName || pub.channel_name === channelName)) - ) || null - ); -} - -function pendingPublishToDummyClaim({ channelName, name, outpoint, claimId, txid, nout }) { - return { name, outpoint, claimId, txid, nout, channelName }; -} - -function pendingPublishToDummyFileInfo({ name, outpoint, claimId }) { - return { name, outpoint, claimId, metadata: null }; -} - // core Lbry.status = () => new Promise((resolve, reject) => { @@ -148,7 +76,7 @@ Lbry.file_delete = (params = {}) => new Promise((resolve, reject) => { apiCall('file_delete', params, resolve, reject); }); - + Lbry.file_set_status = (params = {}) => new Promise((resolve, reject) => { apiCall('file_set_status', params, resolve, reject); @@ -180,43 +108,6 @@ Lbry.connect = () => { return Lbry.connectPromise; }; -/** - * Publishes a file. The optional fileListedCallback is called when the file becomes available in - * lbry.file_list() during the publish process. - * - * This currently includes a work-around to cache the file in local storage so that the pending - * publish can appear in the UI immediately. - */ -Lbry.publishDeprecated = (params, fileListedCallback, publishedCallback, errorCallback) => { - // Give a short grace period in case publish() returns right away or (more likely) gives an error - const returnPendingTimeout = setTimeout( - () => { - const { name, channel_name: channelName } = params; - if (publishedCallback || fileListedCallback) { - savePendingPublish({ - name, - channelName, - }); - publishedCallback(true); - } - }, - 2000, - { once: true } - ); - - // eslint-disable-next-line no-use-before-define - lbryProxy.publish(params).then( - result => { - if (returnPendingTimeout) clearTimeout(returnPendingTimeout); - publishedCallback(result); - }, - err => { - if (returnPendingTimeout) clearTimeout(returnPendingTimeout); - errorCallback(err); - } - ); -}; - Lbry.getMediaType = (contentType, fileName) => { if (contentType) { return /^[^/]+/.exec(contentType)[0]; @@ -250,35 +141,13 @@ Lbry.getMediaType = (contentType, fileName) => { */ Lbry.file_list = (params = {}) => new Promise((resolve, reject) => { - const { name, channel_name: channelName, outpoint } = params; - - /** - * If we're searching by outpoint, check first to see if there's a matching pending publish. - * Pending publishes use their own faux outpoints that are always unique, so we don't need - * to check if there's a real file. - */ - if (outpoint) { - const pendingPublish = getPendingPublish({ outpoint }); - if (pendingPublish) { - resolve([pendingPublishToDummyFileInfo(pendingPublish)]); - return; - } - } + const { claim_name: claimName, channel_name: channelName, outpoint } = params; apiCall( 'file_list', params, fileInfos => { - removePendingPublishIfNeeded({ name, channelName, outpoint }); - - // if a naked file_list call, append the pending file infos - if (!name && !channelName && !outpoint) { - const dummyFileInfos = Lbry.getPendingPublishes().map(pendingPublishToDummyFileInfo); - - resolve([...fileInfos, ...dummyFileInfos]); - } else { - resolve(fileInfos); - } + resolve(fileInfos); }, reject ); diff --git a/src/redux/actions/app.js b/src/redux/actions/app.js deleted file mode 100644 index 5bf035a..0000000 --- a/src/redux/actions/app.js +++ /dev/null @@ -1,24 +0,0 @@ -import * as ACTIONS from 'constants/action_types'; - -export function doOpenModal(modal, modalProps = {}) { - return { - type: ACTIONS.OPEN_MODAL, - data: { - modal, - modalProps, - }, - }; -} - -export function doCloseModal() { - return { - type: ACTIONS.CLOSE_MODAL, - }; -} - -export function doShowSnackBar(data) { - return { - type: ACTIONS.SHOW_SNACKBAR, - data, - }; -} -- 2.45.3 From b8e0c37a0cd3804eb2ad047669567c6cc6df3c27 Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Wed, 4 Apr 2018 15:18:58 +0100 Subject: [PATCH 36/41] Removed unused redux/actions/app.js. Removed obsolete pending publish code. --- build/index.js | 511 +++++++++++------------------------- src/index.js | 2 - src/redux/actions/claims.js | 15 +- src/redux/actions/wallet.js | 67 +++-- 4 files changed, 214 insertions(+), 381 deletions(-) diff --git a/build/index.js b/build/index.js index bef0f1f..fcd03e4 100644 --- a/build/index.js +++ b/build/index.js @@ -882,7 +882,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); -__webpack_require__(17); +__webpack_require__(16); function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } @@ -943,95 +943,6 @@ function setLocal(key, value) {} // localStorage.setItem(key, JSON.stringify(value)); -/** - * Records a publish attempt in local storage. Returns a dictionary with all the data needed to - * needed to make a dummy claim or file info object. - */ -var pendingId = 0; -function savePendingPublish(_ref) { - var name = _ref.name, - channelName = _ref.channelName; - - pendingId += 1; - var pendingPublishes = getLocal('pendingPublishes') || []; - var newPendingPublish = { - name: name, - channelName: channelName, - claim_id: 'pending-' + pendingId, - txid: 'pending-' + pendingId, - nout: 0, - outpoint: 'pending-' + pendingId + ':0', - time: Date.now() - }; - setLocal('pendingPublishes', [].concat(_toConsumableArray(pendingPublishes), [newPendingPublish])); - return newPendingPublish; -} - -/** - * If there is a pending publish with the given name or outpoint, remove it. - * A channel name may also be provided along with name. - */ -function removePendingPublishIfNeeded(_ref2) { - var name = _ref2.name, - channelName = _ref2.channelName, - outpoint = _ref2.outpoint; - - function pubMatches(pub) { - return pub.outpoint === outpoint || pub.name === name && (!channelName || pub.channel_name === channelName); - } - - setLocal('pendingPublishes', Lbry.getPendingPublishes().filter(function (pub) { - return !pubMatches(pub); - })); -} - -/** - * Gets the current list of pending publish attempts. Filters out any that have timed out and - * removes them from the list. - */ -Lbry.getPendingPublishes = function () { - var pendingPublishes = getLocal('pendingPublishes') || []; - var newPendingPublishes = pendingPublishes.filter(function (pub) { - return Date.now() - pub.time <= Lbry.pendingPublishTimeout; - }); - setLocal('pendingPublishes', newPendingPublishes); - return newPendingPublishes; -}; - -/** - * Gets a pending publish attempt by its name or (fake) outpoint. A channel name can also be - * provided along withe the name. If no pending publish is found, returns null. - */ -function getPendingPublish(_ref3) { - var name = _ref3.name, - channelName = _ref3.channelName, - outpoint = _ref3.outpoint; - - var pendingPublishes = Lbry.getPendingPublishes(); - return pendingPublishes.find(function (pub) { - return pub.outpoint === outpoint || pub.name === name && (!channelName || pub.channel_name === channelName); - }) || null; -} - -function pendingPublishToDummyClaim(_ref4) { - var channelName = _ref4.channelName, - name = _ref4.name, - outpoint = _ref4.outpoint, - claimId = _ref4.claimId, - txid = _ref4.txid, - nout = _ref4.nout; - - return { name: name, outpoint: outpoint, claimId: claimId, txid: txid, nout: nout, channelName: channelName }; -} - -function pendingPublishToDummyFileInfo(_ref5) { - var name = _ref5.name, - outpoint = _ref5.outpoint, - claimId = _ref5.claimId; - - return { name: name, outpoint: outpoint, claimId: claimId, metadata: null }; -} - // core Lbry.status = function () { return new Promise(function (resolve, reject) { @@ -1079,38 +990,6 @@ Lbry.connect = function () { return Lbry.connectPromise; }; -/** - * Publishes a file. The optional fileListedCallback is called when the file becomes available in - * lbry.file_list() during the publish process. - * - * This currently includes a work-around to cache the file in local storage so that the pending - * publish can appear in the UI immediately. - */ -Lbry.publishDeprecated = function (params, fileListedCallback, publishedCallback, errorCallback) { - // Give a short grace period in case publish() returns right away or (more likely) gives an error - var returnPendingTimeout = setTimeout(function () { - var name = params.name, - channelName = params.channel_name; - - if (publishedCallback || fileListedCallback) { - savePendingPublish({ - name: name, - channelName: channelName - }); - publishedCallback(true); - } - }, 2000, { once: true }); - - // eslint-disable-next-line no-use-before-define - lbryProxy.publish(params).then(function (result) { - if (returnPendingTimeout) clearTimeout(returnPendingTimeout); - publishedCallback(result); - }, function (err) { - if (returnPendingTimeout) clearTimeout(returnPendingTimeout); - errorCallback(err); - }); -}; - Lbry.getMediaType = function (contentType, fileName) { if (contentType) { return (/^[^/]+/.exec(contentType)[0] @@ -1146,35 +1025,13 @@ Lbry.getMediaType = function (contentType, fileName) { Lbry.file_list = function () { var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; return new Promise(function (resolve, reject) { - var name = params.name, + var claimName = params.claim_name, channelName = params.channel_name, outpoint = params.outpoint; - /** - * If we're searching by outpoint, check first to see if there's a matching pending publish. - * Pending publishes use their own faux outpoints that are always unique, so we don't need - * to check if there's a real file. - */ - - if (outpoint) { - var pendingPublish = getPendingPublish({ outpoint: outpoint }); - if (pendingPublish) { - resolve([pendingPublishToDummyFileInfo(pendingPublish)]); - return; - } - } apiCall('file_list', params, function (fileInfos) { - removePendingPublishIfNeeded({ name: name, channelName: channelName, outpoint: outpoint }); - - // if a naked file_list call, append the pending file infos - if (!name && !channelName && !outpoint) { - var dummyFileInfos = Lbry.getPendingPublishes().map(pendingPublishToDummyFileInfo); - - resolve([].concat(_toConsumableArray(fileInfos), _toConsumableArray(dummyFileInfos))); - } else { - resolve(fileInfos); - } + resolve(fileInfos); }, reject); }); }; @@ -1183,11 +1040,11 @@ Lbry.claim_list_mine = function () { var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; return new Promise(function (resolve, reject) { apiCall('claim_list_mine', params, function (claims) { - claims.forEach(function (_ref6) { - var name = _ref6.name, - channelName = _ref6.channel_name, - txid = _ref6.txid, - nout = _ref6.nout; + claims.forEach(function (_ref) { + var name = _ref.name, + channelName = _ref.channel_name, + txid = _ref.txid, + nout = _ref.nout; removePendingPublishIfNeeded({ name: name, @@ -1455,6 +1312,37 @@ var selectNavLinks = exports.selectNavLinks = (0, _reselect.createSelector)(sele "use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.doNotify = doNotify; + +var _action_types = __webpack_require__(0); + +var ACTIONS = _interopRequireWildcard(_action_types); + +var _Notification = __webpack_require__(10); + +var _Notification2 = _interopRequireDefault(_Notification); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function doNotify(data) { + return { + type: ACTIONS.CREATE_NOTIFICATION, + data: data + }; +} + +/***/ }), +/* 7 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + Object.defineProperty(exports, "__esModule", { value: true }); @@ -1476,15 +1364,17 @@ var _lbry = __webpack_require__(4); var _lbry2 = _interopRequireDefault(_lbry); -var _lbryapi = __webpack_require__(7); +var _lbryapi = __webpack_require__(8); var _lbryapi2 = _interopRequireDefault(_lbryapi); var _lbryURI = __webpack_require__(2); +var _notifications = __webpack_require__(6); + var _claims = __webpack_require__(3); -var _batchActions = __webpack_require__(8); +var _batchActions = __webpack_require__(9); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -1581,7 +1471,12 @@ function doAbandonClaim(txid, nout) { }); var errorCallback = function errorCallback() { - // dispatch(doOpenModal(MODALS.TRANSACTION_FAILED)); + dispatch((0, _notifications.doNotify)({ + title: 'Transaction failed', + message: 'Transaction failed', + type: 'error', + displayType: ['modal', 'toast'] + })); }; var successCallback = function successCallback(results) { @@ -1595,7 +1490,12 @@ function doAbandonClaim(txid, nout) { dispatch(doResolveUri((0, _lbryURI.buildURI)({ name: name, claimId: claimId }))); dispatch(doFetchClaimListMine()); } else { - // dispatch(doOpenModal(MODALS.TRANSACTION_FAILED)); + dispatch((0, _notifications.doNotify)({ + title: 'Transaction failed', + message: 'Transaction failed', + type: 'error', + displayType: ['modal', 'toast'] + })); } }; @@ -1670,7 +1570,7 @@ function doFetchRewardedContent() { } /***/ }), -/* 7 */ +/* 8 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1682,7 +1582,7 @@ Object.defineProperty(exports, "__esModule", { var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; -var _querystring = __webpack_require__(20); +var _querystring = __webpack_require__(19); var _querystring2 = _interopRequireDefault(_querystring); @@ -1773,10 +1673,10 @@ Lbryapi.call = function (resource, action) { }; exports.default = Lbryapi; -/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(19))) +/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(18))) /***/ }), -/* 8 */ +/* 9 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1798,13 +1698,6 @@ function batchActions() { }; } -/***/ }), -/* 9 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - /***/ }), /* 10 */ /***/ (function(module, exports, __webpack_require__) { @@ -1812,44 +1705,6 @@ function batchActions() { "use strict"; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.doOpenModal = doOpenModal; -exports.doCloseModal = doCloseModal; -exports.doShowSnackBar = doShowSnackBar; - -var _action_types = __webpack_require__(0); - -var ACTIONS = _interopRequireWildcard(_action_types); - -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - -function doOpenModal(modal) { - var modalProps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - - return { - type: ACTIONS.OPEN_MODAL, - data: { - modal: modal, - modalProps: modalProps - } - }; -} - -function doCloseModal() { - return { - type: ACTIONS.CLOSE_MODAL - }; -} - -function doShowSnackBar(data) { - return { - type: ACTIONS.SHOW_SNACKBAR, - data: data - }; -} - /***/ }), /* 11 */ /***/ (function(module, exports, __webpack_require__) { @@ -2297,10 +2152,10 @@ var makeSelectBlockDate = exports.makeSelectBlockDate = function makeSelectBlock Object.defineProperty(exports, "__esModule", { value: true }); -exports.selectBlocks = exports.selectDraftTransactionError = exports.selectDraftTransactionAddress = exports.selectDraftTransactionAmount = exports.selectDraftTransaction = exports.selectGettingNewAddress = exports.selectReceiveAddress = exports.selectIsSendingSupport = exports.selectIsFetchingTransactions = exports.selectHasTransactions = exports.selectRecentTransactions = exports.selectTransactionItems = exports.selectTransactionsById = exports.selectBalance = exports.makeSelectBlockDate = exports.selectWunderBarAddress = exports.selectSearchUrisByQuery = exports.selectIsSearching = exports.selectSearchValue = exports.selectSearchQuery = exports.makeSelectSearchUris = exports.selectSearchState = exports.selectNavLinks = exports.selectActiveHistoryEntry = exports.selectHistoryStack = exports.selectHistoryIndex = exports.selectIsForwardDisabled = exports.selectIsBackDisabled = exports.selectPathAfterAuth = exports.selectPageTitle = exports.selectHeaderLinks = exports.selectCurrentParams = exports.selectCurrentPage = exports.selectCurrentPath = undefined; -exports.makeSelectCurrentParam = exports.computePageFromPath = exports.selectSearchDownloadUris = exports.selectTotalDownloadProgress = exports.selectDownloadingFileInfos = exports.selectFileInfosDownloaded = exports.selectUrisLoading = exports.selectDownloadingByOutpoint = exports.selectIsFetchingFileListDownloadedOrPublished = exports.selectIsFetchingFileList = exports.selectFileInfosByOutpoint = exports.makeSelectLoadingForUri = exports.makeSelectDownloadingForUri = exports.makeSelectFileInfoForUri = exports.selectFetchingCostInfo = exports.selectCostForCurrentPageUri = exports.selectAllCostInfoByUri = exports.makeSelectCostInfoForUri = exports.makeSelectFetchingCostInfoForUri = exports.selectRewardContentClaimIds = exports.selectChannelClaimCounts = exports.selectPlayingUri = exports.selectFetchingFeaturedUris = exports.selectFeaturedUris = exports.selectResolvingUris = exports.selectMyChannelClaims = exports.selectFetchingMyChannels = exports.selectMyClaimsOutpoints = exports.selectAllMyClaimsByOutpoint = exports.selectMyClaimsWithoutChannels = exports.selectMyClaims = exports.selectPendingClaims = exports.selectIsFetchingClaimListMine = exports.selectAllFetchingChannelClaims = exports.selectMyActiveClaims = exports.selectAbandoningIds = exports.selectMyClaimsRaw = exports.selectAllClaimsByChannel = exports.selectClaimsByUri = exports.selectClaimsById = exports.makeSelectTotalPagesForChannel = exports.makeSelectTotalItemsForChannel = exports.makeSelectIsUriResolving = exports.makeSelectContentTypeForUri = exports.makeSelectTitleForUri = exports.makeSelectMetadataForUri = exports.makeSelectClaimsInChannelForCurrentPage = exports.makeSelectFetchingChannelClaims = exports.makeSelectClaimIsMine = exports.makeSelectClaimForUri = exports.selectNotification = exports.walletReducer = exports.searchReducer = exports.notificationsReducer = exports.fileInfoReducer = exports.costInfoReducer = exports.claimsReducer = exports.formatFullPrice = exports.formatCredits = exports.toQueryString = exports.parseQueryParams = exports.batchActions = exports.doSendSupport = exports.doSetDraftTransactionAddress = exports.doSetDraftTransactionAmount = exports.doSendDraftTransaction = exports.doCheckAddressIsMine = exports.doGetNewAddress = exports.doFetchBlock = exports.doFetchTransactions = exports.doBalanceSubscribe = exports.doUpdateBalance = exports.doUpdateSearchQuery = exports.doSearch = exports.doFetchFileInfosAndPublishedClaims = exports.doFileList = exports.doFetchFileInfo = exports.doFetchCostInfoForUri = exports.doFetchRewardedContent = exports.doFetchFeaturedUris = exports.doResolveUri = exports.doResolveUris = exports.doAbandonClaim = exports.doFetchClaimListMine = exports.doShowSnackBar = exports.doCloseModal = exports.doOpenModal = exports.doNotify = exports.isURIClaimable = exports.isURIValid = exports.normalizeURI = exports.buildURI = exports.parseURI = exports.regexAddress = exports.regexInvalidURI = exports.Lbryapi = exports.Lbry = exports.SETTINGS = exports.ACTIONS = exports.Notification = undefined; +exports.selectBlocks = exports.selectDraftTransactionError = exports.selectDraftTransactionAddress = exports.selectDraftTransactionAmount = exports.selectDraftTransaction = exports.selectGettingNewAddress = exports.selectReceiveAddress = exports.selectIsSendingSupport = exports.selectIsFetchingTransactions = exports.selectHasTransactions = exports.selectRecentTransactions = exports.selectTransactionItems = exports.selectTransactionsById = exports.selectBalance = exports.makeSelectBlockDate = exports.selectWunderBarAddress = exports.selectSearchUrisByQuery = exports.selectIsSearching = exports.selectSearchValue = exports.selectSearchQuery = exports.makeSelectSearchUris = exports.selectSearchState = exports.selectNavLinks = exports.selectActiveHistoryEntry = exports.selectHistoryStack = exports.selectHistoryIndex = exports.selectIsForwardDisabled = exports.selectIsBackDisabled = exports.selectPathAfterAuth = exports.selectPageTitle = exports.selectHeaderLinks = undefined; +exports.selectCurrentParams = exports.selectCurrentPage = exports.selectCurrentPath = exports.makeSelectCurrentParam = exports.computePageFromPath = exports.selectSearchDownloadUris = exports.selectTotalDownloadProgress = exports.selectDownloadingFileInfos = exports.selectFileInfosDownloaded = exports.selectUrisLoading = exports.selectDownloadingByOutpoint = exports.selectIsFetchingFileListDownloadedOrPublished = exports.selectIsFetchingFileList = exports.selectFileInfosByOutpoint = exports.makeSelectLoadingForUri = exports.makeSelectDownloadingForUri = exports.makeSelectFileInfoForUri = exports.selectFetchingCostInfo = exports.selectCostForCurrentPageUri = exports.selectAllCostInfoByUri = exports.makeSelectCostInfoForUri = exports.makeSelectFetchingCostInfoForUri = exports.selectRewardContentClaimIds = exports.selectChannelClaimCounts = exports.selectPlayingUri = exports.selectFetchingFeaturedUris = exports.selectFeaturedUris = exports.selectResolvingUris = exports.selectMyChannelClaims = exports.selectFetchingMyChannels = exports.selectMyClaimsOutpoints = exports.selectAllMyClaimsByOutpoint = exports.selectMyClaimsWithoutChannels = exports.selectMyClaims = exports.selectPendingClaims = exports.selectIsFetchingClaimListMine = exports.selectAllFetchingChannelClaims = exports.selectMyActiveClaims = exports.selectAbandoningIds = exports.selectMyClaimsRaw = exports.selectAllClaimsByChannel = exports.selectClaimsByUri = exports.selectClaimsById = exports.makeSelectTotalPagesForChannel = exports.makeSelectTotalItemsForChannel = exports.makeSelectIsUriResolving = exports.makeSelectContentTypeForUri = exports.makeSelectTitleForUri = exports.makeSelectMetadataForUri = exports.makeSelectClaimsInChannelForCurrentPage = exports.makeSelectFetchingChannelClaims = exports.makeSelectClaimIsMine = exports.makeSelectClaimForUri = exports.selectNotification = exports.walletReducer = exports.searchReducer = exports.notificationsReducer = exports.fileInfoReducer = exports.costInfoReducer = exports.claimsReducer = exports.formatFullPrice = exports.formatCredits = exports.toQueryString = exports.parseQueryParams = exports.batchActions = exports.doSendSupport = exports.doSetDraftTransactionAddress = exports.doSetDraftTransactionAmount = exports.doSendDraftTransaction = exports.doCheckAddressIsMine = exports.doGetNewAddress = exports.doFetchBlock = exports.doFetchTransactions = exports.doBalanceSubscribe = exports.doUpdateBalance = exports.doUpdateSearchQuery = exports.doSearch = exports.doFetchFileInfosAndPublishedClaims = exports.doFileList = exports.doFetchFileInfo = exports.doFetchCostInfoForUri = exports.doFetchRewardedContent = exports.doFetchFeaturedUris = exports.doResolveUri = exports.doResolveUris = exports.doAbandonClaim = exports.doFetchClaimListMine = exports.doNotify = exports.isURIClaimable = exports.isURIValid = exports.normalizeURI = exports.buildURI = exports.parseURI = exports.regexAddress = exports.regexInvalidURI = exports.Lbryapi = exports.Lbry = exports.SETTINGS = exports.ACTIONS = exports.Notification = undefined; -var _Notification = __webpack_require__(9); +var _Notification = __webpack_require__(10); Object.defineProperty(exports, 'Notification', { enumerable: true, @@ -2354,7 +2209,7 @@ Object.defineProperty(exports, 'isURIClaimable', { } }); -var _notifications = __webpack_require__(16); +var _notifications = __webpack_require__(6); Object.defineProperty(exports, 'doNotify', { enumerable: true, @@ -2363,28 +2218,7 @@ Object.defineProperty(exports, 'doNotify', { } }); -var _app = __webpack_require__(10); - -Object.defineProperty(exports, 'doOpenModal', { - enumerable: true, - get: function get() { - return _app.doOpenModal; - } -}); -Object.defineProperty(exports, 'doCloseModal', { - enumerable: true, - get: function get() { - return _app.doCloseModal; - } -}); -Object.defineProperty(exports, 'doShowSnackBar', { - enumerable: true, - get: function get() { - return _app.doShowSnackBar; - } -}); - -var _claims = __webpack_require__(6); +var _claims = __webpack_require__(7); Object.defineProperty(exports, 'doFetchClaimListMine', { enumerable: true, @@ -2423,7 +2257,7 @@ Object.defineProperty(exports, 'doFetchRewardedContent', { } }); -var _cost_info = __webpack_require__(23); +var _cost_info = __webpack_require__(22); Object.defineProperty(exports, 'doFetchCostInfoForUri', { enumerable: true, @@ -2432,7 +2266,7 @@ Object.defineProperty(exports, 'doFetchCostInfoForUri', { } }); -var _file_info = __webpack_require__(24); +var _file_info = __webpack_require__(23); Object.defineProperty(exports, 'doFetchFileInfo', { enumerable: true, @@ -2453,7 +2287,7 @@ Object.defineProperty(exports, 'doFetchFileInfosAndPublishedClaims', { } }); -var _search = __webpack_require__(25); +var _search = __webpack_require__(24); Object.defineProperty(exports, 'doSearch', { enumerable: true, @@ -2468,7 +2302,7 @@ Object.defineProperty(exports, 'doUpdateSearchQuery', { } }); -var _wallet = __webpack_require__(28); +var _wallet = __webpack_require__(27); Object.defineProperty(exports, 'doUpdateBalance', { enumerable: true, @@ -2531,7 +2365,7 @@ Object.defineProperty(exports, 'doSendSupport', { } }); -var _batchActions = __webpack_require__(8); +var _batchActions = __webpack_require__(9); Object.defineProperty(exports, 'batchActions', { enumerable: true, @@ -2555,7 +2389,7 @@ Object.defineProperty(exports, 'toQueryString', { } }); -var _formatCredits = __webpack_require__(30); +var _formatCredits = __webpack_require__(28); Object.defineProperty(exports, 'formatCredits', { enumerable: true, @@ -2570,7 +2404,7 @@ Object.defineProperty(exports, 'formatFullPrice', { } }); -var _claims2 = __webpack_require__(31); +var _claims2 = __webpack_require__(29); Object.defineProperty(exports, 'claimsReducer', { enumerable: true, @@ -2579,7 +2413,7 @@ Object.defineProperty(exports, 'claimsReducer', { } }); -var _cost_info2 = __webpack_require__(32); +var _cost_info2 = __webpack_require__(30); Object.defineProperty(exports, 'costInfoReducer', { enumerable: true, @@ -2588,7 +2422,7 @@ Object.defineProperty(exports, 'costInfoReducer', { } }); -var _file_info2 = __webpack_require__(33); +var _file_info2 = __webpack_require__(31); Object.defineProperty(exports, 'fileInfoReducer', { enumerable: true, @@ -2597,7 +2431,7 @@ Object.defineProperty(exports, 'fileInfoReducer', { } }); -var _notifications2 = __webpack_require__(34); +var _notifications2 = __webpack_require__(32); Object.defineProperty(exports, 'notificationsReducer', { enumerable: true, @@ -2606,7 +2440,7 @@ Object.defineProperty(exports, 'notificationsReducer', { } }); -var _search2 = __webpack_require__(35); +var _search2 = __webpack_require__(33); Object.defineProperty(exports, 'searchReducer', { enumerable: true, @@ -2615,7 +2449,7 @@ Object.defineProperty(exports, 'searchReducer', { } }); -var _wallet2 = __webpack_require__(37); +var _wallet2 = __webpack_require__(35); Object.defineProperty(exports, 'walletReducer', { enumerable: true, @@ -2624,7 +2458,7 @@ Object.defineProperty(exports, 'walletReducer', { } }); -var _notifications3 = __webpack_require__(38); +var _notifications3 = __webpack_require__(36); Object.defineProperty(exports, 'selectNotification', { enumerable: true, @@ -2822,7 +2656,7 @@ Object.defineProperty(exports, 'selectRewardContentClaimIds', { } }); -var _cost_info3 = __webpack_require__(39); +var _cost_info3 = __webpack_require__(37); Object.defineProperty(exports, 'makeSelectFetchingCostInfoForUri', { enumerable: true, @@ -3153,7 +2987,7 @@ var _action_types = __webpack_require__(0); var ACTIONS = _interopRequireWildcard(_action_types); -var _settings = __webpack_require__(40); +var _settings = __webpack_require__(38); var SETTINGS = _interopRequireWildcard(_settings); @@ -3161,7 +2995,7 @@ var _lbry = __webpack_require__(4); var _lbry2 = _interopRequireDefault(_lbry); -var _lbryapi = __webpack_require__(7); +var _lbryapi = __webpack_require__(8); var _lbryapi2 = _interopRequireDefault(_lbryapi); @@ -3183,37 +3017,6 @@ exports.selectSearchState = _search3.selectState; /* 16 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.doNotify = doNotify; - -var _action_types = __webpack_require__(0); - -var ACTIONS = _interopRequireWildcard(_action_types); - -var _Notification = __webpack_require__(9); - -var _Notification2 = _interopRequireDefault(_Notification); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - -function doNotify(data) { - return { - type: ACTIONS.CREATE_NOTIFICATION, - data: data - }; -} - -/***/ }), -/* 17 */ -/***/ (function(module, exports, __webpack_require__) { - "use strict"; /* WEBPACK VAR INJECTION */(function(global) {/* * Copyright 2016 Google Inc. All rights reserved. @@ -3390,10 +3193,10 @@ function doNotify(data) { scope['Proxy'] = scope.Proxy; })(typeof module !== 'undefined' && module['exports'] ? global : window); -/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(18))) +/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(17))) /***/ }), -/* 18 */ +/* 17 */ /***/ (function(module, exports) { var g; @@ -3420,7 +3223,7 @@ module.exports = g; /***/ }), -/* 19 */ +/* 18 */ /***/ (function(module, exports) { // shim for using process in browser @@ -3610,18 +3413,18 @@ process.umask = function() { return 0; }; /***/ }), -/* 20 */ +/* 19 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -exports.decode = exports.parse = __webpack_require__(21); -exports.encode = exports.stringify = __webpack_require__(22); +exports.decode = exports.parse = __webpack_require__(20); +exports.encode = exports.stringify = __webpack_require__(21); /***/ }), -/* 21 */ +/* 20 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3712,7 +3515,7 @@ var isArray = Array.isArray || function (xs) { /***/ }), -/* 22 */ +/* 21 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3804,7 +3607,7 @@ var objectKeys = Object.keys || function (obj) { /***/ }), -/* 23 */ +/* 22 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3819,7 +3622,7 @@ var _action_types = __webpack_require__(0); var ACTIONS = _interopRequireWildcard(_action_types); -var _lbryapi = __webpack_require__(7); +var _lbryapi = __webpack_require__(8); var _lbryapi2 = _interopRequireDefault(_lbryapi); @@ -3864,7 +3667,7 @@ function doFetchCostInfoForUri(uri) { } /***/ }), -/* 24 */ +/* 23 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3885,7 +3688,7 @@ var _lbry = __webpack_require__(4); var _lbry2 = _interopRequireDefault(_lbry); -var _claims = __webpack_require__(6); +var _claims = __webpack_require__(7); var _claims2 = __webpack_require__(3); @@ -3957,7 +3760,7 @@ function doFetchFileInfosAndPublishedClaims() { } /***/ }), -/* 25 */ +/* 24 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3972,21 +3775,21 @@ var _action_types = __webpack_require__(0); var ACTIONS = _interopRequireWildcard(_action_types); -var _search = __webpack_require__(26); +var _search = __webpack_require__(25); var SEARCH_TYPES = _interopRequireWildcard(_search); var _lbryURI = __webpack_require__(2); -var _claims = __webpack_require__(6); +var _claims = __webpack_require__(7); var _search2 = __webpack_require__(13); -var _batchActions = __webpack_require__(8); +var _batchActions = __webpack_require__(9); var _batchActions2 = _interopRequireDefault(_batchActions); -var _handleFetch = __webpack_require__(27); +var _handleFetch = __webpack_require__(26); var _handleFetch2 = _interopRequireDefault(_handleFetch); @@ -4161,7 +3964,7 @@ var getSearchSuggestions = exports.getSearchSuggestions = function getSearchSugg }; /***/ }), -/* 26 */ +/* 25 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4175,7 +3978,7 @@ var CHANNEL = exports.CHANNEL = 'channel'; var SEARCH = exports.SEARCH = 'search'; /***/ }), -/* 27 */ +/* 26 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4190,7 +3993,7 @@ function handleFetchResponse(response) { } /***/ }), -/* 28 */ +/* 27 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4214,15 +4017,11 @@ var _action_types = __webpack_require__(0); var ACTIONS = _interopRequireWildcard(_action_types); -var _modal_types = __webpack_require__(29); - -var MODALS = _interopRequireWildcard(_modal_types); - var _lbry = __webpack_require__(4); var _lbry2 = _interopRequireDefault(_lbry); -var _app = __webpack_require__(10); +var _notifications = __webpack_require__(6); var _wallet = __webpack_require__(14); @@ -4231,14 +4030,19 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function doUpdateBalance() { - return function (dispatch) { + return function (dispatch, getState) { + var _getState = getState(), + balanceInStore = _getState.wallet.balance; + _lbry2.default.wallet_balance().then(function (balance) { - return dispatch({ - type: ACTIONS.UPDATE_BALANCE, - data: { - balance: balance - } - }); + if (balanceInStore !== balance) { + return dispatch({ + type: ACTIONS.UPDATE_BALANCE, + data: { + balance: balance + } + }); + } }); }; } @@ -4320,7 +4124,12 @@ function doSendDraftTransaction() { var amount = (0, _wallet.selectDraftTransactionAmount)(state); if (balance - amount <= 0) { - dispatch((0, _app.doOpenModal)(MODALS.INSUFFICIENT_CREDITS)); + dispatch((0, _notifications.doNotify)({ + title: 'Insufficient credits', + message: 'Insufficient credits', + type: 'error', + displayType: ['modal', 'toast'] + })); return; } @@ -4333,17 +4142,25 @@ function doSendDraftTransaction() { dispatch({ type: ACTIONS.SEND_TRANSACTION_COMPLETED }); - dispatch((0, _app.doShowSnackBar)({ - message: __('You sent ' + amount + ' LBC'), - linkText: __('History'), - linkTarget: __('/wallet') + dispatch((0, _notifications.doNotify)({ + title: 'Credits sent', + message: 'You sent ' + amount + ' LBC', + type: 'error', + displayType: ['snackbar', 'toast'], + linkText: 'History', + linkTarget: '/wallet' })); } else { dispatch({ type: ACTIONS.SEND_TRANSACTION_FAILED, data: { error: results } }); - dispatch((0, _app.doOpenModal)(MODALS.TRANSACTION_FAILED)); + dispatch((0, _notifications.doNotify)({ + title: 'Transaction failed', + message: 'Transaction failed', + type: 'error', + displayType: ['modal', 'toast'] + })); } }; @@ -4352,7 +4169,12 @@ function doSendDraftTransaction() { type: ACTIONS.SEND_TRANSACTION_FAILED, data: { error: error.message } }); - dispatch((0, _app.doOpenModal)(MODALS.TRANSACTION_FAILED)); + dispatch((0, _notifications.doNotify)({ + title: 'Transaction failed', + message: 'Transaction failed', + type: 'error', + displayType: ['modal', 'toast'] + })); }; _lbry2.default.wallet_send({ @@ -4382,7 +4204,12 @@ function doSendSupport(amount, claimId, uri, successCallback, errorCallback) { var balance = (0, _wallet.selectBalance)(state); if (balance - amount <= 0) { - dispatch((0, _app.doOpenModal)(MODALS.INSUFFICIENT_CREDITS)); + dispatch((0, _notifications.doNotify)({ + title: 'Insufficient credits', + message: 'Insufficient credits', + type: 'error', + displayType: ['modal', 'toast'] + })); return; } @@ -4398,33 +4225,7 @@ function doSendSupport(amount, claimId, uri, successCallback, errorCallback) { } /***/ }), -/* 29 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -var CONFIRM_FILE_REMOVE = exports.CONFIRM_FILE_REMOVE = 'confirmFileRemove'; -var INCOMPATIBLE_DAEMON = exports.INCOMPATIBLE_DAEMON = 'incompatibleDaemon'; -var FILE_TIMEOUT = exports.FILE_TIMEOUT = 'file_timeout'; -var DOWNLOADING = exports.DOWNLOADING = 'downloading'; -var ERROR = exports.ERROR = 'error'; -var INSUFFICIENT_CREDITS = exports.INSUFFICIENT_CREDITS = 'insufficient_credits'; -var UPGRADE = exports.UPGRADE = 'upgrade'; -var WELCOME = exports.WELCOME = 'welcome'; -var EMAIL_COLLECTION = exports.EMAIL_COLLECTION = 'email_collection'; -var FIRST_REWARD = exports.FIRST_REWARD = 'first_reward'; -var AUTHENTICATION_FAILURE = exports.AUTHENTICATION_FAILURE = 'auth_failure'; -var TRANSACTION_FAILED = exports.TRANSACTION_FAILED = 'transaction_failed'; -var REWARD_APPROVAL_REQUIRED = exports.REWARD_APPROVAL_REQUIRED = 'reward_approval_required'; -var AFFIRM_PURCHASE = exports.AFFIRM_PURCHASE = 'affirm_purchase'; -var CONFIRM_CLAIM_REVOKE = exports.CONFIRM_CLAIM_REVOKE = 'confirmClaimRevoke'; - -/***/ }), -/* 30 */ +/* 28 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4462,7 +4263,7 @@ function formatFullPrice(amount) { } /***/ }), -/* 31 */ +/* 29 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4770,7 +4571,7 @@ function claimsReducer() { } /***/ }), -/* 32 */ +/* 30 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4828,7 +4629,7 @@ function costInfoReducer() { } /***/ }), -/* 33 */ +/* 31 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -5025,7 +4826,7 @@ function fileInfoReducer() { } /***/ }), -/* 34 */ +/* 32 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -5090,7 +4891,7 @@ function notificationsReducer() { } /***/ }), -/* 35 */ +/* 33 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -5109,7 +4910,7 @@ var _action_types = __webpack_require__(0); var ACTIONS = _interopRequireWildcard(_action_types); -var _reduxUtils = __webpack_require__(36); +var _reduxUtils = __webpack_require__(34); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } @@ -5162,7 +4963,7 @@ var searchReducer = exports.searchReducer = (0, _reduxUtils.handleActions)((_han }), _handleActions), defaultState); /***/ }), -/* 36 */ +/* 34 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -5195,7 +4996,7 @@ var handleActions = exports.handleActions = function handleActions(actionMap, de }; /***/ }), -/* 37 */ +/* 35 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -5377,7 +5178,7 @@ function walletReducer() { } /***/ }), -/* 38 */ +/* 36 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -5399,7 +5200,7 @@ var selectNotification = exports.selectNotification = (0, _reselect.createSelect }); /***/ }), -/* 39 */ +/* 37 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -5443,7 +5244,7 @@ var makeSelectFetchingCostInfoForUri = exports.makeSelectFetchingCostInfoForUri }; /***/ }), -/* 40 */ +/* 38 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; diff --git a/src/index.js b/src/index.js index 92507d4..6a1af48 100644 --- a/src/index.js +++ b/src/index.js @@ -25,8 +25,6 @@ export { // actions export { doNotify } from 'redux/actions/notifications'; -export { doOpenModal, doCloseModal, doShowSnackBar } from 'redux/actions/app'; - export { doFetchClaimListMine, doAbandonClaim, diff --git a/src/redux/actions/claims.js b/src/redux/actions/claims.js index f8a1c2f..b4c2e69 100644 --- a/src/redux/actions/claims.js +++ b/src/redux/actions/claims.js @@ -2,6 +2,7 @@ import * as ACTIONS from 'constants/action_types'; import Lbry from 'lbry'; import Lbryapi from 'lbryapi'; import { buildURI, normalizeURI } from 'lbryURI'; +import { doNotify } from 'redux/actions/notifications'; import { selectMyClaimsRaw, selectResolvingUris } from 'redux/selectors/claims'; import { batchActions } from 'util/batchActions'; @@ -83,7 +84,12 @@ export function doAbandonClaim(txid, nout) { }); const errorCallback = () => { - // dispatch(doOpenModal(MODALS.TRANSACTION_FAILED)); + dispatch(doNotify({ + title: 'Transaction failed', + message: 'Transaction failed', + type: 'error', + displayType: ['modal', 'toast'] + })); }; const successCallback = results => { @@ -97,7 +103,12 @@ export function doAbandonClaim(txid, nout) { dispatch(doResolveUri(buildURI({ name, claimId }))); dispatch(doFetchClaimListMine()); } else { - // dispatch(doOpenModal(MODALS.TRANSACTION_FAILED)); + dispatch(doNotify({ + title: 'Transaction failed', + message: 'Transaction failed', + type: 'error', + displayType: ['modal', 'toast'] + })); } }; diff --git a/src/redux/actions/wallet.js b/src/redux/actions/wallet.js index 1a3ebb5..fe1c285 100644 --- a/src/redux/actions/wallet.js +++ b/src/redux/actions/wallet.js @@ -1,7 +1,6 @@ import * as ACTIONS from 'constants/action_types'; -import * as MODALS from 'constants/modal_types'; import Lbry from 'lbry'; -import { doOpenModal, doShowSnackBar } from 'redux/actions/app'; +import { doNotify } from 'redux/actions/notifications'; import { selectBalance, selectDraftTransaction, @@ -9,15 +8,18 @@ import { } from 'redux/selectors/wallet'; export function doUpdateBalance() { - return dispatch => { - Lbry.wallet_balance().then(balance => - dispatch({ - type: ACTIONS.UPDATE_BALANCE, - data: { - balance, - }, - }) - ); + return (dispatch, getState) => { + const { wallet: { balance: balanceInStore } } = getState(); + Lbry.wallet_balance().then(balance => { + if (balanceInStore !== balance) { + return dispatch({ + type: ACTIONS.UPDATE_BALANCE, + data: { + balance, + }, + }); + } + }); }; } @@ -96,7 +98,12 @@ export function doSendDraftTransaction() { const amount = selectDraftTransactionAmount(state); if (balance - amount <= 0) { - dispatch(doOpenModal(MODALS.INSUFFICIENT_CREDITS)); + dispatch(doNotify({ + title: 'Insufficient credits', + message: 'Insufficient credits', + type: 'error', + displayType: ['modal', 'toast'] + })); return; } @@ -109,19 +116,25 @@ export function doSendDraftTransaction() { dispatch({ type: ACTIONS.SEND_TRANSACTION_COMPLETED, }); - dispatch( - doShowSnackBar({ - message: __(`You sent ${amount} LBC`), - linkText: __('History'), - linkTarget: __('/wallet'), - }) - ); + dispatch(doNotify({ + title: 'Credits sent', + message: `You sent ${amount} LBC`, + type: 'error', + displayType: ['snackbar', 'toast'], + linkText: 'History', + linkTarget: '/wallet' + })); } else { dispatch({ type: ACTIONS.SEND_TRANSACTION_FAILED, data: { error: results }, }); - dispatch(doOpenModal(MODALS.TRANSACTION_FAILED)); + dispatch(doNotify({ + title: 'Transaction failed', + message: 'Transaction failed', + type: 'error', + displayType: ['modal', 'toast'] + })); } }; @@ -130,7 +143,12 @@ export function doSendDraftTransaction() { type: ACTIONS.SEND_TRANSACTION_FAILED, data: { error: error.message }, }); - dispatch(doOpenModal(MODALS.TRANSACTION_FAILED)); + dispatch(doNotify({ + title: 'Transaction failed', + message: 'Transaction failed', + type: 'error', + displayType: ['modal', 'toast'] + })); }; Lbry.wallet_send({ @@ -160,7 +178,12 @@ export function doSendSupport(amount, claimId, uri, successCallback, errorCallba const balance = selectBalance(state); if (balance - amount <= 0) { - dispatch(doOpenModal(MODALS.INSUFFICIENT_CREDITS)); + dispatch(doNotify({ + title: 'Insufficient credits', + message: 'Insufficient credits', + type: 'error', + displayType: ['modal', 'toast'] + })); return; } -- 2.45.3 From ef561a11e3096aafd96ffb4fbc682dd0a1a93508 Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Wed, 4 Apr 2018 15:19:19 +0100 Subject: [PATCH 37/41] updated build --- src/redux/actions/claims.js | 28 ++++++++------ src/redux/actions/wallet.js | 74 +++++++++++++++++++++---------------- 2 files changed, 58 insertions(+), 44 deletions(-) diff --git a/src/redux/actions/claims.js b/src/redux/actions/claims.js index b4c2e69..8fa939b 100644 --- a/src/redux/actions/claims.js +++ b/src/redux/actions/claims.js @@ -84,12 +84,14 @@ export function doAbandonClaim(txid, nout) { }); const errorCallback = () => { - dispatch(doNotify({ - title: 'Transaction failed', - message: 'Transaction failed', - type: 'error', - displayType: ['modal', 'toast'] - })); + dispatch( + doNotify({ + title: 'Transaction failed', + message: 'Transaction failed', + type: 'error', + displayType: ['modal', 'toast'], + }) + ); }; const successCallback = results => { @@ -103,12 +105,14 @@ export function doAbandonClaim(txid, nout) { dispatch(doResolveUri(buildURI({ name, claimId }))); dispatch(doFetchClaimListMine()); } else { - dispatch(doNotify({ - title: 'Transaction failed', - message: 'Transaction failed', - type: 'error', - displayType: ['modal', 'toast'] - })); + dispatch( + doNotify({ + title: 'Transaction failed', + message: 'Transaction failed', + type: 'error', + displayType: ['modal', 'toast'], + }) + ); } }; diff --git a/src/redux/actions/wallet.js b/src/redux/actions/wallet.js index fe1c285..728ba2d 100644 --- a/src/redux/actions/wallet.js +++ b/src/redux/actions/wallet.js @@ -98,12 +98,14 @@ export function doSendDraftTransaction() { const amount = selectDraftTransactionAmount(state); if (balance - amount <= 0) { - dispatch(doNotify({ - title: 'Insufficient credits', - message: 'Insufficient credits', - type: 'error', - displayType: ['modal', 'toast'] - })); + dispatch( + doNotify({ + title: 'Insufficient credits', + message: 'Insufficient credits', + type: 'error', + displayType: ['modal', 'toast'], + }) + ); return; } @@ -116,25 +118,29 @@ export function doSendDraftTransaction() { dispatch({ type: ACTIONS.SEND_TRANSACTION_COMPLETED, }); - dispatch(doNotify({ - title: 'Credits sent', - message: `You sent ${amount} LBC`, - type: 'error', - displayType: ['snackbar', 'toast'], - linkText: 'History', - linkTarget: '/wallet' - })); + dispatch( + doNotify({ + title: 'Credits sent', + message: `You sent ${amount} LBC`, + type: 'error', + displayType: ['snackbar', 'toast'], + linkText: 'History', + linkTarget: '/wallet', + }) + ); } else { dispatch({ type: ACTIONS.SEND_TRANSACTION_FAILED, data: { error: results }, }); - dispatch(doNotify({ - title: 'Transaction failed', - message: 'Transaction failed', - type: 'error', - displayType: ['modal', 'toast'] - })); + dispatch( + doNotify({ + title: 'Transaction failed', + message: 'Transaction failed', + type: 'error', + displayType: ['modal', 'toast'], + }) + ); } }; @@ -143,12 +149,14 @@ export function doSendDraftTransaction() { type: ACTIONS.SEND_TRANSACTION_FAILED, data: { error: error.message }, }); - dispatch(doNotify({ - title: 'Transaction failed', - message: 'Transaction failed', - type: 'error', - displayType: ['modal', 'toast'] - })); + dispatch( + doNotify({ + title: 'Transaction failed', + message: 'Transaction failed', + type: 'error', + displayType: ['modal', 'toast'], + }) + ); }; Lbry.wallet_send({ @@ -178,12 +186,14 @@ export function doSendSupport(amount, claimId, uri, successCallback, errorCallba const balance = selectBalance(state); if (balance - amount <= 0) { - dispatch(doNotify({ - title: 'Insufficient credits', - message: 'Insufficient credits', - type: 'error', - displayType: ['modal', 'toast'] - })); + dispatch( + doNotify({ + title: 'Insufficient credits', + message: 'Insufficient credits', + type: 'error', + displayType: ['modal', 'toast'], + }) + ); return; } -- 2.45.3 From ab4104d6f4c514582a92888c601ae8f2bf834e0f Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Wed, 4 Apr 2018 15:29:09 +0100 Subject: [PATCH 38/41] removed one more reference to pending publish --- build/index.js | 19 ++----------------- src/lbry.js | 11 +---------- 2 files changed, 3 insertions(+), 27 deletions(-) diff --git a/build/index.js b/build/index.js index fcd03e4..30b1428 100644 --- a/build/index.js +++ b/build/index.js @@ -884,10 +884,9 @@ Object.defineProperty(exports, "__esModule", { __webpack_require__(16); -function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } - var CHECK_DAEMON_STARTED_TRY_NUMBER = 200; + var Lbry = { isConnected: false, daemonConnectionString: 'http://localhost:5279', @@ -1040,21 +1039,7 @@ Lbry.claim_list_mine = function () { var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; return new Promise(function (resolve, reject) { apiCall('claim_list_mine', params, function (claims) { - claims.forEach(function (_ref) { - var name = _ref.name, - channelName = _ref.channel_name, - txid = _ref.txid, - nout = _ref.nout; - - removePendingPublishIfNeeded({ - name: name, - channelName: channelName, - outpoint: txid + ':' + nout - }); - }); - - var dummyClaims = Lbry.getPendingPublishes().map(pendingPublishToDummyClaim); - resolve([].concat(_toConsumableArray(claims), _toConsumableArray(dummyClaims))); + resolve(claims); }, reject); }); }; diff --git a/src/lbry.js b/src/lbry.js index ad1a962..f287d1f 100644 --- a/src/lbry.js +++ b/src/lbry.js @@ -159,16 +159,7 @@ Lbry.claim_list_mine = (params = {}) => 'claim_list_mine', params, claims => { - claims.forEach(({ name, channel_name: channelName, txid, nout }) => { - removePendingPublishIfNeeded({ - name, - channelName, - outpoint: `${txid}:${nout}`, - }); - }); - - const dummyClaims = Lbry.getPendingPublishes().map(pendingPublishToDummyClaim); - resolve([...claims, ...dummyClaims]); + resolve(claims); }, reject ); -- 2.45.3 From d2e4d6ef1309aa7f6d419eedce81a042bac20350 Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Wed, 4 Apr 2018 15:39:43 +0100 Subject: [PATCH 39/41] updated redux/selectors/file_info with latest changes from lbry-app master --- build/index.js | 39 +++++++++++++++++-------------- src/redux/selectors/file_info.js | 40 +++++++++++++++++--------------- 2 files changed, 43 insertions(+), 36 deletions(-) diff --git a/build/index.js b/build/index.js index 30b1428..7114c48 100644 --- a/build/index.js +++ b/build/index.js @@ -1749,10 +1749,10 @@ exports.selectSearchDownloadUris = exports.selectTotalDownloadProgress = exports var _claims = __webpack_require__(3); -var _lbryURI = __webpack_require__(2); - var _reselect = __webpack_require__(1); +var _lbryURI = __webpack_require__(2); + var selectState = exports.selectState = function selectState(state) { return state.fileInfo || {}; }; @@ -1846,7 +1846,7 @@ var selectTotalDownloadProgress = exports.selectTotalDownloadProgress = (0, _res }); var selectSearchDownloadUris = exports.selectSearchDownloadUris = function selectSearchDownloadUris(query) { - return (0, _reselect.createSelector)(selectFileInfosDownloaded, function (fileInfos) { + return (0, _reselect.createSelector)(selectFileInfosDownloaded, _claims.selectClaimsById, function (fileInfos, claimsById) { if (!query || !fileInfos.length) { return null; } @@ -1869,24 +1869,24 @@ var selectSearchDownloadUris = exports.selectSearchDownloadUris = function selec var downloadResultsFromQuery = []; fileInfos.forEach(function (fileInfo) { - var channel_name = fileInfo.channel_name, - claim_name = fileInfo.claim_name, + var channelName = fileInfo.channel_name, + claimName = fileInfo.claim_name, metadata = fileInfo.metadata; var author = metadata.author, description = metadata.description, title = metadata.title; - if (channel_name) { - var channelName = channel_name.toLowerCase(); - var strippedOutChannelName = channelName.slice(1); // trim off the @ - if (searchQueryDictionary[channel_name] || searchQueryDictionary[strippedOutChannelName]) { + if (channelName) { + var lowerCaseChannel = channelName.toLowerCase(); + var strippedOutChannelName = lowerCaseChannel.slice(1); // trim off the @ + if (searchQueryDictionary[channelName] || searchQueryDictionary[strippedOutChannelName]) { downloadResultsFromQuery.push(fileInfo); return; } } - var nameParts = claim_name.toLowerCase().split('-'); + var nameParts = claimName.toLowerCase().split('-'); if (arrayContainsQueryPart(nameParts)) { downloadResultsFromQuery.push(fileInfo); return; @@ -1917,20 +1917,25 @@ var selectSearchDownloadUris = exports.selectSearchDownloadUris = function selec return downloadResultsFromQuery.length ? downloadResultsFromQuery.map(function (fileInfo) { var channelName = fileInfo.channel_name, claimId = fileInfo.claim_id, - claimName = fileInfo.claim_name, - value = fileInfo.value, - metadata = fileInfo.metadata; + claimName = fileInfo.claim_name; + var uriParams = {}; if (channelName) { + var claim = claimsById[claimId]; + if (claim.value) { + uriParams.claimId = claim.value.publisherSignature.certificateId; + } else { + uriParams.claimId = claimId; + } uriParams.channelName = channelName; + uriParams.contentName = claimName; + } else { + uriParams.claimId = claimId; + uriParams.claimName = claimName; } - uriParams.claimId = claimId; - uriParams.claimId = claimId; - uriParams.contentName = claimName; - var uri = (0, _lbryURI.buildURI)(uriParams); return uri; }) : null; diff --git a/src/redux/selectors/file_info.js b/src/redux/selectors/file_info.js index 5f346de..b971328 100644 --- a/src/redux/selectors/file_info.js +++ b/src/redux/selectors/file_info.js @@ -2,9 +2,10 @@ import { selectClaimsByUri, selectIsFetchingClaimListMine, selectMyClaims, + selectClaimsById, } from 'redux/selectors/claims'; -import { buildURI } from 'lbryURI'; import { createSelector } from 'reselect'; +import { buildURI } from 'lbryURI'; export const selectState = state => state.fileInfo || {}; @@ -106,7 +107,7 @@ export const selectTotalDownloadProgress = createSelector(selectDownloadingFileI }); export const selectSearchDownloadUris = query => - createSelector(selectFileInfosDownloaded, fileInfos => { + createSelector(selectFileInfosDownloaded, selectClaimsById, (fileInfos, claimsById) => { if (!query || !fileInfos.length) { return null; } @@ -129,19 +130,19 @@ export const selectSearchDownloadUris = query => const downloadResultsFromQuery = []; fileInfos.forEach(fileInfo => { - const { channel_name, claim_name, metadata } = fileInfo; + const { channel_name: channelName, claim_name: claimName, metadata } = fileInfo; const { author, description, title } = metadata; - if (channel_name) { - const channelName = channel_name.toLowerCase(); - const strippedOutChannelName = channelName.slice(1); // trim off the @ - if (searchQueryDictionary[channel_name] || searchQueryDictionary[strippedOutChannelName]) { + if (channelName) { + const lowerCaseChannel = channelName.toLowerCase(); + const strippedOutChannelName = lowerCaseChannel.slice(1); // trim off the @ + if (searchQueryDictionary[channelName] || searchQueryDictionary[strippedOutChannelName]) { downloadResultsFromQuery.push(fileInfo); return; } } - const nameParts = claim_name.toLowerCase().split('-'); + const nameParts = claimName.toLowerCase().split('-'); if (arrayContainsQueryPart(nameParts)) { downloadResultsFromQuery.push(fileInfo); return; @@ -171,23 +172,24 @@ export const selectSearchDownloadUris = query => return downloadResultsFromQuery.length ? downloadResultsFromQuery.map(fileInfo => { - const { - channel_name: channelName, - claim_id: claimId, - claim_name: claimName, - value, - metadata, - } = fileInfo; + const { channel_name: channelName, claim_id: claimId, claim_name: claimName } = fileInfo; + const uriParams = {}; if (channelName) { + const claim = claimsById[claimId]; + if (claim.value) { + uriParams.claimId = claim.value.publisherSignature.certificateId; + } else { + uriParams.claimId = claimId; + } uriParams.channelName = channelName; + uriParams.contentName = claimName; + } else { + uriParams.claimId = claimId; + uriParams.claimName = claimName; } - uriParams.claimId = claimId; - uriParams.claimId = claimId; - uriParams.contentName = claimName; - const uri = buildURI(uriParams); return uri; }) -- 2.45.3 From 8002bde5b704bc2d0964c9e2d146f1f0af964a59 Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Wed, 4 Apr 2018 20:24:32 +0100 Subject: [PATCH 40/41] fix batchActions import in src/redux/actions/search.js --- build/index.js | 4 +--- src/redux/actions/search.js | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/build/index.js b/build/index.js index 7114c48..cf7bf49 100644 --- a/build/index.js +++ b/build/index.js @@ -3777,8 +3777,6 @@ var _search2 = __webpack_require__(13); var _batchActions = __webpack_require__(9); -var _batchActions2 = _interopRequireDefault(_batchActions); - var _handleFetch = __webpack_require__(26); var _handleFetch2 = _interopRequireDefault(_handleFetch); @@ -3839,7 +3837,7 @@ var doSearch = exports.doSearch = function doSearch(rawQuery) { uris: uris } }); - dispatch(_batchActions2.default.apply(undefined, actions)); + dispatch(_batchActions.batchActions.apply(undefined, actions)); }).catch(function () { dispatch({ type: ACTIONS.SEARCH_FAIL diff --git a/src/redux/actions/search.js b/src/redux/actions/search.js index 5908f1f..e53a37e 100644 --- a/src/redux/actions/search.js +++ b/src/redux/actions/search.js @@ -4,7 +4,7 @@ import * as SEARCH_TYPES from 'constants/search'; import { normalizeURI, buildURI, parseURI } from 'lbryURI'; import { doResolveUri } from 'redux/actions/claims'; import { makeSelectSearchUris } from 'redux/selectors/search'; -import batchActions from 'util/batchActions'; +import { batchActions } from 'util/batchActions'; import handleFetchResponse from 'util/handle-fetch'; export const doSearch = rawQuery => (dispatch, getState) => { @@ -43,7 +43,7 @@ export const doSearch = rawQuery => (dispatch, getState) => { .then(data => { const uris = []; const actions = []; - + data.forEach(result => { const uri = buildURI({ claimName: result.name, -- 2.45.3 From 76f110c05fc84824f2823ef64a2bcd56a67d51eb Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Thu, 5 Apr 2018 03:52:33 +0100 Subject: [PATCH 41/41] added README.md --- README.md | 22 ++++++++++++++++++++++ src/redux/actions/search.js | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..4abdc2c --- /dev/null +++ b/README.md @@ -0,0 +1,22 @@ +# lbry-redux +lbry-redux is a module which contains common React and redux code shared between lbry-app and lbry-android. + +## Installation +Add `lbry-redux` as a dependency to your `package.json` file. +`"lbry-redux": "lbryio/lbry-redux"` + +### Local development +If you intend to make changes to the module and test immediately, you can use `npm link` to add the package to your `node_modules` folder. This will create a symlink to the folder where `lbry-redux` was cloned to. +``` +cd lbry-redux +sudo npm link +cd ////node_modules +npm link lbry-redux +```` + +### Build +Run `$ npm build`. + +## License + +[MIT © LBRY](LICENSE) \ No newline at end of file diff --git a/src/redux/actions/search.js b/src/redux/actions/search.js index e53a37e..7a2e009 100644 --- a/src/redux/actions/search.js +++ b/src/redux/actions/search.js @@ -43,7 +43,7 @@ export const doSearch = rawQuery => (dispatch, getState) => { .then(data => { const uris = []; const actions = []; - + data.forEach(result => { const uri = buildURI({ claimName: result.name, -- 2.45.3