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 (
);
}