message.tsx 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import { MessageProps } from '@/features/chat/components/message'
  2. import { User } from '../../../../../../types/user'
  3. import { getHueForUserId } from '@/shared/utils/colors'
  4. import MessageContent from '@/features/chat/components/message-content'
  5. import classNames from 'classnames'
  6. import MaterialIcon from '@/shared/components/material-icon'
  7. import { t } from 'i18next'
  8. function hue(user?: User) {
  9. return user ? getHueForUserId(user.id) : 0
  10. }
  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. return {
  21. borderColor: `hsl(${hue(user)}, 85%, 40%)`,
  22. backgroundColor: `hsl(${hue(user)}, 85%, 40%`,
  23. }
  24. }
  25. function Message({ message, fromSelf }: MessageProps) {
  26. const userAvailable = message.user?.id && message.user.email
  27. return (
  28. <div className="chat-message-redesign">
  29. <div className="message-row">
  30. <div className="message-avatar-placeholder" />
  31. {!fromSelf && (
  32. <div className="message-author">
  33. <span>
  34. {userAvailable
  35. ? message.user.first_name || message.user.email
  36. : t('deleted_user')}
  37. </span>
  38. </div>
  39. )}
  40. </div>
  41. {message.contents.map((content, index) => (
  42. <div key={index} className="message-row">
  43. <>
  44. {!fromSelf && index === message.contents.length - 1 ? (
  45. <div className="message-avatar">
  46. <div className="avatar" style={getAvatarStyle(message.user)}>
  47. {userAvailable ? (
  48. message.user.first_name?.charAt(0) ||
  49. message.user.email.charAt(0)
  50. ) : (
  51. <MaterialIcon
  52. type="delete"
  53. className="message-avatar-deleted-user-icon"
  54. />
  55. )}
  56. </div>
  57. </div>
  58. ) : (
  59. <div className="message-avatar-placeholder" />
  60. )}
  61. <div
  62. className={classNames('message-container', {
  63. 'message-from-self': fromSelf,
  64. 'first-row-in-message': index === 0,
  65. 'last-row-in-message': index === message.contents.length - 1,
  66. })}
  67. >
  68. <div className="message-content">
  69. <MessageContent content={content} />
  70. </div>
  71. </div>
  72. </>
  73. </div>
  74. ))}
  75. </div>
  76. )
  77. }
  78. export default Message