import { Accessor, Component, createContext, createEffect, createMemo, createResource, For, ParentComponent, Setter, Show, Suspense, useContext } from "solid-js"; import css from './colorschemepicker.module.css'; import { CgDarkMode } from "solid-icons/cg"; import { action, createAsyncStore, query, useAction } from "@solidjs/router"; import { useSession } from "vinxi/http"; import { createStore, reconcile, ReconcileOptions, SetStoreFunction } from "solid-js/store"; export enum ColorScheme { Auto = 'light dark', Light = 'light', Dark = 'dark', } const colorSchemes = Object.entries(ColorScheme) as readonly [keyof typeof ColorScheme, ColorScheme][]; export interface State { colorScheme: ColorScheme; hue: number; } const getSession = async () => { 'use server'; return useSession({ password: process.env.SESSION_SECRET!, }); }; export const getState = query(async () => { 'use server'; const session = await getSession(); return session.data; }, 'color-scheme'); const setState = action(async (state: State) => { 'use server'; const session = await getSession(); await session.update(state); }, 'color-scheme'); interface ThemeContextType { readonly theme: State; setColorScheme(colorScheme: ColorScheme): void; setHue(hue: number): void; } const ThemeContext = createContext(); const useStore = () => useContext(ThemeContext)!; export const useTheme = () => { const ctx = useContext(ThemeContext); if (ctx === undefined) { throw new Error('useColorScheme is called outside a '); } return ctx.theme; }; export const ThemeProvider: ParentComponent = (props) => { const [state, { mutate }] = createResource(() => getState(), { deferStream: true, initialValue: { colorScheme: ColorScheme.Auto, hue: 0 } }); const updateState = useAction(setState); return {state => { const [store, setStore] = createStore(state()); createEffect(() => { setStore(state()); }); return ({ ...prev, colorScheme }))) }, setHue(hue: number) { updateState(mutate(prev => ({ ...prev, hue }))) }, }}> {props.children} ; }} ; }; export const ColorSchemePicker: Component = (props) => { const { theme, setColorScheme, setHue } = useStore(); return <> ; };