diff --git a/src/types.ts b/src/types.ts index 93ce900..97bdd20 100644 --- a/src/types.ts +++ b/src/types.ts @@ -59,5 +59,10 @@ export type UseUndoable = [ behavior?: MutationBehavior, ignoreAction?: boolean ) => void + setStateStable: ( + payload: T | ((oldValue: T) => T), + behavior?: MutationBehavior, + ignoreAction?: boolean + ) => void } ] diff --git a/src/useUndoable.ts b/src/useUndoable.ts index ffd4cfb..c1ac6b8 100644 --- a/src/useUndoable.ts +++ b/src/useUndoable.ts @@ -1,4 +1,4 @@ -import { useReducer, useCallback, Reducer } from "react" +import { useReducer, useCallback, Reducer, useRef } from "react" import { reducer } from "./reducer" @@ -95,6 +95,19 @@ const useUndoable = ( [state] ) + const setStateRef = useRef(setState) + setStateRef.current = setState; + + const setStateStable = useCallback(( + payload: any, + + // @ts-ignore + mutationBehavior: MutationBehavior = options.behavior, + ignoreAction: boolean = false + ) => { + return setStateRef.current(payload, mutationBehavior, ignoreAction) + }, [setStateRef]) + // In some rare cases, the fact that the above setState // function changes on every render can be problematic. // Since we can't really avoid this (setState uses @@ -126,6 +139,7 @@ const useUndoable = ( reset, resetInitialState, static_setState, + setStateStable }, ] }