mirror of
https://github.com/sergeyyarkov/educt-client.git
synced 2026-10-11 10:19:22 +03:00
60 lines
1.7 KiB
TypeScript
60 lines
1.7 KiB
TypeScript
import React, { memo, useEffect, useRef } from 'react';
|
|
import { Flex, Box, Stack, Text as ChakraText } from '@chakra-ui/react';
|
|
import { Avatar, IAvatarProps } from './Avatar';
|
|
import { Text, ITextProps } from './Text';
|
|
import { MessageContext } from './context';
|
|
import { MessageType } from '@educt/types';
|
|
|
|
interface IMessageComposition {
|
|
Avatar: React.FC<IAvatarProps>;
|
|
Text: React.FC<ITextProps>;
|
|
}
|
|
|
|
interface IMyMessageProps {
|
|
isMyMessage: boolean;
|
|
}
|
|
|
|
const MessageList: React.FC<{ messages: MessageType[] }> = memo(({ messages }) => {
|
|
const listRef = useRef<HTMLDivElement | null>(null);
|
|
|
|
useEffect(() => {
|
|
if (listRef.current) {
|
|
listRef.current.scrollTo(0, listRef.current.scrollHeight);
|
|
}
|
|
}, [messages]);
|
|
|
|
return (
|
|
<Stack ref={listRef} h='65vh' overflowY={'scroll'} mb='12' mt='6' spacing={'3'} pr='8'>
|
|
{messages.length !== 0 ? (
|
|
messages.map((message, i) => (
|
|
<Message key={i} isMyMessage={message.isMyMessage}>
|
|
<Message.Avatar fullname={message.userName} />
|
|
<Message.Text content={message.content} time={message.time} />
|
|
</Message>
|
|
))
|
|
) : (
|
|
<Box>
|
|
<ChakraText mt='5' textAlign={'center'} color='gray.500' userSelect={'none'}>
|
|
Your message history will be displayed here.
|
|
</ChakraText>
|
|
</Box>
|
|
)}
|
|
</Stack>
|
|
);
|
|
});
|
|
|
|
const Message: React.FC<IMyMessageProps> & IMessageComposition = ({ children, isMyMessage }) => {
|
|
return (
|
|
<MessageContext.Provider value={{ isMyMessage }}>
|
|
<Flex flexDir={!isMyMessage ? 'row' : 'row-reverse'} alignItems={'center'}>
|
|
{children}
|
|
</Flex>
|
|
</MessageContext.Provider>
|
|
);
|
|
};
|
|
|
|
Message.Avatar = Avatar;
|
|
Message.Text = Text;
|
|
|
|
export { MessageList, Message };
|