CustomizeSidebarSetting.tsx 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. import React, { useState, useCallback, useEffect } from 'react';
  2. import { useTranslation } from 'react-i18next';
  3. import { Card, CardBody } from 'reactstrap';
  4. import { toastSuccess, toastError } from '~/client/util/apiNotification';
  5. import { apiv3Get, apiv3Put } from '~/client/util/apiv3-client';
  6. import { isDarkMode as isDarkModeByUtil } from '~/client/util/color-scheme';
  7. const CustomizeSidebarsetting = (): JSX.Element => {
  8. const { t } = useTranslation();
  9. const [isDrawerMode, setIsDrawerMode] = useState(false);
  10. const [isDefaultClosedAtDockMode, setIsDefaultClosedAtDockMode] = useState(false);
  11. const [retrieveError, setRetrieveError] = useState();
  12. const isDarkMode = isDarkModeByUtil();
  13. const colorText = isDarkMode ? 'dark' : 'light';
  14. const drawerIconFileName = `/images/customize-settings/drawer-${colorText}.svg`;
  15. const dockIconFileName = `/images/customize-settings/dock-${colorText}.svg`;
  16. const retrieveData = useCallback(async() => {
  17. try {
  18. const resSidebar = await apiv3Get('/customize-setting/sidebar');
  19. setIsDrawerMode(resSidebar.data.isDrawerMode);
  20. const resIsClosed = await apiv3Get('/customize-setting/isSidebarClosedAtDockMode');
  21. setIsDefaultClosedAtDockMode(resIsClosed.data.isSidebarClosedAtDockMode);
  22. }
  23. catch (err) {
  24. setRetrieveError(err);
  25. toastError(err);
  26. }
  27. }, []);
  28. const onClickSubmit = async() => {
  29. try {
  30. await apiv3Put('/customize-setting/sidebar', { isDrawerMode });
  31. await apiv3Put('/customize-setting/isSidebarClosedAtDockMode', { isDefaultClosedAtDockMode });
  32. // TODO: 文言を考えて追加する
  33. toastSuccess(t('toaster.update_successed', { target: t('admin:customize_setting.layout') }));
  34. retrieveData();
  35. }
  36. catch (err) {
  37. toastError(err);
  38. }
  39. };
  40. useEffect(() => {
  41. retrieveData();
  42. }, [retrieveData]);
  43. return (
  44. <React.Fragment>
  45. <div className="row">
  46. <div className="col-12">
  47. <h2 className="admin-setting-header">{t('admin:customize_setting.default_sidebar_mode.title')}</h2>
  48. <Card className="card well my-3">
  49. <CardBody className="px-0 py-2">
  50. {t('admin:customize_setting.default_sidebar_mode.desc')}
  51. </CardBody>
  52. </Card>
  53. <div className="d-flex justify-content-around mt-5">
  54. <div id="layoutOptions" className="card-deck">
  55. <div
  56. className={`card customize-layout-card ${isDrawerMode ? 'border-active' : ''}`}
  57. onClick={() => setIsDrawerMode(true)}
  58. role="button"
  59. >
  60. <img src={drawerIconFileName} />
  61. <div className="card-body text-center">
  62. Drawer Mode
  63. </div>
  64. </div>
  65. <div
  66. className={`card customize-layout-card ${!isDrawerMode ? 'border-active' : ''}`}
  67. onClick={() => setIsDrawerMode(false)}
  68. role="button"
  69. >
  70. <img src={dockIconFileName} />
  71. <div className="card-body text-center">
  72. Dock Mode
  73. </div>
  74. </div>
  75. </div>
  76. </div>
  77. <Card className="card well my-5">
  78. <CardBody className="px-0 py-2">
  79. {t('admin:customize_setting.default_sidebar_mode.dock_mode_default_desc')}
  80. </CardBody>
  81. </Card>
  82. <div className="px-3">
  83. <div className="custom-control custom-radio my-3">
  84. <input
  85. type="radio"
  86. id="radio-email-show"
  87. className="custom-control-input"
  88. name="mailVisibility"
  89. checked={!isDrawerMode && !isDefaultClosedAtDockMode}
  90. disabled={isDrawerMode}
  91. onChange={() => { setIsDefaultClosedAtDockMode(false) }}
  92. />
  93. <label className="custom-control-label" htmlFor="radio-email-show">
  94. {t('admin:customize_setting.default_sidebar_mode.dock_mode_default_open')}
  95. </label>
  96. </div>
  97. <div className="custom-control custom-radio my-3">
  98. <input
  99. type="radio"
  100. id="radio-email-show"
  101. className="custom-control-input"
  102. name="mailVisibility"
  103. checked={!isDrawerMode && isDefaultClosedAtDockMode}
  104. disabled={isDrawerMode}
  105. onChange={() => { setIsDefaultClosedAtDockMode(true) }}
  106. />
  107. <label className="custom-control-label" htmlFor="radio-email-show">
  108. {t('admin:customize_setting.default_sidebar_mode.dock_mode_default_close')}
  109. </label>
  110. </div>
  111. </div>
  112. <div className="row my-3">
  113. <div className="mx-auto">
  114. <button type="button" onClick={onClickSubmit} className="btn btn-primary" disabled={retrieveError != null}>{ t('Update') }</button>
  115. </div>
  116. </div>
  117. </div>
  118. </div>
  119. </React.Fragment>
  120. );
  121. };
  122. export default CustomizeSidebarsetting;