From fd2551e76407564bb5357f0946a150084d6039ee Mon Sep 17 00:00:00 2001
From: zeppi <jessopb@gmail.com>
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),