Skip to content

State Management

Viber uses Zustand for state management, providing a simple yet powerful reactive state system that works across React and Svelte.

Viber provides several pre-built stores:

import { useAgentStore, useSpaceStore, useChatStore } from 'viber';
import { useAgentStore } from 'viber';
const store = useAgentStore();
// Access state
console.log(store.getState().agents);
// Subscribe to changes
store.subscribe((state) => {
console.log('Agents updated:', state.agents);
});
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>
);
}

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 }),
}));
import { create } from 'zustand';
import { persist } from 'zustand/middleware';
const useSettingsStore = create(
persist(
(set) => ({
theme: 'dark',
setTheme: (theme) => set({ theme }),
}),
{ name: 'viber-settings' }
)
);
  1. Selective Subscriptions: Only subscribe to the state slices you need
  2. Derived State: Use selectors for computed values
  3. Actions in Store: Keep state mutations inside store actions
  4. Immutable Updates: Always return new objects when updating state