message-list.js 1.8 KB

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