import { Avatar, Modal } from "antd"; import { HotKeys, KeyMap } from "react-hotkeys"; import { useCallback, useEffect, useState } from "react"; import { useCreateLine, useUserSearch } from "../../../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..."} />
); }