useMap.ts (1045B)
1 import { useCallback, useState } from 'react'; 2 3 export type MapOrEntries<K, V> = Map<K, V> | [K, V][]; 4 5 export interface Actions<K, V> { 6 set: (key: K, value: V) => void; 7 setAll: (entries: MapOrEntries<K, V>) => void; 8 remove: (key: K) => void; 9 reset: Map<K, V>['clear']; 10 } 11 12 type Return<K, V> = [ 13 Omit<Map<K, V>, 'set' | 'clear' | 'delete'>, 14 Actions<K, V>, 15 ]; 16 17 function useMap<K, V>( 18 initialState: MapOrEntries<K, V> = new Map(), 19 ): Return<K, V> { 20 const [map, setMap] = useState(new Map(initialState)); 21 22 const actions: Actions<K, V> = { 23 set: useCallback((key, value) => { 24 setMap((prev) => { 25 const copy = new Map(prev); 26 copy.set(key, value); 27 return copy; 28 }); 29 }, []), 30 31 setAll: useCallback((entries) => { 32 setMap(() => new Map(entries)); 33 }, []), 34 35 remove: useCallback((key) => { 36 setMap((prev) => { 37 const copy = new Map(prev); 38 copy.delete(key); 39 return copy; 40 }); 41 }, []), 42 43 reset: useCallback(() => { 44 setMap(() => new Map()); 45 }, []), 46 }; 47 48 return [map, actions]; 49 } 50 51 export default useMap;