sparkletown/sparkle

View on GitHub
src/hooks/useDynamicInput.ts

Summary

Maintainability
A
1 hr
Test Coverage
import { useCallback, useState } from "react";

export const useDynamicInput = (questions?: number) => {
  const defaultCounter = questions ?? 0;
  const defaultIndexes = questions
    ? Array.from(Array(questions)).map((_, index) => index)
    : [];

  const [counter, setCounter] = useState(defaultCounter);
  const [indexes, setIndexes] = useState<number[]>(defaultIndexes);

  const add = useCallback(() => {
    setIndexes((prevIndexes) => [...prevIndexes, counter]);
    setCounter((prevCounters) => prevCounters + 1);
  }, [counter]);

  const remove = useCallback(
    (index: number) => () => {
      setIndexes((prevIndexes) => [...prevIndexes.filter((i) => i !== index)]);
      setCounter((prevCounters) => prevCounters - 1);
    },
    []
  );

  const clear = useCallback(() => {
    setIndexes([]);
    setCounter(0);
  }, []);

  return {
    counter,
    indexes,
    add,
    remove,
    clear,
  };
};