message.tsx 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import { MessageProps } from '@/features/chat/components/message'
  2. import { User } from '../../../../../../types/user'
  3. import {
  4. getBackgroundColorForUserId,
  5. hslStringToLuminance,
  6. } from '@/shared/utils/colors'
  7. import MessageContent from '@/features/chat/components/message-content'
  8. import classNames from 'classnames'
  9. import MaterialIcon from '@/shared/components/material-icon'
  10. import { t } from 'i18next'
  11. function getAvatarStyle(user?: User) {
  12. if (!user?.id) {
  13. // Deleted user
  14. return {
  15. backgroundColor: 'var(--bg-light-disabled)',
  16. borderColor: 'var(--bg-light-disabled)',
  17. color: 'var(--content-disabled)',
  18. }
  19. }
  20. const backgroundColor = getBackgroundColorForUserId(user.id)
  21. return {
  22. borderColor: backgroundColor,
  23. backgroundColor,
  24. color:
  25. hslStringToLuminance(backgroundColor) < 0.5
  26. ? 'var(--content-primary-dark)'
  27. : 'var(--content-primary)',
  28. }
  29. }
  30. function Message({ message, fromSelf }: MessageProps) {
  31. return (
  32. <div className="chat-message-redesign">
  33. <div className="message-row">
  34. <div className="message-avatar-placeholder" />
  35. {!fromSelf && (
  36. <div className="message-author">
  37. <span>
  38. {message.user?.id && message.user.email
  39. ? message.user.first_name || message.user.email
  40. : t('deleted_user')}
  41. </span>
  42. </div>
  43. )}
  44. </div>
  45. {message.contents.map((content, index) => (
  46. <div key={index} className="message-row">
  47. <>
  48. {!fromSelf && index === message.contents.length - 1 ? (
  49. <div className="message-avatar">
  50. <div className="avatar" style={getAvatarStyle(message.user)}>
  51. {message.user?.id && message.user.email ? (
  52. message.user.first_name?.charAt(0) ||
  53. message.user.email.charAt(0)
  54. ) : (
  55. <MaterialIcon
  56. type="delete"
  57. className="message-avatar-deleted-user-icon"
  58. />
  59. )}
  60. </div>
  61. </div>
  62. ) : (
  63. <div className="message-avatar-placeholder" />
  64. )}
  65. <div
  66. className={classNames('message-container', {
  67. 'message-from-self': fromSelf,
  68. 'first-row-in-message': index === 0,
  69. 'last-row-in-message': index === message.contents.length - 1,
  70. })}
  71. >
  72. <div className="message-content">
  73. <MessageContent content={content} />
  74. </div>
  75. </div>
  76. </>
  77. </div>
  78. ))}
  79. </div>
  80. )
  81. }
  82. export default Message