message.tsx 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import { getHueForUserId } from '../../../shared/utils/colors'
  2. import MessageContent from './message-content'
  3. import type { Message as MessageType } from '@/features/chat/context/chat-context'
  4. import { User } from '../../../../../types/user'
  5. interface MessageProps {
  6. message: MessageType
  7. userId: string | null
  8. }
  9. function Message({ message, userId }: MessageProps) {
  10. function hue(user?: User) {
  11. return user ? getHueForUserId(user.id, userId) : 0
  12. }
  13. function getMessageStyle(user?: User) {
  14. return {
  15. borderColor: `hsl(${hue(user)}, 85%, 40%)`,
  16. backgroundColor: `hsl(${hue(user)}, 85%, 40%`,
  17. }
  18. }
  19. function getArrowStyle(user?: User) {
  20. return {
  21. borderColor: `hsl(${hue(user)}, 85%, 40%)`,
  22. }
  23. }
  24. const isMessageFromSelf = message.user ? message.user.id === userId : false
  25. return (
  26. <div className="message-wrapper">
  27. {!isMessageFromSelf && message.user.id && (
  28. <div className="name">
  29. <span>{message.user.first_name || message.user.email}</span>
  30. </div>
  31. )}
  32. <div className="message" style={getMessageStyle(message.user)}>
  33. {!isMessageFromSelf && (
  34. <div className="arrow" style={getArrowStyle(message.user)} />
  35. )}
  36. <div className="message-content">
  37. {message.contents.map((content, index) => (
  38. <MessageContent key={index} content={content} />
  39. ))}
  40. </div>
  41. </div>
  42. </div>
  43. )
  44. }
  45. export default Message