diff --git a/packages/core/src/models/conversation.model.ts b/packages/core/src/models/conversation.model.ts index 3b2e505..ef20be2 100644 --- a/packages/core/src/models/conversation.model.ts +++ b/packages/core/src/models/conversation.model.ts @@ -7,7 +7,7 @@ export default class Conversation { public membersList: string[], - public name?: string, + public name: string | null = null, public lastUpdatedDate = Timestamp.now(), diff --git a/packages/desktop/src/components/Conversations.tsx b/packages/desktop/src/components/Conversations.tsx index ec09279..2b12234 100644 --- a/packages/desktop/src/components/Conversations.tsx +++ b/packages/desktop/src/components/Conversations.tsx @@ -29,232 +29,11 @@ import { searchUsers } from '../firebase/firestore'; import { User } from '@nirvana/core/src/models/user.model'; import useTerminal from './Terminal'; -const Conversations = () => { - const { enqueueSnackbar } = useSnackbar(); +// const Conversations = () => { - const searchRef = useRef(null); - const [searchVal, setSearchVal] = useState(''); +// return ( - const onSearchFocus = useCallback(() => { - enqueueSnackbar('search focused'); - if (searchRef?.current) searchRef.current.focus(); - }, [enqueueSnackbar, searchRef]); +// ); +// }; - const [searchUsersResults, setSearchUsersResults] = useState([]); - const [searching, setSearching] = useState(false); - - useKey('Shift', onSearchFocus); - - const [, cancel] = useDebounce( - async () => { - if (searchVal) { - enqueueSnackbar('searching...', { variant: 'info' }); - - const results = await searchUsers(searchVal); - setSearchUsersResults(results); - - console.warn(results); - } - - setSearching(false); - }, - 500, - [searchVal, enqueueSnackbar, setSearchUsersResults], - ); - - const handleChangeSearchInput = useCallback( - (e: React.ChangeEvent) => { - setSearching(true); - setSearchVal(e.target.value); - }, - [setSearching, setSearchVal], - ); - - return ( - <> - - - - - - - {searching && } - - - - - - - - - - - - {searchVal ? : } - - ); -}; - -function ListPeople({ people }: { people: User[] }) { - const { handleQuickDial } = useTerminal(); - - return ( - - Search Results - - } - > - {people.length === 0 && ( - - {`Can't find someone? Invite them!`} - - )} - - {people.map((person) => ( - - handleQuickDial(person.uid)}> - - - - - - - - - - - - ))} - - ); -} - -function ListConversations() { - const { conversationMap } = useTerminal(); - - if (Object.keys(conversationMap).length === 0) { - return ( - - Look for someone by name or email to start a conversation! - - ); - } - - return ( - <> - - - Priority - - } - > - - - - - - - - - 20 sec - - - - - - - - - - - - 34 min ago - - - - - - - Inbox - - } - > - - - - - - - - - - - - - - - - - - - - - 2 hours ago - - - - - ); -} - -export default Conversations; +// export default Conversations; diff --git a/packages/desktop/src/components/Navbar.tsx b/packages/desktop/src/components/Navbar.tsx index 04142f6..77c2d72 100644 --- a/packages/desktop/src/components/Navbar.tsx +++ b/packages/desktop/src/components/Navbar.tsx @@ -1,40 +1,20 @@ -import React, { useCallback, useRef } from 'react'; +import React from 'react'; -import { Container } from '@mui/system'; import { Avatar, - Box, Divider, - Fab, - Grid, IconButton, - Input, ListItemIcon, Menu, - Paper, Stack, Tooltip, Typography, } from '@mui/material'; import NirvanaLogo from './NirvanaLogo'; -import { blueGrey } from '@mui/material/colors'; -import { - FiHeadphones, - FiLogOut, - FiMonitor, - FiMoreVertical, - FiPlay, - FiSearch, - FiSun, - FiWind, -} from 'react-icons/fi'; -import KeyboardShortcutLabel from './KeyboardShortcutLabel'; -import { useSnackbar } from 'notistack'; -import { useKey } from 'react-use'; +import { FiHeadphones, FiLogOut, FiMonitor, FiWind } from 'react-icons/fi'; import MenuItem from '@mui/material/MenuItem'; import useAuth from '../providers/AuthProvider'; -import Conversations from './Conversations'; const Navbar = () => { const [anchorEl, setAnchorEl] = React.useState(null); diff --git a/packages/desktop/src/components/Terminal.tsx b/packages/desktop/src/components/Terminal.tsx index ffceaa4..25d2d44 100644 --- a/packages/desktop/src/components/Terminal.tsx +++ b/packages/desktop/src/components/Terminal.tsx @@ -1,12 +1,32 @@ -import React, { useContext, useState, useCallback, useMemo, useEffect } from 'react'; +import React, { useContext, useState, useCallback, useMemo, useEffect, useRef } from 'react'; import { Container } from '@mui/system'; -import { Avatar, Box, Fab, Grid, IconButton, Paper, Stack, Typography } from '@mui/material'; +import { + Avatar, + Box, + Fab, + Grid, + Paper, + Input, + CircularProgress, + IconButton, + Tooltip, + Stack, + Badge, + Divider, + List, + ListItem, + ListItemAvatar, + ListItemButton, + ListItemSecondaryAction, + ListItemText, + ListSubheader, + Typography, +} from '@mui/material'; import { blueGrey } from '@mui/material/colors'; import { FiMoreVertical, FiPlay, FiSun } from 'react-icons/fi'; import { useSnackbar } from 'notistack'; -import Conversations from './Conversations'; import Navbar from './Navbar'; import Conversation from '@nirvana/core/src/models/conversation.model'; import useAuth from '../providers/AuthProvider'; @@ -16,6 +36,13 @@ import { useImmer } from 'use-immer'; import { User } from '@nirvana/core/src/models/user.model'; import { onSnapshot } from 'firebase/firestore'; +import { FiActivity, FiInbox, FiSearch, FiUsers, FiCoffee } from 'react-icons/fi'; +import NirvanaAvatar from './NirvanaAvatar'; +import { useDebounce, useKey } from 'react-use'; + +import KeyboardShortcutLabel from './KeyboardShortcutLabel'; +import { searchUsers } from '../firebase/firestore'; + type ConversationMap = { [conversationId: string]: Conversation; }; @@ -143,6 +170,44 @@ export function TerminalProvider({ children }: { children?: React.ReactNode }) { [conversationMap, enqueueSnackbar, user], ); + const searchRef = useRef(null); + const [searchVal, setSearchVal] = useState(''); + + const onSearchFocus = useCallback(() => { + enqueueSnackbar('search focused'); + if (searchRef?.current) searchRef.current.focus(); + }, [enqueueSnackbar, searchRef]); + + const [searchUsersResults, setSearchUsersResults] = useState([]); + const [searching, setSearching] = useState(false); + + useKey('Shift', onSearchFocus); + + const [, cancel] = useDebounce( + async () => { + if (searchVal) { + enqueueSnackbar('searching...', { variant: 'info' }); + + const results = await searchUsers(searchVal); + setSearchUsersResults(results); + + console.warn(results); + } + + setSearching(false); + }, + 500, + [searchVal, enqueueSnackbar, setSearchUsersResults], + ); + + const handleChangeSearchInput = useCallback( + (e: React.ChangeEvent) => { + setSearching(true); + setSearchVal(e.target.value); + }, + [setSearching, setSearchVal], + ); + return ( - + <> + + + + + + + {searching && } + + + + + + + + + + + + {searchVal ? : } + @@ -335,3 +444,146 @@ export function TerminalProvider({ children }: { children?: React.ReactNode }) { export default function useTerminal() { return useContext(TerminalContext); } + +function ListPeople({ people }: { people: User[] }) { + const { handleQuickDial } = useTerminal(); + + return ( + + Search Results + + } + > + {people.length === 0 && ( + + {`Can't find someone? Invite them!`} + + )} + + {people.map((person) => ( + + handleQuickDial(person.uid)}> + + + + + + + + + + + + ))} + + ); +} + +function ListConversations() { + const { conversationMap } = useTerminal(); + + if (Object.keys(conversationMap).length === 0) { + return ( + + Look for someone by name or email to start a conversation! + + ); + } + + return ( + <> + + + Priority + + } + > + + + + + + + + + 20 sec + + + + + + + + + + + + 34 min ago + + + + + + + Inbox + + } + > + + + + + + + + + + + + + + + + + + + + + 2 hours ago + + + + + ); +} diff --git a/packages/desktop/src/firebase/firestore.ts b/packages/desktop/src/firebase/firestore.ts index 9965b03..1ba7cf2 100644 --- a/packages/desktop/src/firebase/firestore.ts +++ b/packages/desktop/src/firebase/firestore.ts @@ -144,7 +144,7 @@ export const createOneOnOneConversation = async ( otherUserId: string, myUserId: string, ): Promise => { - const newConversation = new Conversation(myUserId, [myUserId, otherUserId]); + const newConversation = new Conversation(myUserId, [myUserId, otherUserId], null); try { const newDoc = await addDoc(db.conversations, newConversation);