RebuildIndexControls.jsx 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. import React from 'react';
  2. import { useTranslation } from 'next-i18next';
  3. import PropTypes from 'prop-types';
  4. import { useAdminSocket } from '~/features/admin/states/socket-io';
  5. import { SocketEventName } from '~/interfaces/websocket';
  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 { isRebuildingProcessing, isRebuildingCompleted } = this.props;
  37. const { total, current } = this.state;
  38. const showProgressBar = isRebuildingProcessing || isRebuildingCompleted;
  39. if (!showProgressBar) {
  40. return null;
  41. }
  42. const header = isRebuildingCompleted ? 'Completed' : 'Processing..';
  43. return (
  44. <div className="mb-3">
  45. <LabeledProgressBar
  46. header={header}
  47. currentCount={current}
  48. totalCount={total}
  49. />
  50. </div>
  51. );
  52. }
  53. render() {
  54. const { t, isNormalized, isRebuildingProcessing } = this.props;
  55. const isEnabled = isNormalized && !isRebuildingProcessing;
  56. return (
  57. <>
  58. {this.renderProgressBar()}
  59. <button
  60. type="submit"
  61. className="btn btn-primary"
  62. onClick={() => {
  63. this.props.onRebuildingRequested();
  64. }}
  65. disabled={!isEnabled}
  66. >
  67. {t('full_text_search_management.rebuild_button')}
  68. </button>
  69. <p className="form-text text-muted">
  70. {t('full_text_search_management.rebuild_description_1')}
  71. <br />
  72. {t('full_text_search_management.rebuild_description_2')}
  73. <br />
  74. </p>
  75. </>
  76. );
  77. }
  78. }
  79. const RebuildIndexControlsFC = (props) => {
  80. const { t } = useTranslation('admin');
  81. const 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;