Compare commits

..

No commits in common. "master" and "playlist-fetch-changes" have entirely different histories.

12 changed files with 82 additions and 240 deletions

112
dist/bundle.es.js vendored
View file

@ -2,12 +2,9 @@
Object.defineProperty(exports, '__esModule', { value: true }); Object.defineProperty(exports, '__esModule', { value: true });
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
require('proxy-polyfill'); require('proxy-polyfill');
var uuid = require('uuid'); var uuid = require('uuid');
var reselect = require('reselect'); var reselect = require('reselect');
var fromEntries = _interopDefault(require('@ungap/from-entries'));
const MINIMUM_PUBLISH_BID = 0.00000001; const MINIMUM_PUBLISH_BID = 0.00000001;
@ -719,7 +716,7 @@ const INSTANT_PURCHASE_MAX = 'instant_purchase_max';
const THEME = 'theme'; const THEME = 'theme';
const THEMES = 'themes'; const THEMES = 'themes';
const AUTOMATIC_DARK_MODE_ENABLED = 'automatic_dark_mode_enabled'; const AUTOMATIC_DARK_MODE_ENABLED = 'automatic_dark_mode_enabled';
const AUTOPLAY_MEDIA = 'autoplay'; const AUTOPLAY = 'autoplay';
const AUTOPLAY_NEXT = 'autoplay_next'; const AUTOPLAY_NEXT = 'autoplay_next';
const OS_NOTIFICATIONS_ENABLED = 'os_notifications_enabled'; const OS_NOTIFICATIONS_ENABLED = 'os_notifications_enabled';
const AUTO_DOWNLOAD = 'auto_download'; const AUTO_DOWNLOAD = 'auto_download';
@ -770,7 +767,7 @@ var settings = /*#__PURE__*/Object.freeze({
THEME: THEME, THEME: THEME,
THEMES: THEMES, THEMES: THEMES,
AUTOMATIC_DARK_MODE_ENABLED: AUTOMATIC_DARK_MODE_ENABLED, AUTOMATIC_DARK_MODE_ENABLED: AUTOMATIC_DARK_MODE_ENABLED,
AUTOPLAY_MEDIA: AUTOPLAY_MEDIA, AUTOPLAY: AUTOPLAY,
AUTOPLAY_NEXT: AUTOPLAY_NEXT, AUTOPLAY_NEXT: AUTOPLAY_NEXT,
OS_NOTIFICATIONS_ENABLED: OS_NOTIFICATIONS_ENABLED, OS_NOTIFICATIONS_ENABLED: OS_NOTIFICATIONS_ENABLED,
AUTO_DOWNLOAD: AUTO_DOWNLOAD, AUTO_DOWNLOAD: AUTO_DOWNLOAD,
@ -1040,7 +1037,7 @@ var daemon_settings = /*#__PURE__*/Object.freeze({
const SDK_SYNC_KEYS = [LBRYUM_SERVERS, SHARE_USAGE_DATA]; const SDK_SYNC_KEYS = [LBRYUM_SERVERS, SHARE_USAGE_DATA];
// CLIENT // CLIENT
const CLIENT_SYNC_KEYS = [SHOW_MATURE, HIDE_REPOSTS, SHOW_ANONYMOUS, INSTANT_PURCHASE_ENABLED, INSTANT_PURCHASE_MAX, THEME, AUTOPLAY_MEDIA, AUTOPLAY_NEXT, HIDE_BALANCE, HIDE_SPLASH_ANIMATION, FLOATING_PLAYER, DARK_MODE_TIMES, AUTOMATIC_DARK_MODE_ENABLED, LANGUAGE]; const CLIENT_SYNC_KEYS = [SHOW_MATURE, HIDE_REPOSTS, SHOW_ANONYMOUS, INSTANT_PURCHASE_ENABLED, INSTANT_PURCHASE_MAX, THEME, AUTOPLAY, HIDE_BALANCE, HIDE_SPLASH_ANIMATION, FLOATING_PLAYER, DARK_MODE_TIMES, AUTOMATIC_DARK_MODE_ENABLED];
var shared_preferences = /*#__PURE__*/Object.freeze({ var shared_preferences = /*#__PURE__*/Object.freeze({
SDK_SYNC_KEYS: SDK_SYNC_KEYS, SDK_SYNC_KEYS: SDK_SYNC_KEYS,
@ -3651,7 +3648,7 @@ const makeSelectCollectionIsMine = id => reselect.createSelector(selectMyCollect
const selectMyPublishedCollections = reselect.createSelector(selectResolvedCollections, selectPendingCollections, selectMyEditedCollections, selectMyCollectionIds, (resolved, pending, edited, myIds) => { const selectMyPublishedCollections = reselect.createSelector(selectResolvedCollections, selectPendingCollections, selectMyEditedCollections, selectMyCollectionIds, (resolved, pending, edited, myIds) => {
// all resolved in myIds, plus those in pending and edited // all resolved in myIds, plus those in pending and edited
const myPublishedCollections = fromEntries(Object.entries(pending).concat(Object.entries(resolved).filter(([key, val]) => myIds.includes(key) && const myPublishedCollections = Object.fromEntries(Object.entries(pending).concat(Object.entries(resolved).filter(([key, val]) => myIds.includes(key) &&
// $FlowFixMe // $FlowFixMe
!pending[key]))); !pending[key])));
// now add in edited: // now add in edited:
@ -3662,7 +3659,7 @@ const selectMyPublishedCollections = reselect.createSelector(selectResolvedColle
}); });
const selectMyPublishedMixedCollections = reselect.createSelector(selectMyPublishedCollections, published => { const selectMyPublishedMixedCollections = reselect.createSelector(selectMyPublishedCollections, published => {
const myCollections = fromEntries( const myCollections = Object.fromEntries(
// $FlowFixMe // $FlowFixMe
Object.entries(published).filter(([key, collection]) => { Object.entries(published).filter(([key, collection]) => {
// $FlowFixMe // $FlowFixMe
@ -3672,7 +3669,7 @@ const selectMyPublishedMixedCollections = reselect.createSelector(selectMyPublis
}); });
const selectMyPublishedPlaylistCollections = reselect.createSelector(selectMyPublishedCollections, published => { const selectMyPublishedPlaylistCollections = reselect.createSelector(selectMyPublishedCollections, published => {
const myCollections = fromEntries( const myCollections = Object.fromEntries(
// $FlowFixMe // $FlowFixMe
Object.entries(published).filter(([key, collection]) => { Object.entries(published).filter(([key, collection]) => {
// $FlowFixMe // $FlowFixMe
@ -3687,7 +3684,7 @@ const makeSelectMyPublishedCollectionForId = id => reselect.createSelector(selec
// selectResolvedCollections, // selectResolvedCollections,
// selectSavedCollectionIds, // selectSavedCollectionIds,
// (resolved, myIds) => { // (resolved, myIds) => {
// const mySavedCollections = fromEntries( // const mySavedCollections = Object.fromEntries(
// Object.entries(resolved).filter(([key, val]) => myIds.includes(key)) // Object.entries(resolved).filter(([key, val]) => myIds.includes(key))
// ); // );
// return mySavedCollections; // return mySavedCollections;
@ -3730,51 +3727,23 @@ const makeSelectClaimIdsForCollectionId = id => reselect.createSelector(makeSele
return ids; return ids;
}); });
const makeSelectIndexForUrlInCollection = (url, id) => reselect.createSelector(state => state.content.shuffleList, makeSelectUrlsForCollectionId(id), makeSelectClaimForUri(url), (shuffleState, urls, claim) => { const makeSelectIndexForUrlInCollection = (url, id) => reselect.createSelector(makeSelectUrlsForCollectionId(id), makeSelectClaimForUri(url), (urls, claim) => {
const shuffleUrls = shuffleState && shuffleState.collectionId === id && shuffleState.newUrls; const index = urls && urls.findIndex(u => u === url);
const listUrls = shuffleUrls || urls;
const index = listUrls && listUrls.findIndex(u => u === url);
if (index > -1) { if (index > -1) {
return index; return index;
} else if (claim) { } else if (claim) {
const index = listUrls && listUrls.findIndex(u => u === claim.permanent_url); const index = urls && urls.findIndex(u => u === claim.permanent_url);
if (index > -1) return index; if (index > -1) return index;
return claim; return claim;
} }
return null; return null;
}); });
const makeSelectPreviousUrlForCollectionAndUrl = (id, url) => reselect.createSelector(state => state.content.shuffleList, state => state.content.loopList, makeSelectIndexForUrlInCollection(url, id), makeSelectUrlsForCollectionId(id), (shuffleState, loopState, index, urls) => { const makeSelectNextUrlForCollectionAndUrl = (id, url) => reselect.createSelector(makeSelectIndexForUrlInCollection(url, id), selectClaimsByUri, makeSelectUrlsForCollectionId(id), (index, claims, urls) => {
const loopList = loopState && loopState.collectionId === id && loopState.loop;
const shuffleUrls = shuffleState && shuffleState.collectionId === id && shuffleState.newUrls;
if (index > -1) { if (index > -1) {
const listUrls = shuffleUrls || urls;
let nextUrl;
if (index === 0 && loopList) {
nextUrl = listUrls[listUrls.length - 1];
} else {
nextUrl = listUrls[index - 1];
}
return nextUrl || null;
} else {
return null;
}
});
const makeSelectNextUrlForCollectionAndUrl = (id, url) => reselect.createSelector(state => state.content.shuffleList, state => state.content.loopList, makeSelectIndexForUrlInCollection(url, id), makeSelectUrlsForCollectionId(id), (shuffleState, loopState, index, urls) => {
const loopList = loopState && loopState.collectionId === id && loopState.loop;
const shuffleUrls = shuffleState && shuffleState.collectionId === id && shuffleState.newUrls;
if (index > -1) {
const listUrls = shuffleUrls || urls;
// We'll get the next playble url // We'll get the next playble url
let remainingUrls = listUrls.slice(index + 1); const remainingUrls = urls.slice(index + 1);
if (!remainingUrls.length && loopList) { const nextUrl = remainingUrls.find(u => claims[u].value.stream_type && (claims[u].value.stream_type === 'video' || claims[u].value.stream_type === 'audio'));
remainingUrls = listUrls.slice(0);
}
const nextUrl = remainingUrls && remainingUrls[0];
return nextUrl || null; return nextUrl || null;
} else { } else {
return null; return null;
@ -3790,13 +3759,7 @@ const makeSelectCountForCollectionId = id => reselect.createSelector(makeSelectC
if (collection.itemCount !== undefined) { if (collection.itemCount !== undefined) {
return collection.itemCount; return collection.itemCount;
} }
let itemCount = 0; return collection.items.length;
collection.items.map(item => {
if (item) {
itemCount += 1;
}
});
return itemCount;
} }
return null; return null;
}); });
@ -4502,15 +4465,11 @@ function doCollectionPublish(options, localId) {
}; };
} }
function doCollectionPublishUpdate(options, isBackgroundUpdate) { function doCollectionPublishUpdate(options) {
return (dispatch, getState) => { return dispatch => {
// TODO: implement one click update // TODO: implement one click update
const updateParams = isBackgroundUpdate ? { const updateParams = {
blocking: true,
claim_id: options.claim_id,
clear_claims: true
} : {
bid: creditsToString(options.bid), bid: creditsToString(options.bid),
title: options.title, title: options.title,
thumbnail_url: options.thumbnail_url, thumbnail_url: options.thumbnail_url,
@ -4520,25 +4479,16 @@ function doCollectionPublishUpdate(options, isBackgroundUpdate) {
locations: [], locations: [],
blocking: true, blocking: true,
claim_id: options.claim_id, claim_id: options.claim_id,
clear_claims: true, clear_claims: true
replace: true
}; };
if (isBackgroundUpdate && updateParams.claim_id) {
const state = getState();
updateParams['claims'] = makeSelectClaimIdsForCollectionId(updateParams.claim_id)(state);
} else if (options.claims) {
updateParams['claims'] = options.claims;
}
if (options.tags) { if (options.tags) {
updateParams['tags'] = options.tags.map(tag => tag.name); updateParams['tags'] = options.tags.map(tag => tag.name);
} }
if (options.channel_id) { if (options.claims) {
updateParams['channel_id'] = options.channel_id; updateParams['claims'] = options.claims;
} }
return new Promise(resolve => { return new Promise(resolve => {
dispatch({ dispatch({
type: COLLECTION_PUBLISH_UPDATE_STARTED type: COLLECTION_PUBLISH_UPDATE_STARTED
@ -5633,7 +5583,7 @@ const doUpdatePublishForm = publishFormValue => dispatch => dispatch({
data: _extends$7({}, publishFormValue) data: _extends$7({}, publishFormValue)
}); });
const doUploadThumbnail = (filePath, thumbnailBlob, fsAdapter, fs, path, cb) => dispatch => { const doUploadThumbnail = (filePath, thumbnailBlob, fsAdapter, fs, path) => dispatch => {
const downMessage = __('Thumbnail upload service may be down, try again later.'); const downMessage = __('Thumbnail upload service may be down, try again later.');
let thumbnail, fileExt, fileName, fileType; let thumbnail, fileExt, fileName, fileType;
@ -5667,17 +5617,13 @@ const doUploadThumbnail = (filePath, thumbnailBlob, fsAdapter, fs, path, cb) =>
method: 'POST', method: 'POST',
body: data body: data
}).then(res => res.text()).then(text => text.length ? JSON.parse(text) : {}).then(json => { }).then(res => res.text()).then(text => text.length ? JSON.parse(text) : {}).then(json => {
if (!json.success) return uploadError(json.message || downMessage); return json.success ? dispatch({
if (cb) {
cb(json.data.serveUrl);
}
return dispatch({
type: UPDATE_PUBLISH_FORM, type: UPDATE_PUBLISH_FORM,
data: { data: {
uploadThumbnailStatus: COMPLETE, uploadThumbnailStatus: COMPLETE,
thumbnail: json.data.serveUrl thumbnail: json.data.serveUrl
} }
}); }) : uploadError(json.message || downMessage);
}).catch(err => { }).catch(err => {
let message = err.message; let message = err.message;
@ -7772,15 +7718,8 @@ const collectionsReducer = handleActions({
[COLLECTION_PENDING]: (state, action) => { [COLLECTION_PENDING]: (state, action) => {
const { localId, claimId } = action.data; const { localId, claimId } = action.data;
const { const { edited: editList, unpublished: unpublishedList, pending: pendingList } = state;
resolved: resolvedList,
edited: editList,
unpublished: unpublishedList,
pending: pendingList
} = state;
const newEditList = Object.assign({}, editList); const newEditList = Object.assign({}, editList);
const newResolvedList = Object.assign({}, resolvedList);
const newUnpublishedList = Object.assign({}, unpublishedList); const newUnpublishedList = Object.assign({}, unpublishedList);
const newPendingList = Object.assign({}, pendingList); const newPendingList = Object.assign({}, pendingList);
@ -7790,7 +7729,7 @@ const collectionsReducer = handleActions({
delete newUnpublishedList[localId]; delete newUnpublishedList[localId];
} else { } else {
// edit update // edit update
newPendingList[claimId] = Object.assign({}, newEditList[claimId] || newResolvedList[claimId]); newPendingList[claimId] = Object.assign({}, newEditList[claimId]);
delete newEditList[claimId]; delete newEditList[claimId];
} }
@ -8107,7 +8046,6 @@ exports.makeSelectPendingAmountByUri = makeSelectPendingAmountByUri;
exports.makeSelectPendingClaimForUri = makeSelectPendingClaimForUri; exports.makeSelectPendingClaimForUri = makeSelectPendingClaimForUri;
exports.makeSelectPendingCollectionForId = makeSelectPendingCollectionForId; exports.makeSelectPendingCollectionForId = makeSelectPendingCollectionForId;
exports.makeSelectPermanentUrlForUri = makeSelectPermanentUrlForUri; exports.makeSelectPermanentUrlForUri = makeSelectPermanentUrlForUri;
exports.makeSelectPreviousUrlForCollectionAndUrl = makeSelectPreviousUrlForCollectionAndUrl;
exports.makeSelectPublishFormValue = makeSelectPublishFormValue; exports.makeSelectPublishFormValue = makeSelectPublishFormValue;
exports.makeSelectPublishedCollectionForId = makeSelectPublishedCollectionForId; exports.makeSelectPublishedCollectionForId = makeSelectPublishedCollectionForId;
exports.makeSelectReflectingClaimForUri = makeSelectReflectingClaimForUri; exports.makeSelectReflectingClaimForUri = makeSelectReflectingClaimForUri;

View file

@ -1,5 +0,0 @@
// @flow
declare module '@ungap/from-entries' {
declare module.exports: any;
}

View file

@ -1,5 +0,0 @@
// @flow
declare module '@ungap/from-entries' {
declare module.exports: any;
}

View file

@ -29,7 +29,6 @@
"test": "jest" "test": "jest"
}, },
"dependencies": { "dependencies": {
"@ungap/from-entries": "^0.2.1",
"proxy-polyfill": "0.1.6", "proxy-polyfill": "0.1.6",
"reselect": "^3.0.0", "reselect": "^3.0.0",
"uuid": "^8.3.1" "uuid": "^8.3.1"

View file

@ -23,7 +23,7 @@ export const INSTANT_PURCHASE_MAX = 'instant_purchase_max';
export const THEME = 'theme'; export const THEME = 'theme';
export const THEMES = 'themes'; export const THEMES = 'themes';
export const AUTOMATIC_DARK_MODE_ENABLED = 'automatic_dark_mode_enabled'; export const AUTOMATIC_DARK_MODE_ENABLED = 'automatic_dark_mode_enabled';
export const AUTOPLAY_MEDIA = 'autoplay'; export const AUTOPLAY = 'autoplay';
export const AUTOPLAY_NEXT = 'autoplay_next'; export const AUTOPLAY_NEXT = 'autoplay_next';
export const OS_NOTIFICATIONS_ENABLED = 'os_notifications_enabled'; export const OS_NOTIFICATIONS_ENABLED = 'os_notifications_enabled';
export const AUTO_DOWNLOAD = 'auto_download'; export const AUTO_DOWNLOAD = 'auto_download';

View file

@ -21,12 +21,10 @@ export const CLIENT_SYNC_KEYS = [
SETTINGS.INSTANT_PURCHASE_ENABLED, SETTINGS.INSTANT_PURCHASE_ENABLED,
SETTINGS.INSTANT_PURCHASE_MAX, SETTINGS.INSTANT_PURCHASE_MAX,
SETTINGS.THEME, SETTINGS.THEME,
SETTINGS.AUTOPLAY_MEDIA, SETTINGS.AUTOPLAY,
SETTINGS.AUTOPLAY_NEXT,
SETTINGS.HIDE_BALANCE, SETTINGS.HIDE_BALANCE,
SETTINGS.HIDE_SPLASH_ANIMATION, SETTINGS.HIDE_SPLASH_ANIMATION,
SETTINGS.FLOATING_PLAYER, SETTINGS.FLOATING_PLAYER,
SETTINGS.DARK_MODE_TIMES, SETTINGS.DARK_MODE_TIMES,
SETTINGS.AUTOMATIC_DARK_MODE_ENABLED, SETTINGS.AUTOMATIC_DARK_MODE_ENABLED,
SETTINGS.LANGUAGE,
]; ];

View file

@ -183,7 +183,6 @@ export {
makeSelectCountForCollectionId, makeSelectCountForCollectionId,
makeSelectIsResolvingCollectionForId, makeSelectIsResolvingCollectionForId,
makeSelectIndexForUrlInCollection, makeSelectIndexForUrlInCollection,
makeSelectPreviousUrlForCollectionAndUrl,
makeSelectNextUrlForCollectionAndUrl, makeSelectNextUrlForCollectionAndUrl,
makeSelectCollectionForIdHasClaimUrl, makeSelectCollectionForIdHasClaimUrl,
} from 'redux/selectors/collections'; } from 'redux/selectors/collections';

View file

@ -19,10 +19,7 @@ import { creditsToString } from 'util/format-credits';
import { batchActions } from 'util/batch-actions'; import { batchActions } from 'util/batch-actions';
import { createNormalizedClaimSearchKey } from 'util/claim'; import { createNormalizedClaimSearchKey } from 'util/claim';
import { PAGE_SIZE } from 'constants/claim'; import { PAGE_SIZE } from 'constants/claim';
import { import { selectPendingCollections } from 'redux/selectors/collections';
selectPendingCollections,
makeSelectClaimIdsForCollectionId,
} from 'redux/selectors/collections';
import { import {
doFetchItemsInCollection, doFetchItemsInCollection,
doFetchItemsInCollections, doFetchItemsInCollections,
@ -831,22 +828,18 @@ export function doCollectionPublish(
}; };
} }
export function doCollectionPublishUpdate( export function doCollectionPublishUpdate(options: {
options: { bid?: string,
bid?: string, blocking?: true,
blocking?: true, title?: string,
title?: string, thumbnail_url?: string,
thumbnail_url?: string, description?: string,
description?: string, claim_id: string,
claim_id: string, tags?: Array<Tag>,
tags?: Array<Tag>, languages?: Array<string>,
languages?: Array<string>, claims?: Array<string>,
claims?: Array<string>, }) {
channel_id?: string, return (dispatch: Dispatch): Promise<any> => {
},
isBackgroundUpdate?: boolean
) {
return (dispatch: Dispatch, getState: GetState): Promise<any> => {
// TODO: implement one click update // TODO: implement one click update
const updateParams: { const updateParams: {
@ -854,49 +847,32 @@ export function doCollectionPublishUpdate(
blocking?: true, blocking?: true,
title?: string, title?: string,
thumbnail_url?: string, thumbnail_url?: string,
channel_id?: string,
description?: string, description?: string,
claim_id: string, claim_id: string,
tags?: Array<string>, tags?: Array<string>,
languages?: Array<string>, languages?: Array<string>,
claims?: Array<string>, claims?: Array<string>,
clear_claims: boolean, clear_claims: boolean,
replace?: boolean, } = {
} = isBackgroundUpdate bid: creditsToString(options.bid),
? { title: options.title,
blocking: true, thumbnail_url: options.thumbnail_url,
claim_id: options.claim_id, description: options.description,
clear_claims: true, tags: [],
} languages: options.languages || [],
: { locations: [],
bid: creditsToString(options.bid), blocking: true,
title: options.title, claim_id: options.claim_id,
thumbnail_url: options.thumbnail_url, clear_claims: true,
description: options.description, };
tags: [],
languages: options.languages || [],
locations: [],
blocking: true,
claim_id: options.claim_id,
clear_claims: true,
replace: true,
};
if (isBackgroundUpdate && updateParams.claim_id) {
const state = getState();
updateParams['claims'] = makeSelectClaimIdsForCollectionId(updateParams.claim_id)(state);
} else if (options.claims) {
updateParams['claims'] = options.claims;
}
if (options.tags) { if (options.tags) {
updateParams['tags'] = options.tags.map(tag => tag.name); updateParams['tags'] = options.tags.map(tag => tag.name);
} }
if (options.channel_id) { if (options.claims) {
updateParams['channel_id'] = options.channel_id; updateParams['claims'] = options.claims;
} }
return new Promise(resolve => { return new Promise(resolve => {
dispatch({ dispatch({
type: ACTIONS.COLLECTION_PUBLISH_UPDATE_STARTED, type: ACTIONS.COLLECTION_PUBLISH_UPDATE_STARTED,

View file

@ -69,8 +69,7 @@ export const doUploadThumbnail = (
thumbnailBlob?: File, thumbnailBlob?: File,
fsAdapter?: any, fsAdapter?: any,
fs?: any, fs?: any,
path?: any, path?: any
cb?: (string) => void
) => (dispatch: Dispatch) => { ) => (dispatch: Dispatch) => {
const downMessage = __('Thumbnail upload service may be down, try again later.'); const downMessage = __('Thumbnail upload service may be down, try again later.');
let thumbnail, fileExt, fileName, fileType; let thumbnail, fileExt, fileName, fileType;
@ -113,17 +112,15 @@ export const doUploadThumbnail = (
.then(res => res.text()) .then(res => res.text())
.then(text => (text.length ? JSON.parse(text) : {})) .then(text => (text.length ? JSON.parse(text) : {}))
.then(json => { .then(json => {
if (!json.success) return uploadError(json.message || downMessage); return json.success
if (cb) { ? dispatch({
cb(json.data.serveUrl); type: ACTIONS.UPDATE_PUBLISH_FORM,
} data: {
return dispatch({ uploadThumbnailStatus: THUMBNAIL_STATUSES.COMPLETE,
type: ACTIONS.UPDATE_PUBLISH_FORM, thumbnail: json.data.serveUrl,
data: { },
uploadThumbnailStatus: THUMBNAIL_STATUSES.COMPLETE, })
thumbnail: json.data.serveUrl, : uploadError(json.message || downMessage);
},
});
}) })
.catch(err => { .catch(err => {
let message = err.message; let message = err.message;

View file

@ -90,15 +90,8 @@ const collectionsReducer = handleActions(
[ACTIONS.COLLECTION_PENDING]: (state, action) => { [ACTIONS.COLLECTION_PENDING]: (state, action) => {
const { localId, claimId } = action.data; const { localId, claimId } = action.data;
const { const { edited: editList, unpublished: unpublishedList, pending: pendingList } = state;
resolved: resolvedList,
edited: editList,
unpublished: unpublishedList,
pending: pendingList,
} = state;
const newEditList = Object.assign({}, editList); const newEditList = Object.assign({}, editList);
const newResolvedList = Object.assign({}, resolvedList);
const newUnpublishedList = Object.assign({}, unpublishedList); const newUnpublishedList = Object.assign({}, unpublishedList);
const newPendingList = Object.assign({}, pendingList); const newPendingList = Object.assign({}, pendingList);
@ -108,10 +101,7 @@ const collectionsReducer = handleActions(
delete newUnpublishedList[localId]; delete newUnpublishedList[localId];
} else { } else {
// edit update // edit update
newPendingList[claimId] = Object.assign( newPendingList[claimId] = Object.assign({}, newEditList[claimId]);
{},
newEditList[claimId] || newResolvedList[claimId]
);
delete newEditList[claimId]; delete newEditList[claimId];
} }

View file

@ -1,5 +1,4 @@
// @flow // @flow
import fromEntries from '@ungap/from-entries';
import { createSelector } from 'reselect'; import { createSelector } from 'reselect';
import { import {
selectMyCollectionIds, selectMyCollectionIds,
@ -80,7 +79,7 @@ export const selectMyPublishedCollections = createSelector(
selectMyCollectionIds, selectMyCollectionIds,
(resolved, pending, edited, myIds) => { (resolved, pending, edited, myIds) => {
// all resolved in myIds, plus those in pending and edited // all resolved in myIds, plus those in pending and edited
const myPublishedCollections = fromEntries( const myPublishedCollections = Object.fromEntries(
Object.entries(pending).concat( Object.entries(pending).concat(
Object.entries(resolved).filter( Object.entries(resolved).filter(
([key, val]) => ([key, val]) =>
@ -101,7 +100,7 @@ export const selectMyPublishedCollections = createSelector(
export const selectMyPublishedMixedCollections = createSelector( export const selectMyPublishedMixedCollections = createSelector(
selectMyPublishedCollections, selectMyPublishedCollections,
published => { published => {
const myCollections = fromEntries( const myCollections = Object.fromEntries(
// $FlowFixMe // $FlowFixMe
Object.entries(published).filter(([key, collection]) => { Object.entries(published).filter(([key, collection]) => {
// $FlowFixMe // $FlowFixMe
@ -115,7 +114,7 @@ export const selectMyPublishedMixedCollections = createSelector(
export const selectMyPublishedPlaylistCollections = createSelector( export const selectMyPublishedPlaylistCollections = createSelector(
selectMyPublishedCollections, selectMyPublishedCollections,
published => { published => {
const myCollections = fromEntries( const myCollections = Object.fromEntries(
// $FlowFixMe // $FlowFixMe
Object.entries(published).filter(([key, collection]) => { Object.entries(published).filter(([key, collection]) => {
// $FlowFixMe // $FlowFixMe
@ -136,7 +135,7 @@ export const makeSelectMyPublishedCollectionForId = (id: string) =>
// selectResolvedCollections, // selectResolvedCollections,
// selectSavedCollectionIds, // selectSavedCollectionIds,
// (resolved, myIds) => { // (resolved, myIds) => {
// const mySavedCollections = fromEntries( // const mySavedCollections = Object.fromEntries(
// Object.entries(resolved).filter(([key, val]) => myIds.includes(key)) // Object.entries(resolved).filter(([key, val]) => myIds.includes(key))
// ); // );
// return mySavedCollections; // return mySavedCollections;
@ -213,18 +212,14 @@ export const makeSelectClaimIdsForCollectionId = (id: string) =>
export const makeSelectIndexForUrlInCollection = (url: string, id: string) => export const makeSelectIndexForUrlInCollection = (url: string, id: string) =>
createSelector( createSelector(
state => state.content.shuffleList,
makeSelectUrlsForCollectionId(id), makeSelectUrlsForCollectionId(id),
makeSelectClaimForUri(url), makeSelectClaimForUri(url),
(shuffleState, urls, claim) => { (urls, claim) => {
const shuffleUrls = shuffleState && shuffleState.collectionId === id && shuffleState.newUrls; const index = urls && urls.findIndex(u => u === url);
const listUrls = shuffleUrls || urls;
const index = listUrls && listUrls.findIndex(u => u === url);
if (index > -1) { if (index > -1) {
return index; return index;
} else if (claim) { } else if (claim) {
const index = listUrls && listUrls.findIndex(u => u === claim.permanent_url); const index = urls && urls.findIndex(u => u === claim.permanent_url);
if (index > -1) return index; if (index > -1) return index;
return claim; return claim;
} }
@ -232,49 +227,20 @@ export const makeSelectIndexForUrlInCollection = (url: string, id: string) =>
} }
); );
export const makeSelectPreviousUrlForCollectionAndUrl = (id: string, url: string) =>
createSelector(
state => state.content.shuffleList,
state => state.content.loopList,
makeSelectIndexForUrlInCollection(url, id),
makeSelectUrlsForCollectionId(id),
(shuffleState, loopState, index, urls) => {
const loopList = loopState && loopState.collectionId === id && loopState.loop;
const shuffleUrls = shuffleState && shuffleState.collectionId === id && shuffleState.newUrls;
if (index > -1) {
const listUrls = shuffleUrls || urls;
let nextUrl;
if (index === 0 && loopList) {
nextUrl = listUrls[listUrls.length - 1];
} else {
nextUrl = listUrls[index - 1];
}
return nextUrl || null;
} else {
return null;
}
}
);
export const makeSelectNextUrlForCollectionAndUrl = (id: string, url: string) => export const makeSelectNextUrlForCollectionAndUrl = (id: string, url: string) =>
createSelector( createSelector(
state => state.content.shuffleList,
state => state.content.loopList,
makeSelectIndexForUrlInCollection(url, id), makeSelectIndexForUrlInCollection(url, id),
selectClaimsByUri,
makeSelectUrlsForCollectionId(id), makeSelectUrlsForCollectionId(id),
(shuffleState, loopState, index, urls) => { (index, claims, urls) => {
const loopList = loopState && loopState.collectionId === id && loopState.loop;
const shuffleUrls = shuffleState && shuffleState.collectionId === id && shuffleState.newUrls;
if (index > -1) { if (index > -1) {
const listUrls = shuffleUrls || urls;
// We'll get the next playble url // We'll get the next playble url
let remainingUrls = listUrls.slice(index + 1); const remainingUrls = urls.slice(index + 1);
if (!remainingUrls.length && loopList) { const nextUrl = remainingUrls.find(
remainingUrls = listUrls.slice(0); u =>
} claims[u].value.stream_type &&
const nextUrl = remainingUrls && remainingUrls[0]; (claims[u].value.stream_type === 'video' || claims[u].value.stream_type === 'audio')
);
return nextUrl || null; return nextUrl || null;
} else { } else {
return null; return null;
@ -298,13 +264,7 @@ export const makeSelectCountForCollectionId = (id: string) =>
if (collection.itemCount !== undefined) { if (collection.itemCount !== undefined) {
return collection.itemCount; return collection.itemCount;
} }
let itemCount = 0; return collection.items.length;
collection.items.map(item => {
if (item) {
itemCount += 1;
}
});
return itemCount;
} }
return null; return null;
} }

View file

@ -1411,11 +1411,6 @@
dependencies: dependencies:
"@types/yargs-parser" "*" "@types/yargs-parser" "*"
"@ungap/from-entries@^0.2.1":
version "0.2.1"
resolved "https://registry.yarnpkg.com/@ungap/from-entries/-/from-entries-0.2.1.tgz#7e86196b8b2e99d73106a8f25c2a068326346354"
integrity sha512-CAqefTFAfnUPwYqsWHXpOxHaq1Zo5UQ3m9Zm2p09LggGe57rqHoBn3c++xcoomzXKynAUuiBMDUCQvKMnXjUpA==
abab@^1.0.4: abab@^1.0.4:
version "1.0.4" version "1.0.4"
resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e"