CustomizeSidebarSetting.tsx 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  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 [isSidebarDrawerMode, setIsSidebarDrawerMode] = useState(false);
  10. const [isSidebarClosedAtDockMode, setIsSidebarClosedAtDockMode] = 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 retrieveIsSidebarDrawerMode = useCallback(async() => {
  17. try {
  18. const res = await apiv3Get('/customize-setting/sidebar');
  19. setIsSidebarDrawerMode(res.data.isSidebarDrawerMode);
  20. }
  21. catch (err) {
  22. setRetrieveError(err);
  23. toastError(err);
  24. }
  25. }, []);
  26. const retrieveIsSidebarClosedAtDockMode = useCallback(async() => {
  27. try {
  28. const res = await apiv3Get('/customize-setting/isSidebarClosedAtDockMode');
  29. setIsSidebarClosedAtDockMode(res.data.isSidebarClosedAtDockMode);
  30. }
  31. catch (err) {
  32. setRetrieveError(err);
  33. toastError(err);
  34. }
  35. }, []);
  36. const retrieveData = useCallback(async() => {
  37. await retrieveIsSidebarDrawerMode();
  38. await retrieveIsSidebarClosedAtDockMode();
  39. }, [retrieveIsSidebarDrawerMode, retrieveIsSidebarClosedAtDockMode]);
  40. const submitIsSidebarDrawerMode = useCallback(async() => {
  41. try {
  42. await apiv3Put('/customize-setting/sidebar', { isSidebarDrawerMode });
  43. toastSuccess(t('toaster.update_successed', { target: t('admin:customize_setting.default_sidebar_mode.title') }));
  44. }
  45. catch (err) {
  46. toastError(err);
  47. }
  48. }, [t, isSidebarDrawerMode]);
  49. const submitIsSidebarClosedAtDockMode = useCallback(async() => {
  50. try {
  51. await apiv3Put('/customize-setting/isSidebarClosedAtDockMode', { isSidebarClosedAtDockMode });
  52. toastSuccess(t('toaster.update_successed', { target: t('admin:customize_setting.default_sidebar_mode.dock_mode_default') }));
  53. }
  54. catch (err) {
  55. toastError(err);
  56. }
  57. }, [t, isSidebarClosedAtDockMode]);
  58. const onClickSubmit = useCallback(async() => {
  59. await submitIsSidebarDrawerMode();
  60. await submitIsSidebarClosedAtDockMode();
  61. retrieveData();
  62. }, [retrieveData, submitIsSidebarClosedAtDockMode, submitIsSidebarDrawerMode]);
  63. useEffect(() => {
  64. retrieveData();
  65. }, [retrieveData]);
  66. return (
  67. <React.Fragment>
  68. <div className="row">
  69. <div className="col-12">
  70. <h2 className="admin-setting-header">{t('admin:customize_setting.default_sidebar_mode.title')}</h2>
  71. <Card className="card well my-3">
  72. <CardBody className="px-0 py-2">
  73. {t('admin:customize_setting.default_sidebar_mode.desc')}
  74. </CardBody>
  75. </Card>
  76. <div className="d-flex justify-content-around mt-5">
  77. <div id="layoutOptions" className="card-deck">
  78. <div
  79. className={`card customize-layout-card ${isSidebarDrawerMode ? 'border-active' : ''}`}
  80. onClick={() => setIsSidebarDrawerMode(true)}
  81. role="button"
  82. >
  83. <img src={drawerIconFileName} />
  84. <div className="card-body text-center">
  85. Drawer Mode
  86. </div>
  87. </div>
  88. <div
  89. className={`card customize-layout-card ${!isSidebarDrawerMode ? 'border-active' : ''}`}
  90. onClick={() => setIsSidebarDrawerMode(false)}
  91. role="button"
  92. >
  93. <img src={dockIconFileName} />
  94. <div className="card-body text-center">
  95. Dock Mode
  96. </div>
  97. </div>
  98. </div>
  99. </div>
  100. <Card className="card well my-5">
  101. <CardBody className="px-0 py-2">
  102. {t('admin:customize_setting.default_sidebar_mode.dock_mode_default_desc')}
  103. </CardBody>
  104. </Card>
  105. <div className="px-3">
  106. <div className="custom-control custom-radio my-3">
  107. <input
  108. type="radio"
  109. id="is-open"
  110. className="custom-control-input"
  111. name="mailVisibility"
  112. checked={!isSidebarDrawerMode && !isSidebarClosedAtDockMode}
  113. disabled={isSidebarDrawerMode}
  114. onChange={() => setIsSidebarClosedAtDockMode(false)}
  115. />
  116. <label className="custom-control-label" htmlFor="is-open">
  117. {t('admin:customize_setting.default_sidebar_mode.dock_mode_default_open')}
  118. </label>
  119. </div>
  120. <div className="custom-control custom-radio my-3">
  121. <input
  122. type="radio"
  123. id="is-closed"
  124. className="custom-control-input"
  125. name="mailVisibility"
  126. checked={!isSidebarDrawerMode && isSidebarClosedAtDockMode}
  127. disabled={isSidebarDrawerMode}
  128. onChange={() => setIsSidebarClosedAtDockMode(true)}
  129. />
  130. <label className="custom-control-label" htmlFor="is-closed">
  131. {t('admin:customize_setting.default_sidebar_mode.dock_mode_default_close')}
  132. </label>
  133. </div>
  134. </div>
  135. <div className="row my-3">
  136. <div className="mx-auto">
  137. <button type="button" onClick={onClickSubmit} className="btn btn-primary" disabled={retrieveError != null}>{ t('Update') }</button>
  138. </div>
  139. </div>
  140. </div>
  141. </div>
  142. </React.Fragment>
  143. );
  144. };
  145. export default CustomizeSidebarsetting;