Estoy desarrollando una aplicación de chat de video usando react-native-voximplant , todo funciona, pero cuando la aplicación se carga por primera vez, la funcionalidad de inicio de login ocurre dentro de useEffect . Entonces, el problema es que, cuando mi HomeScreen se monta, useEffects debería activarse y debería iniciar sesión en voximplant sdk y ahora, si toco el ícono de llamada, se muestra lo siguiente en la consola:
Cuando se monta HomeScreen:
LOG Client: emit: no handlers for event: AuthResult LOG Error while trying to login to voximplant: {"code": 491, "name": "AuthResult", "result": false} LOG Client: emit: no handlers for event: ConnectionEstablishedAhora, cuando toco en llamar para hacer una llamada:
// after a second... WARN Possible Unhandled Promise Rejection (id: 0): "NOT_LOGGED_IN" Ahora, cuando presiono guardar (ctrl + s) , inicio sesión y ahora, si hago una llamada, ¡funciona! No sé qué estoy haciendo mal aquí. ¿Hay algún problema con useEffect o estoy haciendo algo mal?
El código de la pantalla de inicio:
import {Voximplant} from 'react-native-voximplant'; const HomeScreen = () => { const voximplant = Voximplant.getInstance(); useEffect(() => { const signInToVoximplant = async () => { try { const fqUsername = '...'; // credentials are correct, don't worry about them. const password = '...'; await voximplant.login(fqUsername, password); } catch (error) { console.log('Error while trying to login to voximplant: ', error); } }; signInToVoximplant(); }, []); useEffect(() => { const connect = async () => { const status = await voximplant.getClientState(); if (status === Voximplant.ClientState.DISCONNECTED) { await voximplant.connect(); } else if (status === Voximplant.ClientState.LOGGED_IN) { console.log('[INFO] VOXIMPLANT CONNECTED'); return; } }; connect(); }, []); } return ... La call solo funcionará si ctrl+s , es decir, guardo el archivo, de lo contrario arrojará un Unhandled Promise rejection... porque no está conectado, sin embargo, he escrito/proporcionado el inicio de sesión dentro de useEffect .
Según sus registros, cuando se inicia la aplicación, el inicio de sesión falla con el error 491, lo que significa que el cliente se encuentra en un estado no válido. Ocurre porque invoca la API de inicio de sesión antes de que se establezca la conexión con Voximplant Cloud (API de conexión).
Cuando se vuelve a cargar la aplicación, el código nativo no se reinicia (pero js sí) y, de hecho, el cliente todavía está conectado a Voximplant Cloud, por eso el inicio de sesión es exitoso la segunda vez.
Para solucionar el problema, debe cambiar el orden de invocación de la API del SDK de Voximplant: primero llame a la API Client.connect y luego a Client.login.
También es mejor mover connect/login a un solo useEffect.
Ambos useEffect se ejecutan montados, pero ¿cuál primero?.
Intenta poner ambas funciones en el mismo useEffect y llámalas en orden:
useEffect(() => { const signInToVoximplant = async () => { ... }; const connect = async () => { ... }; signInToVoximplant(); connect(); }, []);