From fd2551e76407564bb5357f0946a150084d6039ee Mon Sep 17 00:00:00 2001 From: zeppi Date: Mon, 22 Mar 2021 13:14:13 -0400 Subject: [PATCH] fix pending, support new collection add ui --- dist/flow-typed/Collections.js | 1 + src/index.js | 1 + src/redux/actions/collections.js | 12 ++++++--- src/redux/middleware/shared-state.js | 1 - src/redux/reducers/collections.js | 39 +++++++++++++++------------- src/redux/selectors/collections.js | 28 ++++++++++---------- 6 files changed, 47 insertions(+), 35 deletions(-) diff --git a/dist/flow-typed/Collections.js b/dist/flow-typed/Collections.js index 83c33be..c2eba63 100644 --- a/dist/flow-typed/Collections.js +++ b/dist/flow-typed/Collections.js @@ -37,4 +37,5 @@ declare type CollectionEditParams = { replace?: boolean, order?: { from: number, to: number }, type?: string, + name?: string, } diff --git a/src/index.js b/src/index.js index a7ca376..d2acbad 100644 --- a/src/index.js +++ b/src/index.js @@ -179,6 +179,7 @@ export { makeSelectNameForCollectionId, makeSelectIsResolvingCollectionForId, makeSelectNextUrlForCollection, + makeSelectCollectionForIdHasClaimUrl, } from 'redux/selectors/collections'; export { diff --git a/src/redux/actions/collections.js b/src/redux/actions/collections.js index 55a8c98..7aca1e0 100644 --- a/src/redux/actions/collections.js +++ b/src/redux/actions/collections.js @@ -8,6 +8,7 @@ import { makeSelectCollectionForId, // makeSelectPublishedCollectionForId, // for "save" or "copy" action makeSelectMyPublishedCollectionForId, + makeSelectPublishedCollectionForId, makeSelectUnpublishedCollectionForId, makeSelectEditedCollectionForId, } from 'redux/selectors/collections'; @@ -24,6 +25,7 @@ const getTimestamp = () => { export const doLocalCollectionCreate = ( name: string, collectionItems: string, + type: string, sourceId: string ) => (dispatch: Dispatch) => { return dispatch({ @@ -35,6 +37,7 @@ export const doLocalCollectionCreate = ( updatedAt: getTimestamp(), items: collectionItems || [], sourceId: sourceId, + type: type || 'collection', }, }, }); @@ -79,7 +82,7 @@ export const doFetchItemsInCollections = ( pageSize?: number, }, resolveStartedCallback?: () => void -) => async (dispatch: Dispatch, getState: GetState) => { +) => async(dispatch: Dispatch, getState: GetState) => { let state = getState(); // for each collection id, // make sure the collection is resolved, the items are resolved, and build the collection objects @@ -284,7 +287,7 @@ export const doFetchItemsInCollection = ( return doFetchItemsInCollections(newOptions, cb); }; -export const doCollectionEdit = (collectionId: string, params: CollectionEditParams) => async ( +export const doCollectionEdit = (collectionId: string, params: CollectionEditParams) => async( dispatch: Dispatch, getState: GetState ) => { @@ -294,7 +297,7 @@ export const doCollectionEdit = (collectionId: string, params: CollectionEditPar const unpublishedCollection: Collection = makeSelectUnpublishedCollectionForId(collectionId)( state ); - const publishedCollection: Collection = makeSelectMyPublishedCollectionForId(collectionId)(state); + const publishedCollection: Collection = makeSelectPublishedCollectionForId(collectionId)(state); // needs to be published only const generateCollectionItemsFromSearchResult = results => { return ( @@ -383,8 +386,11 @@ export const doCollectionEdit = (collectionId: string, params: CollectionEditPar currentItems.splice(order.to, 0, movedItem); } + // console.log('p&e', publishedCollection.items, newItems, publishedCollection.items.join(','), newItems.join(',')) if (editedCollection) { if (publishedCollection.items.join(',') === newItems.join(',')) { + // print these + // delete edited if newItems are the same as publishedItems dispatch({ type: ACTIONS.COLLECTION_DELETE, diff --git a/src/redux/middleware/shared-state.js b/src/redux/middleware/shared-state.js index 3d40834..031e9a4 100644 --- a/src/redux/middleware/shared-state.js +++ b/src/redux/middleware/shared-state.js @@ -26,7 +26,6 @@ export const buildSharedStateMiddleware = ( clearTimeout(timeout); const actionResult = next(action); // Call `getState` after calling `next` to ensure the state has updated in response to the action - function runPreferences() { const nextState: { user: any, settings: any } = getState(); const syncEnabled = diff --git a/src/redux/reducers/collections.js b/src/redux/reducers/collections.js index 0f93e43..691a821 100644 --- a/src/redux/reducers/collections.js +++ b/src/redux/reducers/collections.js @@ -69,7 +69,12 @@ const collectionsReducer = handleActions( const newPendingList = Object.assign({}, pendingList); if (collectionKey && state[collectionKey] && state[collectionKey][id]) { - delete state[collectionKey][id]; + const newList = Object.assign({}, state[collectionKey]); + delete newList[id]; + return { + ...state, + [collectionKey]: newList, + }; } else { if (newEditList[id]) { delete newEditList[id]; @@ -178,40 +183,38 @@ const collectionsReducer = handleActions( }, [ACTIONS.COLLECTION_ITEMS_RESOLVE_COMPLETED]: (state, action) => { const { resolvedCollections, failedCollectionIds } = action.data; - const { - pending: pendingList, - edited: editList, - isResolvingCollectionById, - resolved: lists, - } = state; + const { pending, edited, isResolvingCollectionById, resolved } = state; + const newPending = Object.assign({}, pending); + const newEdited = Object.assign({}, edited); + const newResolved = Object.assign({}, resolved, resolvedCollections); + const resolvedIds = Object.keys(resolvedCollections); const newResolving = Object.assign({}, isResolvingCollectionById); - if (resolvedCollections && resolvedCollections.length) { + if (resolvedCollections && Object.keys(resolvedCollections).length) { resolvedIds.forEach(resolvedId => { - if (editList[resolvedId]) { - if (editList[resolvedId]['updatedAt'] < resolvedCollections[resolvedId]['updatedAt']) { - delete editList[resolvedId]; + if (newEdited[resolvedId]) { + if (newEdited[resolvedId]['updatedAt'] < resolvedCollections[resolvedId]['updatedAt']) { + delete newEdited[resolvedId]; } } delete newResolving[resolvedId]; - if (pendingList[resolvedId]) { - delete pendingList[resolvedId]; + if (newPending[resolvedId]) { + delete newPending[resolvedId]; } }); } - if (failedCollectionIds && failedCollectionIds.length) { + if (failedCollectionIds && Object.keys(failedCollectionIds).length) { failedCollectionIds.forEach(failedId => { delete newResolving[failedId]; }); } - const newLists = Object.assign({}, lists, resolvedCollections); - return Object.assign({}, state, { ...state, - pending: pendingList, - resolved: newLists, + pending: newPending, + resolved: newResolved, + edited: newEdited, isResolvingCollectionById: newResolving, }); }, diff --git a/src/redux/selectors/collections.js b/src/redux/selectors/collections.js index f895b3e..e59fb7c 100644 --- a/src/redux/selectors/collections.js +++ b/src/redux/selectors/collections.js @@ -68,7 +68,6 @@ export const makeSelectCollectionIsMine = (id: string) => } ); -// for library page, we want all published export const selectMyPublishedCollections = createSelector( selectResolvedCollections, selectPendingCollections, @@ -78,21 +77,18 @@ export const selectMyPublishedCollections = createSelector( // all resolved in myIds, plus those in pending and edited const myPublishedCollections = Object.fromEntries( Object.entries(pending).concat( - Object.entries(edited) - .filter( - ([key, val]) => myIds.includes(key) + Object.entries(resolved).filter( + ([key, val]) => + myIds.includes(key) && // $FlowFixMe - ) - .concat( - Object.entries(resolved).filter( - ([key, val]) => - myIds.includes(key) && - // $FlowFixMe - (!pending[key] && !edited[key]) - ) - ) + !pending[key] + ) ) ); + // now add in edited: + Object.entries(edited).forEach(([id, item]) => { + myPublishedCollections[id] = item; + }); return myPublishedCollections; } ); @@ -163,6 +159,12 @@ export const makeSelectCollectionForId = (id: string) => } ); +export const makeSelectCollectionForIdHasClaimUrl = (id: string, url: string) => + createSelector( + makeSelectCollectionForId(id), + collection => collection.items.includes(url) + ); + export const makeSelectUrlsForCollectionId = (id: string) => createSelector( makeSelectCollectionForId(id),