message.tsx 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  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. import { useTranslation } from 'react-i18next'
  6. export interface MessageProps {
  7. message: MessageType
  8. fromSelf: boolean
  9. }
  10. function hue(user?: User) {
  11. return user ? getHueForUserId(user.id) : 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. function Message({ message, fromSelf }: MessageProps) {
  25. const { t } = useTranslation()
  26. return (
  27. <div className="message-wrapper">
  28. {!fromSelf && (
  29. <div className="name" translate="no">
  30. <span>
  31. {message.user
  32. ? message.user.first_name || message.user.email
  33. : t('deleted_user')}
  34. </span>
  35. </div>
  36. )}
  37. <div className="message" style={getMessageStyle(message.user)}>
  38. {!fromSelf && (
  39. <div className="arrow" style={getArrowStyle(message.user)} />
  40. )}
  41. <div className="message-content">
  42. {message.contents.map((content, index) => (
  43. <MessageContent key={index} content={content} />
  44. ))}
  45. </div>
  46. </div>
  47. </div>
  48. )
  49. }
  50. export default Message