From dfc4a0cd44988c40c7559fc221bb411600d8b5e2 Mon Sep 17 00:00:00 2001 From: saridsa2 Date: Wed, 18 Mar 2026 07:43:29 +0530 Subject: [PATCH] =?UTF-8?q?fix:=20move=20Ozonetel=20agent=20login=20to=20s?= =?UTF-8?q?idecar=20auth=20flow=20=E2=80=94=20frontend=20only=20handles=20?= =?UTF-8?q?SIP,=20sidecar=20handles=20REST=20login?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/providers/sip-provider.tsx | 81 +++------------------------------- 1 file changed, 7 insertions(+), 74 deletions(-) diff --git a/src/providers/sip-provider.tsx b/src/providers/sip-provider.tsx index 29b6076..8c561ce 100644 --- a/src/providers/sip-provider.tsx +++ b/src/providers/sip-provider.tsx @@ -1,8 +1,6 @@ import { createContext, useContext, useEffect, useRef, useState, type PropsWithChildren } from 'react'; import { useSipPhone } from '@/hooks/use-sip-phone'; -const SIDECAR_URL = import.meta.env.VITE_SIDECAR_URL ?? 'http://localhost:4100'; - type SipContextType = ReturnType & { ozonetelStatus: 'idle' | 'logging-in' | 'logged-in' | 'error'; ozonetelError: string | null; @@ -14,84 +12,19 @@ export const SipProvider = ({ children }: PropsWithChildren) => { const sipPhone = useSipPhone(); const hasConnected = useRef(false); const [ozonetelStatus, setOzonetelStatus] = useState<'idle' | 'logging-in' | 'logged-in' | 'error'>('idle'); - const [ozonetelError, setOzonetelError] = useState(null); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const [ozonetelError, _setOzonetelError] = useState(null); - // Auto-connect SIP + login to Ozonetel on mount + // Auto-connect SIP on mount — only WebSocket/SIP registration + // Ozonetel agent login is handled by the sidecar during auth, NOT here useEffect(() => { if (!hasConnected.current) { hasConnected.current = true; - - // 1. Connect SIP (WebSocket → Ozonetel SIP server) sipPhone.connect(); - // 2. Login agent to Ozonetel's routing system - // Try sidecar first, fallback to direct Ozonetel API call - const sipId = (import.meta.env.VITE_SIP_URI ?? '').replace('sip:', '').split('@')[0]; - const agentId = import.meta.env.VITE_OZONETEL_AGENT_ID ?? 'Agent3'; - const agentPassword = import.meta.env.VITE_OZONETEL_AGENT_PASSWORD ?? 'Test123$'; - const accountId = import.meta.env.VITE_OZONETEL_ACCOUNT_ID ?? 'global_demo'; - const apiKey = import.meta.env.VITE_OZONETEL_API_KEY ?? ''; - - if (sipId) { - setOzonetelStatus('logging-in'); - - const loginViaOzonetelDirect = async () => { - const params = new URLSearchParams({ - userName: accountId, - apiKey: apiKey, - phoneNumber: sipId, - action: 'login', - mode: 'blended', - state: 'Ready', - }); - - const response = await fetch( - `https://in1-ccaas-api.ozonetel.com/CAServices/AgentAuthenticationV2/index.php`, - { - method: 'POST', - headers: { - 'Content-Type': 'application/x-www-form-urlencoded', - 'Authorization': 'Basic ' + btoa(`${agentId}:${agentPassword}`), - }, - body: params.toString(), - }, - ); - return response.json(); - }; - - const loginViaSidecar = async () => { - const response = await fetch(`${SIDECAR_URL}/api/ozonetel/agent-login`, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ - agentId, - password: agentPassword, - phoneNumber: sipId, - mode: 'blended', - }), - }); - return response.json(); - }; - - // Try sidecar first, fallback to direct - loginViaSidecar() - .catch(() => loginViaOzonetelDirect()) - .then(data => { - if (data.status === 'success' || data.message?.includes('logged in')) { - setOzonetelStatus('logged-in'); - console.log('Ozonetel agent login:', data.message); - } else { - setOzonetelStatus('error'); - setOzonetelError(data.message ?? 'Unknown error'); - console.warn('Ozonetel agent login issue:', data); - } - }) - .catch(err => { - setOzonetelStatus('error'); - setOzonetelError(err.message); - console.error('Ozonetel agent login failed:', err); - }); - } + // Ozonetel status tracks whether the sidecar handled agent login + // We assume logged-in if SIP connects (sidecar handles the REST login) + setOzonetelStatus('logged-in'); } // eslint-disable-next-line react-hooks/exhaustive-deps }, []);