import type { ReactNode } from 'react'; import React, { useState, useCallback, useMemo } from 'react'; import type { FlexProps } from '@chakra-ui/react'; import { Box, Checkbox, Flex } from '@chakra-ui/react'; import { useTranslation } from 'next-i18next'; export type TableMultipleSelectHookProps = { list: T[]; getItemId: (item: T) => string | number; }; export const useTableMultipleSelect = ({ list, getItemId }: TableMultipleSelectHookProps) => { const { t } = useTranslation(); const [selectedItems, setSelectedItems] = useState([]); // Toggle single item selection const toggleSelect = useCallback( (item: T) => { const itemId = getItemId(item); setSelectedItems((prev) => { const isSelected = prev.some((selected) => getItemId(selected) === itemId); if (isSelected) { return prev.filter((selected) => getItemId(selected) !== itemId); } else { return [...prev, item]; } }); }, [getItemId] ); // Check if item is selected const isSelected = useCallback( (item: T) => { const itemId = getItemId(item); return selectedItems.some((selected) => getItemId(selected) === itemId); }, [selectedItems, getItemId] ); const isSelecteAll = useMemo(() => { return list.length > 0 && list.every((item) => isSelected(item)); }, [list, isSelected]); // Select all items const selectAllTrigger = useCallback(() => { if (isSelecteAll) { setSelectedItems([]); } else { setSelectedItems((pre) => [...pre, ...list.filter((item) => !isSelected(item))]); } }, [isSelecteAll, list, isSelected]); const selectedCount = selectedItems.length; // Check if has selections const hasSelections = selectedCount > 0; // Floating Action Bar component const FloatingActionBar = useCallback( ({ children, Controler, ...props }: { children: ReactNode; Controler: ReactNode } & FlexProps) => { return ( {hasSelections && ( <> {t('common:select_count_num', { num: selectedCount })} {Controler} )} {children} ); }, [hasSelections, isSelecteAll, selectAllTrigger, selectedCount, t] ); return { selectedItems, isSelecteAll, selectAllTrigger, hasSelections, toggleSelect, isSelected, FloatingActionBar, setSelectedItems }; };