feat: edição de rotas de entrada, fix de 2 bugs reais no ESL, diagnóstico de NAT/áudio e softphone WebRTC (PHASE 65/66)
Três achados reportados pelo usuário numa mensagem só: (1) Rotas de Entrada não tinha edição depois de criada — implementada no mesmo padrão de Filas; (2) telas de Platform > Infraestrutura sempre davam "Timeout no ESL" nesta VM — não era limitação permanente como o comentário antigo dizia, e sim ESL_HOST=freeswitch (nome DNS que só existe dentro da rede do Docker) mais um segundo bug independente (`show gateways as json` não é comando válido nesta versão do FreeSWITCH); (3) ramal externo registrava mas sem áudio — diagnosticado com contadores de pacote do iptables: a VM está atrás de um roteador sem port-forward pra faixa de RTP, achado de infraestrutura de rede, não bug de código. Também integra o softphone WebRTC (handphone.js/OpenSIPS, já em produção): código-fonte encontrado em git.falehandix.com.br/Handix/handphone-2.0, patch mínimo pra aceitar o endereço do proxy em runtime (era build-time), nova config global (Platform > Infraestrutura > Softphone WebRTC) e widget na topbar do tenant que pega usuário/domínio/senha do ramal vinculado ao agente logado. Adiciona docs/QA_SETUP.md — runbook completo pra subir o ambiente do zero numa máquina nova (Docker, migrations, seed, systemd), e completa o .env.example que estava faltando a maioria das variáveis reais. Testado ponta a ponta com Playwright: edição de rota (criar/editar/F5), as 3 telas de Infraestrutura com dado real, e um tenant/ramal/agente de teste criados na hora confirmando que o script do softphone recebe as credenciais certas. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BFaBaBSQGhyXGEgtTYZGV8
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
"use client";
|
||||
|
||||
import { useEffect, useRef } from "react";
|
||||
import { getSoftphoneConfig } from "./agent-me-actions";
|
||||
|
||||
const SCRIPT_ID = "handphone-widget-script";
|
||||
|
||||
/**
|
||||
* Softphone WebRTC embutido (Handphone, PHASE 66) — o FreeSWITCH deste
|
||||
* projeto nunca fala WebRTC: quem faz a ponte WebRTC↔SIP é um OpenSIPS
|
||||
* externo já em produção, configurado pelo Platform Super Admin em
|
||||
* Sistema > Softphone WebRTC. O ramal continua puro SIP; o widget só
|
||||
* pega username/domain/senha do ramal vinculado ao agente e o endereço
|
||||
* do proxy, e se autoconecta via `data-sip-*` (ver dist/handphone.js e
|
||||
* docs/SOFTPHONE.md) — nenhum estado de ACD (Disponível/Pausa/Offline)
|
||||
* interfere aqui, é o mesmo tipo de registro SIP que um telefone físico
|
||||
* faria.
|
||||
*/
|
||||
export function SoftphoneWidget({ hasExtension }: { hasExtension: boolean }) {
|
||||
const loadedRef = useRef(false);
|
||||
|
||||
useEffect(() => {
|
||||
if (!hasExtension || loadedRef.current) return;
|
||||
if (document.getElementById(SCRIPT_ID)) return;
|
||||
loadedRef.current = true;
|
||||
|
||||
getSoftphoneConfig().then((result) => {
|
||||
if (!result.ok || !result.config.hasExtension || !result.config.proxyUrl) {
|
||||
if (result.ok && result.config.hasExtension && !result.config.proxyUrl) {
|
||||
console.warn("[Softphone] proxy WebRTC nao configurado (Platform > Sistema > Softphone WebRTC)");
|
||||
}
|
||||
return;
|
||||
}
|
||||
const { username, domain, password, proxyUrl } = result.config;
|
||||
const script = document.createElement("script");
|
||||
script.id = SCRIPT_ID;
|
||||
script.src = "/handphone.js";
|
||||
script.dataset.sipUser = username;
|
||||
script.dataset.sipDomain = domain;
|
||||
script.dataset.sipPassword = password;
|
||||
script.dataset.sipServer = proxyUrl;
|
||||
script.dataset.position = "bottom-right";
|
||||
document.body.appendChild(script);
|
||||
});
|
||||
}, [hasExtension]);
|
||||
|
||||
return null;
|
||||
}
|
||||
Reference in New Issue
Block a user