message.js 1.9 KB

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