Pular para o conteúdo

Zustand Stores

Total: 2 stores


Arquivo: src/stores/auth-store.ts

Gerencia estado de autenticação, conta ativa e multi-account.

CampoTipoDescrição
userIdstring | nullID do usuário autenticado (Supabase auth.uid)
accountAccount | nullConta ativa (id, name, plan, status, etc.)
roleAccountRole | nullRole do usuário na conta ativa (owner, admin, member, viewer, agent)
accountsAccountWithRole[]Todas as contas do usuário (para account switcher)
isLoadingbooleanEstado de carregamento da autenticação
isAdminbooleanSe usuário e platform admin (PLATFORM_ADMIN_EMAILS)
supportMode{ account_name: string; account_id: string } | nullSupport mode ativo (admin visualizando conta de cliente)
ActionParamsDescriçã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
  • Middleware: persist (zustand/middleware)
  • Storage: localStorage com key STORAGE_KEYS.ACTIVE_ACCOUNT
  • Partialize: Persiste userId, account, role, accounts, isAdmin, supportMode
  • NAO persiste: isLoading
Componente/HookCampos Usados
useAuth() hookInicializa auth, loga com Supabase
AppLayoutuseAuth() chamado para garantir auth
ChatPageaccount.id para filtrar conversas
SettingsLayoutlogout via useAuth
TeamPagerole para permissões
AccountSwitcheraccounts, switchAccount
SupportBannersupportMode
Sidebaraccount.name, account.plan, isAdmin
Topbaraccount, userId

Arquivo: src/stores/chat-store.ts

Gerencia estado de conversas e mensagens do chat em tempo real.

CampoTipoDescrição
conversationsConversation[]Lista de conversas
activeConversationConversation | nullConversa selecionada
messagesMessage[]Mensagens da conversa ativa
activeTabConversationStatus | "all"Tab ativa (open, closed, bot, all)
panelOpenbooleanSe panel lateral está aberto
isLoadingConversationsbooleanLoading state das conversas
isLoadingMessagesbooleanLoading state das mensagens
ActionParamsDescriçã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
  • Sem persistência (não usa middleware persist)
  • Estado resetado a cada reload
Componente/HookCampos Usados
ChatPagemessages, setMessages, addMessage
useRealtimeMessagesaddMessage, updateMessageStatus
ConversationListVia props (dados passados da page)
MessageAreaVia 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).