import { useEffect, useRef } from 'react'; import equal from '@gilbarbara/deep-equal'; import treeChanges, { Data, KeyType, TreeChanges } from 'tree-changes'; export default function useTreeChanges(value: T) { const previousValue = useRef(value); const isEqual = equal(previousValue.current, value); const previousIsEqual = useRef(isEqual); const instance = useRef>>( treeChanges(previousValue.current, value), ); useEffect(() => { previousValue.current = value; }); if (previousIsEqual.current !== isEqual || !isEqual) { previousIsEqual.current = isEqual; instance.current = treeChanges(previousValue.current, value); } return instance.current; } // eslint-disable-next-line unicorn/prefer-export-from export { treeChanges }; export type { Data, KeyType, TreeChanges, Value } from 'tree-changes';