timetable-app

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

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;