RebuildIndexControls.jsx 2.9 KB

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