message-list.tsx 2.0 KB

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