CustomizeThemeSetting.tsx 2.2 KB

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