body.js 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import React from "react"
  2. import Waypoint from "../waypoint"
  3. import MisagoMarkup from "misago/components/misago-markup"
  4. import escapeHtml from "misago/utils/escape-html"
  5. const HIDDEN_BY_URL = '<a href="%(url)s" class="item-title">%(user)s</a>'
  6. const HIDDEN_BY_SPAN = '<span class="item-title">%(user)s</span>'
  7. const HIDDEN_ON =
  8. '<abbr class="last-title" title="%(absolute)s">%(relative)s</abbr>'
  9. export default function(props) {
  10. if (props.post.is_hidden && !props.post.acl.can_see_hidden) {
  11. return <Hidden {...props} />
  12. } else if (props.post.content) {
  13. return <Default {...props} />
  14. } else {
  15. return <Invalid {...props} />
  16. }
  17. }
  18. export function Default(props) {
  19. return (
  20. <Waypoint className="post-body" post={props.post}>
  21. <MisagoMarkup markup={props.post.content} />
  22. </Waypoint>
  23. )
  24. }
  25. export function Hidden(props) {
  26. let user = null
  27. if (props.post.hidden_by) {
  28. user = interpolate(
  29. HIDDEN_BY_URL,
  30. {
  31. url: escapeHtml(props.post.url.hidden_by),
  32. user: escapeHtml(props.post.hidden_by_name)
  33. },
  34. true
  35. )
  36. } else {
  37. user = interpolate(
  38. HIDDEN_BY_SPAN,
  39. {
  40. user: escapeHtml(props.post.hidden_by_name)
  41. },
  42. true
  43. )
  44. }
  45. const date = interpolate(
  46. HIDDEN_ON,
  47. {
  48. absolute: escapeHtml(props.post.hidden_on.format("LLL")),
  49. relative: escapeHtml(props.post.hidden_on.fromNow())
  50. },
  51. true
  52. )
  53. const message = interpolate(
  54. escapeHtml(gettext("Hidden by %(hidden_by)s %(hidden_on)s.")),
  55. {
  56. hidden_by: user,
  57. hidden_on: date
  58. },
  59. true
  60. )
  61. return (
  62. <Waypoint className="post-body post-body-hidden" post={props.post}>
  63. <p className="lead">
  64. {gettext("This post is hidden. You cannot see its contents.")}
  65. </p>
  66. <p className="text-muted" dangerouslySetInnerHTML={{ __html: message }} />
  67. </Waypoint>
  68. )
  69. }
  70. export function Invalid(props) {
  71. return (
  72. <Waypoint className="post-body post-body-invalid" post={props.post}>
  73. <p className="lead">
  74. {gettext("This post's contents cannot be displayed.")}
  75. </p>
  76. <p className="text-muted">
  77. {gettext("This error is caused by invalid post content manipulation.")}
  78. </p>
  79. </Waypoint>
  80. )
  81. }