message.tsx 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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. return (
  27. <div className="chat-message-redesign">
  28. <div className="message-row">
  29. <div className="message-avatar-placeholder" />
  30. {!fromSelf && (
  31. <div className="message-author">
  32. <span>
  33. {message.user?.id && message.user.email
  34. ? message.user.first_name || message.user.email
  35. : t('deleted_user')}
  36. </span>
  37. </div>
  38. )}
  39. </div>
  40. {message.contents.map((content, index) => (
  41. <div key={index} className="message-row">
  42. <>
  43. {!fromSelf && index === message.contents.length - 1 ? (
  44. <div className="message-avatar">
  45. <div className="avatar" style={getAvatarStyle(message.user)}>
  46. {message.user?.id && message.user.email ? (
  47. message.user.first_name?.charAt(0) ||
  48. message.user.email.charAt(0)
  49. ) : (
  50. <MaterialIcon
  51. type="delete"
  52. className="message-avatar-deleted-user-icon"
  53. />
  54. )}
  55. </div>
  56. </div>
  57. ) : (
  58. <div className="message-avatar-placeholder" />
  59. )}
  60. <div
  61. className={classNames('message-container', {
  62. 'message-from-self': fromSelf,
  63. 'first-row-in-message': index === 0,
  64. 'last-row-in-message': index === message.contents.length - 1,
  65. })}
  66. >
  67. <div className="message-content">
  68. <MessageContent content={content} />
  69. </div>
  70. </div>
  71. </>
  72. </div>
  73. ))}
  74. </div>
  75. )
  76. }
  77. export default Message