Zustand Stores
Total: 2 stores
useAuthStore
Seção intitulada “useAuthStore”Arquivo: src/stores/auth-store.ts
Gerencia estado de autenticação, conta ativa e multi-account.
| Campo | Tipo | Descrição |
|---|---|---|
userId | string | null | ID do usuário autenticado (Supabase auth.uid) |
account | Account | null | Conta ativa (id, name, plan, status, etc.) |
role | AccountRole | null | Role do usuário na conta ativa (owner, admin, member, viewer, agent) |
accounts | AccountWithRole[] | Todas as contas do usuário (para account switcher) |
isLoading | boolean | Estado de carregamento da autenticação |
isAdmin | boolean | Se usuário e platform admin (PLATFORM_ADMIN_EMAILS) |
supportMode | { account_name: string; account_id: string } | null | Support mode ativo (admin visualizando conta de cliente) |
Actions
Seção intitulada “Actions”| Action | Params | Descrição |
|---|---|---|
setAuth | (userId, account, role, accounts?, isAdmin?, supportMode?) | Define estado completo de auth após login |
setAccounts | (accounts: AccountWithRole[]) | Atualiza lista de contas |
switchAccount | (accountWithRole: AccountWithRole) | Troca conta ativa |
setSupportMode | (mode | null) | Ativa/desativa support mode |
clearAuth | () | Limpa todo estado de auth (logout) |
setLoading | (loading: boolean) | Define estado de loading |
Persistência
Seção intitulada “Persistência”- Middleware:
persist(zustand/middleware) - Storage:
localStoragecom keySTORAGE_KEYS.ACTIVE_ACCOUNT - Partialize: Persiste
userId,account,role,accounts,isAdmin,supportMode - NAO persiste:
isLoading
Uso Principal
Seção intitulada “Uso Principal”| Componente/Hook | Campos Usados |
|---|---|
useAuth() hook | Inicializa auth, loga com Supabase |
AppLayout | useAuth() chamado para garantir auth |
ChatPage | account.id para filtrar conversas |
SettingsLayout | logout via useAuth |
TeamPage | role para permissões |
AccountSwitcher | accounts, switchAccount |
SupportBanner | supportMode |
Sidebar | account.name, account.plan, isAdmin |
Topbar | account, userId |
useChatStore
Seção intitulada “useChatStore”Arquivo: src/stores/chat-store.ts
Gerencia estado de conversas e mensagens do chat em tempo real.
| Campo | Tipo | Descrição |
|---|---|---|
conversations | Conversation[] | Lista de conversas |
activeConversation | Conversation | null | Conversa selecionada |
messages | Message[] | Mensagens da conversa ativa |
activeTab | ConversationStatus | "all" | Tab ativa (open, closed, bot, all) |
panelOpen | boolean | Se panel lateral está aberto |
isLoadingConversations | boolean | Loading state das conversas |
isLoadingMessages | boolean | Loading state das mensagens |
Actions
Seção intitulada “Actions”| Action | Params | Descrição |
|---|---|---|
setConversations | (conversations: Conversation[]) | Define lista de conversas |
setActiveConversation | (conversation | null) | Seleciona conversa (limpa messages) |
setMessages | (messages: Message[]) | Define mensagens da conversa ativa |
addMessage | (message: Message) | Adiciona mensagem ao final (optimistic update / realtime) |
updateMessageStatus | (messageId, status) | Atualiza status (sent -> delivered -> read) |
setActiveTab | (tab) | Muda tab ativa |
togglePanel | () | Toggle panel lateral |
setPanelOpen | (open: boolean) | Define estado do panel |
setLoadingConversations | (loading: boolean) | Define loading das conversas |
setLoadingMessages | (loading: boolean) | Define loading das mensagens |
Persistência
Seção intitulada “Persistência”- Sem persistência (não usa middleware persist)
- Estado resetado a cada reload
Uso Principal
Seção intitulada “Uso Principal”| Componente/Hook | Campos Usados |
|---|---|
ChatPage | messages, setMessages, addMessage |
useRealtimeMessages | addMessage, updateMessageStatus |
ConversationList | Via props (dados passados da page) |
MessageArea | Via props (dados passados da page) |
O ChatPage usa uma combinação de useChatStore (para messages) e useApiQuery (para conversas). As conversas NAO são gerenciadas pelo store diretamente na page — são fetched via useApiQuery e passadas como props. O store é usado principalmente para messages (optimistic updates + realtime).