message-list.tsx 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import moment from 'moment'
  2. import Message from './message'
  3. import type { Message as MessageType } from '@/features/chat/context/chat-context'
  4. import MessageRedesign from '@/features/ide-redesign/components/chat/message'
  5. import { useUserContext } from '@/shared/context/user-context'
  6. const FIVE_MINUTES = 5 * 60 * 1000
  7. function formatTimestamp(date: moment.MomentInput) {
  8. if (!date) {
  9. return 'N/A'
  10. } else {
  11. return `${moment(date).format('h:mm a')} ${moment(date).calendar()}`
  12. }
  13. }
  14. interface MessageListProps {
  15. messages: MessageType[]
  16. resetUnreadMessages(...args: unknown[]): unknown
  17. newDesign?: boolean
  18. }
  19. function MessageList({
  20. messages,
  21. resetUnreadMessages,
  22. newDesign,
  23. }: MessageListProps) {
  24. const user = useUserContext()
  25. const MessageComponent = newDesign ? MessageRedesign : Message
  26. function shouldRenderDate(messageIndex: number) {
  27. if (messageIndex === 0) {
  28. return true
  29. } else {
  30. const message = messages[messageIndex]
  31. const previousMessage = messages[messageIndex - 1]
  32. return (
  33. message.timestamp &&
  34. previousMessage.timestamp &&
  35. message.timestamp - previousMessage.timestamp > FIVE_MINUTES
  36. )
  37. }
  38. }
  39. return (
  40. // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions
  41. <ul
  42. className="list-unstyled"
  43. onClick={resetUnreadMessages}
  44. onKeyDown={resetUnreadMessages}
  45. >
  46. {messages.map((message, index) => (
  47. // new messages are added to the beginning of the list, so we use a reversed index
  48. <li key={message.id} className="message">
  49. {shouldRenderDate(index) && (
  50. <div className="date">
  51. <time
  52. dateTime={
  53. message.timestamp
  54. ? moment(message.timestamp).format()
  55. : undefined
  56. }
  57. >
  58. {formatTimestamp(message.timestamp)}
  59. </time>
  60. </div>
  61. )}
  62. <MessageComponent
  63. message={message}
  64. fromSelf={message.user ? message.user.id === user.id : false}
  65. />
  66. </li>
  67. ))}
  68. </ul>
  69. )
  70. }
  71. export default MessageList