diff --git a/web/src/hooks/use-optimistic-state.ts b/web/src/hooks/use-optimistic-state.ts index ca33fe885..0b47dd4ff 100644 --- a/web/src/hooks/use-optimistic-state.ts +++ b/web/src/hooks/use-optimistic-state.ts @@ -3,11 +3,11 @@ import { useState, useEffect, useCallback, useRef } from "react"; type OptimisticStateResult = [T, (newValue: T) => void]; const useOptimisticState = ( - initialState: T, + currentState: T, setState: (newValue: T) => void, delay: number = 20, ): OptimisticStateResult => { - const [optimisticValue, setOptimisticValue] = useState(initialState); + const [optimisticValue, setOptimisticValue] = useState(currentState); const debounceTimeout = useRef | null>(null); const handleValueChange = useCallback( @@ -37,6 +37,16 @@ const useOptimisticState = ( }; }, []); + useEffect(() => { + if (currentState != optimisticValue) { + setOptimisticValue(currentState); + } + // sometimes an external action will cause the currentState to change + // without handleValueChange being called. In this case + // we need to update the optimistic value so the UI reflects the change + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [currentState]); + return [optimisticValue, handleValueChange]; };