State Management
Overview
Section titled “Overview”Viber uses Zustand for state management, providing a simple yet powerful reactive state system that works across React and Svelte.
Core Stores
Section titled “Core Stores”Viber provides several pre-built stores:
import { useAgentStore, useSpaceStore, useChatStore } from 'viber';Agent Store
Section titled “Agent Store”import { useAgentStore } from 'viber';
const store = useAgentStore();
// Access stateconsole.log(store.getState().agents);
// Subscribe to changesstore.subscribe((state) => { console.log('Agents updated:', state.agents);});Framework Integration
Section titled “Framework Integration”import { useAgentStore } from 'viber/react';
function AgentList() { const agents = useAgentStore((state) => state.agents);
return ( <ul> {agents.map((agent) => ( <li key={agent.name}>{agent.name}</li> ))} </ul> );}<script lang="ts"> import { agentStore } from 'viber/svelte';</script>
<ul> {#each $agentStore.agents as agent} <li>{agent.name}</li> {/each}</ul>Custom Stores
Section titled “Custom Stores”Create custom stores for your application state:
import { create } from 'zustand';
interface ProjectState { projects: Project[]; activeProject: string | null; setActiveProject: (id: string) => void;}
const useProjectStore = create<ProjectState>((set) => ({ projects: [], activeProject: null, setActiveProject: (id) => set({ activeProject: id }),}));Persistence
Section titled “Persistence”import { create } from 'zustand';import { persist } from 'zustand/middleware';
const useSettingsStore = create( persist( (set) => ({ theme: 'dark', setTheme: (theme) => set({ theme }), }), { name: 'viber-settings' } ));Best Practices
Section titled “Best Practices”- Selective Subscriptions: Only subscribe to the state slices you need
- Derived State: Use selectors for computed values
- Actions in Store: Keep state mutations inside store actions
- Immutable Updates: Always return new objects when updating state