connection.addHandler(safeCB(presenceEl => { const showEl = presenceEl.querySelector('show'); let show = 'online'; if (presenceEl.getAttribute('type') === 'unavailable') { show = 'offline'; } else if (showEl) { show = showEl.textContent; } const statusEl = presenceEl.querySelector('status'); const bareJID = Strophe.getBareJidFromJid(presenceEl.getAttribute('from')); const presence = { jid: presenceEl.getAttribute('from'), show, status: statusEl ? statusEl.textContent : undefined }; if (this.state.presences.bareJID) { this.setState({ presences: update(this.state.presences, { [bareJID]: { [presence.jid]: { $set: presence } } })}); } else { this.setState({ presences: update(this.state.presences, { [bareJID]: { $set: { [presence.jid]: presence } } })}); } return true; }), null, 'presence', null, null, null);
} }); const App = React.createClass({ getInitialState() { return { roster: undefined, showOffline: false, presence: {}, status: "disconnected" }; }, handleConnect(jid, password) { this.setState({ status: "connecting", error: undefined, presences: {}, roster: undefined }); const connection = this.connection = new Strophe.Connection(`https://${Strophe.getDomainFromJid(jid)}/http-bind`); // connection.rawInput = (data) => { console.log('RECV: ' + data); }; // connection.rawOutput = (data) => { console.log('SEND: ' + data); }; connection.connect(jid, password, safeCB(status => { if (status === Strophe.Status.CONNECTING) { this.setState({ status: "connecting" }); } else if (status === Strophe.Status.CONNFAIL) { this.setState({ status: "disconnected", error: "failed to connect" }); } else if (status === Strophe.Status.DISCONNECTING) { this.setState({ status: "disconnecting" }); }