import React from "react"; import { AppTheme } from "@backstage/core-plugin-api"; import { UnifiedTheme, UnifiedThemeProvider, createUnifiedTheme, themes, } from "@backstage/theme"; import LightIcon from "@material-ui/icons/WbSunny"; import DarkIcon from "@material-ui/icons/Brightness2"; import { createTheme } from "@mui/material/styles"; import { useThemeConfig } from "../hooks/useThemeConfig"; import * as backstage from "./backstage"; import * as rhdh10 from "./rhdh-1.0"; import * as rhdh11 from "./rhdh-1.1"; import * as rhdh120 from "./rhdh-1.2.0"; import * as rhdh from "./rhdh"; import { ThemeConfig } from "../types"; import { useTheme } from "../hooks/useTheme"; const createThemeProvider = (theme: UnifiedTheme): AppTheme["Provider"] => function RHDHThemeProvider({ children }) { return ( {children} ); }; const createThemeProviderForThemeConfig = ( themeConfig: ThemeConfig, ): AppTheme["Provider"] => function RHDHThemeProviderForThemeConfig({ children }) { const theme = useTheme(themeConfig); return ( {children} ); }; const createThemeProviderForThemeName = ( themeName: string, ): AppTheme["Provider"] => function RHDHThemeProviderForThemeName({ children }) { const themeConfig = useThemeConfig(themeName); const theme = useTheme(themeConfig); return ( {children} ); }; export const getAllThemes = (): AppTheme[] => { return [ { id: "light", title: "RHDH Light (latest)", variant: "light", icon: , Provider: createThemeProviderForThemeName("light"), }, { id: "dark", title: "RHDH Dark (latest)", variant: "dark", icon: , Provider: createThemeProviderForThemeName("dark"), }, { id: "light-customized", title: "RHDH Light (customized)", variant: "light", icon: , Provider: createThemeProviderForThemeConfig({ mode: "light", variant: "rhdh", palette: { primary: { main: "#ff0000" }, secondary: { main: "#00ff00" }, }, }), }, { id: "dark-customized", title: "RHDH Dark (customized)", variant: "dark", icon: , Provider: createThemeProviderForThemeConfig({ mode: "dark", variant: "rhdh", palette: { primary: { main: "#ff0000" }, secondary: { main: "#00ff00" }, }, }), }, { id: "backstage-light", title: "Backstage Light", variant: "light", icon: , Provider: createThemeProvider(themes.light), }, { id: "backstage-dark", title: "Backstage Dark", variant: "dark", icon: , Provider: createThemeProvider(themes.dark), }, { id: "rhdh-1.2.0-light", title: "RHDH 1.2.0 Light", variant: "light", icon: , Provider: createThemeProvider( createUnifiedTheme(rhdh120.customLightTheme({})), ), }, { id: "rhdh-1.2.0-dark", title: "RHDH 1.2.0 Dark", variant: "dark", icon: , Provider: createThemeProvider( createUnifiedTheme(rhdh120.customDarkTheme({})), ), }, { id: "rhdh-1.1-light", title: "RHDH 1.1 Light", variant: "light", icon: , Provider: createThemeProvider( createUnifiedTheme(rhdh11.customLightTheme({})), ), }, { id: "rhdh-1.1-dark", title: "RHDH 1.1 Dark", variant: "dark", icon: , Provider: createThemeProvider( createUnifiedTheme(rhdh11.customDarkTheme({})), ), }, { id: "rhdh-1.0-light", title: "RHDH 1.0 Light", variant: "light", icon: , Provider: createThemeProvider( createUnifiedTheme(rhdh10.customLightTheme({})), ), }, { id: "rhdh-1.0-dark", title: "RHDH 1.0 Dark", variant: "dark", icon: , Provider: createThemeProvider( createUnifiedTheme(rhdh10.customDarkTheme({})), ), }, ]; }; export const useAllThemes = (): AppTheme[] => { return React.useMemo(() => getAllThemes(), []); }; export const getThemes = (): AppTheme[] => { return [ { id: "light", title: "Light", variant: "light", icon: , Provider: createThemeProviderForThemeName("light"), }, { id: "dark", title: "Dark", variant: "dark", icon: , Provider: createThemeProviderForThemeName("dark"), }, ]; }; export const useThemes = (): AppTheme[] => { return React.useMemo(() => getThemes(), []); }; export const useLoaderTheme = () => { return React.useMemo(() => { const latestTheme = localStorage.getItem("theme"); const mode = latestTheme?.includes("dark") ? "dark" : "light"; const variant = latestTheme?.includes("backstage") ? "backstage" : "rhdh"; const themeOptions = variant === "backstage" ? backstage.getDefaultThemeConfig(mode) : rhdh.getDefaultThemeConfig(mode); return createTheme(themeOptions); }, []); };