CustomizeSidebarSetting.tsx 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import React, { type JSX, useCallback } from 'react';
  2. import { LoadingSpinner } from '@growi/ui/dist/components';
  3. import { useTranslation } from 'next-i18next';
  4. import { Card, CardBody } from 'reactstrap';
  5. import { toastError, toastSuccess } from '~/client/util/toastr';
  6. import { useSWRxSidebarConfig } from '~/stores/admin/sidebar-config';
  7. import { useNextThemes } from '~/stores-universal/use-next-themes';
  8. const CustomizeSidebarsetting = (): JSX.Element => {
  9. const { t } = useTranslation(['admin', 'commons']);
  10. const { data, update, setIsSidebarCollapsedMode } = useSWRxSidebarConfig();
  11. const { resolvedTheme } = useNextThemes();
  12. const collapsedIconFileName = `/images/customize-settings/collapsed-${resolvedTheme}.svg`;
  13. const dockIconFileName = `/images/customize-settings/dock-${resolvedTheme}.svg`;
  14. const onClickSubmit = useCallback(async () => {
  15. try {
  16. await update();
  17. toastSuccess(
  18. t('toaster.update_successed', {
  19. target: t('customize_settings.default_sidebar_mode.title'),
  20. ns: 'commons',
  21. }),
  22. );
  23. } catch (err) {
  24. toastError(err);
  25. }
  26. }, [t, update]);
  27. if (data == null) {
  28. return <LoadingSpinner />;
  29. }
  30. const { isSidebarCollapsedMode } = data;
  31. return (
  32. <div className="row">
  33. <div className="col-12">
  34. <h2 className="admin-setting-header">
  35. {t('customize_settings.default_sidebar_mode.title')}
  36. </h2>
  37. <Card className="card custom-card bg-body-tertiary my-3">
  38. <CardBody className="px-0 py-2">
  39. {t('customize_settings.default_sidebar_mode.desc')}
  40. </CardBody>
  41. </Card>
  42. <div className="d-flex justify-content-around mt-5">
  43. <div className="row row-cols-2">
  44. <div className="col">
  45. <button
  46. type="button"
  47. className={`card border border-4 ${isSidebarCollapsedMode ? 'border-primary' : ''}`}
  48. onClick={() => setIsSidebarCollapsedMode(true)}
  49. aria-pressed={isSidebarCollapsedMode}
  50. >
  51. {/* biome-ignore lint/performance/noImgElement: Ignore for SVG */}
  52. <img src={collapsedIconFileName} alt="Collapsed Mode" />
  53. <div className="card-body text-center">Collapsed Mode</div>
  54. </button>
  55. </div>
  56. <div className="col">
  57. <button
  58. type="button"
  59. className={`card border border-4 ${!isSidebarCollapsedMode ? 'border-primary' : ''}`}
  60. onClick={() => setIsSidebarCollapsedMode(false)}
  61. aria-pressed={!isSidebarCollapsedMode}
  62. >
  63. {/* biome-ignore lint/performance/noImgElement: Ignore for SVG */}
  64. <img src={dockIconFileName} alt="Dock Mode" />
  65. <div className="card-body text-center">Dock Mode</div>
  66. </button>
  67. </div>
  68. </div>
  69. </div>
  70. <div className="row my-3">
  71. <div className="mx-auto">
  72. <button
  73. type="button"
  74. onClick={onClickSubmit}
  75. className="btn btn-primary"
  76. >
  77. {t('Update')}
  78. </button>
  79. </div>
  80. </div>
  81. </div>
  82. </div>
  83. );
  84. };
  85. export default CustomizeSidebarsetting;