@supunlakmal/hooks
Version:
A collection of reusable React hooks
59 lines • 2.03 kB
JavaScript
import { useMemo, useState } from 'react';
/**
* Custom hook to manage state as a Set, providing helper functions.
*
* @template T - The type of the values in the Set.
* @param initialSet - Optional initial Set or an iterable of values.
* @returns A tuple containing the current Set state and an actions object.
*/
export const useSet = (initialSet) => {
const [set, setSet] = useState(() => new Set(initialSet));
const actions = useMemo(() => ({
add: (value) => {
setSet((prevSet) => {
if (prevSet.has(value)) {
return prevSet; // No change if value already exists
}
const newSet = new Set(prevSet);
newSet.add(value);
return newSet;
});
},
remove: (value) => {
setSet((prevSet) => {
if (!prevSet.has(value)) {
return prevSet; // No change if value doesn't exist
}
const newSet = new Set(prevSet);
newSet.delete(value);
return newSet;
});
},
toggle: (value) => {
setSet((prevSet) => {
const newSet = new Set(prevSet);
if (newSet.has(value)) {
newSet.delete(value);
}
else {
newSet.add(value);
}
return newSet;
});
},
reset: () => {
// Reset back to the initial state provided when the hook was first called
setSet(new Set(initialSet));
},
clear: () => {
// Clear the set completely
setSet(new Set());
},
has: (value) => {
// Direct check on the current set state
return set.has(value);
},
}), [initialSet]); // Recalculate actions only if initialSet reference changes
return [set, actions];
};
//# sourceMappingURL=useSet.js.map