Frontend
Frontend (stCall)
O frontend é uma aplicação Nuxt 3 com PrimeVue para UI e Pinia para gerenciamento de estado.
Stack
| Tecnologia | Versão | Uso |
|---|---|---|
| Nuxt | 3.13.0 | Framework SSR/SSG |
| Vue | 3.4.0 | Framework reativo |
| PrimeVue | 4.2.2 | Componentes de UI |
| Tailwind CSS | 6.7.3 | Utilitários CSS |
| Pinia | 2.1.7 | Gerenciamento de estado |
| SIP.js | 0.21.2 | WebRTC/SIP |
Componentes PrimeVue
Convenção de Nomes
Os componentes PrimeVue são usados em PascalCase sem prefixo:
<!-- CORRETO -->
<Button label="Salvar" />
<DataTable :value="dados">
<Dialog v-model:visible="visivel">
<Card>
<!-- ERRADO - NÃO usar prefixo p- -->
<p-button />
<p-data-table />
O prefixo p no nuxt.config.ts é apenas para classes CSS, não para nomes de componentes.
Tema
O tema é baseado no Aura preset do PrimeVue com cor primária laranja:
- Configurado em
theme.config.ts - Modo escuro: classe
.stcall-dark-mode - Ripple effect habilitado
- Input variant: filled
Pinia Stores
authStore
Gerencia autenticação e dados do usuário.
| Estado | Tipo | Descrição |
|---|---|---|
user | User | null | Dados do usuário logado |
isAuthenticated | boolean | Se está autenticado |
token | string | null | Token JWT |
| Getter | Retorno |
|---|---|
isAdmin | boolean - admin ou supervisor |
isAgent | boolean - agente |
userName | string - nome ou "Guest" |
callStore
Gerencia chamadas ativas e histórico.
| Estado | Tipo | Descrição |
|---|---|---|
activeCall | Call | null | Chamada ativa atual |
callHistory | CallHistory[] | Histórico de chamadas |
isDialing | boolean | Se está discando |
incomingCall | Call | null | Chamada entrante |
| Getter | Retorno |
|---|---|
hasActiveCall | boolean |
hasIncomingCall | boolean |
callStatusText | string - texto de status |
todaysCalls | number - chamadas do dia |
averageCallDuration | number - duração média |
recentCalls | CallHistory[] - últimas 10 |
asteriskStore
Gerencia conexão WebSocket com stcall-ws.
agentStore
Gerencia dados e status dos agentes.
uiStore
Gerencia preferências de UI (dark mode, notificações, compacto).
audioStore
Gerencia configurações de áudio (dispositivos, volumes).
dialerStore
Gerencia estado do discador.
Composables
Os composables são auto-importados pelo Nuxt. Não crie index.ts barrel exports no diretório composables/.
<script setup lang="ts">
// CORRETO - auto-importado
const { callDuration } = useCallDuration(() => activeCall.value)
const { formatDuration } = useCallFormatters()
// ERRADO - não importar explicitamente
import { useCallDuration } from '~/composables'
</script>
Principais Composables
| Composable | Responsabilidade |
|---|---|
useWebRTCPhone | Cliente SIP.js completo |
useWebRTCIntegration | Ponte WebRTC ↔ ARI |
useCallDuration | Timer de chamada automático |
useCallFormatters | Formatação (duração, telefone) |
useCallLifecycle | Ciclo de vida da chamada |
useCallControls | Mudo, espera, transferência |
useWebSocketConnection | Conexão WS com stcall-ws |
useWebSocketCommands | Envio de comandos |
useAuthAPI | API de autenticação |
useTokenStorage | Persistência do token |
useSingleInstance | Uma aba por agente |
useCommandExecutor | Executor com toast/logs |
Layouts
default.vue
Layout principal com sidebar + topbar + área de conteúdo. Usado por todas as páginas exceto login.
blank.vue
Layout mínimo sem sidebar/topbar. Usado pela página de login.
Middleware
auth.global.ts
Middleware global que verifica autenticação em todas as rotas. Redireciona para /login se não autenticado.
admin.ts
Middleware para rotas administrativas. Verifica papel de admin/supervisor.
Tipos
Os tipos são definidos em types/ com barrel export em types/index.ts:
import type { Call, Agent, User } from '~/types'
Tipos Principais
type CallStatus = 'active' | 'ringing' | 'transferring' | 'missed' | 'completed'
type CallDirection = 'inbound' | 'outbound'
type AgentStatus = 'available' | 'on-call' | 'unavailable' | 'offline'
type UserRole = 'admin' | 'agent' | 'supervisor'
Padrão de Toast
O sistema de notificações toast está disponível globalmente:
const toast = useToast()
toast.add({
severity: 'success',
summary: 'Sucesso',
detail: 'Operação concluída',
life: 3000,
})
Severidades: success, error, warn, info