Improve group user search

This commit is contained in:
Ian Philips 2022-06-23 16:49:14 -05:00
parent 17ac6c58b2
commit f0d4e9940c

View File

@ -1,12 +1,11 @@
import { UserIcon } from '@heroicons/react/outline' import { UserIcon } from '@heroicons/react/outline'
import { useUsers } from 'web/hooks/use-users' import { useUsers } from 'web/hooks/use-users'
import { User } from 'common/user' import { User } from 'common/user'
import { Fragment, useState } from 'react' import { Fragment, useMemo, useState } from 'react'
import clsx from 'clsx' import clsx from 'clsx'
import { Menu, Transition } from '@headlessui/react' import { Menu, Transition } from '@headlessui/react'
import { Avatar } from 'web/components/avatar' import { Avatar } from 'web/components/avatar'
import { Row } from 'web/components/layout/row' import { Row } from 'web/components/layout/row'
import { debounce } from 'lodash'
export function FilterSelectUsers(props: { export function FilterSelectUsers(props: {
setSelectedUsers: (users: User[]) => void setSelectedUsers: (users: User[]) => void
@ -16,18 +15,20 @@ export function FilterSelectUsers(props: {
const { ignoreUserIds, selectedUsers, setSelectedUsers } = props const { ignoreUserIds, selectedUsers, setSelectedUsers } = props
const users = useUsers() const users = useUsers()
const [query, setQuery] = useState('') const [query, setQuery] = useState('')
const [filteredUsers, setFilteredUsers] = useState<User[]>([])
const filteredUsers = const beginQuerying = query.length > 2
query === '' useMemo(() => {
? users if (beginQuerying)
: users.filter((user: User) => { setFilteredUsers(
users.filter((user: User) => {
return ( return (
!selectedUsers.map((user) => user.name).includes(user.name) && !selectedUsers.map((user) => user.name).includes(user.name) &&
!ignoreUserIds.includes(user.id) && !ignoreUserIds.includes(user.id) &&
user.name.toLowerCase().includes(query.toLowerCase()) user.name.toLowerCase().includes(query.toLowerCase())
) )
}) })
const debouncedQuery = debounce(setQuery, 50) )
}, [beginQuerying, users, selectedUsers, ignoreUserIds, query])
return ( return (
<div> <div>
@ -40,7 +41,7 @@ export function FilterSelectUsers(props: {
name="user name" name="user name"
id="user name" id="user name"
value={query} value={query}
onChange={(e) => debouncedQuery(e.target.value)} onChange={(e) => setQuery(e.target.value)}
className="input input-bordered block w-full pl-10 focus:border-gray-300 " className="input input-bordered block w-full pl-10 focus:border-gray-300 "
placeholder="Austin Chen" placeholder="Austin Chen"
/> />
@ -48,13 +49,13 @@ export function FilterSelectUsers(props: {
<Menu <Menu
as="div" as="div"
className={clsx( className={clsx(
'relative inline-block w-full text-right', 'relative inline-block w-full overflow-y-scroll text-right',
query !== '' && 'h-36' beginQuerying && 'h-36'
)} )}
> >
{({}) => ( {({}) => (
<Transition <Transition
show={query !== ''} show={beginQuerying}
as={Fragment} as={Fragment}
enter="transition ease-out duration-100" enter="transition ease-out duration-100"
enterFrom="transform opacity-0 scale-95" enterFrom="transform opacity-0 scale-95"