LegacyPrivatePagesMigrationModal.tsx 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. import React, { useState } from 'react';
  2. import {
  3. Modal, ModalHeader, ModalBody, ModalFooter,
  4. } from 'reactstrap';
  5. import { useTranslation } from 'react-i18next';
  6. import { apiv3Post } from '~/client/util/apiv3-client';
  7. import { useLegacyPrivatePagesMigrationModal } from '~/stores/modal';
  8. import ApiErrorMessageList from './PageManagement/ApiErrorMessageList';
  9. type Props = {
  10. }
  11. export const LegacyPrivatePagesMigrationModal = (props: Props): JSX.Element => {
  12. const { t } = useTranslation();
  13. const { data: status, close } = useLegacyPrivatePagesMigrationModal();
  14. const isOpened = status?.isOpened ?? false;
  15. const [isRecursively, setIsRecursively] = useState(true);
  16. // eslint-disable-next-line @typescript-eslint/no-unused-vars
  17. const [errs, setErrs] = useState<Error[] | null>(null);
  18. async function submit() {
  19. if (status == null || status.pages == null || status.pages.length === 0) {
  20. return;
  21. }
  22. const { pages, onSubmited } = status;
  23. const pageIds = pages.map(page => page.pageId);
  24. try {
  25. await apiv3Post<void>('/pages/legacy-pages-migration', {
  26. pageIds,
  27. isRecursively: isRecursively ? true : undefined,
  28. });
  29. if (onSubmited != null) {
  30. onSubmited(pages, isRecursively);
  31. }
  32. }
  33. catch (err) {
  34. setErrs([err]);
  35. }
  36. }
  37. function renderForm() {
  38. return (
  39. <div className="custom-control custom-checkbox custom-checkbox-warning">
  40. <input
  41. className="custom-control-input"
  42. id="convertRecursively"
  43. type="checkbox"
  44. onChange={e => setIsRecursively(e.target.checked)}
  45. />
  46. <label className="custom-control-label" htmlFor="convertRecursively">
  47. { t('private_legacy_pages.modal.convert_recursively_label') }
  48. <p className="form-text text-muted mt-0"> { t('private_legacy_pages.modal.convert_recursively_desc') }</p>
  49. </label>
  50. </div>
  51. );
  52. }
  53. const renderPageIds = () => {
  54. if (status != null && status.pages != null) {
  55. return status.pages.map(page => <div key={page.pageId}><code>{ page.path }</code></div>);
  56. }
  57. return <></>;
  58. };
  59. return (
  60. <Modal size="lg" isOpen={isOpened} toggle={close} className="grw-create-page">
  61. <ModalHeader tag="h4" toggle={close} className="bg-primary text-light">
  62. { t('private_legacy_pages.modal.title') }
  63. </ModalHeader>
  64. <ModalBody>
  65. <div className="form-group grw-scrollable-modal-body pb-1">
  66. <label>{ t('private_legacy_pages.modal.converting_pages') }:</label><br />
  67. {/* Todo: change the way to show path on modal when too many pages are selected */}
  68. {/* https://redmine.weseek.co.jp/issues/82787 */}
  69. {renderPageIds()}
  70. </div>
  71. {renderForm()}
  72. </ModalBody>
  73. <ModalFooter>
  74. <ApiErrorMessageList errs={errs} />
  75. <button type="button" className="btn btn-primary" onClick={submit}>
  76. <i className="icon-fw icon-refresh" aria-hidden="true"></i>
  77. { t('private_legacy_pages.modal.button_label') }
  78. </button>
  79. </ModalFooter>
  80. </Modal>
  81. );
  82. };