frontend client for gemstone. decentralised workplace app

feat: theme provider with facet library

serenity db0e9e6d 422ed0b2

Changed files
+59 -5
src
+47
src/providers/ThemeProvider.tsx
···
···
+
import type { Enumify } from "@/lib/utils/types";
+
import type { Dispatch, ReactNode, SetStateAction } from "react";
+
import { createContext, useContext, useState } from "react";
+
+
export const ColorMode = {
+
DARK: "dark",
+
LIGHT: "light",
+
} as const;
+
+
// eslint-disable-next-line @typescript-eslint/no-redeclare -- intentional. lets us have enum-like objects without some of the weirdness
+
export type ColorMode = Enumify<typeof ColorMode>;
+
+
interface ThemeContextValue {
+
colorMode: ColorMode;
+
setColorMode: Dispatch<SetStateAction<ColorMode>>;
+
}
+
+
const ThemeContext = createContext<ThemeContextValue | null>(null);
+
+
const useThemeProvider = () => {
+
const value = useContext(ThemeContext);
+
if (!value)
+
throw new Error(
+
"Theme provider failed to initialise. Did you access this out of tree somehow? Tried to access theme values before it was initialised.",
+
);
+
return value;
+
};
+
+
export const useColorMode = () => {
+
const { colorMode } = useThemeProvider();
+
return colorMode;
+
};
+
+
export const useSetColorMode = () => {
+
const { setColorMode } = useThemeProvider();
+
return setColorMode;
+
};
+
+
export const ThemeProvider = ({ children }: { children: ReactNode }) => {
+
const [colorMode, setColorMode] = useState<ColorMode>(ColorMode.DARK);
+
+
const value: ThemeContextValue = {
+
colorMode,
+
setColorMode,
+
};
+
return <ThemeContext value={value}>{children}</ThemeContext>;
+
};
+12 -5
src/providers/index.tsx
···
import { DebugProvider } from "@/providers/DebugProvider";
import { OAuthProvider } from "@/providers/OAuthProvider";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import type { ReactNode } from "react";
const queryClient = new QueryClient();
export const RootProviders = ({ children }: { children: ReactNode }) => {
return (
-
<DebugProvider>
-
<QueryClientProvider client={queryClient}>
-
<OAuthProvider>{children}</OAuthProvider>
-
</QueryClientProvider>
-
</DebugProvider>
);
};
···
+
import { FacetProvider, generateFacet } from "@/lib/facet";
import { DebugProvider } from "@/providers/DebugProvider";
import { OAuthProvider } from "@/providers/OAuthProvider";
+
import { ThemeProvider } from "@/providers/ThemeProvider";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import type { ReactNode } from "react";
+
const facet = generateFacet();
const queryClient = new QueryClient();
export const RootProviders = ({ children }: { children: ReactNode }) => {
return (
+
<FacetProvider facet={facet}>
+
<ThemeProvider>
+
<DebugProvider>
+
<QueryClientProvider client={queryClient}>
+
<OAuthProvider>{children}</OAuthProvider>
+
</QueryClientProvider>
+
</DebugProvider>
+
</ThemeProvider>
+
</FacetProvider>
);
};