CustomizeLayoutSetting.tsx 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import React, {
  2. useCallback, useEffect, useState,
  3. } from 'react';
  4. import { useTranslation } from 'next-i18next';
  5. import { toastSuccess, toastError } from '~/client/util/toastr';
  6. import { useSWRxLayoutSetting } from '~/stores/admin/customize';
  7. import { useNextThemes } from '~/stores/use-next-themes';
  8. const useIsContainerFluid = () => {
  9. const { data: layoutSetting, update: updateLayoutSetting } = useSWRxLayoutSetting();
  10. const [isContainerFluid, setIsContainerFluid] = useState<boolean>();
  11. useEffect(() => {
  12. setIsContainerFluid(layoutSetting?.isContainerFluid);
  13. }, [layoutSetting?.isContainerFluid]);
  14. return {
  15. isContainerFluid,
  16. setIsContainerFluid,
  17. updateLayoutSetting,
  18. };
  19. };
  20. const CustomizeLayoutSetting = (): JSX.Element => {
  21. const { t } = useTranslation('admin');
  22. const { resolvedTheme } = useNextThemes();
  23. const { isContainerFluid, setIsContainerFluid, updateLayoutSetting } = useIsContainerFluid();
  24. const [retrieveError, setRetrieveError] = useState<any>();
  25. const onClickSubmit = useCallback(async() => {
  26. if (isContainerFluid == null) { return }
  27. try {
  28. await updateLayoutSetting({ isContainerFluid });
  29. toastSuccess(t('toaster.update_successed', { target: t('customize_settings.layout'), ns: 'commons' }));
  30. }
  31. catch (err) {
  32. toastError(err);
  33. }
  34. }, [isContainerFluid, updateLayoutSetting, t]);
  35. if (isContainerFluid == null) {
  36. return (
  37. <div className="text-muted text-center">
  38. <i className="fa fa-2x fa-spinner fa-pulse"></i>
  39. </div>
  40. );
  41. }
  42. return (
  43. <React.Fragment>
  44. <div className="row">
  45. <div className="col-12">
  46. <h2 className="admin-setting-header">{t('customize_settings.layout')}</h2>
  47. <div className="d-flex justify-content-around mt-5">
  48. <div id="layoutOptions" className="card-deck">
  49. <div
  50. className={`card customize-layout-card ${!isContainerFluid ? 'border-active' : ''}`}
  51. onClick={() => setIsContainerFluid(false)}
  52. role="button"
  53. >
  54. <img src={`/images/customize-settings/default-${resolvedTheme}.svg`} />
  55. <div className="card-body text-center">
  56. {t('customize_settings.layout_options.default')}
  57. </div>
  58. </div>
  59. <div
  60. className={`card customize-layout-card ${isContainerFluid ? 'border-active' : ''}`}
  61. onClick={() => setIsContainerFluid(true)}
  62. role="button"
  63. >
  64. <img src={`/images/customize-settings/fluid-${resolvedTheme}.svg`} />
  65. <div className="card-body text-center">
  66. {t('customize_settings.layout_options.expanded')}
  67. </div>
  68. </div>
  69. </div>
  70. </div>
  71. <div className="row my-3">
  72. <div className="mx-auto">
  73. <button type="button" className="btn btn-primary" onClick={onClickSubmit} disabled={retrieveError != null}>{ t('Update') }</button>
  74. </div>
  75. </div>
  76. </div>
  77. </div>
  78. </React.Fragment>
  79. );
  80. };
  81. export default CustomizeLayoutSetting;