Skip to content

Instantly share code, notes, and snippets.

@FokkeZB FokkeZB/script.js
Last active Mar 6, 2019

Embed
What would you like to do?
Let a script loaded before Intercom wait until intercom has booted
function afterIntercom() {
if (window.intercomSettings.is_intercom_bubble_enabled && window.intercomSettings.is_intercom_twoway_enabled) {
// do something
}
}
if (window.intercomSettings) {
afterIntercom();
} else {
Object.defineProperty(window, 'intercomSettings', {
configurable: true,
enumerable: true,
get: function() {
return this._intercomSettings;
},
set: function(val) {
this._intercomSettings = val;
afterIntercom();
}
});
}
@sn3p

This comment has been minimized.

Copy link

sn3p commented Oct 31, 2016

window.intercomSettings in undefined for me, but I'm watching window.Intercom.booted.
See http://blog.learningspaces.io/customizing-the-intercom-launcher/

// Wait for Intercom to boot (max 30 seconds)
const timeout = setTimeout(() => clearInterval(interval), 30000);
const interval = setInterval(() => {
  if (window.Intercom.booted) {
    // Intercom is booted!

    clearInterval(interval);
    clearTimeout(timeout);
  }
}, 100);
@WatsonFungHK

This comment has been minimized.

Copy link

WatsonFungHK commented Jul 20, 2018

This approach is safer. At the very beginning, intercom might be undefined and ultimately break the app
if (!!window.Intercom && window.Intercom.booted)

@t-richards

This comment has been minimized.

Copy link

t-richards commented Mar 5, 2019

In the call to Object.defineProperty, the option

writeable: true,

should be eliminated. When using the correctly spelled option, writable: true, it is considered an error to have accessors and writable at the same time:

TypeError: Invalid property descriptor. Cannot both specify accessors and a value or writable attribute

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.