You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
28 lines
748 B
TypeScript
28 lines
748 B
TypeScript
3 years ago
|
import { useCallback, useState } from 'react';
|
||
|
import _ from 'lodash';
|
||
|
|
||
|
export function useSet<T>(initialValues: Array<T> = []) {
|
||
|
const [uniqueValues, setUniqueValues] = useState<Array<T>>(initialValues);
|
||
|
|
||
|
const addTo = useCallback(
|
||
|
(valueToAdd: T) => {
|
||
|
if (uniqueValues.includes(valueToAdd)) {
|
||
|
return;
|
||
|
}
|
||
|
setUniqueValues([...uniqueValues, valueToAdd]);
|
||
|
},
|
||
|
[uniqueValues, setUniqueValues]
|
||
|
);
|
||
|
const removeFrom = useCallback(
|
||
|
(valueToRemove: T) => {
|
||
|
if (!uniqueValues.includes(valueToRemove)) {
|
||
|
return;
|
||
|
}
|
||
|
setUniqueValues(uniqueValues.filter(v => !_.isEqual(v, valueToRemove)));
|
||
|
},
|
||
|
[uniqueValues, setUniqueValues]
|
||
|
);
|
||
|
|
||
|
return { uniqueValues, addTo, removeFrom };
|
||
|
}
|