From ee266160f9bbb5caf687de0f9cb6089b4d7d2046 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sa=C3=BAl=20Ibarra=20Corretg=C3=A9?= Date: Wed, 29 Jun 2022 09:41:25 +0300 Subject: [PATCH] fix(external-api) fix error if setting some options too early Specifically: display-name, email and avatar. These are the most common ones, and the ones currently used by Spot for example. --- conference.js | 60 +---------------------- react/features/external-api/subscriber.js | 19 ++++++- 2 files changed, 20 insertions(+), 59 deletions(-) diff --git a/conference.js b/conference.js index daa1d27ec..c396d817a 100644 --- a/conference.js +++ b/conference.js @@ -3094,34 +3094,12 @@ export default { * @param email {string} the new email */ changeLocalEmail(email = '') { - const localParticipant = getLocalParticipant(APP.store.getState()); - const formattedEmail = String(email).trim(); - if (formattedEmail === localParticipant.email) { - return; - } - - const localId = localParticipant.id; - - APP.store.dispatch(participantUpdated({ - // XXX Only the local participant is allowed to update without - // stating the JitsiConference instance (i.e. participant property - // `conference` for a remote participant) because the local - // participant is uniquely identified by the very fact that there is - // only one local participant. - - id: localId, - local: true, - email: formattedEmail - })); - APP.store.dispatch(updateSettings({ email: formattedEmail })); - APP.API.notifyEmailChanged(localId, { - email: formattedEmail - }); + sendData(commands.EMAIL, formattedEmail); }, @@ -3130,29 +3108,12 @@ export default { * @param url {string} the new url */ changeLocalAvatarUrl(url = '') { - const { avatarURL, id } = getLocalParticipant(APP.store.getState()); - const formattedUrl = String(url).trim(); - if (formattedUrl === avatarURL) { - return; - } - - APP.store.dispatch(participantUpdated({ - // XXX Only the local participant is allowed to update without - // stating the JitsiConference instance (i.e. participant property - // `conference` for a remote participant) because the local - // participant is uniquely identified by the very fact that there is - // only one local participant. - - id, - local: true, - avatarURL: formattedUrl - })); - APP.store.dispatch(updateSettings({ avatarURL: formattedUrl })); + sendData(commands.AVATAR_URL, url); }, @@ -3193,23 +3154,6 @@ export default { */ changeLocalDisplayName(nickname = '') { const formattedNickname = getNormalizedDisplayName(nickname); - const { id, name } = getLocalParticipant(APP.store.getState()); - - if (formattedNickname === name) { - return; - } - - APP.store.dispatch(participantUpdated({ - // XXX Only the local participant is allowed to update without - // stating the JitsiConference instance (i.e. participant property - // `conference` for a remote participant) because the local - // participant is uniquely identified by the very fact that there is - // only one local participant. - - id, - local: true, - name: formattedNickname - })); APP.store.dispatch(updateSettings({ displayName: formattedNickname diff --git a/react/features/external-api/subscriber.js b/react/features/external-api/subscriber.js index 14b8c8d8d..cfc582a41 100644 --- a/react/features/external-api/subscriber.js +++ b/react/features/external-api/subscriber.js @@ -23,7 +23,7 @@ StateListenerRegistry.register( const localParticipant = getLocalParticipant(store.getState()); const { defaultLocalDisplayName } = store.getState()['features/base/config']; - // Initial setting of the display name occurs happens on app + // Initial setting of the display name happens on app // initialization, before the local participant is ready. The initial // settings is not desired to be fired anyways, only changes. if (localParticipant) { @@ -39,6 +39,23 @@ StateListenerRegistry.register( } }); +StateListenerRegistry.register( + /* selector */ state => state['features/base/settings'].email, + /* listener */ (email, store) => { + const localParticipant = getLocalParticipant(store.getState()); + + // Initial setting of the email happens on app + // initialization, before the local participant is ready. The initial + // settings is not desired to be fired anyways, only changes. + if (localParticipant) { + const { id } = localParticipant; + + APP.API.notifyEmailChanged(id, { + email + }); + } + }); + /** * Updates the on stage participant value. */