import {Menu, Transition} from '@headlessui/react' import {XMarkIcon} from '@heroicons/react/24/outline' import clsx from 'clsx' import {Fragment, useEffect, useRef, useState} from 'react' import {Button} from 'web/components/buttons/button' import {Col} from 'web/components/layout/col' import {Row} from 'web/components/layout/row' import {Avatar} from 'web/components/widgets/avatar' import {UserLink} from 'web/components/widgets/user-link' import {DisplayUser, searchUsers} from 'web/lib/supabase/users' import {Input} from './widgets/input' export function SelectUsers(props: { setSelectedUsers: (users: DisplayUser[]) => void selectedUsers: DisplayUser[] ignoreUserIds: string[] showSelectedUsersTitle?: boolean selectedUsersClassName?: string showUserUsername?: boolean maxUsers?: number searchLimit?: number className?: string }) { const { ignoreUserIds, selectedUsers, setSelectedUsers, showSelectedUsersTitle, selectedUsersClassName, showUserUsername, maxUsers, className, searchLimit, } = props const [query, setQuery] = useState('') const [filteredUsers, setFilteredUsers] = useState([]) const requestId = useRef(0) const queryReady = query.length > 1 const inputRef = useRef(null) useEffect(() => { // Wait for the modal (and transition) to finish const timeout = setTimeout(() => { inputRef.current?.focus() }, 100) return () => clearTimeout(timeout) }, []) useEffect(() => { const id = ++requestId.current if (queryReady) { searchUsers(query, searchLimit ?? 5).then((results) => { // if there's a more recent request, forget about this one if (id === requestId.current) { setFilteredUsers( results.filter((user) => { return ( !selectedUsers.some(({name}) => name === user.name) && !ignoreUserIds.includes(user.id) ) }), ) } }) } else { setFilteredUsers([]) } }, [query, selectedUsers, ignoreUserIds]) const shouldShow = maxUsers ? selectedUsers.length < maxUsers : true return ( {shouldShow && ( <> ) => setQuery(e.target.value)} placeholder="Search users..." /> {queryReady && ( {() => (
{filteredUsers.map((user) => ( {({active}) => ( )} ))}
)}
)} )} {selectedUsers.length > 0 && ( <> {showSelectedUsersTitle &&
'Added members:'
} {selectedUsers.map((user) => ( ))} )} ) }