Customize.jsx 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import React, { Fragment, Suspense } from 'react';
  2. import PropTypes from 'prop-types';
  3. import loggerFactory from '@alias/logger';
  4. import AdminCustomizeContainer from '../../../services/AdminCustomizeContainer';
  5. import { withUnstatedContainers } from '../../UnstatedUtils';
  6. import { toastError } from '../../../util/apiNotification';
  7. import toArrayIfNot from '../../../../../lib/util/toArrayIfNot';
  8. import CustomizeLayoutSetting from './CustomizeLayoutSetting';
  9. import CustomizeFunctionSetting from './CustomizeFunctionSetting';
  10. import CustomizeHighlightSetting from './CustomizeHighlightSetting';
  11. import CustomizeCssSetting from './CustomizeCssSetting';
  12. import CustomizeScriptSetting from './CustomizeScriptSetting';
  13. import CustomizeHeaderSetting from './CustomizeHeaderSetting';
  14. import CustomizeTitle from './CustomizeTitle';
  15. const logger = loggerFactory('growi:services:AdminCustomizePage');
  16. function CustomizePageWithContainerWithSusupense(props) {
  17. return (
  18. <Suspense
  19. fallback={(
  20. <div className="row">
  21. <i className="fa fa-5x fa-spinner fa-pulse mx-auto text-muted"></i>
  22. </div>
  23. )}
  24. >
  25. <CustomizePageWithUnstatedContainer />
  26. </Suspense>
  27. );
  28. }
  29. let retrieveErrors = null;
  30. function Customize(props) {
  31. const { adminCustomizeContainer } = props;
  32. if (adminCustomizeContainer.state.currentTheme === adminCustomizeContainer.dummyCurrentTheme) {
  33. throw (async() => {
  34. try {
  35. await adminCustomizeContainer.retrieveCustomizeData();
  36. }
  37. catch (err) {
  38. const errs = toArrayIfNot(err);
  39. toastError(errs);
  40. logger.error(errs);
  41. retrieveErrors = errs;
  42. adminCustomizeContainer.setState({ currentTheme: adminCustomizeContainer.dummyCurrentThemeForError });
  43. }
  44. })();
  45. }
  46. if (adminCustomizeContainer.state.currentTheme === adminCustomizeContainer.dummyCurrentThemeForError) {
  47. throw new Error(`${retrieveErrors.length} errors occured`);
  48. }
  49. return (
  50. <Fragment>
  51. <div className="mb-5">
  52. <CustomizeLayoutSetting />
  53. </div>
  54. <div className="mb-5">
  55. <CustomizeFunctionSetting />
  56. </div>
  57. <div className="mb-5">
  58. <CustomizeHighlightSetting />
  59. </div>
  60. <div className="mb-5">
  61. <CustomizeTitle />
  62. </div>
  63. <div className="mb-5">
  64. <CustomizeHeaderSetting />
  65. </div>
  66. <div className="mb-5">
  67. <CustomizeCssSetting />
  68. </div>
  69. <div className="mb-5">
  70. <CustomizeScriptSetting />
  71. </div>
  72. </Fragment>
  73. );
  74. }
  75. const CustomizePageWithUnstatedContainer = withUnstatedContainers(Customize, [AdminCustomizeContainer]);
  76. Customize.propTypes = {
  77. adminCustomizeContainer: PropTypes.instanceOf(AdminCustomizeContainer).isRequired,
  78. };
  79. export default CustomizePageWithContainerWithSusupense;