ShipSearch: prevent dupes

Fixes urbit/landscape#470
This commit is contained in:
Liam Fitzgerald 2021-03-04 14:35:32 +10:00
parent 7d451a37b8
commit ec9e45dad6
No known key found for this signature in database
GPG Key ID: D390E12C61D1CFFB
2 changed files with 8 additions and 6 deletions

View File

@ -114,7 +114,7 @@ export function DropdownSearch<C>(props: DropdownSearchProps<C>): ReactElement {
search(e.target.value);
setQuery(e.target.value);
},
[setQuery]
[search, onChange]
);
const dropdown = useMemo(() => {

View File

@ -37,14 +37,16 @@ interface InviteSearchProps<I extends string> {
maxLength?: number;
}
const getNicknameForShips = (groups: Groups, contacts: Rolodex): readonly [string[], Map<string, string[]>] => {
const getNicknameForShips = (groups: Groups, contacts: Rolodex, selected: string[]): readonly [string[], Map<string, string[]>] => {
const peerSet = new Set<string>();
const nicknames = new Map<string, string[]>();
_.forEach(groups, (group, path) => {
if (group.members.size > 0) {
const groupEntries = group.members.values();
for (const member of groupEntries) {
peerSet.add(member);
if(!selected.includes(member)) {
peerSet.add(member);
}
}
}
@ -116,15 +118,15 @@ export function ShipSearch<I extends string, V extends Value<I>>(
const inputIdx = useRef(initialValues[id].length);
const selected: string[] = values[id] ?? [];
const selected: string[] = useMemo(() => values[id] ?? [], [values, id]);
const name = () => `${props.id}[${inputIdx.current}]`;
const pills = selected.slice(0, inputIdx.current);
const [peers, nicknames] = useMemo(
() => getNicknameForShips(props.groups, props.contacts),
[props.contacts, props.groups]
() => getNicknameForShips(props.groups, props.contacts, selected),
[props.contacts, props.groups, selected]
);
const renderCandidate = useCallback(