Decides whether to use analytics after the analytics API has been given a chance to load.

This commit is contained in:
Lyubomir Marinov 2016-01-25 11:17:39 -06:00
parent 41872781f9
commit 6dbbea9944
3 changed files with 5626 additions and 5531 deletions

View File

@ -242,17 +242,5 @@
<a id="feedbackButton" data-container="body" data-toggle="popover" data-placement="right" data-i18n="[data-content]feedback"><i class="fa fa-heart"></i></a>
</div>
</div>
<script type="text/javascript">
if (!config.disableThirdPartyRequests) {
[
'analytics.js?v=1'
].forEach(function(extSrc) {
var extScript = document.createElement('script');
extScript.src = extSrc;
extScript.async = false;
document.head.appendChild(extScript);
});
}
</script>
</body>
</html>

File diff suppressed because it is too large Load Diff

View File

@ -1,19 +1,46 @@
class NoopAnalytics {
sendEvent () {}
/* global config JitsiMeetJS */
// Load the integration of a third-party analytics API such as Google Analytics.
// Since we cannot guarantee the quality of the third-party service (e.g. their
// server may take noticeably long time to respond), it is in our best interest
// (in the sense that the intergration of the analytics API is important to us
// but not enough to allow it to prevent people from joining a conference) to
// download the API asynchronously. Additionally, Google Analytics will download
// its implementation asynchronously anyway so it makes sense to append the
// loading on our side rather than prepend it.
if (config.disableThirdPartyRequests !== true) {
JitsiMeetJS.util.ScriptUtil.loadScript(
'analytics.js?v=1',
/* async */ true,
/* prepend */ false);
}
const AnalyticsImpl = window.Analytics || NoopAnalytics;
class NoopAnalytics {
sendEvent () {}
}
// XXX Since we asynchronously load the integration of the analytics API and the
// analytics API may asynchronously load its implementation (e.g. Google
// Analytics), we cannot make the decision with respect to which analytics
// implementation we will use here and we have to postpone it i.e. we will make
// a lazy decision.
class AnalyticsAdapter {
constructor () {
this.analytics = new AnalyticsImpl();
}
constructor () {
}
sendEvent (...args) {
try {
this.analytics.sendEvent(...args);
} catch (ignored) {}
}
sendEvent (...args) {
var a = this.analytics;
if (a === null || typeof a === 'undefined') {
var AnalyticsImpl = window.Analytics || NoopAnalytics;
this.analytics = a = new AnalyticsImpl();
}
try {
a.sendEvent(...args);
} catch (ignored) {}
}
}
export default new AnalyticsAdapter();