import React, { useState, useCallback, useRef, useEffect } from 'react'; import { FiPlusSquare, FiUsers, FiXSquare } from 'react-icons/fi'; import { useAsyncFn, useDebounce } from 'react-use'; import { userSearch } from '../../../../api/NirvanaApi'; import toast from 'react-hot-toast'; import { Avatar, Skeleton, Spin } from 'antd'; import { User } from '@nirvana/core/models/user.model'; export default function NewChannelForm() { const [peopleSearchQuery, setPeopleSearchQuery] = useState(''); const [userSearchRes, fetchUsers] = useAsyncFn(userSearch); const [isSearchingUsers, setSearchingUsers] = useState(false); const searchInputRef = useRef(null); useEffect(() => { if (searchInputRef) searchInputRef.current.focus(); }, [searchInputRef]); const [_, cancel] = useDebounce( async () => { try { await fetchUsers(peopleSearchQuery); setSearchingUsers(false); } catch (error) { toast.error('Problem in searching users!'); console.error(error); } }, 1000, [peopleSearchQuery, setSearchingUsers, fetchUsers], ); const handleSearchChange = useCallback( async (e) => { setSearchingUsers(true); setPeopleSearchQuery(e.target.value); }, [setPeopleSearchQuery, setSearchingUsers], ); const [selectedUsers, setSelectedUsers] = useState([]); // ensuring that we haven't already selected this user // changing search results so that we don't see the selected user in the search results anymore const addUser = useCallback( (newUser: User) => { setSelectedUsers((prevUsers) => { if (prevUsers.find((currUser) => currUser.email === newUser.email)) { return [...prevUsers, newUser]; } return prevUsers; }); if (userSearchRes.value?.users) { userSearchRes.value.users = userSearchRes.value.users.filter( (currUser) => currUser._id !== newUser._id, ); } }, [setSelectedUsers, userSearchRes.value], ); const removeUser = useCallback((userIdToRemove: string) => { setSelectedUsers((prevUsers) => prevUsers.filter((currentUser) => currentUser._id.toString() !== userIdToRemove), ); }, []); return (
{/* people search */} People
{/* dropdown search results */}
{(userSearchRes.loading || isSearchingUsers) && } {(!userSearchRes.value || userSearchRes.value?.users.length === 0) && ( {`Can't find someone? Invite them and tell them the secret passcode!`} )} {userSearchRes.value?.users.map((searchedUser) => { return (
addUser(searchedUser)} role={'presentation'} key={searchedUser.email} className="flex flex-row gap-2 items-center p-2 border border-gray-200 hover:bg-gray-100 cursor-pointer" > {searchedUser.name} {searchedUser.email}
); })}
{/* selected people */} {`Selected`} {selectedUsers.length}/7 {selectedUsers.map((selectedUser) => { return (
removeUser(selectedUser._id.toString())} role={'presentation'} key={selectedUser.email} className="flex flex-row gap-2 items-center p-2 border border-gray-200 hover:bg-gray-100 cursor-pointer group" > {selectedUser.name} {selectedUser.email}
); })}
); }