AppSettingsPageContents.tsx 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. import React, { useEffect } from 'react';
  2. import { useTranslation } from 'next-i18next';
  3. import AdminAppContainer from '~/client/services/AdminAppContainer';
  4. import { toastError } from '~/client/util/toastr';
  5. import { useIsMaintenanceMode } from '~/states/global';
  6. import { toArrayIfNot } from '~/utils/array-utils';
  7. import loggerFactory from '~/utils/logger';
  8. import { withUnstatedContainers } from '../../UnstatedUtils';
  9. import AppSetting from './AppSetting';
  10. import FileUploadSetting from './FileUploadSetting';
  11. import MailSetting from './MailSetting';
  12. import { MaintenanceMode } from './MaintenanceMode';
  13. import PageBulkExportSettings from './PageBulkExportSettings';
  14. import SiteUrlSetting from './SiteUrlSetting';
  15. import V5PageMigration from './V5PageMigration';
  16. const logger = loggerFactory('growi:appSettings');
  17. type Props = {
  18. adminAppContainer: AdminAppContainer;
  19. };
  20. const AppSettingsPageContents = (props: Props) => {
  21. const { t } = useTranslation('admin');
  22. const { adminAppContainer } = props;
  23. const isMaintenanceMode = useIsMaintenanceMode();
  24. const { isV5Compatible } = adminAppContainer.state;
  25. useEffect(() => {
  26. const fetchAppSettingsData = async () => {
  27. await adminAppContainer.retrieveAppSettingsData();
  28. };
  29. try {
  30. fetchAppSettingsData();
  31. } catch (err) {
  32. const errs = toArrayIfNot(err);
  33. toastError(errs);
  34. logger.error(errs);
  35. }
  36. }, [adminAppContainer]);
  37. return (
  38. <div data-testid="admin-app-settings">
  39. {
  40. // Alert message will be displayed in case that the GROWI is under maintenance
  41. isMaintenanceMode && (
  42. <div className="alert alert-danger alert-link" role="alert">
  43. <h3 className="alert-heading">
  44. {t('admin:maintenance_mode.maintenance_mode')}
  45. </h3>
  46. <p>{t('admin:maintenance_mode.description')}</p>
  47. <hr />
  48. <a
  49. className="btn-link"
  50. href="#maintenance-mode"
  51. rel="noopener noreferrer"
  52. >
  53. <span
  54. className="material-symbols-outlined ms-1"
  55. aria-hidden="true"
  56. >
  57. expand_more
  58. </span>
  59. <strong>
  60. {t('admin:maintenance_mode.end_maintenance_mode')}
  61. </strong>
  62. </a>
  63. </div>
  64. )
  65. }
  66. {!isV5Compatible && (
  67. <div className="row">
  68. <div className="col-lg-12">
  69. <h2
  70. className="admin-setting-header"
  71. data-testid="v5-page-migration"
  72. >
  73. {t('V5 Page Migration')}
  74. </h2>
  75. <V5PageMigration />
  76. </div>
  77. </div>
  78. )}
  79. <div className="row">
  80. <div className="col-lg-12">
  81. <h2 className="admin-setting-header">
  82. {t('headers.app_settings', { ns: 'commons' })}
  83. </h2>
  84. <AppSetting />
  85. </div>
  86. </div>
  87. <div className="row mt-5">
  88. <div className="col-lg-12">
  89. <h2 className="admin-setting-header">
  90. {t('app_setting.site_url.title')}
  91. </h2>
  92. <SiteUrlSetting />
  93. </div>
  94. </div>
  95. <div className="row mt-5">
  96. <div className="col-lg-12">
  97. <h2 className="admin-setting-header" id="mail-settings">
  98. {t('app_setting.mail_settings')}
  99. </h2>
  100. <MailSetting />
  101. </div>
  102. </div>
  103. <div className="row mt-5">
  104. <div className="col-lg-12">
  105. <h2 className="admin-setting-header">
  106. {t('admin:app_setting.file_upload_settings')}
  107. </h2>
  108. <FileUploadSetting />
  109. </div>
  110. </div>
  111. <div className="row mt-5">
  112. <div className="col-lg-12">
  113. <h2 className="admin-setting-header">
  114. {t('admin:app_setting.page_bulk_export_settings')}
  115. </h2>
  116. <PageBulkExportSettings />
  117. </div>
  118. </div>
  119. <div className="row">
  120. <div className="col-lg-12">
  121. <h2 className="admin-setting-header" id="maintenance-mode">
  122. {t('admin:maintenance_mode.maintenance_mode')}
  123. </h2>
  124. <MaintenanceMode />
  125. </div>
  126. </div>
  127. </div>
  128. );
  129. };
  130. /**
  131. * Wrapper component for using unstated
  132. */
  133. const AppSettingsPageContentsWrapper = withUnstatedContainers(
  134. AppSettingsPageContents,
  135. [AdminAppContainer],
  136. );
  137. export default AppSettingsPageContentsWrapper;