info.js 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. /* jshint ignore:start */
  2. import React from 'react';
  3. import escapeHtml from 'misago/utils/escape-html';
  4. import Controls from './controls';
  5. const DATE_ABBR = '<abbr title="%(absolute)s">%(relative)s</abbr>';
  6. const DATE_URL = '<a href="%(url)s" title="%(absolute)s">%(relative)s</a>';
  7. const USER_SPAN = '<span class="item-title">%(user)s</span>';
  8. const USER_URL = '<a href="%(url)s" class="item-title">%(user)s</a>';
  9. export default function(props) {
  10. return (
  11. <ul className="list-inline event-info">
  12. <Hidden {...props} />
  13. <Poster {...props} />
  14. <Ip {...props} />
  15. <Controls {...props} />
  16. </ul>
  17. );
  18. }
  19. export function Hidden(props) {
  20. if (props.post.is_hidden) {
  21. let user = null;
  22. if (props.post.url.hidden_by) {
  23. user = interpolate(USER_URL, {
  24. url: escapeHtml(props.post.url.hidden_by),
  25. user: escapeHtml(props.post.hidden_by_name)
  26. }, true);
  27. } else {
  28. user = interpolate(USER_SPAN, {
  29. user: escapeHtml(props.post.hidden_by_name)
  30. }, true);
  31. }
  32. const date = interpolate(DATE_ABBR, {
  33. absolute: escapeHtml(props.post.hidden_on.format('LLL')),
  34. relative: escapeHtml(props.post.hidden_on.fromNow())
  35. }, true);
  36. const message = interpolate(escapeHtml(gettext("Hidden by %(event_by)s %(event_on)s.")), {
  37. event_by: user,
  38. event_on: date
  39. }, true);
  40. return (
  41. <li
  42. className="event-hidden-message"
  43. dangerouslySetInnerHTML={{__html: message}}
  44. />
  45. );
  46. } else {
  47. return null;
  48. }
  49. }
  50. export function Poster(props) {
  51. let user = null;
  52. if (props.post.poster) {
  53. user = interpolate(USER_URL, {
  54. url: escapeHtml(props.post.poster.url),
  55. user: escapeHtml(props.post.poster_name)
  56. }, true);
  57. } else {
  58. user = interpolate(USER_SPAN, {
  59. user: escapeHtml(props.post.poster_name)
  60. }, true);
  61. }
  62. const date = interpolate(DATE_URL, {
  63. url: escapeHtml(props.post.url.index),
  64. absolute: escapeHtml(props.post.posted_on.format('LLL')),
  65. relative: escapeHtml(props.post.posted_on.fromNow())
  66. }, true);
  67. const message = interpolate(escapeHtml(gettext("By %(event_by)s %(event_on)s.")), {
  68. event_by: user,
  69. event_on: date
  70. }, true);
  71. return (
  72. <li className="event-posters" dangerouslySetInnerHTML={{__html: message}} />
  73. );
  74. }
  75. export function Ip(props) {
  76. if (props.user.acl.can_see_users_ips) {
  77. return (
  78. <li className="event-ip">
  79. <abbr title={props.post.poster_ip}>
  80. {gettext("IP recorded")}
  81. </abbr>
  82. </li>
  83. );
  84. } else {
  85. return null;
  86. }
  87. }