CustomizeThemeSetting.tsx 2.3 KB

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