fix(tool-ui): remove render-time ref mutation in controllable state

This commit is contained in:
2026-04-03 18:02:44 +02:00
parent 16f24991a4
commit c33e65b0f6

View File

@@ -1,6 +1,6 @@
"use client"; "use client";
import { useCallback, useMemo, useRef, useState } from "react"; import { useCallback, useMemo, useState } from "react";
export type UseControllableStateOptions<T> = { export type UseControllableStateOptions<T> = {
value?: T; value?: T;
@@ -20,17 +20,14 @@ export function useControllableState<T>({
() => (isControlled ? (value as T) : uncontrolled), () => (isControlled ? (value as T) : uncontrolled),
[isControlled, value, uncontrolled], [isControlled, value, uncontrolled],
); );
const currentValueRef = useRef(currentValue);
currentValueRef.current = currentValue;
const setValue = useCallback( const setValue = useCallback(
(next: T | ((prev: T) => T)) => { (next: T | ((prev: T) => T)) => {
const resolved = const resolved =
typeof next === "function" typeof next === "function"
? (next as (prev: T) => T)(currentValueRef.current) ? (next as (prev: T) => T)(currentValue)
: next; : next;
currentValueRef.current = resolved;
if (!isControlled) { if (!isControlled) {
setUncontrolled(resolved); setUncontrolled(resolved);
} }
@@ -38,7 +35,7 @@ export function useControllableState<T>({
onChange?.(resolved); onChange?.(resolved);
return resolved; return resolved;
}, },
[isControlled, onChange], [currentValue, isControlled, onChange],
); );
const setUncontrolledValue = useCallback((next: T) => { const setUncontrolledValue = useCallback((next: T) => {