From b6c3e54ac7b1531c135d7b5c8eedc3c9be2c7030 Mon Sep 17 00:00:00 2001 From: talksik Date: Mon, 30 May 2022 06:45:18 -0500 Subject: [PATCH] autocomplete sort of working --- .../src/components/NewConversationDialog.tsx | 94 ++++++++++++++++++- .../desktop/src/subcomponents/UserRow.tsx | 0 2 files changed, 92 insertions(+), 2 deletions(-) create mode 100644 packages/desktop/src/subcomponents/UserRow.tsx diff --git a/packages/desktop/src/components/NewConversationDialog.tsx b/packages/desktop/src/components/NewConversationDialog.tsx index f4c54d3..56fecd2 100644 --- a/packages/desktop/src/components/NewConversationDialog.tsx +++ b/packages/desktop/src/components/NewConversationDialog.tsx @@ -1,7 +1,25 @@ -import React, { useCallback } from 'react'; -import { Container, Dialog, IconButton } from '@mui/material'; +import React, { HTMLAttributes, useCallback, useState } from 'react'; +import { + Autocomplete, + AutocompleteRenderOptionState, + Container, + Dialog, + FormControl, + IconButton, + InputBase, + InputLabel, + Select, + styled, + TextField, + Typography, +} from '@mui/material'; import { FiX } from 'react-icons/fi'; import { blueGrey } from '@mui/material/colors'; +import { useSnackbar } from 'notistack'; +import { useDebounce } from 'react-use'; +import { searchUsers } from '../firebase/firestore'; +import { User } from '@nirvana/core/src/models/user.model'; +import useAuth from '../providers/AuthProvider'; export default function NewConversationDialog({ open, @@ -10,6 +28,45 @@ export default function NewConversationDialog({ open: boolean; handleClose: () => void; }) { + const { enqueueSnackbar } = useSnackbar(); + const { user } = useAuth(); + + const [searchVal, setSearchVal] = useState(''); + const [searchUsersResults, setSearchUsersResults] = useState([]); + const [searching, setSearching] = useState(false); + + const [selectedUsers, setSelectedUsers] = useState([]); + + const handleSelectUser = useCallback((event, newValue: User[]) => { + setSelectedUsers(newValue); + }, []); + + 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 handleSubmit = useCallback(() => { try { // @@ -20,6 +77,13 @@ export default function NewConversationDialog({ handleClose(); }, [handleClose]); + const renderOption = useCallback( + (props: HTMLAttributes, option: User, state: AutocompleteRenderOptionState) => ( + {option.email} + ), + [], + ); + return ( + + + (typeof option === 'string' ? option : option.displayName)} + value={selectedUsers} + onChange={handleSelectUser} + filterSelectedOptions + inputValue={searchVal} + renderInput={(params) => ( + + )} + /> + ); diff --git a/packages/desktop/src/subcomponents/UserRow.tsx b/packages/desktop/src/subcomponents/UserRow.tsx new file mode 100644 index 0000000..e69de29