import { XIcon } from '@heroicons/react/outline' import { Fragment, useRef, useEffect, useState } from 'react' import clsx from 'clsx' import { Menu, Transition } from '@headlessui/react' import { Avatar } from 'web/components/widgets/avatar' import { Row } from 'web/components/layout/row' import { UserLink } from 'web/components/widgets/user-link' import { Input } from './widgets/input' import { searchUsers, DisplayUser } from 'web/lib/supabase/users' import { Col } from 'web/components/layout/col' import { Button } from 'web/components/buttons/button' 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) => ( ))} )} ) }