Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | import { cn } from "@heroui/react" import type { Decorator } from "@storybook/react-vite" import React from "react" import { AiHydroAuthContext, AiHydroAuthContextType, AiHydroAuthProvider, useAiHydroAuth } from "@/context/AiHydroAuthContext" import { ExtensionStateContext, ExtensionStateContextProvider, ExtensionStateContextType, useExtensionState, } from "@/context/ExtensionStateContext" import { StorybookThemes } from "../../.storybook/themes" // Component that handles theme switching const ThemeHandler: React.FC<{ children: React.ReactNode; theme?: string }> = ({ children, theme }) => { React.useEffect(() => { const styles = theme?.includes("light") ? StorybookThemes.light : StorybookThemes.dark // Apply CSS variables to the document root const root = document.documentElement Object.entries(styles).forEach(([property, value]) => { root.style.setProperty(property, value) }) document.body.style.backgroundColor = styles["--vscode-editor-background"] document.body.style.color = styles["--vscode-editor-foreground"] document.body.style.fontFamily = styles["--vscode-font-family"] document.body.style.fontSize = styles["--vscode-font-size"] return () => { // Cleanup on unmount Object.keys(styles).forEach((property) => { root.style.removeProperty(property) }) } }, [theme]) return <>{children}</> } function StorybookDecoratorProvider(className = "relative"): Decorator { return (story, parameters) => { return ( <div className={className}> <ExtensionStateContextProvider> <AiHydroAuthProvider> <ThemeHandler theme={parameters?.globals?.theme}>{React.createElement(story)}</ThemeHandler> </AiHydroAuthProvider> </ExtensionStateContextProvider> </div> ) } } // Wrapper component to safely use useExtensionState inside the provider const ExtensionStateProviderWithOverrides: React.FC<{ overrides?: Partial<ExtensionStateContextType> children: React.ReactNode }> = ({ overrides, children }) => { const extensionState = useExtensionState() return <ExtensionStateContext.Provider value={{ ...extensionState, ...overrides }}>{children}</ExtensionStateContext.Provider> } const AiHydroAuthProviderWithOverrides: React.FC<{ overrides?: Partial<AiHydroAuthContextType> children: React.ReactNode }> = ({ overrides, children }) => { const authContext = useAiHydroAuth() return <AiHydroAuthContext.Provider value={{ ...authContext, ...overrides }}>{children}</AiHydroAuthContext.Provider> } export const createStorybookDecorator = (overrideStates?: Partial<ExtensionStateContextType>, classNames?: string, authOverrides?: Partial<AiHydroAuthContextType>) => (Story: any) => ( <ExtensionStateProviderWithOverrides overrides={overrideStates}> <AiHydroAuthProviderWithOverrides overrides={authOverrides}> <div className={cn("max-w-lg mx-auto", classNames)}> <Story /> </div> </AiHydroAuthProviderWithOverrides> </ExtensionStateProviderWithOverrides> ) export const StorybookWebview = StorybookDecoratorProvider() |