Compare commits
18 commits
persistEdi
...
master
Author | SHA1 | Date | |
---|---|---|---|
|
0f930c4a7b | ||
|
32b5787071 | ||
|
129b0ea3fa | ||
|
e3bc848263 | ||
|
372e559cae | ||
|
49b9db5aae | ||
|
12a2ffc708 | ||
|
95fa26f836 | ||
|
dc264ec50c | ||
|
aeb1f533b5 | ||
|
d016d8057b | ||
|
0302a2f8d6 | ||
|
8fa92d872d | ||
|
e4d0662100 | ||
|
036aa59086 | ||
|
c76dfbde27 | ||
|
7cc9923ed9 | ||
|
60bd918d5e |
14 changed files with 272 additions and 90 deletions
131
dist/bundle.es.js
vendored
131
dist/bundle.es.js
vendored
|
@ -2,9 +2,12 @@
|
||||||
|
|
||||||
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;
|
||||||
|
|
||||||
|
@ -716,7 +719,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 = 'autoplay';
|
const AUTOPLAY_MEDIA = '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';
|
||||||
|
@ -767,7 +770,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: AUTOPLAY,
|
AUTOPLAY_MEDIA: AUTOPLAY_MEDIA,
|
||||||
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,
|
||||||
|
@ -1037,7 +1040,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, HIDE_BALANCE, HIDE_SPLASH_ANIMATION, FLOATING_PLAYER, DARK_MODE_TIMES, AUTOMATIC_DARK_MODE_ENABLED];
|
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];
|
||||||
|
|
||||||
var shared_preferences = /*#__PURE__*/Object.freeze({
|
var shared_preferences = /*#__PURE__*/Object.freeze({
|
||||||
SDK_SYNC_KEYS: SDK_SYNC_KEYS,
|
SDK_SYNC_KEYS: SDK_SYNC_KEYS,
|
||||||
|
@ -1868,11 +1871,12 @@ function extractUserState(rawObj) {
|
||||||
app_welcome_version,
|
app_welcome_version,
|
||||||
sharing_3P,
|
sharing_3P,
|
||||||
unpublishedCollections,
|
unpublishedCollections,
|
||||||
|
editedCollections,
|
||||||
builtinCollections,
|
builtinCollections,
|
||||||
savedCollections
|
savedCollections
|
||||||
} = rawObj.value;
|
} = rawObj.value;
|
||||||
|
|
||||||
return _extends$1({}, subscriptions ? { subscriptions } : {}, following ? { following } : {}, tags ? { tags } : {}, blocked ? { blocked } : {}, coin_swap_codes ? { coin_swap_codes } : {}, settings ? { settings } : {}, app_welcome_version ? { app_welcome_version } : {}, sharing_3P ? { sharing_3P } : {}, unpublishedCollections ? { unpublishedCollections } : {}, builtinCollections ? { builtinCollections } : {}, savedCollections ? { savedCollections } : {});
|
return _extends$1({}, subscriptions ? { subscriptions } : {}, following ? { following } : {}, tags ? { tags } : {}, blocked ? { blocked } : {}, coin_swap_codes ? { coin_swap_codes } : {}, settings ? { settings } : {}, app_welcome_version ? { app_welcome_version } : {}, sharing_3P ? { sharing_3P } : {}, unpublishedCollections ? { unpublishedCollections } : {}, editedCollections ? { editedCollections } : {}, builtinCollections ? { builtinCollections } : {}, savedCollections ? { savedCollections } : {});
|
||||||
}
|
}
|
||||||
|
|
||||||
return {};
|
return {};
|
||||||
|
@ -1890,6 +1894,7 @@ function doPopulateSharedUserState(sharedSettings) {
|
||||||
app_welcome_version,
|
app_welcome_version,
|
||||||
sharing_3P,
|
sharing_3P,
|
||||||
unpublishedCollections,
|
unpublishedCollections,
|
||||||
|
editedCollections,
|
||||||
builtinCollections,
|
builtinCollections,
|
||||||
savedCollections
|
savedCollections
|
||||||
} = extractUserState(sharedSettings);
|
} = extractUserState(sharedSettings);
|
||||||
|
@ -1905,6 +1910,7 @@ function doPopulateSharedUserState(sharedSettings) {
|
||||||
welcomeVersion: app_welcome_version,
|
welcomeVersion: app_welcome_version,
|
||||||
allowAnalytics: sharing_3P,
|
allowAnalytics: sharing_3P,
|
||||||
unpublishedCollections,
|
unpublishedCollections,
|
||||||
|
editedCollections,
|
||||||
builtinCollections,
|
builtinCollections,
|
||||||
savedCollections
|
savedCollections
|
||||||
}
|
}
|
||||||
|
@ -3645,7 +3651,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 = Object.fromEntries(Object.entries(pending).concat(Object.entries(resolved).filter(([key, val]) => myIds.includes(key) &&
|
const myPublishedCollections = 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:
|
||||||
|
@ -3656,7 +3662,7 @@ const selectMyPublishedCollections = reselect.createSelector(selectResolvedColle
|
||||||
});
|
});
|
||||||
|
|
||||||
const selectMyPublishedMixedCollections = reselect.createSelector(selectMyPublishedCollections, published => {
|
const selectMyPublishedMixedCollections = reselect.createSelector(selectMyPublishedCollections, published => {
|
||||||
const myCollections = Object.fromEntries(
|
const myCollections = fromEntries(
|
||||||
// $FlowFixMe
|
// $FlowFixMe
|
||||||
Object.entries(published).filter(([key, collection]) => {
|
Object.entries(published).filter(([key, collection]) => {
|
||||||
// $FlowFixMe
|
// $FlowFixMe
|
||||||
|
@ -3666,7 +3672,7 @@ const selectMyPublishedMixedCollections = reselect.createSelector(selectMyPublis
|
||||||
});
|
});
|
||||||
|
|
||||||
const selectMyPublishedPlaylistCollections = reselect.createSelector(selectMyPublishedCollections, published => {
|
const selectMyPublishedPlaylistCollections = reselect.createSelector(selectMyPublishedCollections, published => {
|
||||||
const myCollections = Object.fromEntries(
|
const myCollections = fromEntries(
|
||||||
// $FlowFixMe
|
// $FlowFixMe
|
||||||
Object.entries(published).filter(([key, collection]) => {
|
Object.entries(published).filter(([key, collection]) => {
|
||||||
// $FlowFixMe
|
// $FlowFixMe
|
||||||
|
@ -3681,7 +3687,7 @@ const makeSelectMyPublishedCollectionForId = id => reselect.createSelector(selec
|
||||||
// selectResolvedCollections,
|
// selectResolvedCollections,
|
||||||
// selectSavedCollectionIds,
|
// selectSavedCollectionIds,
|
||||||
// (resolved, myIds) => {
|
// (resolved, myIds) => {
|
||||||
// const mySavedCollections = Object.fromEntries(
|
// const mySavedCollections = fromEntries(
|
||||||
// Object.entries(resolved).filter(([key, val]) => myIds.includes(key))
|
// Object.entries(resolved).filter(([key, val]) => myIds.includes(key))
|
||||||
// );
|
// );
|
||||||
// return mySavedCollections;
|
// return mySavedCollections;
|
||||||
|
@ -3702,6 +3708,7 @@ const makeSelectClaimUrlInCollection = url => reselect.createSelector(selectBuil
|
||||||
const itemsInCollections = [];
|
const itemsInCollections = [];
|
||||||
collections.map(list => {
|
collections.map(list => {
|
||||||
Object.entries(list).forEach(([key, value]) => {
|
Object.entries(list).forEach(([key, value]) => {
|
||||||
|
// $FlowFixMe
|
||||||
value.items.map(item => {
|
value.items.map(item => {
|
||||||
itemsInCollections.push(item);
|
itemsInCollections.push(item);
|
||||||
});
|
});
|
||||||
|
@ -3723,23 +3730,51 @@ const makeSelectClaimIdsForCollectionId = id => reselect.createSelector(makeSele
|
||||||
return ids;
|
return ids;
|
||||||
});
|
});
|
||||||
|
|
||||||
const makeSelectIndexForUrlInCollection = (url, id) => reselect.createSelector(makeSelectUrlsForCollectionId(id), makeSelectClaimForUri(url), (urls, claim) => {
|
const makeSelectIndexForUrlInCollection = (url, id) => reselect.createSelector(state => state.content.shuffleList, makeSelectUrlsForCollectionId(id), makeSelectClaimForUri(url), (shuffleState, urls, claim) => {
|
||||||
const index = urls && urls.findIndex(u => u === url);
|
const shuffleUrls = shuffleState && shuffleState.collectionId === id && shuffleState.newUrls;
|
||||||
|
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 = urls && urls.findIndex(u => u === claim.permanent_url);
|
const index = listUrls && listUrls.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 makeSelectNextUrlForCollectionAndUrl = (id, url) => reselect.createSelector(makeSelectIndexForUrlInCollection(url, id), selectClaimsByUri, makeSelectUrlsForCollectionId(id), (index, claims, urls) => {
|
const makeSelectPreviousUrlForCollectionAndUrl = (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) {
|
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
|
||||||
const remainingUrls = urls.slice(index + 1);
|
let remainingUrls = listUrls.slice(index + 1);
|
||||||
const nextUrl = remainingUrls.find(u => claims[u].value.stream_type && (claims[u].value.stream_type === 'video' || claims[u].value.stream_type === 'audio'));
|
if (!remainingUrls.length && loopList) {
|
||||||
|
remainingUrls = listUrls.slice(0);
|
||||||
|
}
|
||||||
|
const nextUrl = remainingUrls && remainingUrls[0];
|
||||||
return nextUrl || null;
|
return nextUrl || null;
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
||||||
|
@ -3755,7 +3790,13 @@ const makeSelectCountForCollectionId = id => reselect.createSelector(makeSelectC
|
||||||
if (collection.itemCount !== undefined) {
|
if (collection.itemCount !== undefined) {
|
||||||
return collection.itemCount;
|
return collection.itemCount;
|
||||||
}
|
}
|
||||||
return collection.items.length;
|
let itemCount = 0;
|
||||||
|
collection.items.map(item => {
|
||||||
|
if (item) {
|
||||||
|
itemCount += 1;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return itemCount;
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
});
|
});
|
||||||
|
@ -4461,11 +4502,15 @@ function doCollectionPublish(options, localId) {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
function doCollectionPublishUpdate(options) {
|
function doCollectionPublishUpdate(options, isBackgroundUpdate) {
|
||||||
return dispatch => {
|
return (dispatch, getState) => {
|
||||||
// TODO: implement one click update
|
// TODO: implement one click update
|
||||||
|
|
||||||
const updateParams = {
|
const updateParams = isBackgroundUpdate ? {
|
||||||
|
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,
|
||||||
|
@ -4475,16 +4520,25 @@ function doCollectionPublishUpdate(options) {
|
||||||
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.claims) {
|
if (options.channel_id) {
|
||||||
updateParams['claims'] = options.claims;
|
updateParams['channel_id'] = options.channel_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
return new Promise(resolve => {
|
return new Promise(resolve => {
|
||||||
dispatch({
|
dispatch({
|
||||||
type: COLLECTION_PUBLISH_UPDATE_STARTED
|
type: COLLECTION_PUBLISH_UPDATE_STARTED
|
||||||
|
@ -4654,7 +4708,7 @@ const getTimestamp = () => {
|
||||||
return Math.floor(Date.now() / 1000);
|
return Math.floor(Date.now() / 1000);
|
||||||
};
|
};
|
||||||
|
|
||||||
const FETCH_BATCH_SIZE = 10;
|
const FETCH_BATCH_SIZE = 50;
|
||||||
|
|
||||||
const doLocalCollectionCreate = (name, collectionItems, type, sourceId) => dispatch => {
|
const doLocalCollectionCreate = (name, collectionItems, type, sourceId) => dispatch => {
|
||||||
return dispatch({
|
return dispatch({
|
||||||
|
@ -4761,7 +4815,8 @@ const doFetchItemsInCollections = (resolveItemsOptions, resolveStartedCallback)
|
||||||
batches[i] = lbryProxy.claim_search({
|
batches[i] = lbryProxy.claim_search({
|
||||||
claim_ids: claim.value.claims,
|
claim_ids: claim.value.claims,
|
||||||
page: i + 1,
|
page: i + 1,
|
||||||
page_size: batchSize
|
page_size: batchSize,
|
||||||
|
no_totals: true
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
const itemsInBatches = yield Promise.all(batches);
|
const itemsInBatches = yield Promise.all(batches);
|
||||||
|
@ -5578,7 +5633,7 @@ const doUpdatePublishForm = publishFormValue => dispatch => dispatch({
|
||||||
data: _extends$7({}, publishFormValue)
|
data: _extends$7({}, publishFormValue)
|
||||||
});
|
});
|
||||||
|
|
||||||
const doUploadThumbnail = (filePath, thumbnailBlob, fsAdapter, fs, path) => dispatch => {
|
const doUploadThumbnail = (filePath, thumbnailBlob, fsAdapter, fs, path, cb) => 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;
|
||||||
|
|
||||||
|
@ -5612,13 +5667,17 @@ const doUploadThumbnail = (filePath, thumbnailBlob, fsAdapter, fs, path) => disp
|
||||||
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 => {
|
||||||
return json.success ? dispatch({
|
if (!json.success) return uploadError(json.message || downMessage);
|
||||||
|
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;
|
||||||
|
|
||||||
|
@ -7713,8 +7772,15 @@ const collectionsReducer = handleActions({
|
||||||
|
|
||||||
[COLLECTION_PENDING]: (state, action) => {
|
[COLLECTION_PENDING]: (state, action) => {
|
||||||
const { localId, claimId } = action.data;
|
const { localId, claimId } = action.data;
|
||||||
const { edited: editList, unpublished: unpublishedList, pending: pendingList } = state;
|
const {
|
||||||
|
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);
|
||||||
|
|
||||||
|
@ -7724,7 +7790,7 @@ const collectionsReducer = handleActions({
|
||||||
delete newUnpublishedList[localId];
|
delete newUnpublishedList[localId];
|
||||||
} else {
|
} else {
|
||||||
// edit update
|
// edit update
|
||||||
newPendingList[claimId] = Object.assign({}, newEditList[claimId]);
|
newPendingList[claimId] = Object.assign({}, newEditList[claimId] || newResolvedList[claimId]);
|
||||||
delete newEditList[claimId];
|
delete newEditList[claimId];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7776,8 +7842,14 @@ const collectionsReducer = handleActions({
|
||||||
}));
|
}));
|
||||||
},
|
},
|
||||||
[USER_STATE_POPULATE]: (state, action) => {
|
[USER_STATE_POPULATE]: (state, action) => {
|
||||||
const { builtinCollections, savedCollections, unpublishedCollections } = action.data;
|
const {
|
||||||
|
builtinCollections,
|
||||||
|
savedCollections,
|
||||||
|
unpublishedCollections,
|
||||||
|
editedCollections
|
||||||
|
} = action.data;
|
||||||
return _extends$e({}, state, {
|
return _extends$e({}, state, {
|
||||||
|
edited: editedCollections || state.edited,
|
||||||
unpublished: unpublishedCollections || state.unpublished,
|
unpublished: unpublishedCollections || state.unpublished,
|
||||||
builtin: builtinCollections || state.builtin,
|
builtin: builtinCollections || state.builtin,
|
||||||
saved: savedCollections || state.saved
|
saved: savedCollections || state.saved
|
||||||
|
@ -8035,6 +8107,7 @@ 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;
|
||||||
|
|
5
dist/flow-typed/npm/from-entries.js
vendored
Normal file
5
dist/flow-typed/npm/from-entries.js
vendored
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
// @flow
|
||||||
|
|
||||||
|
declare module '@ungap/from-entries' {
|
||||||
|
declare module.exports: any;
|
||||||
|
}
|
5
flow-typed/npm/from-entries.js
vendored
Normal file
5
flow-typed/npm/from-entries.js
vendored
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
// @flow
|
||||||
|
|
||||||
|
declare module '@ungap/from-entries' {
|
||||||
|
declare module.exports: any;
|
||||||
|
}
|
|
@ -29,6 +29,7 @@
|
||||||
"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"
|
||||||
|
|
|
@ -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 = 'autoplay';
|
export const AUTOPLAY_MEDIA = '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';
|
||||||
|
|
|
@ -21,10 +21,12 @@ 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,
|
SETTINGS.AUTOPLAY_MEDIA,
|
||||||
|
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,
|
||||||
];
|
];
|
||||||
|
|
|
@ -183,6 +183,7 @@ export {
|
||||||
makeSelectCountForCollectionId,
|
makeSelectCountForCollectionId,
|
||||||
makeSelectIsResolvingCollectionForId,
|
makeSelectIsResolvingCollectionForId,
|
||||||
makeSelectIndexForUrlInCollection,
|
makeSelectIndexForUrlInCollection,
|
||||||
|
makeSelectPreviousUrlForCollectionAndUrl,
|
||||||
makeSelectNextUrlForCollectionAndUrl,
|
makeSelectNextUrlForCollectionAndUrl,
|
||||||
makeSelectCollectionForIdHasClaimUrl,
|
makeSelectCollectionForIdHasClaimUrl,
|
||||||
} from 'redux/selectors/collections';
|
} from 'redux/selectors/collections';
|
||||||
|
|
|
@ -19,7 +19,10 @@ 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 { selectPendingCollections } from 'redux/selectors/collections';
|
import {
|
||||||
|
selectPendingCollections,
|
||||||
|
makeSelectClaimIdsForCollectionId,
|
||||||
|
} from 'redux/selectors/collections';
|
||||||
import {
|
import {
|
||||||
doFetchItemsInCollection,
|
doFetchItemsInCollection,
|
||||||
doFetchItemsInCollections,
|
doFetchItemsInCollections,
|
||||||
|
@ -828,18 +831,22 @@ export function doCollectionPublish(
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export function doCollectionPublishUpdate(options: {
|
export function doCollectionPublishUpdate(
|
||||||
bid?: string,
|
options: {
|
||||||
blocking?: true,
|
bid?: string,
|
||||||
title?: string,
|
blocking?: true,
|
||||||
thumbnail_url?: string,
|
title?: string,
|
||||||
description?: string,
|
thumbnail_url?: string,
|
||||||
claim_id: string,
|
description?: string,
|
||||||
tags?: Array<Tag>,
|
claim_id: string,
|
||||||
languages?: Array<string>,
|
tags?: Array<Tag>,
|
||||||
claims?: Array<string>,
|
languages?: Array<string>,
|
||||||
}) {
|
claims?: Array<string>,
|
||||||
return (dispatch: Dispatch): Promise<any> => {
|
channel_id?: string,
|
||||||
|
},
|
||||||
|
isBackgroundUpdate?: boolean
|
||||||
|
) {
|
||||||
|
return (dispatch: Dispatch, getState: GetState): Promise<any> => {
|
||||||
// TODO: implement one click update
|
// TODO: implement one click update
|
||||||
|
|
||||||
const updateParams: {
|
const updateParams: {
|
||||||
|
@ -847,32 +854,49 @@ export function doCollectionPublishUpdate(options: {
|
||||||
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,
|
||||||
bid: creditsToString(options.bid),
|
} = isBackgroundUpdate
|
||||||
title: options.title,
|
? {
|
||||||
thumbnail_url: options.thumbnail_url,
|
blocking: true,
|
||||||
description: options.description,
|
claim_id: options.claim_id,
|
||||||
tags: [],
|
clear_claims: true,
|
||||||
languages: options.languages || [],
|
}
|
||||||
locations: [],
|
: {
|
||||||
blocking: true,
|
bid: creditsToString(options.bid),
|
||||||
claim_id: options.claim_id,
|
title: options.title,
|
||||||
clear_claims: true,
|
thumbnail_url: options.thumbnail_url,
|
||||||
};
|
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.claims) {
|
if (options.channel_id) {
|
||||||
updateParams['claims'] = options.claims;
|
updateParams['channel_id'] = options.channel_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
return new Promise(resolve => {
|
return new Promise(resolve => {
|
||||||
dispatch({
|
dispatch({
|
||||||
type: ACTIONS.COLLECTION_PUBLISH_UPDATE_STARTED,
|
type: ACTIONS.COLLECTION_PUBLISH_UPDATE_STARTED,
|
||||||
|
|
|
@ -18,7 +18,7 @@ const getTimestamp = () => {
|
||||||
return Math.floor(Date.now() / 1000);
|
return Math.floor(Date.now() / 1000);
|
||||||
};
|
};
|
||||||
|
|
||||||
const FETCH_BATCH_SIZE = 10;
|
const FETCH_BATCH_SIZE = 50;
|
||||||
|
|
||||||
export const doLocalCollectionCreate = (
|
export const doLocalCollectionCreate = (
|
||||||
name: string,
|
name: string,
|
||||||
|
@ -93,7 +93,7 @@ export const doFetchItemsInCollections = (
|
||||||
pageSize?: number,
|
pageSize?: number,
|
||||||
},
|
},
|
||||||
resolveStartedCallback?: () => void
|
resolveStartedCallback?: () => void
|
||||||
) => async (dispatch: Dispatch, getState: GetState) => {
|
) => async(dispatch: Dispatch, getState: GetState) => {
|
||||||
/*
|
/*
|
||||||
1) make sure all the collection claims are loaded into claims reducer, search/resolve if necessary.
|
1) make sure all the collection claims are loaded into claims reducer, search/resolve if necessary.
|
||||||
2) get the item claims for each
|
2) get the item claims for each
|
||||||
|
@ -165,6 +165,7 @@ export const doFetchItemsInCollections = (
|
||||||
claim_ids: claim.value.claims,
|
claim_ids: claim.value.claims,
|
||||||
page: i + 1,
|
page: i + 1,
|
||||||
page_size: batchSize,
|
page_size: batchSize,
|
||||||
|
no_totals: true,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
const itemsInBatches = await Promise.all(batches);
|
const itemsInBatches = await Promise.all(batches);
|
||||||
|
@ -318,7 +319,7 @@ export const doFetchItemsInCollection = (
|
||||||
return doFetchItemsInCollections(newOptions, cb);
|
return doFetchItemsInCollections(newOptions, cb);
|
||||||
};
|
};
|
||||||
|
|
||||||
export const doCollectionEdit = (collectionId: string, params: CollectionEditParams) => async (
|
export const doCollectionEdit = (collectionId: string, params: CollectionEditParams) => async(
|
||||||
dispatch: Dispatch,
|
dispatch: Dispatch,
|
||||||
getState: GetState
|
getState: GetState
|
||||||
) => {
|
) => {
|
||||||
|
|
|
@ -69,7 +69,8 @@ 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;
|
||||||
|
@ -112,15 +113,17 @@ 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 => {
|
||||||
return json.success
|
if (!json.success) return uploadError(json.message || downMessage);
|
||||||
? dispatch({
|
if (cb) {
|
||||||
type: ACTIONS.UPDATE_PUBLISH_FORM,
|
cb(json.data.serveUrl);
|
||||||
data: {
|
}
|
||||||
uploadThumbnailStatus: THUMBNAIL_STATUSES.COMPLETE,
|
return dispatch({
|
||||||
thumbnail: json.data.serveUrl,
|
type: ACTIONS.UPDATE_PUBLISH_FORM,
|
||||||
},
|
data: {
|
||||||
})
|
uploadThumbnailStatus: THUMBNAIL_STATUSES.COMPLETE,
|
||||||
: uploadError(json.message || downMessage);
|
thumbnail: json.data.serveUrl,
|
||||||
|
},
|
||||||
|
});
|
||||||
})
|
})
|
||||||
.catch(err => {
|
.catch(err => {
|
||||||
let message = err.message;
|
let message = err.message;
|
||||||
|
|
|
@ -14,6 +14,7 @@ type SharedData = {
|
||||||
app_welcome_version?: number,
|
app_welcome_version?: number,
|
||||||
sharing_3P?: boolean,
|
sharing_3P?: boolean,
|
||||||
unpublishedCollections: CollectionGroup,
|
unpublishedCollections: CollectionGroup,
|
||||||
|
editedCollections: CollectionGroup,
|
||||||
builtinCollections: CollectionGroup,
|
builtinCollections: CollectionGroup,
|
||||||
savedCollections: Array<string>,
|
savedCollections: Array<string>,
|
||||||
},
|
},
|
||||||
|
@ -31,6 +32,7 @@ function extractUserState(rawObj: SharedData) {
|
||||||
app_welcome_version,
|
app_welcome_version,
|
||||||
sharing_3P,
|
sharing_3P,
|
||||||
unpublishedCollections,
|
unpublishedCollections,
|
||||||
|
editedCollections,
|
||||||
builtinCollections,
|
builtinCollections,
|
||||||
savedCollections,
|
savedCollections,
|
||||||
} = rawObj.value;
|
} = rawObj.value;
|
||||||
|
@ -45,6 +47,7 @@ function extractUserState(rawObj: SharedData) {
|
||||||
...(app_welcome_version ? { app_welcome_version } : {}),
|
...(app_welcome_version ? { app_welcome_version } : {}),
|
||||||
...(sharing_3P ? { sharing_3P } : {}),
|
...(sharing_3P ? { sharing_3P } : {}),
|
||||||
...(unpublishedCollections ? { unpublishedCollections } : {}),
|
...(unpublishedCollections ? { unpublishedCollections } : {}),
|
||||||
|
...(editedCollections ? { editedCollections } : {}),
|
||||||
...(builtinCollections ? { builtinCollections } : {}),
|
...(builtinCollections ? { builtinCollections } : {}),
|
||||||
...(savedCollections ? { savedCollections } : {}),
|
...(savedCollections ? { savedCollections } : {}),
|
||||||
};
|
};
|
||||||
|
@ -65,6 +68,7 @@ export function doPopulateSharedUserState(sharedSettings: any) {
|
||||||
app_welcome_version,
|
app_welcome_version,
|
||||||
sharing_3P,
|
sharing_3P,
|
||||||
unpublishedCollections,
|
unpublishedCollections,
|
||||||
|
editedCollections,
|
||||||
builtinCollections,
|
builtinCollections,
|
||||||
savedCollections,
|
savedCollections,
|
||||||
} = extractUserState(sharedSettings);
|
} = extractUserState(sharedSettings);
|
||||||
|
@ -80,6 +84,7 @@ export function doPopulateSharedUserState(sharedSettings: any) {
|
||||||
welcomeVersion: app_welcome_version,
|
welcomeVersion: app_welcome_version,
|
||||||
allowAnalytics: sharing_3P,
|
allowAnalytics: sharing_3P,
|
||||||
unpublishedCollections,
|
unpublishedCollections,
|
||||||
|
editedCollections,
|
||||||
builtinCollections,
|
builtinCollections,
|
||||||
savedCollections,
|
savedCollections,
|
||||||
},
|
},
|
||||||
|
|
|
@ -90,8 +90,15 @@ const collectionsReducer = handleActions(
|
||||||
|
|
||||||
[ACTIONS.COLLECTION_PENDING]: (state, action) => {
|
[ACTIONS.COLLECTION_PENDING]: (state, action) => {
|
||||||
const { localId, claimId } = action.data;
|
const { localId, claimId } = action.data;
|
||||||
const { edited: editList, unpublished: unpublishedList, pending: pendingList } = state;
|
const {
|
||||||
|
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);
|
||||||
|
|
||||||
|
@ -101,7 +108,10 @@ const collectionsReducer = handleActions(
|
||||||
delete newUnpublishedList[localId];
|
delete newUnpublishedList[localId];
|
||||||
} else {
|
} else {
|
||||||
// edit update
|
// edit update
|
||||||
newPendingList[claimId] = Object.assign({}, newEditList[claimId]);
|
newPendingList[claimId] = Object.assign(
|
||||||
|
{},
|
||||||
|
newEditList[claimId] || newResolvedList[claimId]
|
||||||
|
);
|
||||||
delete newEditList[claimId];
|
delete newEditList[claimId];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -158,9 +168,15 @@ const collectionsReducer = handleActions(
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
[ACTIONS.USER_STATE_POPULATE]: (state, action) => {
|
[ACTIONS.USER_STATE_POPULATE]: (state, action) => {
|
||||||
const { builtinCollections, savedCollections, unpublishedCollections } = action.data;
|
const {
|
||||||
|
builtinCollections,
|
||||||
|
savedCollections,
|
||||||
|
unpublishedCollections,
|
||||||
|
editedCollections,
|
||||||
|
} = action.data;
|
||||||
return {
|
return {
|
||||||
...state,
|
...state,
|
||||||
|
edited: editedCollections || state.edited,
|
||||||
unpublished: unpublishedCollections || state.unpublished,
|
unpublished: unpublishedCollections || state.unpublished,
|
||||||
builtin: builtinCollections || state.builtin,
|
builtin: builtinCollections || state.builtin,
|
||||||
saved: savedCollections || state.saved,
|
saved: savedCollections || state.saved,
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
// @flow
|
// @flow
|
||||||
|
import fromEntries from '@ungap/from-entries';
|
||||||
import { createSelector } from 'reselect';
|
import { createSelector } from 'reselect';
|
||||||
import {
|
import {
|
||||||
selectMyCollectionIds,
|
selectMyCollectionIds,
|
||||||
|
@ -79,7 +80,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 = Object.fromEntries(
|
const myPublishedCollections = fromEntries(
|
||||||
Object.entries(pending).concat(
|
Object.entries(pending).concat(
|
||||||
Object.entries(resolved).filter(
|
Object.entries(resolved).filter(
|
||||||
([key, val]) =>
|
([key, val]) =>
|
||||||
|
@ -100,7 +101,7 @@ export const selectMyPublishedCollections = createSelector(
|
||||||
export const selectMyPublishedMixedCollections = createSelector(
|
export const selectMyPublishedMixedCollections = createSelector(
|
||||||
selectMyPublishedCollections,
|
selectMyPublishedCollections,
|
||||||
published => {
|
published => {
|
||||||
const myCollections = Object.fromEntries(
|
const myCollections = fromEntries(
|
||||||
// $FlowFixMe
|
// $FlowFixMe
|
||||||
Object.entries(published).filter(([key, collection]) => {
|
Object.entries(published).filter(([key, collection]) => {
|
||||||
// $FlowFixMe
|
// $FlowFixMe
|
||||||
|
@ -114,7 +115,7 @@ export const selectMyPublishedMixedCollections = createSelector(
|
||||||
export const selectMyPublishedPlaylistCollections = createSelector(
|
export const selectMyPublishedPlaylistCollections = createSelector(
|
||||||
selectMyPublishedCollections,
|
selectMyPublishedCollections,
|
||||||
published => {
|
published => {
|
||||||
const myCollections = Object.fromEntries(
|
const myCollections = fromEntries(
|
||||||
// $FlowFixMe
|
// $FlowFixMe
|
||||||
Object.entries(published).filter(([key, collection]) => {
|
Object.entries(published).filter(([key, collection]) => {
|
||||||
// $FlowFixMe
|
// $FlowFixMe
|
||||||
|
@ -135,7 +136,7 @@ export const makeSelectMyPublishedCollectionForId = (id: string) =>
|
||||||
// selectResolvedCollections,
|
// selectResolvedCollections,
|
||||||
// selectSavedCollectionIds,
|
// selectSavedCollectionIds,
|
||||||
// (resolved, myIds) => {
|
// (resolved, myIds) => {
|
||||||
// const mySavedCollections = Object.fromEntries(
|
// const mySavedCollections = fromEntries(
|
||||||
// Object.entries(resolved).filter(([key, val]) => myIds.includes(key))
|
// Object.entries(resolved).filter(([key, val]) => myIds.includes(key))
|
||||||
// );
|
// );
|
||||||
// return mySavedCollections;
|
// return mySavedCollections;
|
||||||
|
@ -175,6 +176,7 @@ export const makeSelectClaimUrlInCollection = (url: string) =>
|
||||||
const itemsInCollections = [];
|
const itemsInCollections = [];
|
||||||
collections.map(list => {
|
collections.map(list => {
|
||||||
Object.entries(list).forEach(([key, value]) => {
|
Object.entries(list).forEach(([key, value]) => {
|
||||||
|
// $FlowFixMe
|
||||||
value.items.map(item => {
|
value.items.map(item => {
|
||||||
itemsInCollections.push(item);
|
itemsInCollections.push(item);
|
||||||
});
|
});
|
||||||
|
@ -211,14 +213,18 @@ 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),
|
||||||
(urls, claim) => {
|
(shuffleState, urls, claim) => {
|
||||||
const index = urls && urls.findIndex(u => u === url);
|
const shuffleUrls = shuffleState && shuffleState.collectionId === id && shuffleState.newUrls;
|
||||||
|
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 = urls && urls.findIndex(u => u === claim.permanent_url);
|
const index = listUrls && listUrls.findIndex(u => u === claim.permanent_url);
|
||||||
if (index > -1) return index;
|
if (index > -1) return index;
|
||||||
return claim;
|
return claim;
|
||||||
}
|
}
|
||||||
|
@ -226,20 +232,49 @@ 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),
|
||||||
(index, claims, urls) => {
|
(shuffleState, loopState, index, 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
|
||||||
const remainingUrls = urls.slice(index + 1);
|
let remainingUrls = listUrls.slice(index + 1);
|
||||||
const nextUrl = remainingUrls.find(
|
if (!remainingUrls.length && loopList) {
|
||||||
u =>
|
remainingUrls = listUrls.slice(0);
|
||||||
claims[u].value.stream_type &&
|
}
|
||||||
(claims[u].value.stream_type === 'video' || claims[u].value.stream_type === 'audio')
|
const nextUrl = remainingUrls && remainingUrls[0];
|
||||||
);
|
|
||||||
return nextUrl || null;
|
return nextUrl || null;
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
||||||
|
@ -263,7 +298,13 @@ export const makeSelectCountForCollectionId = (id: string) =>
|
||||||
if (collection.itemCount !== undefined) {
|
if (collection.itemCount !== undefined) {
|
||||||
return collection.itemCount;
|
return collection.itemCount;
|
||||||
}
|
}
|
||||||
return collection.items.length;
|
let itemCount = 0;
|
||||||
|
collection.items.map(item => {
|
||||||
|
if (item) {
|
||||||
|
itemCount += 1;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return itemCount;
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1411,6 +1411,11 @@
|
||||||
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"
|
||||||
|
|
Loading…
Reference in a new issue