message.tsx 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  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. function hue(user?: User) {
  7. return user ? getHueForUserId(user.id) : 0
  8. }
  9. function getAvatarStyle(user?: User) {
  10. return {
  11. borderColor: `hsl(${hue(user)}, 85%, 40%)`,
  12. backgroundColor: `hsl(${hue(user)}, 85%, 40%`,
  13. }
  14. }
  15. function Message({ message, fromSelf }: MessageProps) {
  16. return (
  17. <div className="chat-message-redesign">
  18. <div className="message-row">
  19. <div className="message-avatar-placeholder" />
  20. {!fromSelf && (
  21. <div className="message-author">
  22. <span>{message.user.first_name || message.user.email}</span>
  23. </div>
  24. )}
  25. </div>
  26. {message.contents.map((content, index) => (
  27. <div key={index} className="message-row">
  28. <>
  29. {!fromSelf && index === message.contents.length - 1 ? (
  30. <div className="message-avatar">
  31. <div className="avatar" style={getAvatarStyle(message.user)}>
  32. {message.user.first_name?.charAt(0) ||
  33. message.user.email.charAt(0)}
  34. </div>
  35. </div>
  36. ) : (
  37. <div className="message-avatar-placeholder" />
  38. )}
  39. <div
  40. className={classNames('message-container', {
  41. 'message-from-self': fromSelf,
  42. 'first-row-in-message': index === 0,
  43. 'last-row-in-message': index === message.contents.length - 1,
  44. })}
  45. >
  46. <div className="message-content">
  47. <MessageContent content={content} />
  48. </div>
  49. </div>
  50. </>
  51. </div>
  52. ))}
  53. </div>
  54. )
  55. }
  56. export default Message