import { Autocomplete, AutocompleteChangeReason, AutocompleteRenderOptionState, Button, Container, Dialog, FormControl, IconButton, InputBase, InputLabel, ListItem, Select, Stack, TextField, Typography, styled, } from '@mui/material'; import React, { HTMLAttributes, useCallback, useEffect, useState } from 'react'; import CircularProgress from '@mui/material/CircularProgress'; import { FiX } from 'react-icons/fi'; import { NirvanaRules } from '../util/rules'; import User from '@nirvana/core/models/user.model'; import UserDetailRow from '../subcomponents/UserDetailRow'; import { blueGrey } from '@mui/material/colors'; import { createConversation } from '../api/NirvanaApi'; import toast from 'react-hot-toast'; import useAuth from '../providers/AuthProvider'; import useConversations from '../providers/ConversationProvider'; import useRouter from '../providers/RouterProvider'; import useSearch from '../providers/SearchProvider'; export default function NewConversationDialog() { const { page, handleSetPage } = useRouter(); const { user } = useAuth(); const { userResults, searchQuery, searchUsers, isSearching } = useSearch(); const [selectedUsers, setSelectedUsers] = useState([]); const handleChangeSelections = useCallback( (e: React.SyntheticEvent, value: User[], reason: AutocompleteChangeReason) => { setSelectedUsers(value); }, [], ); const handleChangeSearchInput = useCallback( (e: React.ChangeEvent, newValue: string) => { searchUsers(newValue); }, [searchUsers], ); const renderOption = useCallback( (props: HTMLAttributes, option: User, state: AutocompleteRenderOptionState) => ( ), [], ); const [conversationName, setConversationName] = useState(''); useEffect(() => { if (selectedUsers.length < 2) { setConversationName(''); } }, [selectedUsers, setConversationName]); const handleChangeName = useCallback( (e: React.ChangeEvent) => { setConversationName(e.target.value); }, [setConversationName], ); const [isSubmitting, setIsSubmitting] = useState(false); const { handleStartConversation } = useConversations(); const handleSubmit = useCallback(async () => { if (selectedUsers.length === 0) { toast.error('Must select a person!'); return; } if (selectedUsers.length + 1 >= NirvanaRules.maxMembersPerConversation) { toast.error('A group can only have 8 people including you!'); return; } setIsSubmitting(true); const succeeded = await handleStartConversation(selectedUsers, conversationName); // clear form for next time if (succeeded) { toast('succeeded'); setSelectedUsers([]); setConversationName(''); handleSetPage('SELECTED_CONVERSATION')(); } setIsSubmitting(false); }, [ selectedUsers, setConversationName, conversationName, setSelectedUsers, setIsSubmitting, handleStartConversation, handleSetPage, ]); return ( Start a Conversation (typeof option === 'string' ? option : option.name)} value={selectedUsers} onChange={handleChangeSelections} filterSelectedOptions isOptionEqualToValue={(optionUser, valueUser) => optionUser._id.toString() === valueUser._id.toString() } filterOptions={(options) => options} inputValue={searchQuery} renderInput={(params) => ( )} /> {selectedUsers.length > 1 && ( )} ); }