import React, { HTMLAttributes, useCallback, useState, useEffect } from 'react'; import { Autocomplete, AutocompleteChangeReason, AutocompleteRenderOptionState, Button, Container, Dialog, FormControl, IconButton, InputBase, InputLabel, ListItem, Select, Stack, styled, TextField, Typography, } from '@mui/material'; import { FiX } from 'react-icons/fi'; import { blueGrey } from '@mui/material/colors'; import { useSnackbar } from 'notistack'; import { useDebounce, useKeyPressEvent, useToggle } from 'react-use'; import { searchUsers } from '../firebase/firestore'; import { User } from '@nirvana/core/src/models/user.model'; import useAuth from '../providers/AuthProvider'; import UserDetailRow from '../subcomponents/UserDetailRow'; import CircularProgress from '@mui/material/CircularProgress'; import { NirvanaRules } from '../util/rules'; export default function NewConversationDialog({ open, handleClose, handleSubmit, }: { open: boolean; handleClose: () => void; handleSubmit: (selectedUsers: User[], conversationName?: string) => Promise; }) { const { enqueueSnackbar } = useSnackbar(); const { user } = useAuth(); const [searchVal, setSearchVal] = useState(''); const [searchUsersResults, setSearchUsersResults] = useState([]); const [searching, setSearching] = useState(false); const [selectedUsers, setSelectedUsers] = useState([]); const handleChangeSelections = useCallback( (e: React.SyntheticEvent, value: User[], reason: AutocompleteChangeReason) => { setSelectedUsers(value); }, [], ); const [, cancel] = useDebounce( async () => { if (searchVal) { enqueueSnackbar('searching...', { variant: 'info' }); let results = await searchUsers(searchVal); results = results.filter((userResult) => userResult.id !== user.uid); setSearchUsersResults(results); console.warn('searched users', results); } setSearching(false); }, 1000, [searchVal, enqueueSnackbar, setSearchUsersResults, user], ); const handleChangeSearchInput = useCallback( (e: React.ChangeEvent, newValue: string) => { setSearching(true); setSearchVal(newValue); }, [setSearching, setSearchVal], ); 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 handleSubmitLocal = useCallback(async () => { if (selectedUsers.length === 0) { enqueueSnackbar('Must select a person!', { variant: 'error' }); return; } if (selectedUsers.length + 1 >= NirvanaRules.maxMembersPerConversation) { enqueueSnackbar('A group can only have 8 people including you!', { variant: 'error' }); return; } setIsSubmitting(true); await handleSubmit(selectedUsers, conversationName); // clear form for next time setSelectedUsers([]); setConversationName(''); setIsSubmitting(false); }, [ selectedUsers, setConversationName, conversationName, enqueueSnackbar, handleSubmit, setSelectedUsers, setIsSubmitting, ]); return ( Start a Conversation (typeof option === 'string' ? option : option.displayName)} value={selectedUsers} onChange={handleChangeSelections} filterSelectedOptions isOptionEqualToValue={(optionUser, valueUser) => optionUser.id === valueUser.id} filterOptions={(options) => options} inputValue={searchVal} renderInput={(params) => ( )} /> {selectedUsers.length > 1 && ( )} ); }