diff --git a/app/javascript/components/react-aria/hooks.ts b/app/javascript/components/react-aria/hooks.ts index e2683b919..200ba16d7 100644 --- a/app/javascript/components/react-aria/hooks.ts +++ b/app/javascript/components/react-aria/hooks.ts @@ -56,7 +56,10 @@ export function useSingleList({ onChange?: (item: Item | null) => void; }) { const [selectedKey, setSelectedKey] = useState(defaultSelectedKey); - const items = useMemo(() => defaultItems || [], [defaultItems]); + const items = useMemo( + () => (defaultItems ? distinctBy(defaultItems, 'value') : []), + [defaultItems] + ); const selectedItem = useMemo( () => items.find((item) => item.value == selectedKey) ?? null, [items, selectedKey] @@ -157,7 +160,10 @@ export function useMultiList({ () => new Set(defaultSelectedKeys ?? []) ); const [inputValue, setInputValue] = useState(''); - const items = useMemo(() => defaultItems || [], [defaultItems]); + const items = useMemo( + () => (defaultItems ? distinctBy(defaultItems, 'value') : []), + [defaultItems] + ); const itemsIndex = useMemo(() => { const index = new Map(); for (const item of items) { @@ -473,3 +479,8 @@ export function useOnFormReset(onReset?: () => void) { return ref; } + +function distinctBy(array: T[], key: keyof T): T[] { + const keys = array.map((item) => item[key]); + return array.filter((item, index) => keys.indexOf(item[key]) == index); +}