|
| 1 | +(function(angular) { |
| 2 | + |
| 3 | + angular.module('zendeskWidget', []) |
| 4 | + .run([ |
| 5 | + '$window', |
| 6 | + 'zendeskWidgetSettings', |
| 7 | + function($window, zendeskWidgetSettings) { |
| 8 | + if (!zendeskWidgetSettings.accountUrl) { |
| 9 | + throw new Error('Missing accountUrl. Please set in app config via ZendeskWidgetProvider'); |
| 10 | + } |
| 11 | + |
| 12 | + var window = $window; |
| 13 | + // Following is essentially a copy paste of JS portion of the Zendesk embed code |
| 14 | + // with our settings subbed in. For more info, see: |
| 15 | + // https://support.zendesk.com/hc/en-us/articles/203908456-Using-Web-Widget-to-embed-customer-service-in-your-website |
| 16 | + |
| 17 | + // Note that JSHint ignore is not working in latest release, so can't actually turn |
| 18 | + // on JSHint yet. See https://github.com/jshint/jshint/issues/2411 |
| 19 | + /* jshint ignore:start */ |
| 20 | + |
| 21 | + window.zEmbed || function(e, t) { |
| 22 | + var n, o, d, i, s, a = [], |
| 23 | + r = document.createElement("iframe"); |
| 24 | + window.zEmbed = function() { |
| 25 | + a.push(arguments) |
| 26 | + }, window.zE = window.zE || window.zEmbed, r.src = "javascript:false", r.title = "", r.role = "presentation", (r.frameElement || r).style.cssText = "display: none", d = document.getElementsByTagName("script"), d = d[d.length - 1], d.parentNode.insertBefore(r, d), i = r.contentWindow, s = i.document; |
| 27 | + try { |
| 28 | + o = s |
| 29 | + } catch (c) { |
| 30 | + n = document.domain, r.src = 'javascript:var d=document.open();d.domain="' + n + '";void(0);', o = s |
| 31 | + } |
| 32 | + o.open()._l = function() { |
| 33 | + var o = this.createElement("script"); |
| 34 | + n && (this.domain = n), o.id = "js-iframe-async", o.src = e, this.t = +new Date, this.zendeskHost = t, this.zEQueue = a, this.body.appendChild(o) |
| 35 | + }, o.write('<body onload="document._l();">'), o.close() |
| 36 | + }("https://assets.zendesk.com/embeddable_framework/main.js", zendeskWidgetSettings.accountUrl); |
| 37 | + |
| 38 | + /* jshint ignore:end */ |
| 39 | + |
| 40 | + $window.zE(function() { |
| 41 | + zendeskWidgetSettings.beforePageLoad($window.zE); |
| 42 | + }); |
| 43 | + } |
| 44 | + ]); |
| 45 | + |
| 46 | +})(angular); |
| 47 | + |
| 48 | +(function(angular) { |
| 49 | + var |
| 50 | + settings = { |
| 51 | + accountUrl: '', |
| 52 | + beforePageLoad: angular.noop |
| 53 | + }, |
| 54 | + apiMethods = [ |
| 55 | + 'setLocale', |
| 56 | + 'identify', |
| 57 | + 'hide', |
| 58 | + 'show', |
| 59 | + 'activate' |
| 60 | + ]; |
| 61 | + |
| 62 | + angular.module('zendeskWidget') |
| 63 | + .value('zendeskWidgetSettings', settings) |
| 64 | + .provider('ZendeskWidget', [function() { |
| 65 | + /** |
| 66 | + * Configure the widget |
| 67 | + * @param {Object} opts settings |
| 68 | + * @param {String} accountUrl Zendesk account url |
| 69 | + * @param {Function} [beforePageLoad] Callback to run after |
| 70 | + * widget instantiated but before page load, such as hiding |
| 71 | + * the widget immediately. Receives the raw zE API object. |
| 72 | + * Callback does *not* need to wrap calls in a zE() closure. |
| 73 | + * For more info, see: |
| 74 | + * https://developer.zendesk.com/embeddables/docs/widget/api#ze.hide). |
| 75 | + */ |
| 76 | + this.init = function(opts) { |
| 77 | + angular.extend(settings, opts); |
| 78 | + }; |
| 79 | + |
| 80 | + this.$get = [ |
| 81 | + '$window', |
| 82 | + function($window) { |
| 83 | + /** |
| 84 | + * Thin wrapper over Zendesk's Web Widget API: |
| 85 | + * https://developer.zendesk.com/embeddables/docs/widget/api |
| 86 | + * @class ZendeskWidgetApi |
| 87 | + */ |
| 88 | + function ZendeskWidgetApi() {} |
| 89 | + |
| 90 | + angular.forEach(apiMethods, function(method) { |
| 91 | + ZendeskWidgetApi.prototype[method] = function() { |
| 92 | + $window.zE[method].apply($window.zE, arguments); |
| 93 | + }; |
| 94 | + }); |
| 95 | + |
| 96 | + return new ZendeskWidgetApi(); |
| 97 | + } |
| 98 | + ]; |
| 99 | + }]); |
| 100 | + |
| 101 | +})(angular); |
0 commit comments