2024-02-15 00:57:41 +01:00
|
|
|
import {
|
|
|
|
|
Button,
|
|
|
|
|
CunninghamProvider,
|
|
|
|
|
Select,
|
|
|
|
|
useModal,
|
|
|
|
|
} from "@openfun/cunningham-react";
|
2024-02-14 00:37:50 +01:00
|
|
|
import React, { useEffect, useMemo, useState } from "react";
|
2024-01-18 16:49:47 +01:00
|
|
|
import { Create } from "./Create";
|
|
|
|
|
import { Home } from "./Home";
|
2023-02-20 16:27:37 +01:00
|
|
|
|
2023-09-26 11:39:28 +02:00
|
|
|
enum Theme {
|
2024-02-14 00:37:50 +01:00
|
|
|
CUNNINGHAM = "cunningham",
|
2024-02-14 00:44:33 +01:00
|
|
|
REDFLUX = "redflux",
|
2024-02-14 00:46:14 +01:00
|
|
|
BLUENEY = "blueney",
|
2024-02-14 00:37:50 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
enum Variant {
|
|
|
|
|
LIGHT = "light",
|
2023-09-26 11:39:28 +02:00
|
|
|
DARK = "dark",
|
|
|
|
|
}
|
|
|
|
|
|
2024-02-14 00:37:50 +01:00
|
|
|
const THEMES: Record<Theme, Record<Variant, string | undefined>> = {
|
|
|
|
|
[Theme.CUNNINGHAM]: {
|
|
|
|
|
light: "default",
|
|
|
|
|
dark: "dark",
|
|
|
|
|
},
|
2024-02-14 00:44:33 +01:00
|
|
|
[Theme.REDFLUX]: {
|
|
|
|
|
light: undefined,
|
|
|
|
|
dark: "redflux_dark",
|
|
|
|
|
},
|
2024-02-14 00:46:14 +01:00
|
|
|
[Theme.BLUENEY]: {
|
|
|
|
|
light: undefined,
|
|
|
|
|
dark: "blueney_dark",
|
|
|
|
|
},
|
2024-02-14 00:37:50 +01:00
|
|
|
};
|
|
|
|
|
|
2024-02-15 00:57:41 +01:00
|
|
|
export type PageProps = ReturnType<typeof useModal>;
|
2024-01-18 16:49:47 +01:00
|
|
|
|
|
|
|
|
const preferredScheme = window.matchMedia("(prefers-color-scheme: dark)")
|
|
|
|
|
.matches
|
2024-02-14 00:37:50 +01:00
|
|
|
? { theme: Theme.CUNNINGHAM, variant: Variant.DARK }
|
|
|
|
|
: { theme: Theme.CUNNINGHAM, variant: Variant.LIGHT };
|
2023-09-26 11:39:28 +02:00
|
|
|
|
2023-02-20 16:27:37 +01:00
|
|
|
export const App = () => {
|
2024-01-18 16:49:47 +01:00
|
|
|
const [locale] = useState("en-US");
|
2024-02-14 00:37:50 +01:00
|
|
|
const [theme, setTheme] = useState<Theme>(
|
|
|
|
|
(sessionStorage.getItem("c-theme") as Theme | null) ??
|
|
|
|
|
preferredScheme.theme,
|
|
|
|
|
);
|
|
|
|
|
const [variant, setVariant] = useState<Variant>(
|
|
|
|
|
(sessionStorage.getItem("c-variant") as Variant | null) ??
|
|
|
|
|
preferredScheme.variant,
|
|
|
|
|
);
|
|
|
|
|
const activeTheme = useMemo(() => THEMES[theme][variant], [theme, variant]);
|
2024-02-15 00:57:41 +01:00
|
|
|
const modal = useModal();
|
2024-02-14 00:37:50 +01:00
|
|
|
const handleThemeChange = (event: MediaQueryListEvent) => {
|
|
|
|
|
const nextVariant = event.matches ? Variant.DARK : Variant.LIGHT;
|
|
|
|
|
if (THEMES[theme][nextVariant] !== undefined) {
|
|
|
|
|
setVariant(nextVariant);
|
|
|
|
|
}
|
|
|
|
|
};
|
2024-01-18 16:49:47 +01:00
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
const query = window.matchMedia("(prefers-color-scheme: dark)");
|
|
|
|
|
query.addEventListener("change", handleThemeChange);
|
|
|
|
|
|
|
|
|
|
return () => {
|
|
|
|
|
query.removeEventListener("change", handleThemeChange);
|
|
|
|
|
};
|
|
|
|
|
}, []);
|
|
|
|
|
|
2024-02-14 00:37:50 +01:00
|
|
|
useEffect(() => {
|
|
|
|
|
document.documentElement.setAttribute("data-theme", theme);
|
|
|
|
|
document.documentElement.setAttribute("data-variant", variant);
|
|
|
|
|
sessionStorage.setItem("c-theme", theme);
|
|
|
|
|
sessionStorage.setItem("c-variant", variant);
|
|
|
|
|
}, [theme, variant]);
|
|
|
|
|
|
2023-02-20 16:27:37 +01:00
|
|
|
return (
|
2024-02-14 00:37:50 +01:00
|
|
|
<CunninghamProvider currentLocale={locale} theme={activeTheme}>
|
2024-01-18 16:49:47 +01:00
|
|
|
<div className="container">
|
2024-02-14 00:37:50 +01:00
|
|
|
{theme === Theme.CUNNINGHAM && (
|
|
|
|
|
<img
|
|
|
|
|
className="pattern"
|
|
|
|
|
src={
|
|
|
|
|
variant === Variant.DARK
|
|
|
|
|
? "pattern_dark.png"
|
|
|
|
|
: "pattern_default.png"
|
|
|
|
|
}
|
|
|
|
|
alt="Background pattern"
|
|
|
|
|
/>
|
|
|
|
|
)}
|
2024-02-15 00:57:41 +01:00
|
|
|
<Home modal={modal} />
|
|
|
|
|
<Create {...modal} />
|
2024-01-18 16:49:47 +01:00
|
|
|
</div>
|
2023-09-26 11:39:28 +02:00
|
|
|
|
2024-01-18 16:49:47 +01:00
|
|
|
<div className="theme-switch">
|
2024-02-14 00:37:50 +01:00
|
|
|
<Select
|
|
|
|
|
value={theme}
|
|
|
|
|
label="Theme"
|
|
|
|
|
clearable={false}
|
|
|
|
|
options={Object.keys(THEMES).map((key) => ({
|
|
|
|
|
value: key,
|
|
|
|
|
label: key[0].toUpperCase() + key.slice(1),
|
|
|
|
|
}))}
|
|
|
|
|
onChange={(e) => {
|
|
|
|
|
setTheme(e.target.value as Theme);
|
|
|
|
|
if (THEMES[e.target.value as Theme][variant] === undefined) {
|
|
|
|
|
setVariant(
|
|
|
|
|
variant === Variant.LIGHT ? Variant.DARK : Variant.LIGHT,
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}}
|
|
|
|
|
/>
|
2024-01-18 16:49:47 +01:00
|
|
|
<Button
|
|
|
|
|
color="tertiary"
|
|
|
|
|
icon={
|
|
|
|
|
<span className="material-icons">
|
2024-02-14 00:37:50 +01:00
|
|
|
{variant === Variant.DARK ? "light_mode" : "dark_mode"}
|
2024-01-18 16:49:47 +01:00
|
|
|
</span>
|
|
|
|
|
}
|
|
|
|
|
onClick={() => {
|
2024-02-14 00:37:50 +01:00
|
|
|
setVariant(
|
|
|
|
|
variant === Variant.LIGHT ? Variant.DARK : Variant.LIGHT,
|
|
|
|
|
);
|
2024-01-18 16:49:47 +01:00
|
|
|
}}
|
2024-02-14 00:37:50 +01:00
|
|
|
disabled={
|
|
|
|
|
THEMES[theme][
|
|
|
|
|
variant === Variant.LIGHT ? Variant.DARK : Variant.LIGHT
|
|
|
|
|
] === undefined
|
|
|
|
|
}
|
2024-01-18 16:49:47 +01:00
|
|
|
/>
|
2023-03-06 16:32:02 +01:00
|
|
|
</div>
|
|
|
|
|
</CunninghamProvider>
|
2023-02-20 16:27:37 +01:00
|
|
|
);
|
|
|
|
|
};
|