From 718cbcbc159f00da0996df10c20fe7f912e2c6e2 Mon Sep 17 00:00:00 2001 From: KRISHNA PATIL RAJPUT Date: Wed, 1 Oct 2025 23:32:51 +0530 Subject: [PATCH] fix: update useSet to proper TypeScript actions without Proxy --- src/useSet.ts | 54 +++++++++++++++++++++++++++++---------------------- 1 file changed, 31 insertions(+), 23 deletions(-) diff --git a/src/useSet.ts b/src/useSet.ts index 9c88306cc9..b041ea349d 100644 --- a/src/useSet.ts +++ b/src/useSet.ts @@ -1,4 +1,4 @@ -import { useCallback, useMemo, useState } from 'react'; +import { useRef, useState } from 'react'; export interface StableActions { add: (key: K) => void; @@ -13,28 +13,36 @@ export interface Actions extends StableActions { } const useSet = (initialSet = new Set()): [Set, Actions] => { - const [set, setSet] = useState(initialSet); - - const stableActions = useMemo>(() => { - const add = (item: K) => setSet((prevSet) => new Set([...Array.from(prevSet), item])); - const remove = (item: K) => - setSet((prevSet) => new Set(Array.from(prevSet).filter((i) => i !== item))); - const toggle = (item: K) => - setSet((prevSet) => - prevSet.has(item) - ? new Set(Array.from(prevSet).filter((i) => i !== item)) - : new Set([...Array.from(prevSet), item]) - ); - - return { add, remove, toggle, reset: () => setSet(initialSet), clear: () => setSet(new Set()) }; - }, [setSet]); - - const utils = { - has: useCallback((item) => set.has(item), [set]), - ...stableActions, - } as Actions; - - return [set, utils]; + const [, forceUpdate] = useState({}); + const setRef = useRef(new Set(initialSet)); + + const actions: Actions = { + add: (item: K) => { + setRef.current.add(item); + forceUpdate({}); + }, + remove: (item: K) => { + setRef.current.delete(item); + forceUpdate({}); + }, + toggle: (item: K) => { + setRef.current.has(item) + ? setRef.current.delete(item) + : setRef.current.add(item); + forceUpdate({}); + }, + reset: () => { + setRef.current = new Set(initialSet); + forceUpdate({}); + }, + clear: () => { + setRef.current.clear(); + forceUpdate({}); + }, + has: (item: K) => setRef.current.has(item), + }; + + return [setRef.current, actions]; }; export default useSet;