Merge pull request #197 from lbryio/onboarding

Onboarding updates
This commit is contained in:
Sean Yesmunt 2019-09-23 10:23:39 -04:00 committed by GitHub
commit 4d88d62129
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 290 additions and 123 deletions

283
dist/bundle.es.js vendored
View file

@ -252,13 +252,18 @@ const FETCH_DATE = 'FETCH_DATE';
const FETCH_COST_INFO_STARTED = 'FETCH_COST_INFO_STARTED';
const FETCH_COST_INFO_COMPLETED = 'FETCH_COST_INFO_COMPLETED';
const FETCH_COST_INFO_FAILED = 'FETCH_COST_INFO_FAILED';
// Tags
const TOGGLE_TAG_FOLLOW = 'TOGGLE_TAG_FOLLOW';
const TAG_ADD = 'TAG_ADD';
const TAG_DELETE = 'TAG_DELETE';
// Blocked Channels
const TOGGLE_BLOCK_CHANNEL = 'TOGGLE_BLOCK_CHANNEL';
// Sync
const USER_STATE_POPULATE = 'USER_STATE_POPULATE';
var action_types = /*#__PURE__*/Object.freeze({
WINDOW_FOCUSED: WINDOW_FOCUSED,
DAEMON_READY: DAEMON_READY,
@ -463,7 +468,8 @@ var action_types = /*#__PURE__*/Object.freeze({
TOGGLE_TAG_FOLLOW: TOGGLE_TAG_FOLLOW,
TAG_ADD: TAG_ADD,
TAG_DELETE: TAG_DELETE,
TOGGLE_BLOCK_CHANNEL: TOGGLE_BLOCK_CHANNEL
TOGGLE_BLOCK_CHANNEL: TOGGLE_BLOCK_CHANNEL,
USER_STATE_POPULATE: USER_STATE_POPULATE
});
const CC_LICENSES = [{
@ -1461,6 +1467,10 @@ const selectClaimsById = reselect.createSelector(selectState$2, state => state.b
const selectCurrentChannelPage = reselect.createSelector(selectState$2, state => state.currentChannelPage || 1);
const selectCreatingChannel = reselect.createSelector(selectState$2, state => state.creatingChannel);
const selectCreateChannelError = reselect.createSelector(selectState$2, state => state.createChannelError);
const selectClaimsByUri = reselect.createSelector(selectState$2, selectClaimsById, (state, byId) => {
const byUri = state.claimsByUri || {};
const claims = {};
@ -1658,9 +1668,12 @@ const selectMyClaimsOutpoints = reselect.createSelector(selectMyClaims, myClaims
const selectFetchingMyChannels = reselect.createSelector(selectState$2, state => state.fetchingMyChannels);
const selectMyChannelClaims = reselect.createSelector(selectState$2, selectClaimsById, (state, byId) => {
const ids = state.myChannelClaims || [];
const claims = [];
const ids = state.myChannelClaims;
if (!ids) {
return ids;
}
const claims = [];
ids.forEach(id => {
if (byId[id]) {
// I'm not sure why this check is necessary, but it ought to be a quick fix for https://github.com/lbryio/lbry-desktop/issues/544
@ -2444,7 +2457,7 @@ function doCreateChannel(name, amount, optionalParams) {
}).catch(error => {
dispatch({
type: CREATE_CHANNEL_FAILED,
data: error
data: error.message
});
});
};
@ -3545,6 +3558,25 @@ const doToggleBlockChannel = uri => ({
var _extends$5 = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
function extractUserState(rawObj) {
if (rawObj && rawObj.version === '0.1' && rawObj.shared) {
const { subscriptions, tags } = rawObj.shared;
return _extends$5({}, subscriptions ? { subscriptions } : {}, tags ? { tags } : {});
}
return {};
}
function doPopulateSharedUserState(settings) {
return dispatch => {
const { subscriptions, tags } = extractUserState(settings);
dispatch({ type: USER_STATE_POPULATE, data: { subscriptions, tags } });
};
}
var _extends$6 = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
const reducers = {};
const defaultState = {
byId: {},
@ -3555,7 +3587,7 @@ const defaultState = {
resolvingUris: [],
// This should not be a Set
// Storing sets in reducers can cause issues
myChannelClaims: new Set(),
myChannelClaims: undefined,
fetchingMyChannels: false,
abandoningById: {},
pendingById: {},
@ -3564,7 +3596,9 @@ const defaultState = {
claimSearchByQueryLastPageReached: {},
fetchingClaimSearchByQuery: {},
updateChannelError: '',
updatingChannel: false
updatingChannel: false,
creatingChannel: false,
createChannelError: undefined
};
function handleClaimAction(state, action) {
@ -3637,7 +3671,7 @@ reducers[RESOLVE_URIS_STARTED] = (state, action) => {
};
reducers[RESOLVE_URIS_COMPLETED] = (state, action) => {
return _extends$5({}, handleClaimAction(state, action));
return _extends$6({}, handleClaimAction(state, action));
};
reducers[FETCH_CLAIM_LIST_MINE_STARTED] = state => Object.assign({}, state, {
@ -3686,13 +3720,20 @@ reducers[FETCH_CHANNEL_LIST_STARTED] = state => Object.assign({}, state, { fetch
reducers[FETCH_CHANNEL_LIST_COMPLETED] = (state, action) => {
const { claims } = action.data;
const myChannelClaims = new Set(state.myChannelClaims);
const byId = Object.assign({}, state.byId);
claims.forEach(claim => {
myChannelClaims.add(claim.claim_id);
byId[claim.claim_id] = claim;
});
let myChannelClaims;
let byId = Object.assign({}, state.byId);
if (!claims.length) {
// $FlowFixMe
myChannelClaims = null;
} else {
myChannelClaims = new Set(state.myChannelClaims);
claims.forEach(claim => {
// $FlowFixMe
myChannelClaims.add(claim.claim_id);
byId[claim.claim_id] = claim;
});
}
return Object.assign({}, state, {
byId,
@ -3782,6 +3823,11 @@ reducers[ABANDON_CLAIM_SUCCEEDED] = (state, action) => {
});
};
reducers[CREATE_CHANNEL_STARTED] = state => _extends$6({}, state, {
creatingChannel: true,
createChannelError: null
});
reducers[CREATE_CHANNEL_COMPLETED] = (state, action) => {
const channelClaim = action.data.channelClaim;
const byId = Object.assign({}, state.byId);
@ -3792,7 +3838,15 @@ reducers[CREATE_CHANNEL_COMPLETED] = (state, action) => {
return Object.assign({}, state, {
byId,
myChannelClaims
myChannelClaims,
creatingChannel: false
});
};
reducers[CREATE_CHANNEL_FAILED] = (state, action) => {
return Object.assign({}, state, {
creatingChannel: false,
createChannelError: action.data
});
};
@ -3850,7 +3904,7 @@ reducers[CLAIM_SEARCH_COMPLETED] = (state, action) => {
delete fetchingClaimSearchByQuery[query];
return Object.assign({}, state, _extends$5({}, handleClaimAction(state, action), {
return Object.assign({}, state, _extends$6({}, handleClaimAction(state, action), {
claimSearchByQuery,
claimSearchByQueryLastPageReached,
fetchingClaimSearchByQuery
@ -3890,7 +3944,7 @@ const handleActions = (actionMap, defaultState) => (state = defaultState, action
return state;
};
var _extends$6 = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _extends$7 = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
const defaultState$1 = {
byId: {},
@ -3899,11 +3953,11 @@ const defaultState$1 = {
};
const commentReducer = handleActions({
[COMMENT_CREATE_STARTED]: (state, action) => _extends$6({}, state, {
[COMMENT_CREATE_STARTED]: (state, action) => _extends$7({}, state, {
isLoading: true
}),
[COMMENT_CREATE_FAILED]: (state, action) => _extends$6({}, state, {
[COMMENT_CREATE_FAILED]: (state, action) => _extends$7({}, state, {
isLoading: false
}),
@ -3916,12 +3970,12 @@ const commentReducer = handleActions({
newComments.unshift(comment);
byId[claimId] = newComments;
return _extends$6({}, state, {
return _extends$7({}, state, {
byId
});
},
[COMMENT_LIST_STARTED]: state => _extends$6({}, state, { isLoading: true }),
[COMMENT_LIST_STARTED]: state => _extends$7({}, state, { isLoading: true }),
[COMMENT_LIST_COMPLETED]: (state, action) => {
const { comments, claimId, uri } = action.data;
@ -3932,19 +3986,19 @@ const commentReducer = handleActions({
byId[claimId] = comments['items'];
commentsByUri[uri] = claimId;
}
return _extends$6({}, state, {
return _extends$7({}, state, {
byId,
commentsByUri,
isLoading: false
});
},
[COMMENT_LIST_FAILED]: (state, action) => _extends$6({}, state, {
[COMMENT_LIST_FAILED]: (state, action) => _extends$7({}, state, {
isLoading: false
})
}, defaultState$1);
var _extends$7 = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _extends$8 = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
const reducers$1 = {};
const defaultState$2 = {
@ -3953,9 +4007,9 @@ const defaultState$2 = {
reducers$1[SET_CONTENT_POSITION] = (state, action) => {
const { claimId, outpoint, position } = action.data;
return _extends$7({}, state, {
positions: _extends$7({}, state.positions, {
[claimId]: _extends$7({}, state.positions[claimId], {
return _extends$8({}, state, {
positions: _extends$8({}, state.positions, {
[claimId]: _extends$8({}, state.positions[claimId], {
[outpoint]: position
})
})
@ -4122,7 +4176,7 @@ function fileInfoReducer(state = defaultState$3, action) {
return state;
}
var _extends$8 = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _extends$9 = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
const reducers$3 = {};
const defaultState$4 = {
@ -4138,7 +4192,7 @@ reducers$3[PURCHASE_URI_STARTED] = (state, action) => {
newFailedPurchaseUris.splice(newFailedPurchaseUris.indexOf(uri), 1);
}
return _extends$8({}, state, {
return _extends$9({}, state, {
failedPurchaseUris: newFailedPurchaseUris,
purchaseUriErrorMessage: ''
});
@ -4156,7 +4210,7 @@ reducers$3[PURCHASE_URI_COMPLETED] = (state, action) => {
newFailedPurchaseUris.splice(newFailedPurchaseUris.indexOf(uri), 1);
}
return _extends$8({}, state, {
return _extends$9({}, state, {
failedPurchaseUris: newFailedPurchaseUris,
purchasedUris: newPurchasedUris,
purchaseUriErrorMessage: ''
@ -4171,7 +4225,7 @@ reducers$3[PURCHASE_URI_FAILED] = (state, action) => {
newFailedPurchaseUris.push(uri);
}
return _extends$8({}, state, {
return _extends$9({}, state, {
failedPurchaseUris: newFailedPurchaseUris,
purchaseUriErrorMessage: error
});
@ -4184,7 +4238,7 @@ reducers$3[DELETE_PURCHASED_URI] = (state, action) => {
newPurchasedUris.splice(newPurchasedUris.indexOf(uri), 1);
}
return _extends$8({}, state, {
return _extends$9({}, state, {
purchasedUris: newPurchasedUris
});
};
@ -4195,7 +4249,7 @@ function fileReducer(state = defaultState$4, action) {
return state;
}
var _extends$9 = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _extends$a = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
const defaultState$5 = {
notifications: [],
@ -4210,7 +4264,7 @@ const notificationsReducer = handleActions({
const newToasts = state.toasts.slice();
newToasts.push(toast);
return _extends$9({}, state, {
return _extends$a({}, state, {
toasts: newToasts
});
},
@ -4218,7 +4272,7 @@ const notificationsReducer = handleActions({
const newToasts = state.toasts.slice();
newToasts.shift();
return _extends$9({}, state, {
return _extends$a({}, state, {
toasts: newToasts
});
},
@ -4229,7 +4283,7 @@ const notificationsReducer = handleActions({
const newNotifications = state.notifications.slice();
newNotifications.push(notification);
return _extends$9({}, state, {
return _extends$a({}, state, {
notifications: newNotifications
});
},
@ -4240,7 +4294,7 @@ const notificationsReducer = handleActions({
notifications = notifications.map(pastNotification => pastNotification.id === notification.id ? notification : pastNotification);
return _extends$9({}, state, {
return _extends$a({}, state, {
notifications
});
},
@ -4249,7 +4303,7 @@ const notificationsReducer = handleActions({
let newNotifications = state.notifications.slice();
newNotifications = newNotifications.filter(notification => notification.id !== id);
return _extends$9({}, state, {
return _extends$a({}, state, {
notifications: newNotifications
});
},
@ -4260,7 +4314,7 @@ const notificationsReducer = handleActions({
const newErrors = state.errors.slice();
newErrors.push(error);
return _extends$9({}, state, {
return _extends$a({}, state, {
errors: newErrors
});
},
@ -4268,13 +4322,13 @@ const notificationsReducer = handleActions({
const newErrors = state.errors.slice();
newErrors.shift();
return _extends$9({}, state, {
return _extends$a({}, state, {
errors: newErrors
});
}
}, defaultState$5);
var _extends$a = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _extends$b = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
function _objectWithoutProperties$3(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
@ -4311,17 +4365,17 @@ const defaultState$6 = {
const publishReducer = handleActions({
[UPDATE_PUBLISH_FORM]: (state, action) => {
const { data } = action;
return _extends$a({}, state, data);
return _extends$b({}, state, data);
},
[CLEAR_PUBLISH]: () => _extends$a({}, defaultState$6),
[PUBLISH_START]: state => _extends$a({}, state, {
[CLEAR_PUBLISH]: () => _extends$b({}, defaultState$6),
[PUBLISH_START]: state => _extends$b({}, state, {
publishing: true,
publishSuccess: false
}),
[PUBLISH_FAIL]: state => _extends$a({}, state, {
[PUBLISH_FAIL]: state => _extends$b({}, state, {
publishing: false
}),
[PUBLISH_SUCCESS]: state => _extends$a({}, state, {
[PUBLISH_SUCCESS]: state => _extends$b({}, state, {
publishing: false,
publishSuccess: true
}),
@ -4336,14 +4390,14 @@ const publishReducer = handleActions({
streamName: name
});
return _extends$a({}, defaultState$6, publishData, {
return _extends$b({}, defaultState$6, publishData, {
editingURI: uri,
uri: shortUri
});
}
}, defaultState$6);
var _extends$b = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _extends$c = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
const defaultState$7 = {
isActive: false, // does the user have any typed text in the search input
@ -4363,29 +4417,29 @@ const defaultState$7 = {
};
const searchReducer = handleActions({
[SEARCH_START]: state => _extends$b({}, state, {
[SEARCH_START]: state => _extends$c({}, state, {
searching: true
}),
[SEARCH_SUCCESS]: (state, action) => {
const { query, uris } = action.data;
return _extends$b({}, state, {
return _extends$c({}, state, {
searching: false,
urisByQuery: Object.assign({}, state.urisByQuery, { [query]: uris })
});
},
[SEARCH_FAIL]: state => _extends$b({}, state, {
[SEARCH_FAIL]: state => _extends$c({}, state, {
searching: false
}),
[UPDATE_SEARCH_QUERY]: (state, action) => _extends$b({}, state, {
[UPDATE_SEARCH_QUERY]: (state, action) => _extends$c({}, state, {
searchQuery: action.data.query,
isActive: true
}),
[UPDATE_SEARCH_SUGGESTIONS]: (state, action) => _extends$b({}, state, {
suggestions: _extends$b({}, state.suggestions, {
[UPDATE_SEARCH_SUGGESTIONS]: (state, action) => _extends$c({}, state, {
suggestions: _extends$c({}, state.suggestions, {
[action.data.query]: action.data.suggestions
})
}),
@ -4393,36 +4447,36 @@ const searchReducer = handleActions({
// sets isActive to false so the uri will be populated correctly if the
// user is on a file page. The search query will still be present on any
// other page
[DISMISS_NOTIFICATION]: state => _extends$b({}, state, {
[DISMISS_NOTIFICATION]: state => _extends$c({}, state, {
isActive: false
}),
[SEARCH_FOCUS]: state => _extends$b({}, state, {
[SEARCH_FOCUS]: state => _extends$c({}, state, {
focused: true
}),
[SEARCH_BLUR]: state => _extends$b({}, state, {
[SEARCH_BLUR]: state => _extends$c({}, state, {
focused: false
}),
[UPDATE_SEARCH_OPTIONS]: (state, action) => {
const { options: oldOptions } = state;
const newOptions = action.data;
const options = _extends$b({}, oldOptions, newOptions);
return _extends$b({}, state, {
const options = _extends$c({}, oldOptions, newOptions);
return _extends$c({}, state, {
options
});
}
}, defaultState$7);
var _extends$c = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _extends$d = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
function getDefaultKnownTags() {
return DEFAULT_FOLLOWED_TAGS.concat(DEFAULT_KNOWN_TAGS).reduce((tagsMap, tag) => _extends$c({}, tagsMap, {
return DEFAULT_FOLLOWED_TAGS.concat(DEFAULT_KNOWN_TAGS).reduce((tagsMap, tag) => _extends$d({}, tagsMap, {
[tag]: { name: tag }
}), {});
}
const defaultState$8 = {
followedTags: DEFAULT_FOLLOWED_TAGS,
followedTags: [],
knownTags: getDefaultKnownTags()
};
@ -4439,7 +4493,7 @@ const tagsReducer = handleActions({
newFollowedTags.push(name);
}
return _extends$c({}, state, {
return _extends$d({}, state, {
followedTags: newFollowedTags
});
},
@ -4448,10 +4502,10 @@ const tagsReducer = handleActions({
const { knownTags } = state;
const { name } = action.data;
let newKnownTags = _extends$c({}, knownTags);
let newKnownTags = _extends$d({}, knownTags);
newKnownTags[name] = { name };
return _extends$c({}, state, {
return _extends$d({}, state, {
knownTags: newKnownTags
});
},
@ -4460,14 +4514,20 @@ const tagsReducer = handleActions({
const { knownTags, followedTags } = state;
const { name } = action.data;
let newKnownTags = _extends$c({}, knownTags);
let newKnownTags = _extends$d({}, knownTags);
delete newKnownTags[name];
const newFollowedTags = followedTags.filter(tag => tag !== name);
return _extends$c({}, state, {
return _extends$d({}, state, {
knownTags: newKnownTags,
followedTags: newFollowedTags
});
},
[USER_STATE_POPULATE]: (state, action) => {
const { tags } = action.data;
return _extends$d({}, state, {
followedTags: tags && tags.length ? tags : DEFAULT_FOLLOWED_TAGS
});
}
}, defaultState$8);
@ -4495,7 +4555,7 @@ const blockedReducer = handleActions({
}
}, defaultState$9);
var _extends$d = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _extends$e = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
const buildDraftTransaction = () => ({
amount: undefined,
@ -4535,25 +4595,25 @@ const defaultState$a = {
};
const walletReducer = handleActions({
[FETCH_TRANSACTIONS_STARTED]: state => _extends$d({}, state, {
[FETCH_TRANSACTIONS_STARTED]: state => _extends$e({}, state, {
fetchingTransactions: true
}),
[FETCH_TRANSACTIONS_COMPLETED]: (state, action) => {
const byId = _extends$d({}, state.transactions);
const byId = _extends$e({}, state.transactions);
const { transactions } = action.data;
transactions.forEach(transaction => {
byId[transaction.txid] = transaction;
});
return _extends$d({}, state, {
return _extends$e({}, state, {
transactions: byId,
fetchingTransactions: false
});
},
[FETCH_SUPPORTS_STARTED]: state => _extends$d({}, state, {
[FETCH_SUPPORTS_STARTED]: state => _extends$e({}, state, {
fetchingSupports: true
}),
@ -4566,7 +4626,7 @@ const walletReducer = handleActions({
byOutpoint[`${txid}:${nout}`] = transaction;
});
return _extends$d({}, state, { supports: byOutpoint, fetchingSupports: false });
return _extends$e({}, state, { supports: byOutpoint, fetchingSupports: false });
},
[ABANDON_SUPPORT_STARTED]: (state, action) => {
@ -4575,7 +4635,7 @@ const walletReducer = handleActions({
currentlyAbandoning[outpoint] = true;
return _extends$d({}, state, {
return _extends$e({}, state, {
abandoningSupportsByOutpoint: currentlyAbandoning
});
},
@ -4588,56 +4648,56 @@ const walletReducer = handleActions({
delete currentlyAbandoning[outpoint];
delete byOutpoint[outpoint];
return _extends$d({}, state, {
return _extends$e({}, state, {
supports: byOutpoint,
abandoningSupportsById: currentlyAbandoning
});
},
[GET_NEW_ADDRESS_STARTED]: state => _extends$d({}, state, {
[GET_NEW_ADDRESS_STARTED]: state => _extends$e({}, state, {
gettingNewAddress: true
}),
[GET_NEW_ADDRESS_COMPLETED]: (state, action) => {
const { address } = action.data;
return _extends$d({}, state, { gettingNewAddress: false, receiveAddress: address });
return _extends$e({}, state, { gettingNewAddress: false, receiveAddress: address });
},
[UPDATE_BALANCE]: (state, action) => _extends$d({}, state, {
[UPDATE_BALANCE]: (state, action) => _extends$e({}, state, {
balance: action.data.balance
}),
[UPDATE_TOTAL_BALANCE]: (state, action) => _extends$d({}, state, {
[UPDATE_TOTAL_BALANCE]: (state, action) => _extends$e({}, state, {
totalBalance: action.data.totalBalance
}),
[CHECK_ADDRESS_IS_MINE_STARTED]: state => _extends$d({}, state, {
[CHECK_ADDRESS_IS_MINE_STARTED]: state => _extends$e({}, state, {
checkingAddressOwnership: true
}),
[CHECK_ADDRESS_IS_MINE_COMPLETED]: state => _extends$d({}, state, {
[CHECK_ADDRESS_IS_MINE_COMPLETED]: state => _extends$e({}, state, {
checkingAddressOwnership: false
}),
[SET_DRAFT_TRANSACTION_AMOUNT]: (state, action) => {
const oldDraft = state.draftTransaction;
const newDraft = _extends$d({}, oldDraft, { amount: parseFloat(action.data.amount) });
const newDraft = _extends$e({}, oldDraft, { amount: parseFloat(action.data.amount) });
return _extends$d({}, state, { draftTransaction: newDraft });
return _extends$e({}, state, { draftTransaction: newDraft });
},
[SET_DRAFT_TRANSACTION_ADDRESS]: (state, action) => {
const oldDraft = state.draftTransaction;
const newDraft = _extends$d({}, oldDraft, { address: action.data.address });
const newDraft = _extends$e({}, oldDraft, { address: action.data.address });
return _extends$d({}, state, { draftTransaction: newDraft });
return _extends$e({}, state, { draftTransaction: newDraft });
},
[SEND_TRANSACTION_STARTED]: state => {
const newDraftTransaction = _extends$d({}, state.draftTransaction, { sending: true });
const newDraftTransaction = _extends$e({}, state.draftTransaction, { sending: true });
return _extends$d({}, state, { draftTransaction: newDraftTransaction });
return _extends$e({}, state, { draftTransaction: newDraftTransaction });
},
[SEND_TRANSACTION_COMPLETED]: state => Object.assign({}, state, {
@ -4650,103 +4710,103 @@ const walletReducer = handleActions({
error: action.data.error
});
return _extends$d({}, state, { draftTransaction: newDraftTransaction });
return _extends$e({}, state, { draftTransaction: newDraftTransaction });
},
[SUPPORT_TRANSACTION_STARTED]: state => _extends$d({}, state, {
[SUPPORT_TRANSACTION_STARTED]: state => _extends$e({}, state, {
sendingSupport: true
}),
[SUPPORT_TRANSACTION_COMPLETED]: state => _extends$d({}, state, {
[SUPPORT_TRANSACTION_COMPLETED]: state => _extends$e({}, state, {
sendingSupport: false
}),
[SUPPORT_TRANSACTION_FAILED]: (state, action) => _extends$d({}, state, {
[SUPPORT_TRANSACTION_FAILED]: (state, action) => _extends$e({}, state, {
error: action.data.error,
sendingSupport: false
}),
[WALLET_STATUS_COMPLETED]: (state, action) => _extends$d({}, state, {
[WALLET_STATUS_COMPLETED]: (state, action) => _extends$e({}, state, {
walletIsEncrypted: action.result
}),
[WALLET_ENCRYPT_START]: state => _extends$d({}, state, {
[WALLET_ENCRYPT_START]: state => _extends$e({}, state, {
walletEncryptPending: true,
walletEncryptSucceded: null,
walletEncryptResult: null
}),
[WALLET_ENCRYPT_COMPLETED]: (state, action) => _extends$d({}, state, {
[WALLET_ENCRYPT_COMPLETED]: (state, action) => _extends$e({}, state, {
walletEncryptPending: false,
walletEncryptSucceded: true,
walletEncryptResult: action.result
}),
[WALLET_ENCRYPT_FAILED]: (state, action) => _extends$d({}, state, {
[WALLET_ENCRYPT_FAILED]: (state, action) => _extends$e({}, state, {
walletEncryptPending: false,
walletEncryptSucceded: false,
walletEncryptResult: action.result
}),
[WALLET_DECRYPT_START]: state => _extends$d({}, state, {
[WALLET_DECRYPT_START]: state => _extends$e({}, state, {
walletDecryptPending: true,
walletDecryptSucceded: null,
walletDecryptResult: null
}),
[WALLET_DECRYPT_COMPLETED]: (state, action) => _extends$d({}, state, {
[WALLET_DECRYPT_COMPLETED]: (state, action) => _extends$e({}, state, {
walletDecryptPending: false,
walletDecryptSucceded: true,
walletDecryptResult: action.result
}),
[WALLET_DECRYPT_FAILED]: (state, action) => _extends$d({}, state, {
[WALLET_DECRYPT_FAILED]: (state, action) => _extends$e({}, state, {
walletDecryptPending: false,
walletDecryptSucceded: false,
walletDecryptResult: action.result
}),
[WALLET_UNLOCK_START]: state => _extends$d({}, state, {
[WALLET_UNLOCK_START]: state => _extends$e({}, state, {
walletUnlockPending: true,
walletUnlockSucceded: null,
walletUnlockResult: null
}),
[WALLET_UNLOCK_COMPLETED]: (state, action) => _extends$d({}, state, {
[WALLET_UNLOCK_COMPLETED]: (state, action) => _extends$e({}, state, {
walletUnlockPending: false,
walletUnlockSucceded: true,
walletUnlockResult: action.result
}),
[WALLET_UNLOCK_FAILED]: (state, action) => _extends$d({}, state, {
[WALLET_UNLOCK_FAILED]: (state, action) => _extends$e({}, state, {
walletUnlockPending: false,
walletUnlockSucceded: false,
walletUnlockResult: action.result
}),
[WALLET_LOCK_START]: state => _extends$d({}, state, {
[WALLET_LOCK_START]: state => _extends$e({}, state, {
walletLockPending: false,
walletLockSucceded: null,
walletLockResult: null
}),
[WALLET_LOCK_COMPLETED]: (state, action) => _extends$d({}, state, {
[WALLET_LOCK_COMPLETED]: (state, action) => _extends$e({}, state, {
walletLockPending: false,
walletLockSucceded: true,
walletLockResult: action.result
}),
[WALLET_LOCK_FAILED]: (state, action) => _extends$d({}, state, {
[WALLET_LOCK_FAILED]: (state, action) => _extends$e({}, state, {
walletLockPending: false,
walletLockSucceded: false,
walletLockResult: action.result
}),
[SET_TRANSACTION_LIST_FILTER]: (state, action) => _extends$d({}, state, {
[SET_TRANSACTION_LIST_FILTER]: (state, action) => _extends$e({}, state, {
transactionListFilter: action.data
}),
[UPDATE_CURRENT_HEIGHT]: (state, action) => _extends$d({}, state, {
[UPDATE_CURRENT_HEIGHT]: (state, action) => _extends$e({}, state, {
latestBlock: action.data
})
}, defaultState$a);
@ -4762,14 +4822,14 @@ const makeSelectContentPositionForUri = uri => reselect.createSelector(selectSta
return state.positions[id] ? state.positions[id][outpoint] : null;
});
var _extends$e = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _extends$f = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
const selectState$7 = state => state.notifications || {};
const selectToast = reselect.createSelector(selectState$7, state => {
if (state.toasts.length) {
const { id, params } = state.toasts[0];
return _extends$e({
return _extends$f({
id
}, params);
}
@ -4826,7 +4886,6 @@ const selectFollowedTags = reselect.createSelector(selectFollowedTagsList, follo
const selectUnfollowedTags = reselect.createSelector(selectKnownTagsByName, selectFollowedTagsList, (tagsByName, followedTags) => {
const followedTagsSet = new Set(followedTags);
let tagsToReturn = [];
Object.keys(tagsByName).forEach(key => {
if (!followedTagsSet.has(key)) {
const { name } = tagsByName[key];
@ -4837,6 +4896,10 @@ const selectUnfollowedTags = reselect.createSelector(selectKnownTagsByName, sele
return tagsToReturn;
});
const makeSelectIsFollowingTag = tag => reselect.createSelector(selectFollowedTags, followedTags => {
return followedTags.some(followedTag => followedTag.name === tag.toLowerCase());
});
//
const selectState$a = state => state.blocked || {};
@ -4898,6 +4961,7 @@ exports.doFileGet = doFileGet;
exports.doFileList = doFileList;
exports.doFocusSearchInput = doFocusSearchInput;
exports.doGetNewAddress = doGetNewAddress;
exports.doPopulateSharedUserState = doPopulateSharedUserState;
exports.doPrepareEdit = doPrepareEdit;
exports.doPublish = doPublish;
exports.doPurchaseUri = doPurchaseUri;
@ -4956,6 +5020,7 @@ exports.makeSelectFileInfoForUri = makeSelectFileInfoForUri;
exports.makeSelectFileNameForUri = makeSelectFileNameForUri;
exports.makeSelectFilePartlyDownloaded = makeSelectFilePartlyDownloaded;
exports.makeSelectFirstRecommendedFileForUri = makeSelectFirstRecommendedFileForUri;
exports.makeSelectIsFollowingTag = makeSelectIsFollowingTag;
exports.makeSelectIsUriResolving = makeSelectIsUriResolving;
exports.makeSelectLoadingForUri = makeSelectLoadingForUri;
exports.makeSelectMediaTypeForUri = makeSelectMediaTypeForUri;
@ -5001,6 +5066,8 @@ exports.selectClaimSearchByQuery = selectClaimSearchByQuery;
exports.selectClaimSearchByQueryLastPageReached = selectClaimSearchByQueryLastPageReached;
exports.selectClaimsById = selectClaimsById;
exports.selectClaimsByUri = selectClaimsByUri;
exports.selectCreateChannelError = selectCreateChannelError;
exports.selectCreatingChannel = selectCreatingChannel;
exports.selectCurrentChannelPage = selectCurrentChannelPage;
exports.selectDownloadedUris = selectDownloadedUris;
exports.selectDownloadingByOutpoint = selectDownloadingByOutpoint;

View file

@ -229,9 +229,14 @@ export const FETCH_DATE = 'FETCH_DATE';
export const FETCH_COST_INFO_STARTED = 'FETCH_COST_INFO_STARTED';
export const FETCH_COST_INFO_COMPLETED = 'FETCH_COST_INFO_COMPLETED';
export const FETCH_COST_INFO_FAILED = 'FETCH_COST_INFO_FAILED';
// Tags
export const TOGGLE_TAG_FOLLOW = 'TOGGLE_TAG_FOLLOW';
export const TAG_ADD = 'TAG_ADD';
export const TAG_DELETE = 'TAG_DELETE';
// Blocked Channels
export const TOGGLE_BLOCK_CHANNEL = 'TOGGLE_BLOCK_CHANNEL';
// Sync
export const USER_STATE_POPULATE = 'USER_STATE_POPULATE';

View file

@ -113,6 +113,8 @@ export { doCommentList, doCommentCreate } from 'redux/actions/comments';
export { doToggleBlockChannel } from 'redux/actions/blocked';
export { doPopulateSharedUserState } from 'redux/actions/sync';
// utils
export { batchActions } from 'util/batch-actions';
export { parseQueryParams, toQueryString } from 'util/query-params';
@ -202,6 +204,8 @@ export {
selectClaimSearchByQueryLastPageReached,
selectUpdatingChannel,
selectUpdateChannelError,
selectCreatingChannel,
selectCreateChannelError,
} from 'redux/selectors/claims';
export { makeSelectCommentsForUri } from 'redux/selectors/comments';
@ -281,7 +285,11 @@ export {
selectTransactionListFilter,
} from 'redux/selectors/wallet';
export { selectFollowedTags, selectUnfollowedTags } from 'redux/selectors/tags';
export {
selectFollowedTags,
selectUnfollowedTags,
makeSelectIsFollowingTag,
} from 'redux/selectors/tags';
export {
selectBlockedChannels,

View file

@ -275,7 +275,7 @@ export function doCreateChannel(name: string, amount: number, optionalParams: an
.catch(error => {
dispatch({
type: ACTIONS.CREATE_CHANNEL_FAILED,
data: error,
data: error.message,
});
})
);

30
src/redux/actions/sync.js Normal file
View file

@ -0,0 +1,30 @@
// @flow
import * as ACTIONS from 'constants/action_types';
type v0Data = {
version: '0.1',
shared: {
subscriptions?: Array<string>,
tags?: Array<string>,
},
};
function extractUserState(rawObj: v0Data) {
if (rawObj && rawObj.version === '0.1' && rawObj.shared) {
const { subscriptions, tags } = rawObj.shared;
return {
...(subscriptions ? { subscriptions } : {}),
...(tags ? { tags } : {}),
};
}
return {};
}
export function doPopulateSharedUserState(settings: any) {
return (dispatch: Dispatch) => {
const { subscriptions, tags } = extractUserState(settings);
dispatch({ type: ACTIONS.USER_STATE_POPULATE, data: { subscriptions, tags } });
};
}

View file

@ -12,18 +12,20 @@ import * as ACTIONS from 'constants/action_types';
import { buildURI, parseURI } from 'lbryURI';
type State = {
createChannelError: ?string,
channelClaimCounts: { [string]: number },
claimsByUri: { [string]: string },
byId: { [string]: Claim },
resolvingUris: Array<string>,
pendingById: { [string]: Claim },
myChannelClaims: Set<string>,
myChannelClaims: ?Set<string>,
abandoningById: { [string]: boolean },
fetchingChannelClaims: { [string]: number },
fetchingMyChannels: boolean,
fetchingClaimSearchByQuery: { [string]: boolean },
claimSearchByQuery: { [string]: Array<string> },
claimSearchByQueryLastPageReached: { [string]: Array<boolean> },
creatingChannel: boolean,
claimsByChannel: {
[string]: {
all: Array<string>,
@ -44,7 +46,7 @@ const defaultState = {
resolvingUris: [],
// This should not be a Set
// Storing sets in reducers can cause issues
myChannelClaims: new Set(),
myChannelClaims: undefined,
fetchingMyChannels: false,
abandoningById: {},
pendingById: {},
@ -54,6 +56,8 @@ const defaultState = {
fetchingClaimSearchByQuery: {},
updateChannelError: '',
updatingChannel: false,
creatingChannel: false,
createChannelError: undefined,
};
function handleClaimAction(state: State, action: any): State {
@ -186,13 +190,20 @@ reducers[ACTIONS.FETCH_CHANNEL_LIST_STARTED] = (state: State): State =>
reducers[ACTIONS.FETCH_CHANNEL_LIST_COMPLETED] = (state: State, action: any): State => {
const { claims }: { claims: Array<ChannelClaim> } = action.data;
const myChannelClaims = new Set(state.myChannelClaims);
const byId = Object.assign({}, state.byId);
claims.forEach(claim => {
myChannelClaims.add(claim.claim_id);
byId[claim.claim_id] = claim;
});
let myChannelClaims;
let byId = Object.assign({}, state.byId);
if (!claims.length) {
// $FlowFixMe
myChannelClaims = null;
} else {
myChannelClaims = new Set(state.myChannelClaims);
claims.forEach(claim => {
// $FlowFixMe
myChannelClaims.add(claim.claim_id);
byId[claim.claim_id] = claim;
});
}
return Object.assign({}, state, {
byId,
@ -282,6 +293,12 @@ reducers[ACTIONS.ABANDON_CLAIM_SUCCEEDED] = (state: State, action: any): State =
});
};
reducers[ACTIONS.CREATE_CHANNEL_STARTED] = (state: State): State => ({
...state,
creatingChannel: true,
createChannelError: null,
});
reducers[ACTIONS.CREATE_CHANNEL_COMPLETED] = (state: State, action: any): State => {
const channelClaim: ChannelClaim = action.data.channelClaim;
const byId = Object.assign({}, state.byId);
@ -293,6 +310,14 @@ reducers[ACTIONS.CREATE_CHANNEL_COMPLETED] = (state: State, action: any): State
return Object.assign({}, state, {
byId,
myChannelClaims,
creatingChannel: false,
});
};
reducers[ACTIONS.CREATE_CHANNEL_FAILED] = (state: State, action: any): State => {
return Object.assign({}, state, {
creatingChannel: false,
createChannelError: action.data,
});
};

View file

@ -14,7 +14,7 @@ function getDefaultKnownTags() {
}
const defaultState: TagState = {
followedTags: DEFAULT_FOLLOWED_TAGS,
followedTags: [],
knownTags: getDefaultKnownTags(),
};
@ -65,6 +65,16 @@ export const tagsReducer = handleActions(
followedTags: newFollowedTags,
};
},
[ACTIONS.USER_STATE_POPULATE]: (
state: TagState,
action: { data: { tags: ?Array<string> } }
) => {
const { tags } = action.data;
return {
...state,
followedTags: tags && tags.length ? tags : DEFAULT_FOLLOWED_TAGS,
};
},
},
defaultState
);

View file

@ -18,6 +18,16 @@ export const selectCurrentChannelPage = createSelector(
state => state.currentChannelPage || 1
);
export const selectCreatingChannel = createSelector(
selectState,
state => state.creatingChannel
);
export const selectCreateChannelError = createSelector(
selectState,
state => state.createChannelError
);
export const selectClaimsByUri = createSelector(
selectState,
selectClaimsById,
@ -350,9 +360,12 @@ export const selectMyChannelClaims = createSelector(
selectState,
selectClaimsById,
(state, byId) => {
const ids = state.myChannelClaims || [];
const claims = [];
const ids = state.myChannelClaims;
if (!ids) {
return ids;
}
const claims = [];
ids.forEach(id => {
if (byId[id]) {
// I'm not sure why this check is necessary, but it ought to be a quick fix for https://github.com/lbryio/lbry-desktop/issues/544

View file

@ -16,7 +16,9 @@ export const selectFollowedTagsList = createSelector(
export const selectFollowedTags = createSelector(
selectFollowedTagsList,
(followedTags: Array<string>): Array<Tag> =>
followedTags.map(tag => ({ name: tag.toLowerCase() })).sort((a, b) => a.name.localeCompare(b.name))
followedTags
.map(tag => ({ name: tag.toLowerCase() }))
.sort((a, b) => a.name.localeCompare(b.name))
);
export const selectUnfollowedTags = createSelector(
@ -25,7 +27,6 @@ export const selectUnfollowedTags = createSelector(
(tagsByName: KnownTags, followedTags: Array<string>): Array<Tag> => {
const followedTagsSet = new Set(followedTags);
let tagsToReturn = [];
Object.keys(tagsByName).forEach(key => {
if (!followedTagsSet.has(key)) {
const { name } = tagsByName[key];
@ -36,3 +37,11 @@ export const selectUnfollowedTags = createSelector(
return tagsToReturn;
}
);
export const makeSelectIsFollowingTag = (tag: string) =>
createSelector(
selectFollowedTags,
followedTags => {
return followedTags.some(followedTag => followedTag.name === tag.toLowerCase());
}
);