CEC-4564: use Set for unique values (#408)

* add TrieSelect

* setup menu button

* CEC-4564: add trie select component

* CEC-4564: fix possible duplicate with set
This commit is contained in:
Tristan Timblin
2023-08-03 10:04:34 -04:00
committed by GitHub
parent 27ffdf01b0
commit fb6e91dcfc
2 changed files with 19 additions and 12 deletions

View File

@@ -58,7 +58,7 @@ const TrieSelectList = ({
{selected.map((signal) => { {selected.map((signal) => {
return ( return (
<li key={signal}> <li key={signal}>
<Chip label={signal} onDelete={() => remove(signal)} /> <Chip label={signal} onDelete={() => remove([signal])} />
</li> </li>
); );
})} })}
@@ -89,12 +89,10 @@ const TrieSelectLevel = ({
}; };
const handleCheck = (names = [], checked) => { const handleCheck = (names = [], checked) => {
for (let i = 0; i < names.length; i++) { if (checked) {
if (checked) { remove(names);
remove(names[i]); } else {
} else { add(names)
add(names[i])
}
} }
} }

View File

@@ -12,17 +12,26 @@ export const useTrieSelect = () => {
} }
export const TrieSelectProvider = ({ children, onChange }) => { export const TrieSelectProvider = ({ children, onChange }) => {
const [selected, setSelected] = useState([]); const [selected, setSelected] = useState(new Set());
const add = (id) => setSelected(prev => [...prev, id]); const add = (ids) => setSelected(prev => new Set([...prev, ...ids]));
const remove = (id) => setSelected(prev => prev.filter(select => select !== id)); const remove = (ids) => setSelected(prev => {
for (const id of ids) {
prev.delete(id);
}
return new Set(prev);
});
useEffect(() => { useEffect(() => {
onChange(selected); onChange(Array.from(selected));
}, [onChange, selected]); }, [onChange, selected]);
return ( return (
<TrieSelectContext.Provider value={{ selected, setSelected, add, remove }}> <TrieSelectContext.Provider value={{
selected: Array.from(selected),
add,
remove
}}>
{children} {children}
</TrieSelectContext.Provider> </TrieSelectContext.Provider>
); );