0

仅基于功能组件工作一个反应项目。

项目包含使用 JSSIP 的音频呼叫功能。调用函数可以在单个调用中正常工作。

当发生多个呼叫时,我可以在应用程序底部显示多个呼叫弹出窗口,如下图所示

在此处输入图像描述

调用 NewRTCSession 时组件会多次加载,因此我使用useRef来存储所有会话。

直到现在一切正常。

现在,当我从浏览器endCall()方法和terminate()会话中按End Call时。

现在,当呼叫结束时,JSSIP 会话呼叫失败事件呼叫。

现在添加代码。

const messageHandler = (message, participants, setParticipants) => {
    setParticipants({
        ...participants,
        [message.request.call_id]: message
    });
    const session = message.session;
    session.on('failed', (e) => {
        try {
            delete participants[message.request.call_id];
            setParticipants(participants);
        } catch(ex) {
        }
    });
};

function IncomingCall() {
    const [participants, setParticipants] = React.useState({});
    const participantsRef = React.useRef(participants);

    React.useEffect(() => {
        participantsRef.current = participants;
    });
  
    React.useEffect(() => {
        const handler = (message) => {messageHandler(message, participantsRef.current, setParticipants)};
        const phone = JsSipHelper.ua();
        phone.on("newRTCSession", handler);
    }, []);

    const endCall = (id) => {
        participants[id].session.terminate();
    };

    return (
        <div id="meetingRoom">
            {Object.keys(participants).map((participant, index) => (
                <div>
                    <h1>Call From: {participants[participant].session.remote_identity.display_name}</h1>
                    <button onClick={() => endCall()}>End Call</button>
                    <button>Answer Call</button>
                </div>
            ))}
        </div>
    );
}

export default IncomingCall;

endCall()从第一个通话部分调用时,手机中的通话成功结束。现在事件调用失败,我正在尝试更新参与者的状态变量,但该变量完全清除。

但是现在我正在等待超时后手机中的呼叫结束,所以它发生了,并且弹出窗口再次出现在 ui 中。

所以,我在这里很困惑。stateuseRef如何与多个一起工作。

参考

带有 socket.io 状态的 UseEffect 钩子在套接字处理程序中不是持久的

4

1 回答 1

0

您可能想看看https://github.com/OpenTelecom/react-sip-phone

这是一个使用支持多个会话的 SIP.js 的反应网络电话。

于 2020-12-21T16:36:43.063 回答