CustomizeThemeSetting.tsx 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import React, { useCallback, useEffect, useState } from 'react';
  2. import { PresetThemes, PresetThemesMetadatas } from '@growi/preset-themes';
  3. import { useTranslation } from 'next-i18next';
  4. import { apiv3Put } from '~/client/util/apiv3-client';
  5. import { toastSuccess, toastError, toastWarning } from '~/client/util/toastr';
  6. import { useSWRxGrowiThemeSetting } from '~/stores/admin/customize';
  7. import AdminUpdateButtonRow from '../Common/AdminUpdateButtonRow';
  8. import CustomizeThemeOptions from './CustomizeThemeOptions';
  9. // eslint-disable-next-line @typescript-eslint/ban-types
  10. type Props = {
  11. }
  12. // eslint-disable-next-line @typescript-eslint/no-unused-vars
  13. const CustomizeThemeSetting = (props: Props): JSX.Element => {
  14. const { t } = useTranslation();
  15. const { data, error } = useSWRxGrowiThemeSetting();
  16. const [currentTheme, setCurrentTheme] = useState(data?.currentTheme);
  17. useEffect(() => {
  18. setCurrentTheme(data?.currentTheme);
  19. }, [data?.currentTheme]);
  20. const selectedHandler = useCallback((themeName: string) => {
  21. setCurrentTheme(themeName);
  22. }, []);
  23. const submitHandler = useCallback(async() => {
  24. if (currentTheme == null) {
  25. toastWarning('The selected theme is undefined');
  26. return;
  27. }
  28. try {
  29. await apiv3Put('/customize-setting/theme', {
  30. theme: currentTheme,
  31. });
  32. toastSuccess(t('toaster.update_successed', { target: t('admin:customize_settings.theme'), ns: 'commons' }));
  33. }
  34. catch (err) {
  35. toastError(err);
  36. }
  37. }, [currentTheme, t]);
  38. const availableThemes = data?.pluginThemesMetadatas == null
  39. ? PresetThemesMetadatas
  40. : PresetThemesMetadatas.concat(data.pluginThemesMetadatas);
  41. const selectedTheme = availableThemes.find(t => t.name === currentTheme)?.name ?? PresetThemes.DEFAULT;
  42. return (
  43. <div className="row">
  44. <div className="col-12">
  45. <h2 className="admin-setting-header">{t('admin:customize_settings.theme')}</h2>
  46. <CustomizeThemeOptions
  47. onSelected={selectedHandler}
  48. availableThemes={availableThemes}
  49. selectedTheme={selectedTheme}
  50. />
  51. <AdminUpdateButtonRow onClick={submitHandler} disabled={error != null} />
  52. </div>
  53. </div>
  54. );
  55. };
  56. export default CustomizeThemeSetting;