This commit is contained in:
Chris Kruining 2025-04-16 00:43:31 +02:00
parent 0eb2e34e60
commit a15809f4fd
Signed by: chris
SSH key fingerprint: SHA256:nG82MUfuVdRVyCKKWqhY+pCrbz9nbX6uzUns4RKa1Pg
11 changed files with 32770 additions and 82 deletions

View file

@ -1,80 +1,88 @@
import { ContextProviderProps, createContextProvider } from "@solid-primitives/context";
import {
ContextProviderProps,
createContextProvider,
} from "@solid-primitives/context";
import { action, createAsyncStore, query, useAction } from "@solidjs/router";
import { createStore } from "solid-js/store";
import { useSession } from "vinxi/http";
export enum ColorScheme {
Auto = 'light dark',
Light = 'light',
Dark = 'dark',
Auto = "light dark",
Light = "light",
Dark = "dark",
}
export interface State {
colorScheme: ColorScheme;
hue: number;
colorScheme: ColorScheme;
hue: number;
}
const getSession = async () => {
'use server';
"use server";
return useSession<State>({
password: process.env.SESSION_SECRET!,
});
return useSession<State>({
password: process.env.SESSION_SECRET!,
});
};
export const getState = query(async () => {
'use server';
"use server";
const session = await getSession();
const session = await getSession();
if (Object.getOwnPropertyNames(session.data).length === 0) {
await session.update({
colorScheme: ColorScheme.Auto,
hue: 0,
})
}
if (Object.getOwnPropertyNames(session.data).length === 0) {
await session.update({
colorScheme: ColorScheme.Auto,
hue: 0,
});
}
return session.data;
}, 'color-scheme');
return session.data;
}, "color-scheme");
const setState = action(async (state: State) => {
'use server';
"use server";
const session = await getSession();
await session.update(prev => ({ ...prev, ...state }));
}, 'color-scheme');
const session = await getSession();
await session.update((prev) => ({ ...prev, ...state }));
}, "color-scheme");
interface ThemeContextType {
readonly theme: State;
setColorScheme(colorScheme: ColorScheme): void;
setHue(colorScheme: number): void;
readonly theme: State;
setColorScheme(colorScheme: ColorScheme): void;
setHue(colorScheme: number): void;
}
const [ThemeContextProvider, useTheme] = createContextProvider<ThemeContextType, ContextProviderProps>((props) => {
const [ThemeContextProvider, useTheme] = createContextProvider<
ThemeContextType,
ContextProviderProps
>(
(props) => {
const updateState = useAction(setState);
const state = createAsyncStore(() => getState());
return {
get theme() {
return state.latest ?? { colorScheme: null };
},
get theme() {
return state.latest ?? { colorScheme: null };
},
setColorScheme(colorScheme) {
updateState({ colorScheme, hue: state.latest!.hue });
},
setHue(hue) {
updateState({ hue, colorScheme: state.latest!.colorScheme });
},
setColorScheme(colorScheme) {
// updateState({ colorScheme, hue: state.latest!.hue });
},
setHue(hue) {
// updateState({ hue, colorScheme: state.latest!.colorScheme });
},
};
}, {
},
{
theme: {
colorScheme: ColorScheme.Auto,
hue: 180,
colorScheme: ColorScheme.Auto,
hue: 180,
},
setColorScheme(colorScheme) { },
setHue(hue) { },
});
setColorScheme(colorScheme) {},
setHue(hue) {},
},
);
export { ThemeContextProvider, useTheme };
export { ThemeContextProvider, useTheme };