RebuildIndexControls.jsx 3.0 KB

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