PageStatusAlert.jsx 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import { translate } from 'react-i18next';
  4. /**
  5. *
  6. * @author Yuki Takei <yuki@weseek.co.jp>
  7. *
  8. * @export
  9. * @class PageStatusAlert
  10. * @extends {React.Component}
  11. */
  12. class PageStatusAlert extends React.Component {
  13. constructor(props) {
  14. super(props);
  15. this.state = {
  16. revisionId: this.props.revisionId,
  17. latestRevisionId: this.props.revisionId,
  18. lastUpdateUsername: undefined,
  19. hasDraftOnHackmd: this.props.hasDraftOnHackmd,
  20. isDraftUpdatingInRealtime: false,
  21. };
  22. this.renderSomeoneEditingAlert = this.renderSomeoneEditingAlert.bind(this);
  23. this.renderDraftExistsAlert = this.renderDraftExistsAlert.bind(this);
  24. this.renderUpdatedAlert = this.renderUpdatedAlert.bind(this);
  25. }
  26. initRevisionId(revisionId) {
  27. this.setState({
  28. revisionId,
  29. latestRevisionId: revisionId,
  30. });
  31. }
  32. setLatestRevisionId(revisionId) {
  33. this.setState({latestRevisionId: revisionId});
  34. }
  35. setLastUpdateUsername(lastUpdateUsername) {
  36. this.setState({lastUpdateUsername});
  37. }
  38. setHasDraftOnHackmd(hasDraftOnHackmd) {
  39. this.setState({
  40. hasDraftOnHackmd,
  41. isDraftUpdatingInRealtime: true,
  42. });
  43. }
  44. renderSomeoneEditingAlert() {
  45. return (
  46. <div className="myadmin-alert alert-success myadmin-alert-bottom alertbottom2" style={{display: 'block'}}>
  47. <i className="icon-fw icon-people"></i>
  48. Someone editing this page on HackMD
  49. &nbsp;
  50. <i className="fa fa-angle-double-right"></i>
  51. &nbsp;
  52. <a href="">
  53. Open HackMD Editor
  54. </a>
  55. </div>
  56. );
  57. }
  58. renderDraftExistsAlert(isRealtime) {
  59. return (
  60. <div className="myadmin-alert alert-success myadmin-alert-bottom alertbottom2" style={{display: 'block'}}>
  61. <i className="icon-fw icon-pencil"></i>
  62. This page has a draft on HackMD
  63. &nbsp;
  64. <i className="fa fa-angle-double-right"></i>
  65. &nbsp;
  66. <a href="">
  67. Open HackMD Editor
  68. </a>
  69. </div>
  70. );
  71. }
  72. renderUpdatedAlert() {
  73. const { t } = this.props;
  74. const label1 = t('edited this page');
  75. const label2 = t('Load latest');
  76. return (
  77. <div className="myadmin-alert alert-warning myadmin-alert-bottom alertbottom2" style={{display: 'block'}}>
  78. <i className="icon-fw icon-bulb"></i>
  79. {this.state.lastUpdateUsername} {label1}
  80. &nbsp;
  81. <i className="fa fa-angle-double-right"></i>
  82. &nbsp;
  83. <a href="javascript:location.reload();">
  84. {label2}
  85. </a>
  86. </div>
  87. );
  88. }
  89. render() {
  90. let content = <React.Fragment></React.Fragment>;
  91. if (this.state.isDraftUpdatingInRealtime) {
  92. content = this.renderSomeoneEditingAlert();
  93. }
  94. else if (this.state.hasDraftOnHackmd) {
  95. content = this.renderDraftExistsAlert();
  96. }
  97. else if (this.state.revisionId !== this.state.latestRevisionId) {
  98. content = this.renderUpdatedAlert();
  99. }
  100. return content;
  101. }
  102. }
  103. PageStatusAlert.propTypes = {
  104. t: PropTypes.func.isRequired, // i18next
  105. crowi: PropTypes.object.isRequired,
  106. revisionId: PropTypes.string.isRequired,
  107. hasDraftOnHackmd: PropTypes.bool.isRequired,
  108. latestRevisionId: PropTypes.string,
  109. };
  110. PageStatusAlert.defaultProps = {
  111. };
  112. export default translate()(PageStatusAlert);