AppSettingsPageContents.tsx 4.4 KB

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