diff --git a/client/lib/voip/VoIPUser.ts b/client/lib/voip/VoIPUser.ts index 9b6af9bfe438..673b09f61913 100644 --- a/client/lib/voip/VoIPUser.ts +++ b/client/lib/voip/VoIPUser.ts @@ -656,4 +656,8 @@ export class VoIPUser extends Emitter implements OutgoingRequestDele getRegistrarState(): string | undefined { return this.registerer?.state.toString().toLocaleLowerCase(); } + + clear(): void { + this.userAgent?.stop(); + } } diff --git a/client/providers/CallProvider/hooks/useVoipClient.ts b/client/providers/CallProvider/hooks/useVoipClient.ts index 65d4293a37b4..09b7e1e46333 100644 --- a/client/providers/CallProvider/hooks/useVoipClient.ts +++ b/client/providers/CallProvider/hooks/useVoipClient.ts @@ -6,7 +6,7 @@ import { IRegistrationInfo } from '../../../../definition/voip/IRegistrationInfo import { WorkflowTypes } from '../../../../definition/voip/WorkflowTypes'; import { useEndpoint } from '../../../contexts/ServerContext'; import { useSetting } from '../../../contexts/SettingsContext'; -import { useUser } from '../../../contexts/UserContext'; +import { useUser, useUserId } from '../../../contexts/UserContext'; import { SimpleVoipUser } from '../../../lib/voip/SimpleVoipUser'; import { VoIPUser } from '../../../lib/voip/VoIPUser'; import { useWebRtcServers } from './useWebRtcServers'; @@ -33,17 +33,18 @@ export const useVoipClient = (): UseVoipClientResult => { const registrationInfo = useEndpoint('GET', 'connector.extension.getRegistrationInfoByUserId'); const membership = useEndpoint('GET', 'voip/queues.getMembershipSubscription'); const user = useUser(); - const iceServers = useWebRtcServers(); + const userId = useUserId(); + const [extension, setExtension] = useSafely(useState(null)); + const iceServers = useWebRtcServers(); const [result, setResult] = useSafely(useState({})); - useEffect(() => { - if (!user || !user?._id || !user?.extension || !voipEnabled) { + if (!userId || !extension || !voipEnabled) { setResult({}); return; } - - registrationInfo({ id: user._id }).then( + let client: VoIPUser; + registrationInfo({ id: userId }).then( (data) => { let parsedData: IRegistrationInfo; if (isSignedResponse(data)) { @@ -59,7 +60,7 @@ export const useVoipClient = (): UseVoipClientResult => { callServerConfig: { websocketPath }, } = parsedData; - let client: VoIPUser; + // let client: VoIPUser; (async (): Promise => { try { const subscription = await membership({ extension }); @@ -81,8 +82,26 @@ export const useVoipClient = (): UseVoipClientResult => { return (): void => { // client?.disconnect(); // TODO how to close the client? before creating a new one? + if (client) { + client.clear(); + } }; - }, [user, iceServers, registrationInfo, setResult, membership, voipEnabled]); + }, [userId, iceServers, registrationInfo, setResult, membership, voipEnabled, extension]); + useEffect(() => { + if (!user) { + setResult({}); + return; + } + if (user.extension) { + setExtension(user.extension); + } else { + setExtension(null); + if (!isUseVoipClientResultError(result) && !isUseVoipClientResultLoading(result)) { + const { voipClient } = result as UseVoipClientResultResolved; + voipClient.clear(); + } + } + }, [result, setExtension, setResult, user]); return result; };