1. import { useState, useEffect, useCallback } from "react";
    2. const useToggleOpen = <T extends object = AnyTypeObject>(list: T[]) => {
    3. const [data, setData] = useState(list);
    4. useEffect(() => {
    5. setData(list);
    6. }, [list]);
    7. const toggleOpen = useCallback(
    8. (index: number, key: string, e: Event) => {
    9. const newData = data.map((item: any, itemIndex) => {
    10. const isOpen =
    11. item[`${key}IsOpen`] !== undefined ? !item[`${key}IsOpen`] : true;
    12. return {
    13. ...item,
    14. [`${key}IsOpen`]: itemIndex === index ? isOpen : item[`${key}IsOpen`],
    15. };
    16. });
    17. e.preventDefault();
    18. e.stopPropagation();
    19. setData(newData);
    20. },
    21. [data]
    22. );
    23. return [data, toggleOpen] as const;
    24. };
    25. export default useToggleOpen;