import { Avatar, Modal } from 'antd'; import { HotKeys, KeyMap } from 'react-hotkeys'; import { useCallback, useEffect, useState } from 'react'; import { useCreateLine, useUserSearch } from '../../../src/controller/index'; import BasicUserRow from '../../components/User/basicUserDetailsRow'; import { FiSearch } from 'react-icons/fi'; import { User } from '@nirvana/core/models'; import toast from 'react-hot-toast'; export default function NewLineModal({ open, handleClose, }: { open: boolean; handleClose: () => void; }) { const [selectedPeople, setSelectedPeople] = useState([]); const [peopleSearchValue, setPeopleSearchValue] = useState(''); // the actual state that goes to query...the debounced one so to speak const [searchQuery, setSearchQuery] = useState(''); const { refetch, data: searchRes } = useUserSearch(searchQuery); const { mutateAsync, isLoading } = useCreateLine(); const [lineName, setLineName] = useState(''); useEffect(() => { if (searchQuery) refetch(); }, [searchQuery]); const onSearch = useCallback(() => { console.log('enter key pressed'); if (peopleSearchValue) { console.log('searching for people in database'); setSearchQuery(peopleSearchValue); } }, [setSearchQuery, peopleSearchValue]); const selectUser = useCallback( (userToAdd: User) => { setSelectedPeople((prevSelectedUsers) => { // if user is not already in the selected user const foundUser = prevSelectedUsers.find( (currentUser) => currentUser._id.toString() === userToAdd._id.toString() ); if (!foundUser) { return [...prevSelectedUsers, userToAdd]; } toast.error('you already selected this person below!'); return prevSelectedUsers; }); }, [setSelectedPeople] ); const unSelectUser = useCallback( (userIdToRemove: string) => { setSelectedPeople((prevSelectedUsers) => { return prevSelectedUsers.filter( (prevUser) => prevUser._id.toString() !== userIdToRemove ); }); }, [setSelectedPeople] ); const handleSubmit = useCallback(async () => { // TODO: prevent creating one-on-one line if already exists with x person? // ensure that we don't have a one on one chat already with x person if it's one person selected // upon success, // make sure that the list of lines updates for this client and others so that it shows this new line // select the line so that it shows up in the line details for this client console.log('trying to create line now!'); try { if (!selectedPeople?.length) { toast.error('you must select at least one person'); return; } const selectedMemberIds = selectedPeople.map((selectedPerson) => selectedPerson._id.toString() ); const res = await mutateAsync({ lineName, otherMemberIds: selectedMemberIds, }); toast.success('created line!'); // handle close once the new line is created handleClose(); } catch (error) { toast.error(error); console.error(error); } finally { console.log('done'); } }, [lineName, selectedPeople]); const handleCancel = () => { handleClose(); }; const keyMap: KeyMap = { HANDLE_SEARCH: 'enter', }; const handlers = { HANDLE_SEARCH: onSearch, }; if (isLoading) return one second while we make magic; return ( <> } className={'flex flex-col gap-5'} >

People

setPeopleSearchValue(e.target.value)} placeholder='search by name or email' /> enter to search {/* search results */} {searchRes?.users?.length > 0 && (
{searchRes?.users?.map((searchedUser) => ( selectUser(searchedUser)}> Add } /> ))}
)}
{/* selected people */} {selectedPeople?.length > 0 && (

Selected People

{selectedPeople.map((selectedUser) => ( unSelectUser(selectedUser._id.toString()) } > Remove } /> ))}
)}

Line Name (optional)

setLineName(e.target.value)} className='placeholder:text-gray-300 outline-none placeholder:text-sm flex-1 border p-2 border-gray-200' placeholder={'ex. Engineering, Sprint 7, Follow up on present...'} />
); }