The weeb for the next gen discord boat - Wamellow wamellow.com
bot discord
3
fork

Configure Feed

Select the types of activity you want to include in your feed.

fix: prevent unnecessary saves and duplicate selections (#38)

authored by

Luna Seemann and committed by
GitHub
ee17bae1 65ca7cab

+18 -5
+12 -2
components/inputs/multi-select-menu.tsx
··· 56 56 value, 57 57 state, 58 58 error, 59 + isDirty, 59 60 update, 60 61 save 61 62 } = useInput({ ··· 68 69 transform, 69 70 70 71 onSave, 71 - manual: true // Save only when menu closes or after debounce 72 + manual: true, // Save only when menu closes or after debounce 73 + isEqual: (a, b) => { 74 + if (a === b) return true; 75 + if (a.length !== b.length) return false; 76 + const setA = new Set(a); 77 + return b.every((v) => setA.has(v)); 78 + } 72 79 }); 73 80 74 81 const [open, setOpen] = useState(false); ··· 134 141 clearTimeout(debounceRef.current); 135 142 debounceRef.current = null; 136 143 } 137 - save(); 144 + 145 + if (isDirty) { 146 + save(); 147 + } 138 148 } 139 149 }; 140 150
+2 -1
components/inputs/select-menu.tsx
··· 71 71 const selectedItem = items.find((i) => i.value === value); 72 72 73 73 const handleSelect = (item: SelectItem<T>) => { 74 - if (item.error) return; // Don't select items with errors 74 + if (item.error || item.value === value) return; // Don't select items with errors or if same 75 75 update(item.value); 76 76 }; 77 77 78 78 const handleClear = (e: React.MouseEvent) => { 79 79 e.stopPropagation(); 80 + if (value === null) return; 80 81 update(null as T | null); 81 82 }; 82 83
+4 -2
utils/input.ts
··· 23 23 24 24 manual?: boolean; 25 25 debounceMs?: number; 26 + 27 + isEqual?: (a: T, b: T) => boolean; 26 28 } 27 29 28 30 export type InputProps<T> = InputOptions<T> & HTMLProps<HTMLDivElement> & { ··· 41 43 42 44 const endpoint = options.endpoint || options.url; 43 45 const k = options.k || options.dataName; 44 - const { onSave, transform, manual, debounceMs, defaultState } = options; 46 + const { onSave, transform, manual, debounceMs, defaultState, isEqual } = options; 45 47 46 48 const defaultStateKey = JSON.stringify(defaultState); 47 49 const [prevDefaultStateKey, setPrevDefaultStateKey] = useState(defaultStateKey); ··· 139 141 value, 140 142 state, 141 143 error, 142 - isDirty: value !== savedValue, 144 + isDirty: isEqual ? !isEqual(value, savedValue) : value !== savedValue, 143 145 update, 144 146 save, 145 147 reset: () => setValue(savedValue)