CustomizeThemeOptions.tsx 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import React, { useMemo } from 'react';
  2. import { type GrowiThemeMetadata, GrowiThemeSchemeType } from '@growi/core';
  3. import { useTranslation } from 'next-i18next';
  4. import { ThemeColorBox } from './ThemeColorBox';
  5. type Props = {
  6. availableThemes: GrowiThemeMetadata[],
  7. selectedTheme?: string,
  8. onSelected?: (themeName: string) => void,
  9. };
  10. const CustomizeThemeOptions = (props: Props): JSX.Element => {
  11. const { t } = useTranslation('admin');
  12. const { availableThemes, selectedTheme, onSelected } = props;
  13. const lightNDarkThemes = useMemo(() => {
  14. return availableThemes.filter(s => s.schemeType === GrowiThemeSchemeType.BOTH);
  15. }, [availableThemes]);
  16. const oneModeThemes = useMemo(() => {
  17. return availableThemes.filter(s => s.schemeType !== GrowiThemeSchemeType.BOTH);
  18. }, [availableThemes]);
  19. return (
  20. <>
  21. {/* Light and Dark Themes */}
  22. <div>
  23. <h3 className="mb-3">{t('customize_settings.theme_desc.light_and_dark')}</h3>
  24. <div className="hstack gap-3 flex-wrap">
  25. {lightNDarkThemes.map((theme) => {
  26. return (
  27. <ThemeColorBox
  28. key={theme.name}
  29. isSelected={selectedTheme != null && selectedTheme === theme.name}
  30. metadata={theme}
  31. onSelected={() => onSelected?.(theme.name)}
  32. />
  33. );
  34. })}
  35. </div>
  36. </div>
  37. {/* Only one mode Theme */}
  38. <div className="mt-3">
  39. <h3 className="mb-3">{t('customize_settings.theme_desc.unique')}</h3>
  40. <div className="hstack gap-3 align-items-start flex-wrap">
  41. {oneModeThemes.map((theme) => {
  42. return (
  43. <ThemeColorBox
  44. key={theme.name}
  45. isSelected={selectedTheme != null && selectedTheme === theme.name}
  46. metadata={theme}
  47. onSelected={() => onSelected?.(theme.name)}
  48. />
  49. );
  50. })}
  51. </div>
  52. </div>
  53. </>
  54. );
  55. };
  56. export default CustomizeThemeOptions;