Feature/make selection logic reusable (#515)
* Introduce "selectable collection" hook * Extract "select all" button into component * Make "SelectionFABActionItem" reusable Was to tightly coupled to chapters * Make "SelectionFAB" reusable Was to tightly coupled to chapters
This commit is contained in:
41
src/components/collection/useSelectableCollection.ts
Normal file
41
src/components/collection/useSelectableCollection.ts
Normal file
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
* Copyright (C) Contributors to the Suwayomi project
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
import { useState } from 'react';
|
||||
|
||||
export const useSelectableCollection = <Id extends number | string>(totalCount: number) => {
|
||||
const [selectedItemIds, setSelectedItemIds] = useState<Id[]>([]);
|
||||
|
||||
const areAllItemsSelected = selectedItemIds.length === totalCount;
|
||||
const areNoItemsSelected = !selectedItemIds.length;
|
||||
|
||||
const handleSelection = (id: Id, selected: boolean) => {
|
||||
const deselect = !selected;
|
||||
if (deselect) {
|
||||
setSelectedItemIds(selectedItemIds.filter((selectedItemId) => selectedItemId !== id));
|
||||
return;
|
||||
}
|
||||
|
||||
setSelectedItemIds([...new Set([...selectedItemIds, id])]);
|
||||
};
|
||||
|
||||
const handleSelectAll = (selectAll: boolean, itemIds: Id[]) => {
|
||||
switch (selectAll) {
|
||||
case true:
|
||||
setSelectedItemIds([...itemIds]);
|
||||
break;
|
||||
case false:
|
||||
setSelectedItemIds([]);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
};
|
||||
|
||||
return { selectedItemIds, handleSelection, handleSelectAll, areAllItemsSelected, areNoItemsSelected };
|
||||
};
|
||||
Reference in New Issue
Block a user