feat(agents): widget de status na topbar (entrar/pausar/retomar/sair)
Achado real reportado pelo usuário: "não achei como deixar o agente
online, tem algum perfil ou tipo de usuario especifico?" — não era
permissão nenhuma. POST /agents/me/login|pause|resume|logout sempre
funcionaram sem exigir permissão (só JwtAuthGuard, resolvem "meu
agente" pelo userId do próprio token). O problema: nenhuma tela chamava
esses endpoints — só existia o CRUD admin de Agentes (criar o vínculo
usuário+ramal), nunca um controle pro próprio usuário logado.
Adicionado GET /agents/me (404 = usuário sem Agent neste tenant, não um
erro — é assim que o widget decide se aparece) e GET /agents/me/pause-
reasons (motivos de pausa sem exigir agents.view, que listaria TODOS os
agentes do tenant — permissão que o role "agent" nunca teve e não devia
ganhar só pra isso).
AgentStatusWidget na topbar (visível em qualquer página do app do
tenant) só aparece pra quem tem Agent vinculado: Offline -> Entrar ->
Disponível -> Pausar (escolhe motivo) -> Em pausa -> Retomar/Sair.
Achado real construindo o widget: as Server Actions de login/logout/
pause/resume exportadas como arrow function que só repassavam
argumentos quebravam em runtime ("Server Actions must be async
functions") — o mesmo bug já documentado antes nesta sessão (wizard de
campanhas). Corrigido declarando como async function de verdade.
Testado ponta a ponta com Playwright, logado como um agente de teste
real (usuário novo, role "agent", Agent vinculado a um ramal real): o
fluxo completo (entrar/pausar/retomar/sair) funciona pela tela, sem
nenhuma chamada de API manual.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BFaBaBSQGhyXGEgtTYZGV8
This commit is contained in:
@@ -47,10 +47,21 @@ export interface Trunk {
|
||||
createdAt: string;
|
||||
}
|
||||
|
||||
export const INBOUND_ROUTE_DESTINATION_TYPES = ["EXTENSION", "IVR", "QUEUE", "CALL_GROUP"] as const;
|
||||
export type InboundRouteDestinationType = (typeof INBOUND_ROUTE_DESTINATION_TYPES)[number];
|
||||
|
||||
export const INBOUND_ROUTE_DESTINATION_TYPE_LABELS: Record<InboundRouteDestinationType, string> = {
|
||||
EXTENSION: "Ramal",
|
||||
IVR: "IVR",
|
||||
QUEUE: "Fila",
|
||||
CALL_GROUP: "Grupo de ramais",
|
||||
};
|
||||
|
||||
export interface InboundRoute {
|
||||
id: string;
|
||||
didNumber: string;
|
||||
description: string | null;
|
||||
destinationType: InboundRouteDestinationType;
|
||||
destinationContext: string;
|
||||
destinationNumber: string;
|
||||
enabled: boolean;
|
||||
@@ -123,6 +134,14 @@ export interface Agent {
|
||||
createdAt: string;
|
||||
}
|
||||
|
||||
export interface MyAgent {
|
||||
id: string;
|
||||
name: string;
|
||||
state: string;
|
||||
enabled: boolean;
|
||||
hasExtension: boolean;
|
||||
}
|
||||
|
||||
export const AGENT_STATE_LABELS: Record<string, string> = {
|
||||
OFFLINE: "Offline",
|
||||
LOGGED_IN: "Logado",
|
||||
|
||||
Reference in New Issue
Block a user