From 0a940829830cf21e2db27dd3acbae3d307ba95f3 Mon Sep 17 00:00:00 2001 From: Igor Gassmann Date: Wed, 27 Dec 2017 20:48:11 -0300 Subject: [PATCH 1/7] Convert anonymous functions to arrow functions --- src/renderer/index.js | 26 ++--- src/renderer/jsonrpc.js | 4 +- src/renderer/lbry.js | 39 +++---- src/renderer/lbryio.js | 10 +- src/renderer/lbryuri.js | 12 +-- src/renderer/redux/actions/app.js | 53 +++++----- src/renderer/redux/actions/availability.js | 2 +- src/renderer/redux/actions/content.js | 57 ++++++----- src/renderer/redux/actions/cost_info.js | 2 +- src/renderer/redux/actions/file_info.js | 30 +++--- src/renderer/redux/actions/navigation.js | 16 ++- src/renderer/redux/actions/rewards.js | 10 +- src/renderer/redux/actions/search.js | 2 +- src/renderer/redux/actions/settings.js | 12 +-- src/renderer/redux/actions/user.js | 18 ++-- src/renderer/redux/actions/wallet.js | 28 +++--- src/renderer/redux/reducers/app.js | 80 ++++++--------- src/renderer/redux/reducers/availability.js | 4 +- src/renderer/redux/reducers/claims.js | 26 +++-- src/renderer/redux/reducers/content.js | 15 ++- src/renderer/redux/reducers/cost_info.js | 4 +- src/renderer/redux/reducers/file_info.js | 25 +++-- src/renderer/redux/reducers/navigation.js | 7 +- src/renderer/redux/reducers/rewards.js | 15 ++- src/renderer/redux/reducers/search.js | 12 +-- src/renderer/redux/reducers/settings.js | 13 ++- src/renderer/redux/reducers/user.js | 106 ++++++++------------ src/renderer/redux/reducers/wallet.js | 57 +++++------ src/renderer/redux/selectors/app.js | 2 - src/renderer/redux/selectors/claims.js | 13 +-- src/renderer/redux/selectors/content.js | 2 +- src/renderer/redux/selectors/file_info.js | 41 +------- src/renderer/redux/selectors/search.js | 6 +- src/renderer/redux/selectors/settings.js | 5 - src/renderer/rewards.js | 2 +- src/renderer/util/setBadge.js | 2 +- src/renderer/util/shape_shift.js | 4 +- src/renderer/util/throttle.js | 6 +- 38 files changed, 328 insertions(+), 440 deletions(-) diff --git a/src/renderer/index.js b/src/renderer/index.js index a5ef55409..19350e8ce 100644 --- a/src/renderer/index.js +++ b/src/renderer/index.js @@ -1,20 +1,20 @@ +import amplitude from 'amplitude-js'; +import App from 'component/app'; +import SnackBar from 'component/snackBar'; +import SplashScreen from 'component/splash'; +import * as ACTIONS from 'constants/action_types'; +import { ipcRenderer, remote, shell } from 'electron'; +import lbry from 'lbry'; /* eslint-disable react/jsx-filename-extension */ import React from 'react'; import ReactDOM from 'react-dom'; -import App from 'component/app'; -import SnackBar from 'component/snackBar'; import { Provider } from 'react-redux'; -import store from 'store'; -import SplashScreen from 'component/splash'; -import { doDaemonReady, doShowSnackBar, doConditionalAuthNavigate } from 'redux/actions/app'; -import { doUserEmailVerify } from 'redux/actions/user'; +import { doConditionalAuthNavigate, doDaemonReady, doShowSnackBar } from 'redux/actions/app'; import { doNavigate } from 'redux/actions/navigation'; import { doDownloadLanguages } from 'redux/actions/settings'; -import * as ACTIONS from 'constants/action_types'; -import amplitude from 'amplitude-js'; -import lbry from 'lbry'; +import { doUserEmailVerify } from 'redux/actions/user'; import 'scss/all.scss'; -import { ipcRenderer, remote, shell } from 'electron'; +import store from 'store'; import app from './app'; const { contextMenu } = remote.require('./main.js'); @@ -64,10 +64,10 @@ ipcRenderer.on('window-is-focused', () => { dock.setBadge(''); }); -(function(history, ...args) { +((history, ...args) => { const { replaceState } = history; const newHistory = history; - newHistory.replaceState = function(_, __, path) { + newHistory.replaceState = (_, __, path) => { amplitude.getInstance().logEvent('NAVIGATION', { destination: path ? path.slice(1) : path }); return replaceState.apply(history, args); }; @@ -101,7 +101,7 @@ document.addEventListener('click', event => { } }); -const init = function initializeReactApp() { +const init = () => { app.store.dispatch(doDownloadLanguages()); function onDaemonReady() { diff --git a/src/renderer/jsonrpc.js b/src/renderer/jsonrpc.js index a94ba4fe8..8e11c4f12 100644 --- a/src/renderer/jsonrpc.js +++ b/src/renderer/jsonrpc.js @@ -1,13 +1,13 @@ const jsonrpc = {}; -jsonrpc.call = function callJsonRpc( +jsonrpc.call = ( connectionString, method, params, callback, errorCallback, connectFailedCallback -) { +) => { function checkAndParse(response) { if (response.status >= 200 && response.status < 300) { return response.json(); diff --git a/src/renderer/lbry.js b/src/renderer/lbry.js index 27cd3ec14..0123f08c2 100644 --- a/src/renderer/lbry.js +++ b/src/renderer/lbry.js @@ -1,5 +1,5 @@ -import jsonrpc from 'jsonrpc'; import { ipcRenderer } from 'electron'; +import jsonrpc from 'jsonrpc'; const CHECK_DAEMON_STARTED_TRY_NUMBER = 200; @@ -19,11 +19,10 @@ const lbryProxy = new Proxy(Lbry, { return target[name]; } - return function(params = {}) { - return new Promise((resolve, reject) => { + return params => + new Promise((resolve, reject) => { apiCall(name, params, resolve, reject); }); - }; }, }); @@ -76,7 +75,7 @@ function removePendingPublishIfNeeded({ name, channelName, outpoint }) { * Gets the current list of pending publish attempts. Filters out any that have timed out and * removes them from the list. */ -Lbry.getPendingPublishes = function() { +Lbry.getPendingPublishes = () => { const pendingPublishes = getLocal('pendingPublishes') || []; const newPendingPublishes = pendingPublishes.filter( pub => Date.now() - pub.time <= Lbry.pendingPublishTimeout @@ -110,7 +109,7 @@ function pendingPublishToDummyFileInfo({ name, outpoint, claimId }) { // core Lbry.connectPromise = null; -Lbry.connect = function() { +Lbry.connect = () => { if (Lbry.connectPromise === null) { Lbry.connectPromise = new Promise((resolve, reject) => { let tryNum = 0; @@ -144,7 +143,7 @@ Lbry.connect = function() { * 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) { +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( () => { @@ -173,11 +172,9 @@ Lbry.publishDeprecated = function(params, fileListedCallback, publishedCallback, ); }; -Lbry.imagePath = function(file) { - return `${staticResourcesPath}/img/${file}`; -}; +Lbry.imagePath = file => `${staticResourcesPath}/img/${file}`; -Lbry.getMediaType = function(contentType, fileName) { +Lbry.getMediaType = (contentType, fileName) => { if (contentType) { return /^[^/]+/.exec(contentType)[0]; } else if (fileName) { @@ -199,14 +196,13 @@ Lbry.getMediaType = function(contentType, fileName) { return 'unknown'; }; -Lbry.getAppVersionInfo = function() { - return new Promise(resolve => { +Lbry.getAppVersionInfo = () => + new Promise(resolve => { ipcRenderer.once('version-info-received', (event, versionInfo) => { resolve(versionInfo); }); ipcRenderer.send('version-info-requested'); }); -}; /** * Wrappers for API methods to simulate missing or future behavior. Unlike the old-style stubs, @@ -217,8 +213,8 @@ Lbry.getAppVersionInfo = function() { * Returns results from the file_list API method, plus dummy entries for pending publishes. * (If a real publish with the same name is found, the pending publish will be ignored and removed.) */ -Lbry.file_list = function(params = {}) { - return new Promise((resolve, reject) => { +Lbry.file_list = params => + new Promise((resolve, reject) => { const { name, channel_name: channelName, outpoint } = params; /** @@ -252,10 +248,9 @@ Lbry.file_list = function(params = {}) { reject ); }); -}; -Lbry.claim_list_mine = function(params = {}) { - return new Promise((resolve, reject) => { +Lbry.claim_list_mine = params => + new Promise((resolve, reject) => { apiCall( 'claim_list_mine', params, @@ -274,10 +269,9 @@ Lbry.claim_list_mine = function(params = {}) { reject ); }); -}; -Lbry.resolve = function(params = {}) { - return new Promise((resolve, reject) => { +Lbry.resolve = params => + new Promise((resolve, reject) => { apiCall( 'resolve', params, @@ -292,6 +286,5 @@ Lbry.resolve = function(params = {}) { reject ); }); -}; export default lbryProxy; diff --git a/src/renderer/lbryio.js b/src/renderer/lbryio.js index 694f83ed7..a666a2b28 100644 --- a/src/renderer/lbryio.js +++ b/src/renderer/lbryio.js @@ -1,6 +1,6 @@ +import { ipcRenderer } from 'electron'; import Lbry from 'lbry'; import querystring from 'querystring'; -import { ipcRenderer } from 'electron'; const Lbryio = { enabled: true, @@ -15,7 +15,7 @@ const CONNECTION_STRING = process.env.LBRY_APP_API_URL const EXCHANGE_RATE_TIMEOUT = 20 * 60 * 1000; -Lbryio.getExchangeRates = function() { +Lbryio.getExchangeRates = () => { if ( !Lbryio.exchangeLastFetched || Date.now() - Lbryio.exchangeLastFetched > EXCHANGE_RATE_TIMEOUT @@ -33,7 +33,7 @@ Lbryio.getExchangeRates = function() { return Lbryio.exchangePromise; }; -Lbryio.call = function(resource, action, params = {}, method = 'get') { +Lbryio.call = (resource, action, params = {}, method = 'get') => { if (!Lbryio.enabled) { console.log(__('Internal API disabled')); return Promise.reject(new Error(__('LBRY internal API is disabled'))); @@ -54,7 +54,7 @@ Lbryio.call = function(resource, action, params = {}, method = 'get') { } else { error = new Error('Unknown API error signature'); } - error.response = response; // this is primarily a hack used in actions/user.js + error.response = response; // This is primarily a hack used in actions/user.js return Promise.reject(error); }); } @@ -109,7 +109,7 @@ Lbryio.setAuthToken = token => { Lbryio.getCurrentUser = () => Lbryio.call('user', 'me'); -Lbryio.authenticate = function() { +Lbryio.authenticate = () => { if (!Lbryio.enabled) { return new Promise(resolve => { resolve({ diff --git a/src/renderer/lbryuri.js b/src/renderer/lbryuri.js index d9ce508dc..3dc934770 100644 --- a/src/renderer/lbryuri.js +++ b/src/renderer/lbryuri.js @@ -28,7 +28,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 = function(uri, requireProto = false) { +Lbryuri.parse = (uri, requireProto = false) => { // Break into components. Empty sub-matches are converted to null const componentsRegex = new RegExp( '^((?:lbry://)?)' + // protocol @@ -147,7 +147,7 @@ Lbryuri.parse = function(uri, requireProto = false) { * * The channelName key will accept names with or without the @ prefix. */ -Lbryuri.build = function(uriObj, includeProto = true) { +Lbryuri.build = (uriObj, includeProto = true) => { const { claimId, claimSequence, bidPosition, contentName, channelName } = uriObj; let { name, path } = uriObj; @@ -192,14 +192,14 @@ Lbryuri.build = function(uriObj, includeProto = true) { /* 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) { +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 = function(uri) { +Lbryuri.isValid = uri => { let parts; try { parts = Lbryuri.parse(Lbryuri.normalize(uri)); @@ -209,12 +209,12 @@ Lbryuri.isValid = function(uri) { return parts && parts.name; }; -Lbryuri.isValidName = function(name, checkCase = true) { +Lbryuri.isValidName = (name, checkCase = true) => { const regexp = new RegExp('^[a-z0-9-]+$', checkCase ? '' : 'i'); return regexp.test(name); }; -Lbryuri.isClaimable = function(uri) { +Lbryuri.isClaimable = uri => { let parts; try { parts = Lbryuri.parse(Lbryuri.normalize(uri)); diff --git a/src/renderer/redux/actions/app.js b/src/renderer/redux/actions/app.js index 3eb7b74ed..2ecc1dcaf 100644 --- a/src/renderer/redux/actions/app.js +++ b/src/renderer/redux/actions/app.js @@ -1,23 +1,24 @@ +/* eslint-disable import/no-commonjs */ import * as ACTIONS from 'constants/action_types'; +import * as MODALS from 'constants/modal_types'; +import { ipcRenderer, remote } from 'electron'; import Lbry from 'lbry'; +import Path from 'path'; +import { doFetchRewardedContent } from 'redux/actions/content'; +import { doFetchFileInfosAndPublishedClaims } from 'redux/actions/file_info'; +import { doAuthNavigate } from 'redux/actions/navigation'; +import { doFetchDaemonSettings } from 'redux/actions/settings'; +import { doAuthenticate } from 'redux/actions/user'; +import { doBalanceSubscribe } from 'redux/actions/wallet'; import { - selectUpdateUrl, - selectUpgradeDownloadPath, - selectUpgradeDownloadItem, - selectUpgradeFilename, + selectCurrentModal, selectIsUpgradeSkipped, selectRemoteVersion, - selectCurrentModal, + selectUpdateUrl, + selectUpgradeDownloadItem, + selectUpgradeDownloadPath, + selectUpgradeFilename, } from 'redux/selectors/app'; -import { doFetchDaemonSettings } from 'redux/actions/settings'; -import { doBalanceSubscribe } from 'redux/actions/wallet'; -import { doAuthenticate } from 'redux/actions/user'; -import { doFetchFileInfosAndPublishedClaims } from 'redux/actions/file_info'; -import * as MODALS from 'constants/modal_types'; -import { doFetchRewardedContent } from 'redux/actions/content'; -import { doAuthNavigate } from 'redux/actions/navigation'; -import { remote, ipcRenderer } from 'electron'; -import Path from 'path'; const { download } = remote.require('electron-dl'); const Fs = remote.require('fs'); @@ -57,7 +58,7 @@ export function doSkipUpgrade() { } export function doStartUpgrade() { - return function(dispatch, getState) { + return (dispatch, getState) => { const state = getState(); const upgradeDownloadPath = selectUpgradeDownloadPath(state); @@ -66,7 +67,7 @@ export function doStartUpgrade() { } export function doDownloadUpgrade() { - return function(dispatch, getState) { + return (dispatch, getState) => { const state = getState(); // Make a new directory within temp directory so the filename is guaranteed to be available const dir = Fs.mkdtempSync(remote.app.getPath('temp') + Path.sep); @@ -105,7 +106,7 @@ export function doDownloadUpgrade() { } export function doCancelUpgrade() { - return function(dispatch, getState) { + return (dispatch, getState) => { const state = getState(); const upgradeDownloadItem = selectUpgradeDownloadItem(state); @@ -128,7 +129,7 @@ export function doCancelUpgrade() { } export function doCheckUpgradeAvailable() { - return function(dispatch, getState) { + return (dispatch, getState) => { const state = getState(); dispatch({ type: ACTIONS.CHECK_UPGRADE_START, @@ -171,7 +172,7 @@ export function doCheckUpgradeAvailable() { Initiate a timer that will check for an app upgrade every 10 minutes. */ export function doCheckUpgradeSubscribe() { - return function(dispatch) { + return dispatch => { const checkUpgradeTimer = setInterval( () => dispatch(doCheckUpgradeAvailable()), CHECK_UPGRADE_INTERVAL @@ -184,7 +185,7 @@ export function doCheckUpgradeSubscribe() { } export function doCheckDaemonVersion() { - return function(dispatch) { + return dispatch => { Lbry.version().then(({ lbrynet_version: lbrynetVersion }) => { dispatch({ type: @@ -197,7 +198,7 @@ export function doCheckDaemonVersion() { } export function doAlertError(errorList) { - return function(dispatch) { + return dispatch => { dispatch({ type: ACTIONS.OPEN_MODAL, data: { @@ -209,7 +210,7 @@ export function doAlertError(errorList) { } export function doDaemonReady() { - return function(dispatch, getState) { + return (dispatch, getState) => { const state = getState(); dispatch(doAuthenticate()); @@ -239,7 +240,7 @@ export function doRemoveSnackBarSnack() { } export function doClearCache() { - return function() { + return () => { window.cacheStore.purge(); return Promise.resolve(); @@ -247,13 +248,13 @@ export function doClearCache() { } export function doQuit() { - return function() { + return () => { remote.app.quit(); }; } export function doChangeVolume(volume) { - return function(dispatch) { + return dispatch => { dispatch({ type: ACTIONS.VOLUME_CHANGED, data: { @@ -264,7 +265,7 @@ export function doChangeVolume(volume) { } export function doConditionalAuthNavigate(newSession) { - return function(dispatch, getState) { + return (dispatch, getState) => { const state = getState(); if (newSession || selectCurrentModal(state) !== 'email_collection') { dispatch(doAuthNavigate()); diff --git a/src/renderer/redux/actions/availability.js b/src/renderer/redux/actions/availability.js index 2382cbbf8..01ae46ab6 100644 --- a/src/renderer/redux/actions/availability.js +++ b/src/renderer/redux/actions/availability.js @@ -1,6 +1,6 @@ // eslint-disable-next-line import/prefer-default-export export function doFetchAvailability() { - return function() { + return () => { /* this is disabled atm - Jeremy */ diff --git a/src/renderer/redux/actions/content.js b/src/renderer/redux/actions/content.js index 6a6e46f04..7ed21e4f1 100644 --- a/src/renderer/redux/actions/content.js +++ b/src/renderer/redux/actions/content.js @@ -1,31 +1,31 @@ -import { ipcRenderer } from 'electron'; import * as ACTIONS from 'constants/action_types'; +import * as MODALS from 'constants/modal_types'; import * as SETTINGS from 'constants/settings'; +import { ipcRenderer } from 'electron'; import Lbry from 'lbry'; import Lbryio from 'lbryio'; import Lbryuri from 'lbryuri'; -import { makeSelectClientSetting } from 'redux/selectors/settings'; +import { doAlertError, doOpenModal } from 'redux/actions/app'; +import { doClaimEligiblePurchaseRewards } from 'redux/actions/rewards'; +import { selectBadgeNumber } from 'redux/selectors/app'; import { selectMyClaimsRaw } from 'redux/selectors/claims'; -import { selectBalance } from 'redux/selectors/wallet'; +import { selectResolvingUris } from 'redux/selectors/content'; +import { makeSelectCostInfoForUri } from 'redux/selectors/cost_info'; import { makeSelectFileInfoForUri, selectDownloadingByOutpoint, selectTotalDownloadProgress, } from 'redux/selectors/file_info'; -import { selectResolvingUris } from 'redux/selectors/content'; -import { makeSelectCostInfoForUri } from 'redux/selectors/cost_info'; -import { doAlertError, doOpenModal } from 'redux/actions/app'; -import { doClaimEligiblePurchaseRewards } from 'redux/actions/rewards'; -import { selectBadgeNumber } from 'redux/selectors/app'; +import { makeSelectClientSetting } from 'redux/selectors/settings'; +import { selectBalance } from 'redux/selectors/wallet'; +import batchActions from 'util/batchActions'; import setBadge from 'util/setBadge'; import setProgressBar from 'util/setProgressBar'; -import batchActions from 'util/batchActions'; -import * as MODALS from 'constants/modal_types'; const DOWNLOAD_POLL_INTERVAL = 250; export function doResolveUris(uris) { - return function(dispatch, getState) { + return (dispatch, getState) => { const normalizedUris = uris.map(Lbryuri.normalize); const state = getState(); @@ -70,7 +70,7 @@ export function doResolveUri(uri) { } export function doFetchFeaturedUris() { - return function(dispatch) { + return dispatch => { dispatch({ type: ACTIONS.FETCH_FEATURED_CONTENT_STARTED, }); @@ -108,7 +108,7 @@ export function doFetchFeaturedUris() { } export function doFetchRewardedContent() { - return function(dispatch) { + return dispatch => { const success = nameToClaimId => { dispatch({ type: ACTIONS.FETCH_REWARD_CONTENT_COMPLETED, @@ -134,7 +134,7 @@ export function doFetchRewardedContent() { } export function doUpdateLoadStatus(uri, outpoint) { - return function(dispatch, getState) { + return (dispatch, getState) => { Lbry.file_list({ outpoint, full_status: true, @@ -196,7 +196,7 @@ export function doUpdateLoadStatus(uri, outpoint) { } export function doStartDownload(uri, outpoint) { - return function(dispatch, getState) { + return (dispatch, getState) => { const state = getState(); if (!outpoint) { @@ -223,7 +223,7 @@ export function doStartDownload(uri, outpoint) { } export function doDownloadFile(uri, streamInfo) { - return function(dispatch) { + return dispatch => { dispatch(doStartDownload(uri, streamInfo.outpoint)); Lbryio.call('file', 'view', { @@ -237,7 +237,7 @@ export function doDownloadFile(uri, streamInfo) { } export function doSetPlayingUri(uri) { - return function(dispatch) { + return dispatch => { dispatch({ type: ACTIONS.SET_PLAYING_URI, data: { uri }, @@ -246,7 +246,7 @@ export function doSetPlayingUri(uri) { } export function doLoadVideo(uri) { - return function(dispatch) { + return dispatch => { dispatch({ type: ACTIONS.LOADING_VIDEO_STARTED, data: { @@ -289,7 +289,7 @@ export function doLoadVideo(uri) { } export function doPurchaseUri(uri) { - return function(dispatch, getState) { + return (dispatch, getState) => { const state = getState(); const balance = selectBalance(state); const fileInfo = makeSelectFileInfoForUri(uri)(state); @@ -348,7 +348,7 @@ export function doPurchaseUri(uri) { } export function doFetchClaimsByChannel(uri, page) { - return function(dispatch) { + return dispatch => { dispatch({ type: ACTIONS.FETCH_CHANNEL_CLAIMS_STARTED, data: { uri, page }, @@ -371,7 +371,7 @@ export function doFetchClaimsByChannel(uri, page) { } export function doFetchClaimCountByChannel(uri) { - return function(dispatch) { + return dispatch => { dispatch({ type: ACTIONS.FETCH_CHANNEL_CLAIM_COUNT_STARTED, data: { uri }, @@ -393,7 +393,7 @@ export function doFetchClaimCountByChannel(uri) { } export function doFetchClaimListMine() { - return function(dispatch) { + return dispatch => { dispatch({ type: ACTIONS.FETCH_CLAIM_LIST_MINE_STARTED, }); @@ -410,14 +410,14 @@ export function doFetchClaimListMine() { } export function doPlayUri(uri) { - return function(dispatch) { + return dispatch => { dispatch(doSetPlayingUri(uri)); dispatch(doPurchaseUri(uri)); }; } export function doFetchChannelListMine() { - return function(dispatch) { + return dispatch => { dispatch({ type: ACTIONS.FETCH_CHANNEL_LIST_MINE_STARTED, }); @@ -434,7 +434,7 @@ export function doFetchChannelListMine() { } export function doCreateChannel(name, amount) { - return function(dispatch) { + return dispatch => { dispatch({ type: ACTIONS.CREATE_CHANNEL_STARTED, }); @@ -462,8 +462,8 @@ export function doCreateChannel(name, amount) { } export function doPublish(params) { - return function(dispatch) { - return new Promise((resolve, reject) => { + return dispatch => + new Promise((resolve, reject) => { const success = claim => { resolve(claim); @@ -477,11 +477,10 @@ export function doPublish(params) { Lbry.publishDeprecated(params, null, success, failure); }); - }; } export function doAbandonClaim(txid, nout) { - return function(dispatch, getState) { + return (dispatch, getState) => { const state = getState(); const myClaims = selectMyClaimsRaw(state); const { claim_id: claimId, name } = myClaims.find( diff --git a/src/renderer/redux/actions/cost_info.js b/src/renderer/redux/actions/cost_info.js index acd0dc8cc..7e9966f05 100644 --- a/src/renderer/redux/actions/cost_info.js +++ b/src/renderer/redux/actions/cost_info.js @@ -4,7 +4,7 @@ import { selectClaimsByUri } from 'redux/selectors/claims'; // eslint-disable-next-line import/prefer-default-export export function doFetchCostInfoForUri(uri) { - return function(dispatch, getState) { + return (dispatch, getState) => { const state = getState(); const claim = selectClaimsByUri(state)[uri]; diff --git a/src/renderer/redux/actions/file_info.js b/src/renderer/redux/actions/file_info.js index d18bd2533..9ed4c9a6f 100644 --- a/src/renderer/redux/actions/file_info.js +++ b/src/renderer/redux/actions/file_info.js @@ -1,25 +1,25 @@ import * as ACTIONS from 'constants/action_types'; +import { shell } from 'electron'; import Lbry from 'lbry'; -import { doFetchClaimListMine, doAbandonClaim } from 'redux/actions/content'; +import { doCloseModal } from 'redux/actions/app'; +import { doAbandonClaim, doFetchClaimListMine } from 'redux/actions/content'; +import { doHistoryBack } from 'redux/actions/navigation'; import { selectClaimsByUri, selectIsFetchingClaimListMine, selectMyClaimsOutpoints, } from 'redux/selectors/claims'; import { - selectIsFetchingFileList, selectFileInfosByOutpoint, - selectUrisLoading, + selectIsFetchingFileList, selectTotalDownloadProgress, + selectUrisLoading, } from 'redux/selectors/file_info'; -import { doCloseModal } from 'redux/actions/app'; -import { doHistoryBack } from 'redux/actions/navigation'; -import setProgressBar from 'util/setProgressBar'; import batchActions from 'util/batchActions'; -import { shell } from 'electron'; +import setProgressBar from 'util/setProgressBar'; export function doFetchFileInfo(uri) { - return function(dispatch, getState) { + return (dispatch, getState) => { const state = getState(); const claim = selectClaimsByUri(state)[uri]; const outpoint = claim ? `${claim.txid}:${claim.nout}` : null; @@ -47,7 +47,7 @@ export function doFetchFileInfo(uri) { } export function doFileList() { - return function(dispatch, getState) { + return (dispatch, getState) => { const state = getState(); const isFetching = selectIsFetchingFileList(state); @@ -69,13 +69,13 @@ export function doFileList() { } export function doOpenFileInFolder(path) { - return function() { + return () => { shell.showItemInFolder(path); }; } export function doOpenFileInShell(path) { - return function(dispatch) { + return dispatch => { const success = shell.openItem(path); if (!success) { dispatch(doOpenFileInFolder(path)); @@ -84,7 +84,7 @@ export function doOpenFileInShell(path) { } export function doDeleteFile(outpoint, deleteFromComputer, abandonClaim) { - return function(dispatch, getState) { + return (dispatch, getState) => { const state = getState(); Lbry.file_delete({ @@ -92,7 +92,7 @@ export function doDeleteFile(outpoint, deleteFromComputer, abandonClaim) { delete_from_download_dir: deleteFromComputer, }); - // If the file is for a claim we published then also abandom the claim + // If the file is for a claim we published then also abandon the claim const myClaimsOutpoints = selectMyClaimsOutpoints(state); if (abandonClaim && myClaimsOutpoints.indexOf(outpoint) !== -1) { const byOutpoint = selectFileInfosByOutpoint(state); @@ -119,7 +119,7 @@ export function doDeleteFile(outpoint, deleteFromComputer, abandonClaim) { } export function doDeleteFileAndGoBack(fileInfo, deleteFromComputer, abandonClaim) { - return function(dispatch) { + return dispatch => { const actions = []; actions.push(doCloseModal()); actions.push(doHistoryBack()); @@ -129,7 +129,7 @@ export function doDeleteFileAndGoBack(fileInfo, deleteFromComputer, abandonClaim } export function doFetchFileInfosAndPublishedClaims() { - return function(dispatch, getState) { + return (dispatch, getState) => { const state = getState(); const isFetchingClaimListMine = selectIsFetchingClaimListMine(state); const isFetchingFileInfo = selectIsFetchingFileList(state); diff --git a/src/renderer/redux/actions/navigation.js b/src/renderer/redux/actions/navigation.js index ec18f9852..78e874376 100644 --- a/src/renderer/redux/actions/navigation.js +++ b/src/renderer/redux/actions/navigation.js @@ -1,9 +1,9 @@ import * as ACTIONS from 'constants/action_types'; -import { selectHistoryStack, selectHistoryIndex } from 'redux/selectors/navigation'; +import { selectHistoryIndex, selectHistoryStack } from 'redux/selectors/navigation'; import { toQueryString } from 'util/query_params'; export function doNavigate(path, params = {}, options = {}) { - return function(dispatch) { + return dispatch => { if (!path) { return; } @@ -23,7 +23,7 @@ export function doNavigate(path, params = {}, options = {}) { } export function doAuthNavigate(pathAfterAuth = null, params = {}) { - return function(dispatch) { + return dispatch => { if (pathAfterAuth) { dispatch({ type: ACTIONS.CHANGE_AFTER_AUTH_PATH, @@ -47,19 +47,15 @@ export function doHistoryTraverse(dispatch, state, modifier) { } export function doHistoryBack() { - return function(dispatch, getState) { - return doHistoryTraverse(dispatch, getState(), -1); - }; + return (dispatch, getState) => doHistoryTraverse(dispatch, getState(), -1); } export function doHistoryForward() { - return function(dispatch, getState) { - return doHistoryTraverse(dispatch, getState(), 1); - }; + return (dispatch, getState) => doHistoryTraverse(dispatch, getState(), 1); } export function doRecordScroll(scroll) { - return function(dispatch) { + return dispatch => { dispatch({ type: ACTIONS.WINDOW_SCROLLED, data: { scrollY: scroll }, diff --git a/src/renderer/redux/actions/rewards.js b/src/renderer/redux/actions/rewards.js index 4c4a278cd..e5067f5b0 100644 --- a/src/renderer/redux/actions/rewards.js +++ b/src/renderer/redux/actions/rewards.js @@ -1,12 +1,12 @@ import * as ACTIONS from 'constants/action_types'; import * as MODALS from 'constants/modal_types'; import Lbryio from 'lbryio'; -import rewards from 'rewards'; import { selectUnclaimedRewardsByType } from 'redux/selectors/rewards'; import { selectUserIsRewardApproved } from 'redux/selectors/user'; +import rewards from 'rewards'; export function doRewardList() { - return function(dispatch) { + return dispatch => { dispatch({ type: ACTIONS.FETCH_REWARDS_STARTED, }); @@ -28,7 +28,7 @@ export function doRewardList() { } export function doClaimRewardType(rewardType) { - return function(dispatch, getState) { + return (dispatch, getState) => { const state = getState(); const rewardsByType = selectUnclaimedRewardsByType(state); const reward = rewardsByType[rewardType]; @@ -80,7 +80,7 @@ export function doClaimRewardType(rewardType) { } export function doClaimEligiblePurchaseRewards() { - return function(dispatch, getState) { + return (dispatch, getState) => { const state = getState(); const rewardsByType = selectUnclaimedRewardsByType(state); const userIsRewardApproved = selectUserIsRewardApproved(state); @@ -100,7 +100,7 @@ export function doClaimEligiblePurchaseRewards() { } export function doClaimRewardClearError(reward) { - return function(dispatch) { + return dispatch => { dispatch({ type: ACTIONS.CLAIM_REWARD_CLEAR_ERROR, data: { reward }, diff --git a/src/renderer/redux/actions/search.js b/src/renderer/redux/actions/search.js index 66de54ef1..277b5cbe4 100644 --- a/src/renderer/redux/actions/search.js +++ b/src/renderer/redux/actions/search.js @@ -7,7 +7,7 @@ import batchActions from 'util/batchActions'; // eslint-disable-next-line import/prefer-default-export export function doSearch(rawQuery) { - return function(dispatch, getState) { + return (dispatch, getState) => { const state = getState(); const page = selectCurrentPage(state); diff --git a/src/renderer/redux/actions/settings.js b/src/renderer/redux/actions/settings.js index 54af9e300..7f0209132 100644 --- a/src/renderer/redux/actions/settings.js +++ b/src/renderer/redux/actions/settings.js @@ -6,7 +6,7 @@ import Http from 'http'; import Lbry from 'lbry'; export function doFetchDaemonSettings() { - return function(dispatch) { + return dispatch => { Lbry.settings_get().then(settings => { dispatch({ type: ACTIONS.DAEMON_SETTINGS_RECEIVED, @@ -19,7 +19,7 @@ export function doFetchDaemonSettings() { } export function doSetDaemonSetting(key, value) { - return function(dispatch) { + return dispatch => { const newSettings = {}; newSettings[key] = value; Lbry.settings_set(newSettings).then(newSettings); @@ -45,14 +45,14 @@ export function doSetClientSetting(key, value) { } export function doGetThemes() { - return function(dispatch) { + return dispatch => { const themes = ['light', 'dark']; dispatch(doSetClientSetting(SETTINGS.THEMES, themes)); }; } export function doDownloadLanguage(langFile) { - return function(dispatch) { + return dispatch => { const destinationPath = `${app.i18n.directory}/${langFile}`; const language = langFile.replace('.json', ''); const errorHandler = () => { @@ -105,7 +105,7 @@ export function doDownloadLanguage(langFile) { } export function doDownloadLanguages() { - return function() { + return () => { // temporarily disable i18n so I can get a working build out -- Jeremy // if (!Fs.existsSync(app.i18n.directory)) { // Fs.mkdirSync(app.i18n.directory); @@ -135,7 +135,7 @@ export function doDownloadLanguages() { } export function doChangeLanguage(language) { - return function(dispatch) { + return dispatch => { dispatch(doSetClientSetting(SETTINGS.LANGUAGE, language)); app.i18n.setLocale(language); }; diff --git a/src/renderer/redux/actions/user.js b/src/renderer/redux/actions/user.js index 32d9fafc8..f0506ff65 100644 --- a/src/renderer/redux/actions/user.js +++ b/src/renderer/redux/actions/user.js @@ -2,12 +2,12 @@ import * as ACTIONS from 'constants/action_types'; import * as MODALS from 'constants/modal_types'; import Lbryio from 'lbryio'; import { doOpenModal, doShowSnackBar } from 'redux/actions/app'; -import { doRewardList, doClaimRewardType } from 'redux/actions/rewards'; +import { doClaimRewardType, doRewardList } from 'redux/actions/rewards'; import { selectEmailToVerify } from 'redux/selectors/user'; import rewards from 'rewards'; export function doFetchInviteStatus() { - return function(dispatch) { + return dispatch => { dispatch({ type: ACTIONS.USER_INVITE_STATUS_FETCH_STARTED, }); @@ -32,7 +32,7 @@ export function doFetchInviteStatus() { } export function doAuthenticate() { - return function(dispatch) { + return dispatch => { dispatch({ type: ACTIONS.AUTHENTICATION_STARTED, }); @@ -56,7 +56,7 @@ export function doAuthenticate() { } export function doUserFetch() { - return function(dispatch) { + return dispatch => { dispatch({ type: ACTIONS.USER_FETCH_STARTED, }); @@ -79,7 +79,7 @@ export function doUserFetch() { } export function doUserEmailNew(email) { - return function(dispatch) { + return dispatch => { dispatch({ type: ACTIONS.USER_EMAIL_NEW_STARTED, email, @@ -124,7 +124,7 @@ export function doUserEmailVerifyFailure(error) { } export function doUserEmailVerify(verificationToken, recaptcha) { - return function(dispatch, getState) { + return (dispatch, getState) => { const email = selectEmailToVerify(getState()); dispatch({ @@ -160,7 +160,7 @@ export function doUserEmailVerify(verificationToken, recaptcha) { } export function doUserIdentityVerify(stripeToken) { - return function(dispatch) { + return dispatch => { dispatch({ type: ACTIONS.USER_IDENTITY_VERIFY_STARTED, token: stripeToken, @@ -188,7 +188,7 @@ export function doUserIdentityVerify(stripeToken) { } export function doFetchAccessToken() { - return function(dispatch) { + return dispatch => { const success = token => dispatch({ type: ACTIONS.FETCH_ACCESS_TOKEN_SUCCESS, @@ -199,7 +199,7 @@ export function doFetchAccessToken() { } export function doUserInviteNew(email) { - return function(dispatch) { + return dispatch => { dispatch({ type: ACTIONS.USER_INVITE_NEW_STARTED, }); diff --git a/src/renderer/redux/actions/wallet.js b/src/renderer/redux/actions/wallet.js index 60ffbef84..9976c98ff 100644 --- a/src/renderer/redux/actions/wallet.js +++ b/src/renderer/redux/actions/wallet.js @@ -1,16 +1,16 @@ import * as ACTIONS from 'constants/action_types'; +import * as MODALS from 'constants/modal_types'; import Lbry from 'lbry'; -import { - selectDraftTransaction, - selectDraftTransactionAmount, - selectBalance, -} from 'redux/selectors/wallet'; import { doOpenModal, doShowSnackBar } from 'redux/actions/app'; import { doNavigate } from 'redux/actions/navigation'; -import * as MODALS from 'constants/modal_types'; +import { + selectBalance, + selectDraftTransaction, + selectDraftTransactionAmount, +} from 'redux/selectors/wallet'; export function doUpdateBalance() { - return function(dispatch) { + return dispatch => { Lbry.wallet_balance().then(balance => dispatch({ type: ACTIONS.UPDATE_BALANCE, @@ -23,14 +23,14 @@ export function doUpdateBalance() { } export function doBalanceSubscribe() { - return function(dispatch) { + return dispatch => { dispatch(doUpdateBalance()); setInterval(() => dispatch(doUpdateBalance()), 5000); }; } export function doFetchTransactions() { - return function(dispatch) { + return dispatch => { dispatch({ type: ACTIONS.FETCH_TRANSACTIONS_STARTED, }); @@ -47,7 +47,7 @@ export function doFetchTransactions() { } export function doFetchBlock(height) { - return function(dispatch) { + return dispatch => { Lbry.block_show({ height }).then(block => { dispatch({ type: ACTIONS.FETCH_BLOCK_SUCCESS, @@ -58,7 +58,7 @@ export function doFetchBlock(height) { } export function doGetNewAddress() { - return function(dispatch) { + return dispatch => { dispatch({ type: ACTIONS.GET_NEW_ADDRESS_STARTED, }); @@ -74,7 +74,7 @@ export function doGetNewAddress() { } export function doCheckAddressIsMine(address) { - return function(dispatch) { + return dispatch => { dispatch({ type: ACTIONS.CHECK_ADDRESS_IS_MINE_STARTED, }); @@ -90,7 +90,7 @@ export function doCheckAddressIsMine(address) { } export function doSendDraftTransaction() { - return function(dispatch, getState) { + return (dispatch, getState) => { const state = getState(); const draftTx = selectDraftTransaction(state); const balance = selectBalance(state); @@ -156,7 +156,7 @@ export function doSetDraftTransactionAddress(address) { } export function doSendSupport(amount, claimId, uri) { - return function(dispatch, getState) { + return (dispatch, getState) => { const state = getState(); const balance = selectBalance(state); diff --git a/src/renderer/redux/reducers/app.js b/src/renderer/redux/reducers/app.js index c8a821fa8..87a588f3c 100644 --- a/src/renderer/redux/reducers/app.js +++ b/src/renderer/redux/reducers/app.js @@ -3,7 +3,7 @@ import * as ACTIONS from 'constants/action_types'; import * as MODALS from 'constants/modal_types'; -const { remote } = require('electron'); +import { remote } from 'electron'; const win = remote.BrowserWindow.getFocusedWindow(); @@ -56,48 +56,42 @@ const defaultState: AppState = { snackBar: undefined, }; -reducers[ACTIONS.DAEMON_READY] = function(state) { - return Object.assign({}, state, { +reducers[ACTIONS.DAEMON_READY] = state => + Object.assign({}, state, { daemonReady: true, }); -}; -reducers[ACTIONS.DAEMON_VERSION_MATCH] = function(state) { - return Object.assign({}, state, { +reducers[ACTIONS.DAEMON_VERSION_MATCH] = state => + Object.assign({}, state, { daemonVersionMatched: true, }); -}; -reducers[ACTIONS.DAEMON_VERSION_MISMATCH] = function(state) { - return Object.assign({}, state, { +reducers[ACTIONS.DAEMON_VERSION_MISMATCH] = state => + Object.assign({}, state, { daemonVersionMatched: false, modal: MODALS.INCOMPATIBLE_DAEMON, }); -}; -reducers[ACTIONS.UPGRADE_CANCELLED] = function(state) { - return Object.assign({}, state, { +reducers[ACTIONS.UPGRADE_CANCELLED] = state => + Object.assign({}, state, { downloadProgress: null, upgradeDownloadComplete: false, modal: null, }); -}; -reducers[ACTIONS.UPGRADE_DOWNLOAD_COMPLETED] = function(state, action) { - return Object.assign({}, state, { +reducers[ACTIONS.UPGRADE_DOWNLOAD_COMPLETED] = (state, action) => + Object.assign({}, state, { downloadPath: action.data.path, upgradeDownloading: false, upgradeDownloadCompleted: true, }); -}; -reducers[ACTIONS.UPGRADE_DOWNLOAD_STARTED] = function(state) { - return Object.assign({}, state, { +reducers[ACTIONS.UPGRADE_DOWNLOAD_STARTED] = state => + Object.assign({}, state, { upgradeDownloading: true, }); -}; -reducers[ACTIONS.SKIP_UPGRADE] = function(state) { +reducers[ACTIONS.SKIP_UPGRADE] = state => { sessionStorage.setItem('upgradeSkipped', 'true'); return Object.assign({}, state, { @@ -106,46 +100,40 @@ reducers[ACTIONS.SKIP_UPGRADE] = function(state) { }); }; -reducers[ACTIONS.UPDATE_VERSION] = function(state, action) { - return Object.assign({}, state, { +reducers[ACTIONS.UPDATE_VERSION] = (state, action) => + Object.assign({}, state, { version: action.data.version, }); -}; -reducers[ACTIONS.CHECK_UPGRADE_SUCCESS] = function(state, action) { - return Object.assign({}, state, { +reducers[ACTIONS.CHECK_UPGRADE_SUCCESS] = (state, action) => + Object.assign({}, state, { isUpgradeAvailable: action.data.upgradeAvailable, remoteVersion: action.data.remoteVersion, }); -}; -reducers[ACTIONS.CHECK_UPGRADE_SUBSCRIBE] = function(state, action) { - return Object.assign({}, state, { +reducers[ACTIONS.CHECK_UPGRADE_SUBSCRIBE] = (state, action) => + Object.assign({}, state, { checkUpgradeTimer: action.data.checkUpgradeTimer, }); -}; -reducers[ACTIONS.OPEN_MODAL] = function(state, action) { - return Object.assign({}, state, { +reducers[ACTIONS.OPEN_MODAL] = (state, action) => + Object.assign({}, state, { modal: action.data.modal, modalProps: action.data.modalProps || {}, }); -}; -reducers[ACTIONS.CLOSE_MODAL] = function(state) { - return Object.assign({}, state, { +reducers[ACTIONS.CLOSE_MODAL] = state => + Object.assign({}, state, { modal: undefined, modalProps: {}, }); -}; -reducers[ACTIONS.UPGRADE_DOWNLOAD_PROGRESSED] = function(state, action) { - return Object.assign({}, state, { +reducers[ACTIONS.UPGRADE_DOWNLOAD_PROGRESSED] = (state, action) => + Object.assign({}, state, { downloadProgress: action.data.percent, }); -}; -reducers[ACTIONS.SHOW_SNACKBAR] = function(state, action) { +reducers[ACTIONS.SHOW_SNACKBAR] = (state, action) => { const { message, linkText, linkTarget, isError } = action.data; const snackBar = Object.assign({}, state.snackBar); const snacks = Object.assign([], snackBar.snacks); @@ -164,7 +152,7 @@ reducers[ACTIONS.SHOW_SNACKBAR] = function(state, action) { }); }; -reducers[ACTIONS.REMOVE_SNACKBAR_SNACK] = function(state) { +reducers[ACTIONS.REMOVE_SNACKBAR_SNACK] = state => { const snackBar = Object.assign({}, state.snackBar); const snacks = Object.assign([], snackBar.snacks); snacks.shift(); @@ -178,7 +166,7 @@ reducers[ACTIONS.REMOVE_SNACKBAR_SNACK] = function(state) { }); }; -reducers[ACTIONS.DOWNLOADING_COMPLETED] = function(state) { +reducers[ACTIONS.DOWNLOADING_COMPLETED] = state => { const { badgeNumber } = state; // Don't update the badge number if the window is focused @@ -189,17 +177,15 @@ reducers[ACTIONS.DOWNLOADING_COMPLETED] = function(state) { }); }; -reducers[ACTIONS.WINDOW_FOCUSED] = function(state) { - return Object.assign({}, state, { +reducers[ACTIONS.WINDOW_FOCUSED] = state => + Object.assign({}, state, { badgeNumber: 0, }); -}; -reducers[ACTIONS.VOLUME_CHANGED] = function(state, action) { - return Object.assign({}, state, { +reducers[ACTIONS.VOLUME_CHANGED] = (state, action) => + Object.assign({}, state, { volume: action.data.volume, }); -}; export default function reducer(state: AppState = defaultState, action: any) { const handler = reducers[action.type]; diff --git a/src/renderer/redux/reducers/availability.js b/src/renderer/redux/reducers/availability.js index 48133ff50..27648ad4a 100644 --- a/src/renderer/redux/reducers/availability.js +++ b/src/renderer/redux/reducers/availability.js @@ -3,7 +3,7 @@ import * as ACTIONS from 'constants/action_types'; const reducers = {}; const defaultState = {}; -reducers[ACTIONS.FETCH_AVAILABILITY_STARTED] = function(state, action) { +reducers[ACTIONS.FETCH_AVAILABILITY_STARTED] = (state, action) => { const { uri } = action.data; const newFetching = Object.assign({}, state.fetching); @@ -14,7 +14,7 @@ reducers[ACTIONS.FETCH_AVAILABILITY_STARTED] = function(state, action) { }); }; -reducers[ACTIONS.FETCH_AVAILABILITY_COMPLETED] = function(state, action) { +reducers[ACTIONS.FETCH_AVAILABILITY_COMPLETED] = (state, action) => { const { uri, availability } = action.data; const newFetching = Object.assign({}, state.fetching); diff --git a/src/renderer/redux/reducers/claims.js b/src/renderer/redux/reducers/claims.js index 6547dd5f4..73eee7815 100644 --- a/src/renderer/redux/reducers/claims.js +++ b/src/renderer/redux/reducers/claims.js @@ -4,7 +4,7 @@ const reducers = {}; const defaultState = {}; -reducers[ACTIONS.RESOLVE_URIS_COMPLETED] = function(state, action) { +reducers[ACTIONS.RESOLVE_URIS_COMPLETED] = (state, action) => { const { resolveInfo } = action.data; const byUri = Object.assign({}, state.claimsByUri); const byId = Object.assign({}, state.byId); @@ -33,13 +33,12 @@ reducers[ACTIONS.RESOLVE_URIS_COMPLETED] = function(state, action) { }); }; -reducers[ACTIONS.FETCH_CLAIM_LIST_MINE_STARTED] = function(state) { - return Object.assign({}, state, { +reducers[ACTIONS.FETCH_CLAIM_LIST_MINE_STARTED] = state => + Object.assign({}, state, { isFetchingClaimListMine: true, }); -}; -reducers[ACTIONS.FETCH_CLAIM_LIST_MINE_COMPLETED] = function(state, action) { +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); @@ -72,11 +71,10 @@ reducers[ACTIONS.FETCH_CLAIM_LIST_MINE_COMPLETED] = function(state, action) { }); }; -reducers[ACTIONS.FETCH_CHANNEL_LIST_MINE_STARTED] = function(state) { - return Object.assign({}, state, { fetchingMyChannels: true }); -}; +reducers[ACTIONS.FETCH_CHANNEL_LIST_MINE_STARTED] = state => + Object.assign({}, state, { fetchingMyChannels: true }); -reducers[ACTIONS.FETCH_CHANNEL_LIST_MINE_COMPLETED] = function(state, action) { +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); @@ -93,7 +91,7 @@ reducers[ACTIONS.FETCH_CHANNEL_LIST_MINE_COMPLETED] = function(state, action) { }); }; -reducers[ACTIONS.FETCH_CHANNEL_CLAIMS_STARTED] = function(state, action) { +reducers[ACTIONS.FETCH_CHANNEL_CLAIMS_STARTED] = (state, action) => { const { uri, page } = action.data; const fetchingChannelClaims = Object.assign({}, state.fetchingChannelClaims); @@ -104,7 +102,7 @@ reducers[ACTIONS.FETCH_CHANNEL_CLAIMS_STARTED] = function(state, action) { }); }; -reducers[ACTIONS.FETCH_CHANNEL_CLAIMS_COMPLETED] = function(state, action) { +reducers[ACTIONS.FETCH_CHANNEL_CLAIMS_COMPLETED] = (state, action) => { const { uri, claims, page } = action.data; const claimsByChannel = Object.assign({}, state.claimsByChannel); @@ -134,7 +132,7 @@ reducers[ACTIONS.FETCH_CHANNEL_CLAIMS_COMPLETED] = function(state, action) { }); }; -reducers[ACTIONS.ABANDON_CLAIM_STARTED] = function(state, action) { +reducers[ACTIONS.ABANDON_CLAIM_STARTED] = (state, action) => { const { claimId } = action.data; const abandoningById = Object.assign({}, state.abandoningById); @@ -145,7 +143,7 @@ reducers[ACTIONS.ABANDON_CLAIM_STARTED] = function(state, action) { }); }; -reducers[ACTIONS.ABANDON_CLAIM_SUCCEEDED] = function(state, action) { +reducers[ACTIONS.ABANDON_CLAIM_SUCCEEDED] = (state, action) => { const { claimId } = action.data; const byId = Object.assign({}, state.byId); const claimsByUri = Object.assign({}, state.claimsByUri); @@ -164,7 +162,7 @@ reducers[ACTIONS.ABANDON_CLAIM_SUCCEEDED] = function(state, action) { }); }; -reducers[ACTIONS.CREATE_CHANNEL_COMPLETED] = function(state, action) { +reducers[ACTIONS.CREATE_CHANNEL_COMPLETED] = (state, action) => { const { channelClaim } = action.data; const byId = Object.assign({}, state.byId); const myChannelClaims = new Set(state.myChannelClaims); diff --git a/src/renderer/redux/reducers/content.js b/src/renderer/redux/reducers/content.js index b16c911b1..e5242b599 100644 --- a/src/renderer/redux/reducers/content.js +++ b/src/renderer/redux/reducers/content.js @@ -7,13 +7,12 @@ const defaultState = { channelClaimCounts: {}, }; -reducers[ACTIONS.FETCH_FEATURED_CONTENT_STARTED] = function(state) { - return Object.assign({}, state, { +reducers[ACTIONS.FETCH_FEATURED_CONTENT_STARTED] = state => + Object.assign({}, state, { fetchingFeaturedContent: true, }); -}; -reducers[ACTIONS.FETCH_FEATURED_CONTENT_COMPLETED] = function(state, action) { +reducers[ACTIONS.FETCH_FEATURED_CONTENT_COMPLETED] = (state, action) => { const { uris, success } = action.data; return Object.assign({}, state, { @@ -23,7 +22,7 @@ reducers[ACTIONS.FETCH_FEATURED_CONTENT_COMPLETED] = function(state, action) { }); }; -reducers[ACTIONS.FETCH_REWARD_CONTENT_COMPLETED] = function(state, action) { +reducers[ACTIONS.FETCH_REWARD_CONTENT_COMPLETED] = (state, action) => { const { claimIds } = action.data; return Object.assign({}, state, { @@ -31,7 +30,7 @@ reducers[ACTIONS.FETCH_REWARD_CONTENT_COMPLETED] = function(state, action) { }); }; -reducers[ACTIONS.RESOLVE_URIS_STARTED] = function(state, action) { +reducers[ACTIONS.RESOLVE_URIS_STARTED] = (state, action) => { const { uris } = action.data; const oldResolving = state.resolvingUris || []; @@ -48,7 +47,7 @@ reducers[ACTIONS.RESOLVE_URIS_STARTED] = function(state, action) { }); }; -reducers[ACTIONS.RESOLVE_URIS_COMPLETED] = function(state, action) { +reducers[ACTIONS.RESOLVE_URIS_COMPLETED] = (state, action) => { const { resolveInfo } = action.data; const channelClaimCounts = Object.assign({}, state.channelClaimCounts); @@ -69,7 +68,7 @@ reducers[ACTIONS.SET_PLAYING_URI] = (state, action) => playingUri: action.data.uri, }); -reducers[ACTIONS.FETCH_CHANNEL_CLAIM_COUNT_COMPLETED] = function(state, action) { +reducers[ACTIONS.FETCH_CHANNEL_CLAIM_COUNT_COMPLETED] = (state, action) => { const channelClaimCounts = Object.assign({}, state.channelClaimCounts); const { uri, totalClaims } = action.data; diff --git a/src/renderer/redux/reducers/cost_info.js b/src/renderer/redux/reducers/cost_info.js index 18c6214ac..4137bb83f 100644 --- a/src/renderer/redux/reducers/cost_info.js +++ b/src/renderer/redux/reducers/cost_info.js @@ -3,7 +3,7 @@ import * as ACTIONS from 'constants/action_types'; const reducers = {}; const defaultState = {}; -reducers[ACTIONS.FETCH_COST_INFO_STARTED] = function(state, action) { +reducers[ACTIONS.FETCH_COST_INFO_STARTED] = (state, action) => { const { uri } = action.data; const newFetching = Object.assign({}, state.fetching); newFetching[uri] = true; @@ -13,7 +13,7 @@ reducers[ACTIONS.FETCH_COST_INFO_STARTED] = function(state, action) { }); }; -reducers[ACTIONS.FETCH_COST_INFO_COMPLETED] = function(state, action) { +reducers[ACTIONS.FETCH_COST_INFO_COMPLETED] = (state, action) => { const { uri, costInfo } = action.data; const newByUri = Object.assign({}, state.byUri); const newFetching = Object.assign({}, state.fetching); diff --git a/src/renderer/redux/reducers/file_info.js b/src/renderer/redux/reducers/file_info.js index 25ae15546..0d9ed2431 100644 --- a/src/renderer/redux/reducers/file_info.js +++ b/src/renderer/redux/reducers/file_info.js @@ -3,13 +3,12 @@ import * as ACTIONS from 'constants/action_types'; const reducers = {}; const defaultState = {}; -reducers[ACTIONS.FILE_LIST_STARTED] = function(state) { - return Object.assign({}, state, { +reducers[ACTIONS.FILE_LIST_STARTED] = state => + Object.assign({}, state, { isFetchingFileList: true, }); -}; -reducers[ACTIONS.FILE_LIST_SUCCEEDED] = function(state, action) { +reducers[ACTIONS.FILE_LIST_SUCCEEDED] = (state, action) => { const { fileInfos } = action.data; const newByOutpoint = Object.assign({}, state.byOutpoint); const pendingByOutpoint = Object.assign({}, state.pendingByOutpoint); @@ -27,7 +26,7 @@ reducers[ACTIONS.FILE_LIST_SUCCEEDED] = function(state, action) { }); }; -reducers[ACTIONS.FETCH_FILE_INFO_STARTED] = function(state, action) { +reducers[ACTIONS.FETCH_FILE_INFO_STARTED] = (state, action) => { const { outpoint } = action.data; const newFetching = Object.assign({}, state.fetching); @@ -38,7 +37,7 @@ reducers[ACTIONS.FETCH_FILE_INFO_STARTED] = function(state, action) { }); }; -reducers[ACTIONS.FETCH_FILE_INFO_COMPLETED] = function(state, action) { +reducers[ACTIONS.FETCH_FILE_INFO_COMPLETED] = (state, action) => { const { fileInfo, outpoint } = action.data; const newByOutpoint = Object.assign({}, state.byOutpoint); @@ -53,7 +52,7 @@ reducers[ACTIONS.FETCH_FILE_INFO_COMPLETED] = function(state, action) { }); }; -reducers[ACTIONS.DOWNLOADING_STARTED] = function(state, action) { +reducers[ACTIONS.DOWNLOADING_STARTED] = (state, action) => { const { uri, outpoint, fileInfo } = action.data; const newByOutpoint = Object.assign({}, state.byOutpoint); @@ -71,7 +70,7 @@ reducers[ACTIONS.DOWNLOADING_STARTED] = function(state, action) { }); }; -reducers[ACTIONS.DOWNLOADING_PROGRESSED] = function(state, action) { +reducers[ACTIONS.DOWNLOADING_PROGRESSED] = (state, action) => { const { outpoint, fileInfo } = action.data; const newByOutpoint = Object.assign({}, state.byOutpoint); @@ -86,7 +85,7 @@ reducers[ACTIONS.DOWNLOADING_PROGRESSED] = function(state, action) { }); }; -reducers[ACTIONS.DOWNLOADING_COMPLETED] = function(state, action) { +reducers[ACTIONS.DOWNLOADING_COMPLETED] = (state, action) => { const { outpoint, fileInfo } = action.data; const newByOutpoint = Object.assign({}, state.byOutpoint); @@ -101,7 +100,7 @@ reducers[ACTIONS.DOWNLOADING_COMPLETED] = function(state, action) { }); }; -reducers[ACTIONS.FILE_DELETE] = function(state, action) { +reducers[ACTIONS.FILE_DELETE] = (state, action) => { const { outpoint } = action.data; const newByOutpoint = Object.assign({}, state.byOutpoint); @@ -116,7 +115,7 @@ reducers[ACTIONS.FILE_DELETE] = function(state, action) { }); }; -reducers[ACTIONS.LOADING_VIDEO_STARTED] = function(state, action) { +reducers[ACTIONS.LOADING_VIDEO_STARTED] = (state, action) => { const { uri } = action.data; const newLoading = Object.assign({}, state.urisLoading); @@ -128,7 +127,7 @@ reducers[ACTIONS.LOADING_VIDEO_STARTED] = function(state, action) { }); }; -reducers[ACTIONS.LOADING_VIDEO_FAILED] = function(state, action) { +reducers[ACTIONS.LOADING_VIDEO_FAILED] = (state, action) => { const { uri } = action.data; const newLoading = Object.assign({}, state.urisLoading); @@ -140,7 +139,7 @@ reducers[ACTIONS.LOADING_VIDEO_FAILED] = function(state, action) { }); }; -reducers[ACTIONS.FETCH_DATE] = function(state, action) { +reducers[ACTIONS.FETCH_DATE] = (state, action) => { const { time } = action.data; if (time) { return Object.assign({}, state, { diff --git a/src/renderer/redux/reducers/navigation.js b/src/renderer/redux/reducers/navigation.js index 581fd52d2..e4544b4cc 100644 --- a/src/renderer/redux/reducers/navigation.js +++ b/src/renderer/redux/reducers/navigation.js @@ -14,7 +14,7 @@ const defaultState = { stack: [], }; -reducers[ACTIONS.DAEMON_READY] = function(state) { +reducers[ACTIONS.DAEMON_READY] = state => { const { currentPath } = state; return Object.assign({}, state, { @@ -22,11 +22,10 @@ reducers[ACTIONS.DAEMON_READY] = function(state) { }); }; -reducers[ACTIONS.CHANGE_AFTER_AUTH_PATH] = function(state, action) { - return Object.assign({}, state, { +reducers[ACTIONS.CHANGE_AFTER_AUTH_PATH] = (state, action) => + Object.assign({}, state, { pathAfterAuth: action.data.path, }); -}; reducers[ACTIONS.HISTORY_NAVIGATE] = (state, action) => { const { stack, index } = state; diff --git a/src/renderer/redux/reducers/rewards.js b/src/renderer/redux/reducers/rewards.js index f9a108f12..f2f42c004 100644 --- a/src/renderer/redux/reducers/rewards.js +++ b/src/renderer/redux/reducers/rewards.js @@ -9,13 +9,12 @@ const defaultState = { claimErrorsByType: {}, }; -reducers[ACTIONS.FETCH_REWARDS_STARTED] = function(state) { - return Object.assign({}, state, { +reducers[ACTIONS.FETCH_REWARDS_STARTED] = state => + Object.assign({}, state, { fetching: true, }); -}; -reducers[ACTIONS.FETCH_REWARDS_COMPLETED] = function(state, action) { +reducers[ACTIONS.FETCH_REWARDS_COMPLETED] = (state, action) => { const { userRewards } = action.data; const unclaimedRewards = {}; @@ -55,13 +54,13 @@ function setClaimRewardState(state, reward, isClaiming, errorMessage = '') { }); } -reducers[ACTIONS.CLAIM_REWARD_STARTED] = function(state, action) { +reducers[ACTIONS.CLAIM_REWARD_STARTED] = (state, action) => { const { reward } = action.data; return setClaimRewardState(state, reward, true, ''); }; -reducers[ACTIONS.CLAIM_REWARD_SUCCESS] = function(state, action) { +reducers[ACTIONS.CLAIM_REWARD_SUCCESS] = (state, action) => { const { reward } = action.data; const unclaimedRewardsByType = Object.assign({}, state.unclaimedRewardsByType); @@ -83,13 +82,13 @@ reducers[ACTIONS.CLAIM_REWARD_SUCCESS] = function(state, action) { return setClaimRewardState(newState, newReward, false, ''); }; -reducers[ACTIONS.CLAIM_REWARD_FAILURE] = function(state, action) { +reducers[ACTIONS.CLAIM_REWARD_FAILURE] = (state, action) => { const { reward, error } = action.data; return setClaimRewardState(state, reward, false, error ? error.message : ''); }; -reducers[ACTIONS.CLAIM_REWARD_CLEAR_ERROR] = function(state, action) { +reducers[ACTIONS.CLAIM_REWARD_CLEAR_ERROR] = (state, action) => { const { reward } = action.data; return setClaimRewardState(state, reward, state.claimPendingByType[reward.reward_type], ''); diff --git a/src/renderer/redux/reducers/search.js b/src/renderer/redux/reducers/search.js index 00764c2b7..b3a0754e4 100644 --- a/src/renderer/redux/reducers/search.js +++ b/src/renderer/redux/reducers/search.js @@ -6,13 +6,12 @@ const defaultState = { searching: false, }; -reducers[ACTIONS.SEARCH_STARTED] = function(state) { - return Object.assign({}, state, { +reducers[ACTIONS.SEARCH_STARTED] = state => + Object.assign({}, state, { searching: true, }); -}; -reducers[ACTIONS.SEARCH_COMPLETED] = function(state, action) { +reducers[ACTIONS.SEARCH_COMPLETED] = (state, action) => { const { query, uris } = action.data; return Object.assign({}, state, { @@ -21,11 +20,10 @@ reducers[ACTIONS.SEARCH_COMPLETED] = function(state, action) { }); }; -reducers[ACTIONS.SEARCH_CANCELLED] = function(state) { - return Object.assign({}, state, { +reducers[ACTIONS.SEARCH_CANCELLED] = state => + Object.assign({}, state, { searching: false, }); -}; export default function reducer(state = defaultState, action) { const handler = reducers[action.type]; diff --git a/src/renderer/redux/reducers/settings.js b/src/renderer/redux/reducers/settings.js index b3cf5794a..914404bb1 100644 --- a/src/renderer/redux/reducers/settings.js +++ b/src/renderer/redux/reducers/settings.js @@ -1,6 +1,6 @@ import * as ACTIONS from 'constants/action_types'; -import * as SETTINGS from 'constants/settings'; import LANGUAGES from 'constants/languages'; +import * as SETTINGS from 'constants/settings'; function getLocalStorageSetting(setting, fallback) { const localStorageVal = localStorage.getItem(`setting_${setting}`); @@ -27,13 +27,12 @@ const defaultState = { languages: {}, }; -reducers[ACTIONS.DAEMON_SETTINGS_RECEIVED] = function(state, action) { - return Object.assign({}, state, { +reducers[ACTIONS.DAEMON_SETTINGS_RECEIVED] = (state, action) => + Object.assign({}, state, { daemonSettings: action.data.settings, }); -}; -reducers[ACTIONS.CLIENT_SETTING_CHANGED] = function(state, action) { +reducers[ACTIONS.CLIENT_SETTING_CHANGED] = (state, action) => { const { key, value } = action.data; const clientSettings = Object.assign({}, state.clientSettings); @@ -47,7 +46,7 @@ reducers[ACTIONS.CLIENT_SETTING_CHANGED] = function(state, action) { }); }; -reducers[ACTIONS.DOWNLOAD_LANGUAGE_SUCCEEDED] = function(state, action) { +reducers[ACTIONS.DOWNLOAD_LANGUAGE_SUCCEEDED] = (state, action) => { const languages = Object.assign({}, state.languages); const { language } = action.data; @@ -62,7 +61,7 @@ reducers[ACTIONS.DOWNLOAD_LANGUAGE_SUCCEEDED] = function(state, action) { return Object.assign({}, state, { languages }); }; -reducers[ACTIONS.DOWNLOAD_LANGUAGE_FAILED] = function(state, action) { +reducers[ACTIONS.DOWNLOAD_LANGUAGE_FAILED] = (state, action) => { const languages = Object.assign({}, state.languages); delete languages[action.data.language]; return Object.assign({}, state, { languages }); diff --git a/src/renderer/redux/reducers/user.js b/src/renderer/redux/reducers/user.js index be8c5f1c7..f616dd1d1 100644 --- a/src/renderer/redux/reducers/user.js +++ b/src/renderer/redux/reducers/user.js @@ -16,59 +16,52 @@ const defaultState = { user: undefined, }; -reducers[ACTIONS.AUTHENTICATION_STARTED] = function(state) { - return Object.assign({}, state, { +reducers[ACTIONS.AUTHENTICATION_STARTED] = state => + Object.assign({}, state, { authenticationIsPending: true, userIsPending: true, user: defaultState.user, }); -}; -reducers[ACTIONS.AUTHENTICATION_SUCCESS] = function(state, action) { - return Object.assign({}, state, { +reducers[ACTIONS.AUTHENTICATION_SUCCESS] = (state, action) => + Object.assign({}, state, { authenticationIsPending: false, userIsPending: false, user: action.data.user, }); -}; -reducers[ACTIONS.AUTHENTICATION_FAILURE] = function(state) { - return Object.assign({}, state, { +reducers[ACTIONS.AUTHENTICATION_FAILURE] = state => + Object.assign({}, state, { authenticationIsPending: false, userIsPending: false, user: null, }); -}; -reducers[ACTIONS.USER_FETCH_STARTED] = function(state) { - return Object.assign({}, state, { +reducers[ACTIONS.USER_FETCH_STARTED] = state => + Object.assign({}, state, { userIsPending: true, user: defaultState.user, }); -}; -reducers[ACTIONS.USER_FETCH_SUCCESS] = function(state, action) { - return Object.assign({}, state, { +reducers[ACTIONS.USER_FETCH_SUCCESS] = (state, action) => + Object.assign({}, state, { userIsPending: false, user: action.data.user, }); -}; -reducers[ACTIONS.USER_FETCH_FAILURE] = function(state) { - return Object.assign({}, state, { +reducers[ACTIONS.USER_FETCH_FAILURE] = state => + Object.assign({}, state, { userIsPending: true, user: null, }); -}; -reducers[ACTIONS.USER_EMAIL_NEW_STARTED] = function(state) { - return Object.assign({}, state, { +reducers[ACTIONS.USER_EMAIL_NEW_STARTED] = state => + Object.assign({}, state, { emailNewIsPending: true, emailNewErrorMessage: '', }); -}; -reducers[ACTIONS.USER_EMAIL_NEW_SUCCESS] = function(state, action) { +reducers[ACTIONS.USER_EMAIL_NEW_SUCCESS] = (state, action) => { const user = Object.assign({}, state.user); user.primary_email = action.data.email; return Object.assign({}, state, { @@ -78,28 +71,25 @@ reducers[ACTIONS.USER_EMAIL_NEW_SUCCESS] = function(state, action) { }); }; -reducers[ACTIONS.USER_EMAIL_NEW_EXISTS] = function(state, action) { - return Object.assign({}, state, { +reducers[ACTIONS.USER_EMAIL_NEW_EXISTS] = (state, action) => + Object.assign({}, state, { emailToVerify: action.data.email, emailNewIsPending: false, }); -}; -reducers[ACTIONS.USER_EMAIL_NEW_FAILURE] = function(state, action) { - return Object.assign({}, state, { +reducers[ACTIONS.USER_EMAIL_NEW_FAILURE] = (state, action) => + Object.assign({}, state, { emailNewIsPending: false, emailNewErrorMessage: action.data.error, }); -}; -reducers[ACTIONS.USER_EMAIL_VERIFY_STARTED] = function(state) { - return Object.assign({}, state, { +reducers[ACTIONS.USER_EMAIL_VERIFY_STARTED] = state => + Object.assign({}, state, { emailVerifyIsPending: true, emailVerifyErrorMessage: '', }); -}; -reducers[ACTIONS.USER_EMAIL_VERIFY_SUCCESS] = function(state, action) { +reducers[ACTIONS.USER_EMAIL_VERIFY_SUCCESS] = (state, action) => { const user = Object.assign({}, state.user); user.primary_email = action.data.email; return Object.assign({}, state, { @@ -109,36 +99,32 @@ reducers[ACTIONS.USER_EMAIL_VERIFY_SUCCESS] = function(state, action) { }); }; -reducers[ACTIONS.USER_EMAIL_VERIFY_FAILURE] = function(state, action) { - return Object.assign({}, state, { +reducers[ACTIONS.USER_EMAIL_VERIFY_FAILURE] = (state, action) => + Object.assign({}, state, { emailVerifyIsPending: false, emailVerifyErrorMessage: action.data.error, }); -}; -reducers[ACTIONS.USER_IDENTITY_VERIFY_STARTED] = function(state) { - return Object.assign({}, state, { +reducers[ACTIONS.USER_IDENTITY_VERIFY_STARTED] = state => + Object.assign({}, state, { identityVerifyIsPending: true, identityVerifyErrorMessage: '', }); -}; -reducers[ACTIONS.USER_IDENTITY_VERIFY_SUCCESS] = function(state, action) { - return Object.assign({}, state, { +reducers[ACTIONS.USER_IDENTITY_VERIFY_SUCCESS] = (state, action) => + Object.assign({}, state, { identityVerifyIsPending: false, identityVerifyErrorMessage: '', user: action.data.user, }); -}; -reducers[ACTIONS.USER_IDENTITY_VERIFY_FAILURE] = function(state, action) { - return Object.assign({}, state, { +reducers[ACTIONS.USER_IDENTITY_VERIFY_FAILURE] = (state, action) => + Object.assign({}, state, { identityVerifyIsPending: false, identityVerifyErrorMessage: action.data.error, }); -}; -reducers[ACTIONS.FETCH_ACCESS_TOKEN_SUCCESS] = function(state, action) { +reducers[ACTIONS.FETCH_ACCESS_TOKEN_SUCCESS] = (state, action) => { const { token } = action.data; return Object.assign({}, state, { @@ -146,48 +132,42 @@ reducers[ACTIONS.FETCH_ACCESS_TOKEN_SUCCESS] = function(state, action) { }); }; -reducers[ACTIONS.USER_INVITE_STATUS_FETCH_STARTED] = function(state) { - return Object.assign({}, state, { +reducers[ACTIONS.USER_INVITE_STATUS_FETCH_STARTED] = state => + Object.assign({}, state, { inviteStatusIsPending: true, }); -}; -reducers[ACTIONS.USER_INVITE_STATUS_FETCH_SUCCESS] = function(state, action) { - return Object.assign({}, state, { +reducers[ACTIONS.USER_INVITE_STATUS_FETCH_SUCCESS] = (state, action) => + Object.assign({}, state, { inviteStatusIsPending: false, invitesRemaining: action.data.invitesRemaining, invitees: action.data.invitees, }); -}; -reducers[ACTIONS.USER_INVITE_NEW_STARTED] = function(state) { - return Object.assign({}, state, { +reducers[ACTIONS.USER_INVITE_NEW_STARTED] = state => + Object.assign({}, state, { inviteNewIsPending: true, inviteNewErrorMessage: '', }); -}; -reducers[ACTIONS.USER_INVITE_NEW_SUCCESS] = function(state) { - return Object.assign({}, state, { +reducers[ACTIONS.USER_INVITE_NEW_SUCCESS] = state => + Object.assign({}, state, { inviteNewIsPending: false, inviteNewErrorMessage: '', }); -}; -reducers[ACTIONS.USER_INVITE_NEW_FAILURE] = function(state, action) { - return Object.assign({}, state, { +reducers[ACTIONS.USER_INVITE_NEW_FAILURE] = (state, action) => + Object.assign({}, state, { inviteNewIsPending: false, inviteNewErrorMessage: action.data.error.message, }); -}; -reducers[ACTIONS.USER_INVITE_STATUS_FETCH_FAILURE] = function(state) { - return Object.assign({}, state, { +reducers[ACTIONS.USER_INVITE_STATUS_FETCH_FAILURE] = state => + Object.assign({}, state, { inviteStatusIsPending: false, invitesRemaining: null, invitees: null, }); -}; export default function reducer(state = defaultState, action) { const handler = reducers[action.type]; diff --git a/src/renderer/redux/reducers/wallet.js b/src/renderer/redux/reducers/wallet.js index 403c57486..bc5761c6c 100644 --- a/src/renderer/redux/reducers/wallet.js +++ b/src/renderer/redux/reducers/wallet.js @@ -18,13 +18,12 @@ const defaultState = { sendingSupport: false, }; -reducers[ACTIONS.FETCH_TRANSACTIONS_STARTED] = function(state) { - return Object.assign({}, state, { +reducers[ACTIONS.FETCH_TRANSACTIONS_STARTED] = state => + Object.assign({}, state, { fetchingTransactions: true, }); -}; -reducers[ACTIONS.FETCH_TRANSACTIONS_COMPLETED] = function(state, action) { +reducers[ACTIONS.FETCH_TRANSACTIONS_COMPLETED] = (state, action) => { const byId = Object.assign({}, state.transactions); const { transactions } = action.data; @@ -39,13 +38,12 @@ reducers[ACTIONS.FETCH_TRANSACTIONS_COMPLETED] = function(state, action) { }); }; -reducers[ACTIONS.GET_NEW_ADDRESS_STARTED] = function(state) { - return Object.assign({}, state, { +reducers[ACTIONS.GET_NEW_ADDRESS_STARTED] = state => + Object.assign({}, state, { gettingNewAddress: true, }); -}; -reducers[ACTIONS.GET_NEW_ADDRESS_COMPLETED] = function(state, action) { +reducers[ACTIONS.GET_NEW_ADDRESS_COMPLETED] = (state, action) => { const { address } = action.data; localStorage.setItem('receiveAddress', address); @@ -55,25 +53,22 @@ reducers[ACTIONS.GET_NEW_ADDRESS_COMPLETED] = function(state, action) { }); }; -reducers[ACTIONS.UPDATE_BALANCE] = function(state, action) { - return Object.assign({}, state, { +reducers[ACTIONS.UPDATE_BALANCE] = (state, action) => + Object.assign({}, state, { balance: action.data.balance, }); -}; -reducers[ACTIONS.CHECK_ADDRESS_IS_MINE_STARTED] = function(state) { - return Object.assign({}, state, { +reducers[ACTIONS.CHECK_ADDRESS_IS_MINE_STARTED] = state => + Object.assign({}, state, { checkingAddressOwnership: true, }); -}; -reducers[ACTIONS.CHECK_ADDRESS_IS_MINE_COMPLETED] = function(state) { - return Object.assign({}, state, { +reducers[ACTIONS.CHECK_ADDRESS_IS_MINE_COMPLETED] = state => + Object.assign({}, state, { checkingAddressOwnership: false, }); -}; -reducers[ACTIONS.SET_DRAFT_TRANSACTION_AMOUNT] = function(state, action) { +reducers[ACTIONS.SET_DRAFT_TRANSACTION_AMOUNT] = (state, action) => { const oldDraft = state.draftTransaction; const newDraft = Object.assign({}, oldDraft, { amount: parseFloat(action.data.amount), @@ -84,7 +79,7 @@ reducers[ACTIONS.SET_DRAFT_TRANSACTION_AMOUNT] = function(state, action) { }); }; -reducers[ACTIONS.SET_DRAFT_TRANSACTION_ADDRESS] = function(state, action) { +reducers[ACTIONS.SET_DRAFT_TRANSACTION_ADDRESS] = (state, action) => { const oldDraft = state.draftTransaction; const newDraft = Object.assign({}, oldDraft, { address: action.data.address, @@ -95,7 +90,7 @@ reducers[ACTIONS.SET_DRAFT_TRANSACTION_ADDRESS] = function(state, action) { }); }; -reducers[ACTIONS.SEND_TRANSACTION_STARTED] = function(state) { +reducers[ACTIONS.SEND_TRANSACTION_STARTED] = state => { const newDraftTransaction = Object.assign({}, state.draftTransaction, { sending: true, }); @@ -105,13 +100,12 @@ reducers[ACTIONS.SEND_TRANSACTION_STARTED] = function(state) { }); }; -reducers[ACTIONS.SEND_TRANSACTION_COMPLETED] = function(state) { - return Object.assign({}, state, { +reducers[ACTIONS.SEND_TRANSACTION_COMPLETED] = state => + Object.assign({}, state, { draftTransaction: buildDraftTransaction(), }); -}; -reducers[ACTIONS.SEND_TRANSACTION_FAILED] = function(state, action) { +reducers[ACTIONS.SEND_TRANSACTION_FAILED] = (state, action) => { const newDraftTransaction = Object.assign({}, state.draftTransaction, { sending: false, error: action.data.error, @@ -122,24 +116,21 @@ reducers[ACTIONS.SEND_TRANSACTION_FAILED] = function(state, action) { }); }; -reducers[ACTIONS.SUPPORT_TRANSACTION_STARTED] = function(state) { - return Object.assign({}, state, { +reducers[ACTIONS.SUPPORT_TRANSACTION_STARTED] = state => + Object.assign({}, state, { sendingSupport: true, }); -}; -reducers[ACTIONS.SUPPORT_TRANSACTION_COMPLETED] = function(state) { - return Object.assign({}, state, { +reducers[ACTIONS.SUPPORT_TRANSACTION_COMPLETED] = state => + Object.assign({}, state, { sendingSupport: false, }); -}; -reducers[ACTIONS.SUPPORT_TRANSACTION_FAILED] = function(state, action) { - return Object.assign({}, state, { +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; diff --git a/src/renderer/redux/selectors/app.js b/src/renderer/redux/selectors/app.js index 7a43f7fb3..052fe7096 100644 --- a/src/renderer/redux/selectors/app.js +++ b/src/renderer/redux/selectors/app.js @@ -58,8 +58,6 @@ export const selectUpgradeDownloadItem = createSelector(selectState, state => st export const selectModalProps = createSelector(selectState, state => state.modalProps); -export const selectDaemonReady = createSelector(selectState, state => state.daemonReady); - export const selectDaemonVersionMatched = createSelector( selectState, state => state.daemonVersionMatched diff --git a/src/renderer/redux/selectors/claims.js b/src/renderer/redux/selectors/claims.js index b0a62174a..4ee7faad8 100644 --- a/src/renderer/redux/selectors/claims.js +++ b/src/renderer/redux/selectors/claims.js @@ -1,6 +1,6 @@ -import { createSelector } from 'reselect'; import Lbryuri from 'lbryuri'; import { makeSelectCurrentParam } from 'redux/selectors/navigation'; +import { createSelector } from 'reselect'; const selectState = state => state.claims || {}; @@ -19,9 +19,7 @@ export const selectClaimsByUri = createSelector(selectState, selectClaimsById, ( if (claimId === null) { claims[uri] = null; } else { - const claim = byId[claimId]; - - claims[uri] = claim; + claims[uri] = byId[claimId]; } }); @@ -94,8 +92,7 @@ export const makeSelectMetadataForUri = uri => createSelector(makeSelectClaimForUri(uri), claim => { const metadata = claim && claim.value && claim.value.stream && claim.value.stream.metadata; - const value = metadata || (claim === undefined ? undefined : null); - return value; + return metadata || (claim === undefined ? undefined : null); }); export const makeSelectTitleForUri = uri => @@ -109,7 +106,7 @@ export const makeSelectContentTypeForUri = uri => export const selectIsFetchingClaimListMine = createSelector( selectState, - state => !!state.isFetchingClaimListMine + state => state.isFetchingClaimListMine ); export const selectPendingClaims = createSelector(selectState, state => @@ -154,7 +151,7 @@ export const selectMyClaimsOutpoints = createSelector(selectMyClaims, myClaims = export const selectFetchingMyChannels = createSelector( selectState, - state => !!state.fetchingMyChannels + state => state.fetchingMyChannels ); export const selectMyChannelClaims = createSelector( diff --git a/src/renderer/redux/selectors/content.js b/src/renderer/redux/selectors/content.js index 31e415dbe..371c59764 100644 --- a/src/renderer/redux/selectors/content.js +++ b/src/renderer/redux/selectors/content.js @@ -6,7 +6,7 @@ export const selectFeaturedUris = createSelector(selectState, state => state.fea export const selectFetchingFeaturedUris = createSelector( selectState, - state => !!state.fetchingFeaturedContent + state => state.fetchingFeaturedContent ); export const selectResolvingUris = createSelector(selectState, state => state.resolvingUris || []); diff --git a/src/renderer/redux/selectors/file_info.js b/src/renderer/redux/selectors/file_info.js index 9e2409911..f760bb3be 100644 --- a/src/renderer/redux/selectors/file_info.js +++ b/src/renderer/redux/selectors/file_info.js @@ -1,10 +1,9 @@ -import { createSelector } from 'reselect'; import { selectClaimsByUri, selectIsFetchingClaimListMine, selectMyClaims, - selectMyClaimsOutpoints, } from 'redux/selectors/claims'; +import { createSelector } from 'reselect'; export const selectState = state => state.fileInfo || {}; @@ -52,10 +51,6 @@ export const selectUrisLoading = createSelector(selectState, state => state.uris export const makeSelectLoadingForUri = uri => createSelector(selectUrisLoading, byUri => byUri && byUri[uri]); -export const selectFileInfosPendingPublish = createSelector(selectState, state => - Object.values(state.pendingByOutpoint || {}) -); - export const selectFileInfosDownloaded = createSelector( selectFileInfosByOutpoint, selectMyClaims, @@ -71,20 +66,6 @@ export const selectFileInfosDownloaded = createSelector( }) ); -export const selectFileInfosPublished = createSelector( - selectFileInfosByOutpoint, - selectMyClaimsOutpoints, - selectFileInfosPendingPublish, - (byOutpoint, outpoints, pendingPublish) => { - const fileInfos = []; - outpoints.forEach(outpoint => { - const fileInfo = byOutpoint[outpoint]; - if (fileInfo) fileInfos.push(fileInfo); - }); - return [...fileInfos, ...pendingPublish]; - } -); - // export const selectFileInfoForUri = (state, props) => { // const claims = selectClaimsByUri(state), // claim = claims[props.uri], @@ -94,26 +75,6 @@ export const selectFileInfosPublished = createSelector( // return outpoint && fileInfos ? fileInfos[outpoint] : undefined; // }; -export const selectFileInfosByUri = createSelector( - selectClaimsByUri, - selectFileInfosByOutpoint, - (claimsByUri, byOutpoint) => { - const fileInfos = {}; - const uris = Object.keys(claimsByUri); - - uris.forEach(uri => { - const claim = claimsByUri[uri]; - if (claim) { - const outpoint = `${claim.txid}:${claim.nout}`; - const fileInfo = byOutpoint[outpoint]; - - if (fileInfo) fileInfos[uri] = fileInfo; - } - }); - return fileInfos; - } -); - export const selectDownloadingFileInfos = createSelector( selectDownloadingByOutpoint, selectFileInfosByOutpoint, diff --git a/src/renderer/redux/selectors/search.js b/src/renderer/redux/selectors/search.js index b34a5742f..4e49f47d8 100644 --- a/src/renderer/redux/selectors/search.js +++ b/src/renderer/redux/selectors/search.js @@ -1,9 +1,9 @@ -import { createSelector } from 'reselect'; import { - selectPageTitle, selectCurrentPage, selectCurrentParams, + selectPageTitle, } from 'redux/selectors/navigation'; +import { createSelector } from 'reselect'; export const selectState = state => state.search || {}; @@ -13,7 +13,7 @@ export const selectSearchQuery = createSelector( (page, params) => (page === 'search' ? params && params.query : null) ); -export const selectIsSearching = createSelector(selectState, state => !!state.searching); +export const selectIsSearching = createSelector(selectState, state => state.searching); export const selectSearchUrisByQuery = createSelector(selectState, state => state.urisByQuery); diff --git a/src/renderer/redux/selectors/settings.js b/src/renderer/redux/selectors/settings.js index ba246f0cb..0e2887f59 100644 --- a/src/renderer/redux/selectors/settings.js +++ b/src/renderer/redux/selectors/settings.js @@ -13,11 +13,6 @@ export const selectClientSettings = createSelector( export const makeSelectClientSetting = setting => createSelector(selectClientSettings, settings => (settings ? settings[setting] : undefined)); -export const selectSettingsIsGenerous = createSelector( - selectDaemonSettings, - settings => settings && settings.is_generous_host -); - // refactor me export const selectShowNsfw = makeSelectClientSetting(SETTINGS.SHOW_NSFW); diff --git a/src/renderer/rewards.js b/src/renderer/rewards.js index d30ca1957..84dde2477 100644 --- a/src/renderer/rewards.js +++ b/src/renderer/rewards.js @@ -39,7 +39,7 @@ rewards.SORT_ORDER = [ rewards.TYPE_NEW_DEVELOPER, ]; -rewards.claimReward = function(type) { +rewards.claimReward = type => { function requestReward(resolve, reject, params) { if (!Lbryio.enabled) { reject(new Error(__('Rewards are not enabled.'))); diff --git a/src/renderer/util/setBadge.js b/src/renderer/util/setBadge.js index 005e63a11..ca4c9d358 100644 --- a/src/renderer/util/setBadge.js +++ b/src/renderer/util/setBadge.js @@ -1,4 +1,4 @@ -const { remote } = require('electron'); +import { remote } from 'electron'; const application = remote.app; const { dock } = application; diff --git a/src/renderer/util/shape_shift.js b/src/renderer/util/shape_shift.js index b61880e35..e958187a5 100644 --- a/src/renderer/util/shape_shift.js +++ b/src/renderer/util/shape_shift.js @@ -1,6 +1,6 @@ // these don't need to be exact -// shapeshift does a more thourough check on validity -// just general matches to prevent unneccesary api calls +// Shapeshift does a more thorough check on validity +// just general matches to prevent unnecessary api calls export const coinRegexPatterns = { BTC: /^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$/, BCH: /^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$/, diff --git a/src/renderer/util/throttle.js b/src/renderer/util/throttle.js index 941633deb..7b7c9b2b5 100644 --- a/src/renderer/util/throttle.js +++ b/src/renderer/util/throttle.js @@ -14,7 +14,7 @@ export default function throttle(func, wait, options = {}) { let previous = 0; const getNow = () => new Date().getTime(); - const later = function() { + const later = () => { previous = options.leading === false ? 0 : getNow(); timeout = null; result = func.apply(context, args); @@ -24,7 +24,7 @@ export default function throttle(func, wait, options = {}) { } }; - const throttled = function(...funcArgs) { + const throttled = function throttled(...funcArgs) { const now = getNow(); if (!previous && options.leading === false) previous = now; @@ -53,7 +53,7 @@ export default function throttle(func, wait, options = {}) { return result; }; - throttled.cancel = function() { + throttled.cancel = () => { clearTimeout(timeout); previous = 0; timeout = null; -- 2.45.2 From e31e9cd345ee910bd6c609656c14d3c885ea46b3 Mon Sep 17 00:00:00 2001 From: Igor Gassmann Date: Wed, 27 Dec 2017 21:09:13 -0300 Subject: [PATCH 2/7] Change rule for func-names to as-needed --- .eslintrc.json | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 2fbd88746..2d095999a 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,7 +1,5 @@ { - "plugins": [ - "flowtype" - ], + "plugins": ["flowtype"], "extends": [ "airbnb", "plugin:import/electron", @@ -28,7 +26,8 @@ "app": true }, "rules": { - "import/no-commonjs": 1, - "import/no-amd": 1 + "import/no-commonjs": "warn", + "import/no-amd": "warn", + "func-names": ["warn", "as-needed"] } -} \ No newline at end of file +} -- 2.45.2 From b1a41892fb784f5e97545b69d9e39e6c39f512fe Mon Sep 17 00:00:00 2001 From: Igor Gassmann Date: Thu, 28 Dec 2017 11:18:20 -0300 Subject: [PATCH 3/7] Rename "pretty-print" command to "format" for more clarity --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 55b1a0905..7e94d5fe3 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "postinstall": "electron-builder install-app-deps", "precommit": "lint-staged", "lint": "eslint 'src/**/*.{js,jsx}' --fix", - "pretty-print": "prettier 'src/**/*.{js,jsx,scss,json}' --write" + "format": "prettier 'src/**/*.{js,jsx,scss,json}' --write" }, "keywords": [ "lbry" -- 2.45.2 From c633c3c7cb50e2ad39ec4151bce9c198257553c0 Mon Sep 17 00:00:00 2001 From: Igor Gassmann Date: Thu, 28 Dec 2017 14:36:48 -0300 Subject: [PATCH 4/7] Update documentation for DevTools --- CONTRIBUTING.md | 162 ++++++++++++++++++++++++++++++++++++++---------- README.md | 96 +++++++++++++++++----------- 2 files changed, 190 insertions(+), 68 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9f8c64645..29f49e38c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,57 +1,153 @@ -# Contributing to LBRY +# Contribute to LBRY -You found this page! That means you are well on your way to contributing to the LBRY app. This application is primarily written in JavaScript and is built on [Electron](https://electronjs.org) while utilizing [React](https://reactjs.org) and [Redux](https://redux.js.org) for UI and application state. +You found this page! That means you are well on your way to contributing to the LBRY app. This +application is primarily written in JavaScript and is built on [Electron](https://electronjs.org) +while utilizing [React](https://reactjs.org) and [Redux](https://redux.js.org) for UI and +application state. ## TL;DR? -* [Here](https://github.com/lbryio/lbry-app/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22+no%3Aassignee) is a list of help wanted issues. -* Comment on an issue to let us know if you are going to work on it, don't take an issue that someone has reserved less than 3 days ago + +* [Here](https://github.com/lbryio/lbry-app/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22+no%3Aassignee) + is a list of help wanted issues. +* Comment on an issue to let us know if you are going to work on it, don't take an issue that + someone reserved less than 3 days ago * Submit a pull request and get paid in LBC * Don't hesitate to contact us with any questions or comments -## Longer Version +## Choose an Issue -LBRY is an open source project, and therefore is developed out in the open for everyone to see. What you see here are the latest source code changes and issues. +LBRY is an open source project and therefore is developed out in the open for everyone to see. What +you see here are the latest source code changes and issues. -Since LBRY is an based around a decentralized community, we believe that the app will be strongest if it receives contributions from individuals outside the core team -- such as yourself! +Since LBRY is based on a decentralized community, we believe that the app will be stronger if it +receives contributions from individuals outside the core team -- such as yourself! -In order to make contributing as easy and rewarding of possible, we have instituted the following system: +To make contributing as easy and rewarding of possible, we have instituted the following system: -* Anyone can view all issues in the system by clicking on the [Issues](https://github.com/lbryio/lbry-app/issues) button at the top of the page. Feel free to add an issue if you think we have missed something (and you might earn some LBC in the process because we do tip people for reporting bugs). -* Once on the [Issues](https://github.com/lbryio/lbry-app/issues) page, a potential contributor can filter issues by the [Help Wanted](https://github.com/lbryio/lbry-app/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22+no%3Aassignee) label to see a curated list of suggested issues with which community members can help. -* Every [Help Wanted](https://github.com/lbryio/lbry-app/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22+no%3Aassignee) issue is ranked on a scale from zero to four. +* Anyone can view all issues in the system by clicking on the + [Issues](https://github.com/lbryio/lbry-app/issues) button at the top of the page. Feel free to + add an issue if you think we have missed something (and you might earn some LBC in the process + because we do tip people for reporting bugs). +* Once on the [Issues](https://github.com/lbryio/lbry-app/issues) page, a potential contributor can + filter issues by the + [Help Wanted](https://github.com/lbryio/lbry-app/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22+no%3Aassignee) + label to see a curated list of suggested issues with which community members can help. +* Every + [Help Wanted](https://github.com/lbryio/lbry-app/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22+no%3Aassignee) + issue is ranked on a scale from zero to four. -Level | Description ---- | --- -[**level 0**](https://github.com/lbryio/lbry-app/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22+label%3A%22level+0%22+no%3Aassignee) | Typos and text edits -- a tech savvy non-programmer can fix these -[**level 1**](https://github.com/lbryio/lbry-app/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22+label%3A%22level+1%22+no%3Aassignee) | Programming issues that require little knowledge of how the LBRY app works -[**level 2**](https://github.com/lbryio/lbry-app/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22+label%3A%22level+2%22+no%3Aassignee) | Issues of average difficulty that require the developer to dig into how the app works a little bit -[**level 3**](https://github.com/lbryio/lbry-app/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22+label%3A%22level+3%22+no%3Aassignee) | Issues that are likely too tricky to be level 2 or require more thinking outside of the box -[**level 4**](https://github.com/lbryio/lbry-app/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22+label%3A%22level+4%22+no%3Aassignee) | Big features or really hard issues +| Level | Description | +| --------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | +| [**level 0**](https://github.com/lbryio/lbry-app/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22+label%3A%22level+0%22+no%3Aassignee) | Typos and text edits -- a tech-savvy non-programmer can fix these | +| [**level 1**](https://github.com/lbryio/lbry-app/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22+label%3A%22level+1%22+no%3Aassignee) | Programming issues that require little knowledge of how the LBRY app works | +| [**level 2**](https://github.com/lbryio/lbry-app/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22+label%3A%22level+2%22+no%3Aassignee) | Issues of average difficulty that require the developer to dig into how the app works a little bit | +| [**level 3**](https://github.com/lbryio/lbry-app/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22+label%3A%22level+3%22+no%3Aassignee) | Issues that are likely too tricky to be level 2 or require more thinking outside of the box | +| [**level 4**](https://github.com/lbryio/lbry-app/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22+label%3A%22level+4%22+no%3Aassignee) | Big features or really hard issues | -The process of ranking issues is highly subjective. The purpose of sorting issues like this is to give contributors a general idea about the type of issues they are looking at. It could very well be the case that a level 1 issue is more difficult than a level 2, for instance. This system is meant to help you find relevant issues, not to prevent you from working on issues that you otherwise would. If these rankings don't work for you, feel free to ignore them. +The process of ranking issues is highly subjective. The purpose of sorting issues like this is to +give contributors a general idea about the type of issues they are looking at. It could very well be +the case that a level 1 issue is more difficult than a level 2, for instance. This system is meant +to help you find relevant issues, not to prevent you from working on issues that you otherwise +would. If these rankings don't work for you, feel free to ignore them. -* After deciding what to work on, a potential contributor can [fork](https://help.github.com/articles/fork-a-repo/) this repository, make his or her changes, and submit a [pull request](https://help.github.com/articles/creating-a-pull-request-from-a-fork/). A contributor wanting to reserve an issue in advance can leave a comment saying that he or she is working on it. Contributors should respect other people's efforts to complete issues in a timely manner and, therefore, not begin working on anything reserved (or updated) within the last 3 days. If someone has been officially assigned an issue via Github's assignment system, it is also not available. Contributors are encouraged to ask if they have any questions about issue availability. -* Once the pull request is visible in the LBRY repo, a LBRY team member will review it and make sure it is up to our standards. At this point, the contributor may have to change his or her code based on our suggestions and comments. -* Then, upon a satisfactory review of the code, we will merge it and send the contributor a tip (in LBC) for the contribution. +## Develop -We are dedicated to being fair and friendly in this process. In __general__, level 4 issues will be paid more than level 3 issues which will be paid more than level 2, and so on. However, this is not due to their labeling, but rather how difficult they end up being. Maybe an issue labeled "level 1" turns out to be very difficult. In this case we would be **more than happy** to tip accordingly. If you do good work, we want you to be rewarded for it. +The project comes with diverse tools for simplifying the development process and for providing +better code quality. It's recommended to make use of them thoroughly during ongoing development. -Also, we are here to enable you. We want you to succeed, so do not hesitate to ask questions. If you need some information or assistance in completing an issue, please let us know! That is what we are here for-- pushing development forward. +We follow the well-known [Airbnb JavaScript Style Guide](http://airbnb.io/javascript/) for defining +our styling rules and code best practices. -Lastly, don't feel limited by this list. Should LBRY have built-in Tor support? Add it! It's not in the issue tracker but maybe it's a good idea. Do you think the search layout is unintuitive? Change it! We welcome all feedback and suggestions. That said, it may be the case that we do not wish to incorporate your change if you don't check with us first (also, please check with us especially if you are planning on adding Tor support :P). If you want to add a feature that is not listed in the issue tracker, go ahead and [create an issue](https://github.com/lbryio/lbry-app/issues/new), and say in the description that you would like to try to implement it yourself. This way we can tell you in advance if we will accept your changes and we can point you in the right direction. +### Run + +LBRY app can be run for development by using the command `yarn dev`. This will launch the app and +provide HMR (Hot Module Replacement). Any change made to the sources will automatically reload the +app without losing its state. + +### Lint + +Code linting is ensured by [ESLint](https://eslint.org/). + +You can lint all the project's sources at any time by using the `yarn lint` command. If you desire +to lint a specific file or directory you can use `yarn eslint 'glob/pattern'`. + +In addition to those commands, staged files are automatically linted before commit. Please take the +time to fix all staged files' linting problems before committing or suppress them if necessary. + +If you want the linting problems to show up on your IDE or text editor, check out +[ESLint integrations](https://eslint.org/docs/user-guide/integrations). + +### Code Formatting + +Project's sources are formatted using [Prettier](https://prettier.io/). + +Staged files are automatically formatted before commit. + +You can also use the command `yarn format` for applying formatting rules to all project's code +sources. For formatting a specific file or directory use `yarn prettier 'glob/pattern'`. + +Editor integrations are available [here](https://prettier.io/docs/en/editors.html). + +### Debug + +There are a few tools integrated to the project that will ease the process of debugging: + +* [Chrome DevTools](https://developer.chrome.com/devtools) + * Also available for the main process as a [remote target](chrome://inspect/#devices). +* [Electron Devtron](https://electronjs.org/devtron) +* [React DevTools](https://github.com/facebook/react-devtools) +* [Redux DevTools](https://github.com/gaearon/redux-devtools) + +## Submit a Pull Request + +* After deciding what to work on, a potential contributor can + [fork](https://help.github.com/articles/fork-a-repo/) this repository, make his or her changes, + and submit a + [pull request](https://help.github.com/articles/creating-a-pull-request-from-a-fork/). A + contributor wanting to reserve an issue in advance can leave a comment saying that he or she is + working on it. Contributors should respect other people's efforts to complete issues in a timely + manner and, therefore, not begin working on anything reserved (or updated) within the last 3 days. + If someone has been officially assigned an issue via Github's assignment system, it is also not + available. Contributors are encouraged to ask if they have any questions about issue availability. +* Once the pull request is visible in the LBRY repo, a LBRY team member will review it and make sure + it is up to our standards. At this point, the contributor may have to change his or her code based + on our suggestions and comments. +* Then, upon a satisfactory review of the code, we will merge it and send the contributor a tip (in + LBC) for the contribution. + +We are dedicated to being fair and friendly in this process. In **general**, level 4 issues will be +paid more than level 3 issues which will be paid more than level 2, and so on. However, this is not +due to their labeling, but rather how difficult they end up being. Maybe an issue labeled "level 1" +turns out to be very difficult. In this case, we would be **more than happy** to tip accordingly. If +you do good work, we want you to be rewarded for it. + +Also, we are here to enable you. We want you to succeed, so do not hesitate to ask questions. If you +need some information or assistance in completing an issue, please let us know! That is what we are +here for-- pushing development forward. + +Lastly, don't feel limited by this list. Should LBRY have built-in Tor support? Add it! It's not in +the issue tracker, but maybe it's a good idea. Do you think the search layout is unintuitive? Change +it! We welcome all feedback and suggestions. That said, it may be the case that we do not wish to +incorporate your change if you don't check with us first (also, please check with us especially if +you are planning on adding Tor support :P). If you want to add a feature that is not listed in the +issue tracker, go ahead and [create an issue](https://github.com/lbryio/lbry-app/issues/new), and +say in the description that you would like to try to implement it yourself. This way we can tell you +in advance if we will accept your changes and we can point you in the right direction. # Tom's "Voice of the User" Wishlist -[Anything marked with **both** "Help Wanted" and "Tom's 'Voice of the User' Wishlist"](https://github.com/lbryio/lbry-app/issues?q=is%3Aopen+is%3Aissue+label%3A%22Tom%27s+%5C%22Voice+of+the+User%5C%22+Wishlist%22+label%3A%22help+wanted%22+no%3Aassignee) will earn you an extra 50 LBC on top of what we would otherwise tip you. +[Anything marked with **both** "Help Wanted" and "Tom's 'Voice of the User' Wishlist"](https://github.com/lbryio/lbry-app/issues?q=is%3Aopen+is%3Aissue+label%3A%22Tom%27s+%5C%22Voice+of+the+User%5C%22+Wishlist%22+label%3A%22help+wanted%22+no%3Aassignee) +will earn you an extra 50 LBC on top of what we would otherwise tip you. -# Get In Touch -Name | Role | Discord | Email ---- | --- | --- | --- -[Liam](https://github.com/liamcardenas) | The application engineer in charge of community development. He is the person to contact with any development/contribution related questions. | liamsdouble | liam@lbry.io -[Tom](https://github.com/tzarebczan) | Community manager. He knows more than anyone about the app and all of its flaws. Reach out to him with any questions about how the app works, if a bug has been reported, or if a feature should be requested. | jiggytom | tom@lbry.io -[Sean](https://github.com/seanyesmunt) | An application engineer who focuses largely on UI/UX. If you have a design or implementation question, feel free to reach out to him. | sean | sean@lbry.io +# Get in Touch -Join our discord [here](https://chat.lbry.io/). +| Name | Role | Discord | Email | +| --------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | ------------ | +| [Liam](https://github.com/liamcardenas) | The application engineer in charge of community development. He is the person to contact with any development/contribution related questions. | liamsdouble | liam@lbry.io | +| [Tom](https://github.com/tzarebczan) | Community manager. He knows more than anyone about the app and all of its flaws. Reach out to him with any questions about how the app works, if a bug has been reported, or if a feature should be requested. | jiggytom | tom@lbry.io | +| [Sean](https://github.com/seanyesmunt) | An application engineer who focuses largely on UI/UX. If you have a design or implementation question, feel free to reach out to him. | sean | sean@lbry.io | + +Join our Discord [here](https://chat.lbry.io/). # More Information diff --git a/README.md b/README.md index 9cb673480..a4544cd71 100644 --- a/README.md +++ b/README.md @@ -1,77 +1,103 @@ # LBRY App -This is a graphical browser for the decentralized content marketplace provided by the [LBRY](https://lbry.io) protocol. It is essentially the [lbry daemon](https://github.com/lbryio/lbry) bundled with a UI using [Electron](http://electron.atom.io/). +The LBRY app is a graphical browser for the decentralized content marketplace provided by the +[LBRY](https://lbry.io) protocol. It is essentially the +[lbry daemon](https://github.com/lbryio/lbry) bundled with a UI using +[Electron](http://electron.atom.io/). -![App Screenshot](https://lbry.io/img/lbry-ui.png) +![App screenshot](https://lbry.io/img/lbry-ui.png) ## Installing We provide installers for Windows, macOS, and Debian-based Linux. -| | Windows | macOS | Linux | -| --- | --- | --- | --- | -| Latest Stable Release | [Download](https://lbry.io/get/lbry.exe) | [Download](https://lbry.io/get/lbry.dmg) | [Download](https://lbry.io/get/lbry.deb) | -| Latest Prerelease | [Download](https://lbry.io/get/lbry.pre.exe) | [Download](https://lbry.io/get/lbry.pre.dmg) | [Download](https://lbry.io/get/lbry.pre.deb) | +| | Windows | macOS | Linux | +| --------------------- | -------------------------------------------- | -------------------------------------------- | -------------------------------------------- | +| Latest Stable Release | [Download](https://lbry.io/get/lbry.exe) | [Download](https://lbry.io/get/lbry.dmg) | [Download](https://lbry.io/get/lbry.deb) | +| Latest Prerelease | [Download](https://lbry.io/get/lbry.pre.exe) | [Download](https://lbry.io/get/lbry.pre.dmg) | [Download](https://lbry.io/get/lbry.pre.deb) | - -Our [releases page](https://github.com/lbryio/lbry-app/releases/latest) also contains the latest release, pre-releases, and past builds. +Our [releases page](https://github.com/lbryio/lbry-app/releases/latest) also contains the latest +release, pre-releases, and past builds. To install from source or make changes to the application, continue reading below. -## Development on Linux and macOS +## Getting Started + +These instructions will get you a copy of the project up and running on your local machine for +development and testing purposes. + +### Prerequisites + +* [Git](https://git-scm.com/downloads) +* [Node.js](https://nodejs.org/en/download/) +* [Yarn](https://yarnpkg.com/en/docs/install) +* `yarn --add-python-to-path install --global --production windows-build-tools` (Windows only) ### One-time Setup 1. Clone this repo 2. `DEPS=true ./build.sh` -This will download and install the LBRY app and its dependencies, including [the LBRY daemon](https://github.com/lbryio/lbry) and command line utilities like `node` and `yarn`. The LBRY app requires Node >= 6; if you have an earlier version of Node installed and want to keep it, you can use [nvm](https://github.com/creationix/nvm) to switch back and forth. +This will download and install the LBRY app and its dependencies, including +[the LBRY daemon](https://github.com/lbryio/lbry) and command line utilities like `node` and `yarn`. +The LBRY app requires Node >= 6; if you have an earlier version of Node installed and want to keep +it, you can use [nvm](https://github.com/creationix/nvm) to switch back and forth. -### Ongoing Development -Run `yarn dev` +### On Windows -This will set up a server that will automatically compile any changes made inside `src\` folder and automatically reload the app without losing the state. +#### Windows Dependency -### Build +1. Download and install `git` from github.io + (configure to use command prompt integration) +2. Download and install `npm` and `node` from + nodejs.org +3. Download and install `python 2.7` from + python.org +4. Download and Install `Microsoft Visual C++ Compiler for Python 2.7` from + Microsoft +5. Download and install `.NET Framework 2.0 Software Development Kit (SDK) (x64)` from + Microsoft (may need + to extract setup.exe and install manually by running install.exe as Administrator) -Run `yarn build` +#### One-time Setup -We use [electron-builder](https://github.com/electron-userland/electron-builder) -to create distributable packages. +1. Open a command prompt as administrator and run the following: -## Development on Windows - -### Windows Dependency -1. Download and install `git` from github.io (configure to use command prompt integration) -2. Download and install `npm` and `node` from nodejs.org -3. Download and install `python 2.7` from python.org -4. Download and Install `Microsoft Visual C++ Compiler for Python 2.7` from Microsoft -5. Download and install `.NET Framework 2.0 Software Development Kit (SDK) (x64)` from Microsoft (may need to extract setup.exe and install manually by running install.exe as Administrator) - -### One-time Setup -1. Open command prompt as adminstrator and run the following: ``` npm install --global --production windows-build-tools exit ``` -2. Open command prompt in the root of the project and run the following: +2. Open a command prompt in the root of the project and run the following: + ``` python -m pip install -r build\requirements.txt npm install -g yarn yarn install yarn build ``` -3. Download the lbry daemon and cli [binaries](https://github.com/lbryio/lbry/releases) and place them in `static\daemon` -### Ongoing Development -Run `yarn dev` +3. Download the lbry daemon and CLI [binaries](https://github.com/lbryio/lbry/releases) and place + them in `static\daemon`. ### Build -Run `yarn build` -This will set up a server that will automatically compile any changes made inside `src\` folder and automatically reload the app without losing the state. +Run `yarn build`. + +We use [electron-builder](https://github.com/electron-userland/electron-builder) to create +distributable packages. + +## Contributing + +Please read [our contributing manual](CONTRIBUTING.md) for details on how to develop for the +project and the process of submitting pull requests. ## Internationalization -If you want to help translating the lbry-app, you can copy the `en.json` file in `/dist/locales/` and modify the values while leaving the keys as their original English strings. An example for this would be: `"Skip": "Überspringen",` Translations should automatically show up in options. +If you want to help to translate the lbry-app, you can copy the `en.json` file in `/dist/locales/` +and modify the values while leaving the keys as their original English strings. An example for this +would be: `"Skip": "Überspringen",` Translations should automatically show up in options. + +## License + +[MIT © LBRY](LICENSE) -- 2.45.2 From c59293cf03b51c0db7e1710c96983343a016f592 Mon Sep 17 00:00:00 2001 From: Igor Gassmann Date: Thu, 28 Dec 2017 14:56:55 -0300 Subject: [PATCH 5/7] Fix default parameter for arrow functions --- src/renderer/lbry.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/renderer/lbry.js b/src/renderer/lbry.js index 0123f08c2..64ad8517e 100644 --- a/src/renderer/lbry.js +++ b/src/renderer/lbry.js @@ -19,7 +19,7 @@ const lbryProxy = new Proxy(Lbry, { return target[name]; } - return params => + return (params = {}) => new Promise((resolve, reject) => { apiCall(name, params, resolve, reject); }); @@ -213,7 +213,7 @@ Lbry.getAppVersionInfo = () => * Returns results from the file_list API method, plus dummy entries for pending publishes. * (If a real publish with the same name is found, the pending publish will be ignored and removed.) */ -Lbry.file_list = params => +Lbry.file_list = (params = {}) => new Promise((resolve, reject) => { const { name, channel_name: channelName, outpoint } = params; @@ -249,7 +249,7 @@ Lbry.file_list = params => ); }); -Lbry.claim_list_mine = params => +Lbry.claim_list_mine = (params = {}) => new Promise((resolve, reject) => { apiCall( 'claim_list_mine', @@ -270,7 +270,7 @@ Lbry.claim_list_mine = params => ); }); -Lbry.resolve = params => +Lbry.resolve = (params = {}) => new Promise((resolve, reject) => { apiCall( 'resolve', -- 2.45.2 From a7aef67d68f88a694322bd3a24010765b6c6d6e7 Mon Sep 17 00:00:00 2001 From: Igor Gassmann Date: Thu, 28 Dec 2017 23:44:12 -0300 Subject: [PATCH 6/7] Add "Running" section --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index a4544cd71..8d84f9753 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,12 @@ This will download and install the LBRY app and its dependencies, including The LBRY app requires Node >= 6; if you have an earlier version of Node installed and want to keep it, you can use [nvm](https://github.com/creationix/nvm) to switch back and forth. +### Running + +The app can be run from the sources using the following command: + +`yarn dev` + ### On Windows #### Windows Dependency -- 2.45.2 From 5d2a760b34e83489a2e68759c6e39c032d62ce23 Mon Sep 17 00:00:00 2001 From: Igor Gassmann Date: Thu, 28 Dec 2017 23:44:42 -0300 Subject: [PATCH 7/7] Put commands on its own line --- CONTRIBUTING.md | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 29f49e38c..3fcb763ec 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -60,16 +60,22 @@ our styling rules and code best practices. ### Run -LBRY app can be run for development by using the command `yarn dev`. This will launch the app and -provide HMR (Hot Module Replacement). Any change made to the sources will automatically reload the -app without losing its state. +LBRY app can be run for development by using the command: + +`yarn dev` + +This will launch the app and provide HMR (Hot Module Replacement). Any change made to the sources +will automatically reload the app without losing its state. ### Lint Code linting is ensured by [ESLint](https://eslint.org/). -You can lint all the project's sources at any time by using the `yarn lint` command. If you desire -to lint a specific file or directory you can use `yarn eslint 'glob/pattern'`. +You can lint all the project's sources at any time by running: + +`yarn lint` + +If you desire to lint a specific file or directory you can use `yarn eslint 'glob/pattern'`. In addition to those commands, staged files are automatically linted before commit. Please take the time to fix all staged files' linting problems before committing or suppress them if necessary. @@ -83,8 +89,12 @@ Project's sources are formatted using [Prettier](https://prettier.io/). Staged files are automatically formatted before commit. -You can also use the command `yarn format` for applying formatting rules to all project's code -sources. For formatting a specific file or directory use `yarn prettier 'glob/pattern'`. +You can also use the following command: + +`yarn format` + +for applying formatting rules to all project's code sources. For formatting a specific file or +directory use `yarn prettier 'glob/pattern'`. Editor integrations are available [here](https://prettier.io/docs/en/editors.html). -- 2.45.2