You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ChatMessageGroup.tsx 2.1KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import clsx from 'clsx';
  2. import React from 'react';
  3. import { makeStyles } from 'tss-react/mui';
  4. // eslint-disable-next-line lines-around-comment
  5. // @ts-ignore
  6. import Avatar from '../../../base/avatar/components/Avatar';
  7. import { IMessage } from '../../reducer';
  8. import ChatMessage from './ChatMessage';
  9. interface IProps {
  10. /**
  11. * Additional CSS classes to apply to the root element.
  12. */
  13. className: string;
  14. /**
  15. * The messages to display as a group.
  16. */
  17. messages: Array<IMessage>;
  18. }
  19. const useStyles = makeStyles()(theme => {
  20. return {
  21. messageGroup: {
  22. display: 'flex',
  23. flexDirection: 'column',
  24. maxWidth: '100%'
  25. },
  26. groupContainer: {
  27. display: 'flex',
  28. '&.local': {
  29. justifyContent: 'flex-end',
  30. '& .avatar': {
  31. display: 'none'
  32. }
  33. }
  34. },
  35. avatar: {
  36. margin: `${theme.spacing(1)} ${theme.spacing(2)} ${theme.spacing(3)} 0`,
  37. position: 'sticky',
  38. flexShrink: 0,
  39. top: 0
  40. }
  41. };
  42. });
  43. const ChatMessageGroup = ({ className = '', messages }: IProps) => {
  44. const { classes } = useStyles();
  45. const messagesLength = messages.length;
  46. if (!messagesLength) {
  47. return null;
  48. }
  49. return (
  50. <div className = { clsx(classes.groupContainer, className) }>
  51. <Avatar
  52. className = { clsx(classes.avatar, 'avatar') }
  53. participantId = { messages[0].id }
  54. size = { 32 } />
  55. <div className = { `${classes.messageGroup} chat-message-group ${className}` }>
  56. {messages.map((message, i) => (
  57. <ChatMessage
  58. key = { i }
  59. message = { message }
  60. showDisplayName = { i === 0 }
  61. showTimestamp = { i === messages.length - 1 }
  62. type = { className } />
  63. ))}
  64. </div>
  65. </div>
  66. );
  67. };
  68. export default ChatMessageGroup;