message-group.tsx 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import { getHueForUserId } from '@/shared/utils/colors'
  2. import type { Message as MessageType } from '@/features/chat/context/chat-context'
  3. import { User } from '../../../../../types/user'
  4. import classNames from 'classnames'
  5. import { MessageAndDropdown } from '@/features/chat/components/message-and-dropdown'
  6. import { useTranslation } from 'react-i18next'
  7. export interface MessageGroupProps {
  8. messages: MessageType[]
  9. user?: User
  10. fromSelf: boolean
  11. }
  12. function hue(user?: User) {
  13. return user ? getHueForUserId(user.id) : 0
  14. }
  15. function getMessageStyle(user?: User) {
  16. return {
  17. borderColor: `hsl(${hue(user)}, 85%, 40%)`,
  18. backgroundColor: `hsl(${hue(user)}, 85%, 40%`,
  19. }
  20. }
  21. function getArrowStyle(user?: User) {
  22. return {
  23. borderColor: `hsl(${hue(user)}, 85%, 40%)`,
  24. }
  25. }
  26. function MessageGroup({ messages, user, fromSelf }: MessageGroupProps) {
  27. const { t } = useTranslation()
  28. return (
  29. <div
  30. className={classNames('message-wrapper', {
  31. 'own-message-wrapper': fromSelf,
  32. })}
  33. >
  34. {!fromSelf && (
  35. <div className="name" translate="no">
  36. <span>
  37. {user ? user.first_name || user.email : t('deleted_user')}
  38. </span>
  39. </div>
  40. )}
  41. <div className="message" style={getMessageStyle(user)}>
  42. {!fromSelf && <div className="arrow" style={getArrowStyle(user)} />}
  43. {messages.map(message => (
  44. <MessageAndDropdown
  45. key={message.id}
  46. message={message}
  47. fromSelf={fromSelf}
  48. />
  49. ))}
  50. </div>
  51. </div>
  52. )
  53. }
  54. export default MessageGroup