MarkDownSettingContents.tsx 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import React, { type JSX, useEffect } from 'react';
  2. import { useTranslation } from 'next-i18next';
  3. import { Card, CardBody } from 'reactstrap';
  4. import AdminMarkDownContainer from '~/client/services/AdminMarkDownContainer';
  5. import { toastError } from '~/client/util/toastr';
  6. import { toArrayIfNot } from '~/utils/array-utils';
  7. import loggerFactory from '~/utils/logger';
  8. import { withUnstatedContainers } from '../../UnstatedUtils';
  9. import ContentDispositionSettings from './ContentDispositionSettings';
  10. import IndentForm from './IndentForm';
  11. import LineBreakForm from './LineBreakForm';
  12. import XssForm from './XssForm';
  13. const logger = loggerFactory('growi:MarkDown');
  14. type Props = {
  15. adminMarkDownContainer: AdminMarkDownContainer;
  16. };
  17. const MarkDownSettingContents = React.memo((props: Props): JSX.Element => {
  18. const { t } = useTranslation('admin');
  19. const { adminMarkDownContainer } = props;
  20. useEffect(() => {
  21. const fetchMarkdownData = async () => {
  22. await adminMarkDownContainer.retrieveMarkdownData();
  23. };
  24. try {
  25. fetchMarkdownData();
  26. } catch (err) {
  27. const errs = toArrayIfNot(err);
  28. toastError(errs);
  29. logger.error(errs);
  30. }
  31. }, [adminMarkDownContainer]);
  32. return (
  33. <div data-testid="admin-markdown" className="mb-5">
  34. {/* Line Break Setting */}
  35. <h2 className="admin-setting-header">
  36. {t('markdown_settings.lineBreak_header')}
  37. </h2>
  38. <Card className="card custom-card bg-body-tertiary my-3">
  39. <CardBody className="px-0 py-2">
  40. {t('markdown_settings.lineBreak_desc')}
  41. </CardBody>
  42. </Card>
  43. <LineBreakForm />
  44. {/* Indent Setting */}
  45. <h2 className="admin-setting-header mt-5">
  46. {t('markdown_settings.indent_header')}
  47. </h2>
  48. <Card className="card custom-card bg-body-tertiary my-3">
  49. <CardBody className="px-0 py-2">
  50. {t('markdown_settings.indent_desc')}
  51. </CardBody>
  52. </Card>
  53. <IndentForm />
  54. {/* XSS Setting */}
  55. <h2 className="admin-setting-header mt-5">
  56. {t('markdown_settings.xss_header')}
  57. </h2>
  58. <Card className="card custom-card bg-body-tertiary my-3">
  59. <CardBody className="px-0 py-2">
  60. {t('markdown_settings.xss_desc')}
  61. </CardBody>
  62. </Card>
  63. <XssForm />
  64. {/* Content-Disposition Setting */}
  65. <ContentDispositionSettings />
  66. </div>
  67. );
  68. });
  69. MarkDownSettingContents.displayName = 'MarkDownSettingContents';
  70. const MarkdownSettingWithUnstatedContainer = withUnstatedContainers(
  71. MarkDownSettingContents,
  72. [AdminMarkDownContainer],
  73. );
  74. export default MarkdownSettingWithUnstatedContainer;