Skip to content

I. useCheckbox

hook/useCheckbox.ts
import { ChangeEvent, useMemo, useState } from "react";
interface Item {
  id: number;
}

const useCheckbox = ({ data }: { data: any }) => {
  const [payload, setPayload] = useState<number[]>([]);
  const checked = useMemo(() => {
    if (!data) {
      return { isAllCheced: false };
    }
    const isAllChecked = data.data.every((n: Item) => payload.includes(n.id));
    const selected = data.data.filter((n: Item) => payload.includes(n.id));

    return {
      isAllChecked: !!selected.length && isAllChecked,
      isIndeterminate: !!selected.length && !isAllChecked,
    };
  }, [payload, data]);

  const handleCheckHeader = () => {
    if (checked.isAllChecked || checked.isIndeterminate) {
      setPayload([]);
    } else {
      setPayload((state) => {
        if (!data) {
          return [];
        }
        const selected = Array.from(
          new Set([...state, ...data?.data?.map((n: Item) => Number(n.id))])
        );
        return [...selected];
      });
    }
  };

  const handleCheckItem = (e: ChangeEvent<any>, id: number) => {
    if (e.target.checked) {
      setPayload((state) => [...state, id]);
    } else {
      const filtered = payload.filter((n) => n !== id);
      setPayload(filtered);
    }
  };

  return { checked, payload, handleCheckHeader, handleCheckItem };
};

export default useCheckbox;