← back to Open Seo

src/client/features/keywords/hooks/useKeywordSelection.ts

46 lines

import { useCallback, useState } from "react";

function getNextSelectionSet(
  current: Set<string>,
  allVisibleKeywords: string[],
): Set<string> {
  const allVisibleSelected =
    allVisibleKeywords.length > 0 &&
    allVisibleKeywords.every((keyword) => current.has(keyword));

  if (allVisibleSelected) {
    return new Set();
  }

  return new Set(allVisibleKeywords);
}

export function useKeywordSelection() {
  const [selectedRows, setSelectedRows] = useState<Set<string>>(new Set());

  const clearSelection = useCallback(() => {
    setSelectedRows(new Set());
  }, []);

  const toggleRowSelection = useCallback((keyword: string) => {
    setSelectedRows((prev) => {
      const next = new Set(prev);
      if (next.has(keyword)) next.delete(keyword);
      else next.add(keyword);
      return next;
    });
  }, []);

  const toggleAllRows = useCallback((allVisibleKeywords: string[]) => {
    setSelectedRows((prev) => getNextSelectionSet(prev, allVisibleKeywords));
  }, []);

  return {
    selectedRows,
    setSelectedRows,
    clearSelection,
    toggleRowSelection,
    toggleAllRows,
  };
}