message.jsx 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import PropTypes from 'prop-types'
  2. import { getHueForUserId } from '../../../shared/utils/colors'
  3. import MessageContent from './message-content'
  4. function Message({ message, userId }) {
  5. function hue(user) {
  6. return user ? getHueForUserId(user.id, userId) : 0
  7. }
  8. function getMessageStyle(user) {
  9. return {
  10. borderColor: `hsl(${hue(user)}, 85%, 40%)`,
  11. backgroundColor: `hsl(${hue(user)}, 85%, 40%`,
  12. }
  13. }
  14. function getArrowStyle(user) {
  15. return {
  16. borderColor: `hsl(${hue(user)}, 85%, 40%)`,
  17. }
  18. }
  19. const isMessageFromSelf = message.user ? message.user.id === userId : false
  20. return (
  21. <div className="message-wrapper">
  22. {!isMessageFromSelf && (
  23. <div className="name">
  24. <span>{message.user.first_name || message.user.email}</span>
  25. </div>
  26. )}
  27. <div className="message" style={getMessageStyle(message.user)}>
  28. {!isMessageFromSelf && (
  29. <div className="arrow" style={getArrowStyle(message.user)} />
  30. )}
  31. <div className="message-content">
  32. {message.contents.map((content, index) => (
  33. <MessageContent key={index} content={content} />
  34. ))}
  35. </div>
  36. </div>
  37. </div>
  38. )
  39. }
  40. Message.propTypes = {
  41. message: PropTypes.shape({
  42. contents: PropTypes.arrayOf(PropTypes.string).isRequired,
  43. user: PropTypes.shape({
  44. id: PropTypes.string,
  45. email: PropTypes.string,
  46. first_name: PropTypes.string,
  47. }),
  48. }),
  49. userId: PropTypes.string.isRequired,
  50. }
  51. export default Message