import { useState, useEffect, Dispatch, SetStateAction } from "react"; import { useTheme } from "next-themes"; // constants import { THEMES_OBJ } from "constants/themes"; // ui import { CustomSelect } from "components/ui"; // types import { ICustomTheme, IUser } from "types"; type Props = { user: IUser | undefined; setPreLoadedData: Dispatch>; customThemeSelectorOptions: boolean; setCustomThemeSelectorOptions: Dispatch>; }; export const ThemeSwitch: React.FC = ({ user, setPreLoadedData, customThemeSelectorOptions, setCustomThemeSelectorOptions, }) => { const [mounted, setMounted] = useState(false); const { theme, setTheme } = useTheme(); // useEffect only runs on the client, so now we can safely show the UI useEffect(() => { setMounted(true); }, []); if (!mounted) { return null; } const currentThemeObj = THEMES_OBJ.find((t) => t.value === theme); return ( <>
{currentThemeObj.label}
) : ( "Select your theme" ) } onChange={({ value, type }: { value: string; type: string }) => { if (value === "custom") { if (user?.theme.palette) setPreLoadedData(user.theme); if (!customThemeSelectorOptions) setCustomThemeSelectorOptions(true); } else { if (customThemeSelectorOptions) setCustomThemeSelectorOptions(false); for (let i = 10; i <= 900; i >= 100 ? (i += 100) : (i += 10)) { document.documentElement.style.removeProperty(`--color-background-${i}`); document.documentElement.style.removeProperty(`--color-text-${i}`); document.documentElement.style.removeProperty(`--color-primary-${i}`); document.documentElement.style.removeProperty(`--color-sidebar-background-${i}`); document.documentElement.style.removeProperty(`--color-sidebar-text-${i}`); } } setTheme(value); document.documentElement.style.setProperty("color-scheme", type); }} input width="w-full" position="right" > {THEMES_OBJ.map(({ value, label, type, icon }) => (
{label}
))} ); };