PageStatusAlert.jsx 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  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. /**
  27. * clear status (invoked when page is updated)
  28. */
  29. clearStatus(updatedRevisionId) {
  30. this.setState({
  31. revisionId: updatedRevisionId,
  32. latestRevisionId: updatedRevisionId,
  33. hasDraftOnHackmd: false,
  34. isDraftUpdatingInRealtime: false,
  35. });
  36. }
  37. setLatestRevisionId(revisionId) {
  38. this.setState({latestRevisionId: revisionId});
  39. }
  40. setLastUpdateUsername(lastUpdateUsername) {
  41. this.setState({lastUpdateUsername});
  42. }
  43. setHasDraftOnHackmd(hasDraftOnHackmd) {
  44. this.setState({
  45. hasDraftOnHackmd,
  46. isDraftUpdatingInRealtime: true,
  47. });
  48. }
  49. renderSomeoneEditingAlert() {
  50. return (
  51. <div className="myadmin-alert alert-success myadmin-alert-bottom alertbottom2" style={{display: 'block'}}>
  52. <i className="icon-fw icon-people"></i>
  53. Someone editing this page on HackMD
  54. &nbsp;
  55. <i className="fa fa-angle-double-right"></i>
  56. &nbsp;
  57. <a href="#hackmd">
  58. Open HackMD Editor
  59. </a>
  60. </div>
  61. );
  62. }
  63. renderDraftExistsAlert(isRealtime) {
  64. return (
  65. <div className="myadmin-alert alert-success myadmin-alert-bottom alertbottom2" style={{display: 'block'}}>
  66. <i className="icon-fw icon-pencil"></i>
  67. This page has a draft on HackMD
  68. &nbsp;
  69. <i className="fa fa-angle-double-right"></i>
  70. &nbsp;
  71. <a href="#hackmd">
  72. Open HackMD Editor
  73. </a>
  74. </div>
  75. );
  76. }
  77. renderUpdatedAlert() {
  78. const { t } = this.props;
  79. const label1 = t('edited this page');
  80. const label2 = t('Load latest');
  81. return (
  82. <div className="myadmin-alert alert-warning myadmin-alert-bottom alertbottom2" style={{display: 'block'}}>
  83. <i className="icon-fw icon-bulb"></i>
  84. {this.state.lastUpdateUsername} {label1}
  85. &nbsp;
  86. <i className="fa fa-angle-double-right"></i>
  87. &nbsp;
  88. <a href="javascript:location.reload();">
  89. {label2}
  90. </a>
  91. </div>
  92. );
  93. }
  94. render() {
  95. let content = <React.Fragment></React.Fragment>;
  96. if (this.state.isDraftUpdatingInRealtime) {
  97. content = this.renderSomeoneEditingAlert();
  98. }
  99. else if (this.state.hasDraftOnHackmd) {
  100. content = this.renderDraftExistsAlert();
  101. }
  102. else if (this.state.revisionId !== this.state.latestRevisionId) {
  103. content = this.renderUpdatedAlert();
  104. }
  105. return content;
  106. }
  107. }
  108. PageStatusAlert.propTypes = {
  109. t: PropTypes.func.isRequired, // i18next
  110. crowi: PropTypes.object.isRequired,
  111. revisionId: PropTypes.string.isRequired,
  112. hasDraftOnHackmd: PropTypes.bool.isRequired,
  113. latestRevisionId: PropTypes.string,
  114. };
  115. PageStatusAlert.defaultProps = {
  116. };
  117. export default translate()(PageStatusAlert);