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

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