Skip to content

Commit

Permalink
Fix/library manga selection type error (#566)
Browse files Browse the repository at this point in the history
* Prevent TypeError when deselecting items from a specific key

This was noticed when changing the categories of a manga to a category without any selected mangas, in this case, when trying to deselect a manga after changing the categories, a TypeError was thrown which resulted in a white screen

* Remove duplicates from the list of all selected ids

* Update state via setter

* Clear selection after disabling the library selection mode

* Remove console log
  • Loading branch information
schroda authored Jan 21, 2024
1 parent 69a62b6 commit dcbf5a1
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 4 deletions.
15 changes: 12 additions & 3 deletions src/components/collection/useSelectableCollection.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ export type SelectableCollectionReturnType<Id extends number | string, Key exten
handleSelectAll: (selectAll: boolean, itemIds: Id[], key?: Key) => void;
setSelectionForKey: (key: Key, itemIds: Id[]) => void;
getSelectionForKey: (key: Key) => Id[];
clearSelection: () => void;
};

export const useSelectableCollection = <Id extends number | string, Key extends string = 'default'>(
Expand All @@ -35,7 +36,7 @@ export const useSelectableCollection = <Id extends number | string, Key extends
): SelectableCollectionReturnType<Id, Key> => {
const [keyToSelectedItemIds, setKeyToSelectedItemIds] = useState<Record<string, Id[]>>(initialState);

const selectedItemIds = Object.values(keyToSelectedItemIds).flat();
const selectedItemIds = [...new Set(Object.values(keyToSelectedItemIds).flat())];
const areAllItemsSelected = selectedItemIds.length === totalCount;
const areNoItemsSelected = !selectedItemIds.length;

Expand All @@ -48,7 +49,7 @@ export const useSelectableCollection = <Id extends number | string, Key extends
if (deselect) {
setKeyToSelectedItemIds((prevState) => ({
...prevState,
[key]: prevState[key].filter((selectedItemId) => selectedItemId !== id),
[key]: prevState[key]?.filter((selectedItemId) => selectedItemId !== id) ?? [],
}));
return;
}
Expand Down Expand Up @@ -79,11 +80,18 @@ export const useSelectableCollection = <Id extends number | string, Key extends
};

const setSelectionForKey = (key: Key, itemIds: Id[]) => {
keyToSelectedItemIds[key] = itemIds;
setKeyToSelectedItemIds((prevState) => ({
...prevState,
[key]: [...itemIds],
}));
};

const getSelectionForKey = (key: Key) => keyToSelectedItemIds[key];

const clearSelection = () => {
setKeyToSelectedItemIds({});
};

return {
selectedItemIds,
keySelectedItemIds,
Expand All @@ -95,5 +103,6 @@ export const useSelectableCollection = <Id extends number | string, Key extends
areNoItemsForKeySelected,
setSelectionForKey,
getSelectionForKey,
clearSelection,
};
};
1 change: 0 additions & 1 deletion src/components/manga/MangaActionMenuItems.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,6 @@ export const MangaActionMenuItems = ({
};

const performAction = (action: MangaAction, mangas: TManga[]) => {
console.log('MangaActionMenuItem', manga);
Mangas.performAction(action, manga ? [manga.id] : Mangas.getIds(mangas), {
wasManuallyMarkedAsRead: true,
}).catch(defaultPromiseErrorHandler(`MangaActionMenuItems:performAction(${action})`));
Expand Down
4 changes: 4 additions & 0 deletions src/screens/Library.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ export function Library() {
selectedItemIds,
handleSelectAll,
handleSelection,
clearSelection,
} = useSelectableCollection<TManga['id'], string>(mangas.length, { currentKey: activeTab?.id.toString() });

const handleSelect = (id: number, selected: boolean) => {
Expand Down Expand Up @@ -108,6 +109,9 @@ export function Library() {
onClose={(selectionModeState) => {
handleClose();
setIsSelectModeActive(selectionModeState);
if (!selectionModeState) {
clearSelection();
}
}}
setHideMenu={setHideMenu}
/>
Expand Down

0 comments on commit dcbf5a1

Please sign in to comment.