useSet

A state hook for managing a Javascript Set object.

Batch Manager

Unique Selection Logic

🎯
Task Name0 Selected
Draft Proposal
Planning
Technical Specs
Planning
UI Mockups
Design
Color Palette
Design
Core Hooks
Engineering
Demo Pages
Engineering

Usage

import { useSet } from 'usehooks-ts'
 
export default function App() {
  const [set, actions] = useSet([1, 2, 3])
 
  return (
    <div>
      <p>Has 1: {set.has(1) ? 'Yes' : 'No'}</p>
      <button onClick={() => actions.add(4)}>Add 4</button>
      <button onClick={() => actions.toggle(2)}>Toggle 2</button>
      <button onClick={actions.clear}>Clear All</button>
    </div>
  )
}

API

const [set, actions] = useSet(initialValues?)

Actions

NameTypeDescription
add(value) => voidAdds a value to the set
remove(value) => voidRemoves a value from the set
toggle(value) => voidAdds if missing, removes if present
reset() => voidReverts to initial values
clear() => voidRemoves all values

Hook

import { useCallback, useState } from 'react'
 
export type SetActions<T> = {
  add: (value: T) => void
  remove: (value: T) => void
  toggle: (value: T) => void
  reset: () => void
  clear: () => void
}
 
export function useSet<T>(initialValues?: Iterable<T>): [Set<T>, SetActions<T>] {
  const [set, setSet] = useState(() => new Set(initialValues))
 
  const add = useCallback((value: T) => {
    setSet((prev) => {
      const copy = new Set(prev)
      copy.add(value)
      return copy
    })
  }, [])
 
  const remove = useCallback((value: T) => {
    setSet((prev) => {
      const copy = new Set(prev)
      copy.delete(value)
      return copy
    })
  }, [])
 
  const toggle = useCallback((value: T) => {
    setSet((prev) => {
      const copy = new Set(prev)
      if (copy.has(value)) {
        copy.delete(value)
      } else {
        copy.add(value)
      }
      return copy
    })
  }, [])
 
  const reset = useCallback(() => {
    setSet(new Set(initialValues))
  }, [initialValues])
 
  const clear = useCallback(() => {
    setSet(new Set())
  }, [])
 
  const actions: SetActions<T> = {
    add,
    remove,
    toggle,
    reset,
    clear,
  }
 
  return [set, actions]
}