RebuildIndexControls.jsx 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import React from 'react';
  2. import { useTranslation } from 'next-i18next';
  3. import PropTypes from 'prop-types';
  4. import { SocketEventName } from '~/interfaces/websocket';
  5. import { useAdminSocket } from '~/stores/socket-io';
  6. import LabeledProgressBar from '../Common/LabeledProgressBar';
  7. class RebuildIndexControls extends React.Component {
  8. constructor(props) {
  9. super(props);
  10. this.state = {
  11. total: 0,
  12. current: 0,
  13. };
  14. }
  15. componentDidMount() {
  16. this.initWebSockets();
  17. }
  18. initWebSockets() {
  19. const { socket } = this.props;
  20. if (socket != null) {
  21. socket.on(SocketEventName.AddPageProgress, (data) => {
  22. this.setState({
  23. total: data.totalCount,
  24. current: data.count,
  25. });
  26. });
  27. socket.on(SocketEventName.FinishAddPage, (data) => {
  28. this.setState({
  29. total: data.totalCount,
  30. current: data.count,
  31. });
  32. });
  33. }
  34. }
  35. renderProgressBar() {
  36. const {
  37. isRebuildingProcessing, isRebuildingCompleted,
  38. } = this.props;
  39. const {
  40. total, current,
  41. } = this.state;
  42. const showProgressBar = isRebuildingProcessing || isRebuildingCompleted;
  43. if (!showProgressBar) {
  44. return null;
  45. }
  46. const header = isRebuildingCompleted ? 'Completed' : 'Processing..';
  47. return (
  48. <div className="mb-3">
  49. <LabeledProgressBar
  50. header={header}
  51. currentCount={current}
  52. totalCount={total}
  53. />
  54. </div>
  55. );
  56. }
  57. render() {
  58. const { t, isNormalized, isRebuildingProcessing } = this.props;
  59. const isEnabled = isNormalized && !isRebuildingProcessing;
  60. return (
  61. <>
  62. { this.renderProgressBar() }
  63. <button
  64. type="submit"
  65. className="btn btn-primary"
  66. onClick={() => { this.props.onRebuildingRequested() }}
  67. disabled={!isEnabled}
  68. >
  69. { t('full_text_search_management.rebuild_button') }
  70. </button>
  71. <p className="form-text text-muted">
  72. { t('full_text_search_management.rebuild_description_1') }<br />
  73. { t('full_text_search_management.rebuild_description_2') }<br />
  74. </p>
  75. </>
  76. );
  77. }
  78. }
  79. const RebuildIndexControlsFC = (props) => {
  80. const { t } = useTranslation('admin');
  81. const { data: socket } = useAdminSocket();
  82. return <RebuildIndexControls t={t} socket={socket} {...props} />;
  83. };
  84. RebuildIndexControls.propTypes = {
  85. t: PropTypes.func.isRequired, // i18next
  86. isRebuildingProcessing: PropTypes.bool.isRequired,
  87. isRebuildingCompleted: PropTypes.bool.isRequired,
  88. isNormalized: PropTypes.bool,
  89. onRebuildingRequested: PropTypes.func.isRequired,
  90. socket: PropTypes.object,
  91. };
  92. export default RebuildIndexControlsFC;