message-list.tsx 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import moment from 'moment'
  2. import Message from './message'
  3. import { UserId } from '../../../../../types/user'
  4. import type { Message as MessageType } from '@/features/chat/context/chat-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. userId: UserId | null
  17. }
  18. function MessageList({
  19. messages,
  20. resetUnreadMessages,
  21. userId,
  22. }: MessageListProps) {
  23. function shouldRenderDate(messageIndex: number) {
  24. if (messageIndex === 0) {
  25. return true
  26. } else {
  27. const message = messages[messageIndex]
  28. const previousMessage = messages[messageIndex - 1]
  29. return (
  30. message.timestamp &&
  31. previousMessage.timestamp &&
  32. message.timestamp - previousMessage.timestamp > FIVE_MINUTES
  33. )
  34. }
  35. }
  36. return (
  37. // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions
  38. <ul
  39. className="list-unstyled"
  40. onClick={resetUnreadMessages}
  41. onKeyDown={resetUnreadMessages}
  42. >
  43. {messages.map((message, index) => (
  44. // new messages are added to the beginning of the list, so we use a reversed index
  45. <li key={message.id} className="message">
  46. {shouldRenderDate(index) && (
  47. <div className="date">
  48. <time
  49. dateTime={
  50. message.timestamp
  51. ? moment(message.timestamp).format()
  52. : undefined
  53. }
  54. >
  55. {formatTimestamp(message.timestamp)}
  56. </time>
  57. </div>
  58. )}
  59. <Message message={message} userId={userId} />
  60. </li>
  61. ))}
  62. </ul>
  63. )
  64. }
  65. export default MessageList