feat: notify user about new message

This commit is contained in:
Sergey Yarkov 2022-02-20 21:14:30 +03:00
parent 3b15e47cfe
commit 4b846a7b27
3 changed files with 34 additions and 16 deletions

View File

@ -15,7 +15,8 @@ import PrivateRoute from '@educt/components/PrivateRoute';
import PublicRoute from '@educt/components/PublicRoute'; import PublicRoute from '@educt/components/PublicRoute';
import { useSocketEvent } from './hooks/useSocketEvent'; import { useSocketEvent } from './hooks/useSocketEvent';
import { SocketContext } from './contexts'; import { SocketContext } from './contexts';
import { UserOnlineListType, UserSeesionType } from './types'; import { HistoryMessageType, UserOnlineListType, UserSeesionType } from './types';
import { useToast } from '@chakra-ui/react';
const App = () => { const App = () => {
const { const {
@ -23,6 +24,7 @@ const App = () => {
onlineStore, onlineStore,
} = useRootStore(); } = useRootStore();
const { socket } = useContext(SocketContext); const { socket } = useContext(SocketContext);
const toast = useToast();
useSocketEvent('connect', () => console.info('[WebSocket]: Connected.')); useSocketEvent('connect', () => console.info('[WebSocket]: Connected.'));
useSocketEvent('disconnect', () => console.info('[WebSocket]: Disconnected.')); useSocketEvent('disconnect', () => console.info('[WebSocket]: Disconnected.'));
@ -36,6 +38,26 @@ const App = () => {
} }
} }
}); });
useSocketEvent<HistoryMessageType>('chat:message', data => {
const chatId = new URLSearchParams(location.search).get('chat_id');
const user = onlineStore.getUser(data.from);
if (user && data.from !== chatId) {
if (data.to === data.from) return;
/**
* Notify user about new message
*/
toast({
title: `${user.userName}`,
description: data.content,
variant: 'left-accent',
position: 'bottom-right',
status: 'info',
duration: 5000,
});
}
});
useSocketEvent<UserOnlineListType>('user:online', online => onlineStore.loadOnline(online)); useSocketEvent<UserOnlineListType>('user:online', online => onlineStore.loadOnline(online));
return ( return (

View File

@ -98,7 +98,7 @@ const Window: React.FC = props => {
isMyMessage: message.from === me?.id, isMyMessage: message.from === me?.id,
content: message.content, content: message.content,
time: new Date(message.time).toLocaleTimeString(), time: new Date(message.time).toLocaleTimeString(),
userName: message.from === me?.id ? me.fullname : user.fullname, userName: message.from === me?.id ? me?.fullname : user.fullname,
}; };
}); });
@ -121,7 +121,7 @@ const Window: React.FC = props => {
}, [chatId]); }, [chatId]);
/** /**
* Event on accept new messages * Event on accept new messages (set new message to state)
*/ */
useSocketEvent<HistoryMessageType>('chat:message', data => { useSocketEvent<HistoryMessageType>('chat:message', data => {
const user = onlineStore.getUser(data.from); const user = onlineStore.getUser(data.from);
@ -133,18 +133,6 @@ const Window: React.FC = props => {
*/ */
if (data.to === data.from) return; if (data.to === data.from) return;
/**
* Notify user about new message
*/
// toast({
// title: `${user.userName}`,
// description: data.content,
// variant: 'left-accent',
// position: 'bottom-right',
// status: 'info',
// duration: 5000,
// });
const message: MessageType = { const message: MessageType = {
content: data.content, content: data.content,
userName: user.userName, userName: user.userName,
@ -168,7 +156,7 @@ const Window: React.FC = props => {
/** /**
* Unselected user * Unselected user
*/ */
if (!chatId || selectedUser === null) { if (!chatId || !selectedUser) {
return ( return (
<Wrapper> <Wrapper>
<Box textAlign={'center'} mt={{ base: '0', lg: '15rem' }}> <Box textAlign={'center'} mt={{ base: '0', lg: '15rem' }}>

View File

@ -3,11 +3,19 @@ import { Page } from '@educt/components/PageElements';
import { IPageProps } from '@educt/interfaces'; import { IPageProps } from '@educt/interfaces';
import { Chat } from '@educt/components/Chat'; import { Chat } from '@educt/components/Chat';
import { observer } from 'mobx-react'; import { observer } from 'mobx-react';
import { useRootStore } from '@educt/hooks/useRootStore';
import LoadingPage from '@educt/components/LoadingPage';
/** /**
* Messages page * Messages page
*/ */
const MessagesPage: React.FC<IPageProps> = () => { const MessagesPage: React.FC<IPageProps> = () => {
const {
userStore: { me },
} = useRootStore();
if (me === null) return <LoadingPage />;
return ( return (
<Page maxW='100%' mt='0' mb='0'> <Page maxW='100%' mt='0' mb='0'>
<Page.Content> <Page.Content>