import type { Meta, StoryObj } from '@storybook/react-vite'; import { Button, Card, Group, Stack, Switch, Text, TextInput, Title } from '@mantine/core'; import { useEffect, useState } from 'react'; import { GlobalStateStore, GlobalStateStoreProvider, useGlobalStateStore, useGlobalStateStoreContext, } from './'; // Basic State Display Component const StateDisplay = () => { const state = useGlobalStateStore(); return ( Current State
Program: Name: {state.program.name || '(empty)'} Slug: {state.program.slug || '(empty)'}
Session: API URL: {state.session.apiURL || '(empty)'} Connected: {state.session.connected ? 'Yes' : 'No'} Auth Token: {state.session.authToken || '(empty)'}
Owner: Name: {state.owner.name || '(empty)'} ID: {state.owner.id} Theme: {state.owner.theme?.name || 'none'} Dark Mode: {state.owner.theme?.darkMode ? 'Yes' : 'No'}
User: Username: {state.user.username || '(empty)'} Email: {state.user.email || '(empty)'} Theme: {state.user.theme?.name || 'none'} Dark Mode: {state.user.theme?.darkMode ? 'Yes' : 'No'}
Layout: Left Bar: {state.layout.leftBar.open ? 'Open' : 'Closed'} Right Bar: {state.layout.rightBar.open ? 'Open' : 'Closed'} Top Bar: {state.layout.topBar.open ? 'Open' : 'Closed'} Bottom Bar: {state.layout.bottomBar.open ? 'Open' : 'Closed'}
); }; // Interactive Controls Component const InteractiveControls = () => { const state = useGlobalStateStore(); const [programName, setProgramName] = useState(''); const [username, setUsername] = useState(''); const [email, setEmail] = useState(''); return ( Controls
Program setProgramName(e.currentTarget.value)} placeholder="Program name" value={programName} />
User setUsername(e.currentTarget.value)} placeholder="Username" value={username} /> setEmail(e.currentTarget.value)} placeholder="Email" value={email} />
Theme state.setUser({ theme: { ...state.user.theme, darkMode: e.currentTarget.checked }, }) } /> state.setOwner({ theme: { ...state.owner.theme, darkMode: e.currentTarget.checked }, }) } />
Layout state.setLeftBar({ open: e.currentTarget.checked })} /> state.setRightBar({ open: e.currentTarget.checked })} /> state.setTopBar({ open: e.currentTarget.checked })} /> state.setBottomBar({ open: e.currentTarget.checked })} />
Actions
); }; // Provider Context Example const ProviderExample = () => { const { refetch } = useGlobalStateStoreContext(); const state = useGlobalStateStore(); return ( Provider Context API URL: {state.session.apiURL} Loading: {state.session.loading ? 'Yes' : 'No'} Connected: {state.session.connected ? 'Yes' : 'No'} ); }; // Main Story Component const BasicStory = () => { useEffect(() => { // Set initial state for demo GlobalStateStore.getState().setProgram({ description: 'A demonstration application', name: 'Demo App', slug: 'demo-app', }); GlobalStateStore.getState().setOwner({ id: 1, name: 'Demo Organization', theme: { darkMode: false, name: 'light' }, }); GlobalStateStore.getState().setUser({ email: 'demo@example.com', theme: { darkMode: false, name: 'light' }, username: 'demo-user', }); }, []); return ( ); }; // Provider Story Component const ProviderStory = () => { return ( ); }; // Layout Controls Story const LayoutStory = () => { const state = useGlobalStateStore(); return ( Layout Controls Left Sidebar state.setLeftBar({ open: e.currentTarget.checked })} /> state.setLeftBar({ pinned: e.currentTarget.checked })} /> state.setLeftBar({ collapsed: e.currentTarget.checked })} /> state.setLeftBar({ size: parseInt(e.currentTarget.value) || 0 }) } type="number" value={state.layout.leftBar.size || 0} /> Right Sidebar state.setRightBar({ open: e.currentTarget.checked })} /> state.setRightBar({ pinned: e.currentTarget.checked })} /> ); }; // Theme Story const ThemeStory = () => { const state = useGlobalStateStore(); useEffect(() => { GlobalStateStore.getState().setOwner({ id: 1, name: 'Acme Corp', theme: { darkMode: false, name: 'corporate' }, }); }, []); return ( Theme Settings
Owner Theme (Organization Default) state.setOwner({ theme: { ...state.owner.theme, name: e.currentTarget.value }, }) } value={state.owner.theme?.name || ''} /> state.setOwner({ theme: { ...state.owner.theme, darkMode: e.currentTarget.checked }, }) } />
User Theme (Personal Override) state.setUser({ theme: { ...state.user.theme, name: e.currentTarget.value }, }) } value={state.user.theme?.name || ''} /> state.setUser({ theme: { ...state.user.theme, darkMode: e.currentTarget.checked }, }) } />
Effective Theme Name: {state.user.theme?.name || state.owner.theme?.name || 'default'} Dark Mode:{' '} {(state.user.theme?.darkMode ?? state.owner.theme?.darkMode) ? 'Yes' : 'No'}
); }; const meta = { component: BasicStory, parameters: { layout: 'fullscreen', }, tags: ['autodocs'], title: 'State/GlobalStateStore', } satisfies Meta; export default meta; type Story = StoryObj; export const Basic: Story = { render: () => , }; export const WithProvider: Story = { render: () => , }; export const LayoutControls: Story = { render: () => , }; export const ThemeControls: Story = { render: () => , };