UNPKG

@halloverden/ngx-zendesk-web-widget

Version:
134 lines 18.1 kB
import { Inject, Injectable } from '@angular/core'; import { firstValueFrom, of, Subject } from 'rxjs'; import { DOCUMENT } from '@angular/common'; import * as i0 from "@angular/core"; import * as i1 from "./ngx-zendesk-web-widget.config"; import * as i2 from "./window.service"; export class NgxZendeskWebWidgetService { constructor(config, windowService, _document) { this.config = config; this.windowService = windowService; this._document = _document; this._initialized = false; this._verifyConfig(); if (!this.config.lazyLoadZendeskScripts) { this.init().then(() => { // noop }); } } init() { if (!this.windowService.get()) { // noop console.warn('NgxZendeskWebWidgetService.init(): Tried initializing Zendesk Web Widget, but no browser window was found.'); return firstValueFrom(of(false)); } const w = this.windowService.get(); this._window = w; let documentDomain = this._document.domain; const config = this.config; const injectionElement = this.getInjectionElement(); const iFrameElement = this.buildIframeElement(); const scriptElement = this.buildScriptElement(); w.zEmbed || (function (e, t) { let args = []; w.zEmbed = function () { args.push(arguments); }; w.zE = w.zE || w.zEmbed; w.zESettings = config.zESettings; iFrameElement.addEventListener('load', (ev) => { const iframeElementFromEvent = ev.target; if (iframeElementFromEvent instanceof HTMLIFrameElement) { const iframeDocumentInstance = iframeElementFromEvent.contentDocument; const iframeWindowInstance = iframeElementFromEvent.contentWindow; let i = setInterval(() => { if (iframeWindowInstance?.document.body && iframeDocumentInstance) { clearInterval(i); iframeDocumentInstance.domain = documentDomain; iframeDocumentInstance.t = new Date(); iframeDocumentInstance.zendeskHost = config.accountUrl; iframeDocumentInstance.zEQueue = args; iframeDocumentInstance.body.appendChild(scriptElement); } }); } }); setTimeout(() => { injectionElement.appendChild(iFrameElement); }); })(); return this.finishLoading(); } getInjectionElement() { let elements = this._document.getElementsByTagName(this.config.injectionTag); if (elements.length === 0) { throw new Error('No element found matching injectionTag from config'); } return elements[0]; } finishLoading() { const o = new Subject(); const timeout = setTimeout(() => { this._initialized = false; o.next(false); o.complete(); }, this.config.timeout || 30000); this._window.zE(() => { clearTimeout(timeout); this._zE = this._window.zE; this._initialized = true; this.config.callback(this); o.next(true); o.complete(); }); return firstValueFrom(o); } buildIframeElement() { const iframe = this._document.createElement('iframe'); iframe.src = 'javascript:false'; iframe.title = 'Zendesk Web Widget'; iframe.style.cssText = 'display: none'; return iframe; } buildScriptElement() { const script = this._document.createElement('script'); script.type = 'text/javascript'; script.id = 'be-sure-not-to-set-the-id-to-ze-snippet-as-that-changes-the-behavior-of-the-snippet'; script.src = 'https://static.zdassets.com/ekr/snippet.js'; script.async = true; return script; } _verifyConfig() { if (!this.config.accountUrl) { throw new Error('NgxZendeskWebWidgetService: NgxZendeskWebWidgetConfig is missing accountUrl.'); } } get isInitialized() { return this._initialized; } get zE() { return this._zE; } commandWebWidget(command, options) { this.zE('webWidget', command, options); } onWebWidgetEvent(eventName, handler) { this.zE('webWidget:on', eventName, handler); } } NgxZendeskWebWidgetService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.3", ngImport: i0, type: NgxZendeskWebWidgetService, deps: [{ token: i1.NgxZendeskWebWidgetConfig }, { token: i2.WindowService }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); NgxZendeskWebWidgetService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.3", ngImport: i0, type: NgxZendeskWebWidgetService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.3", ngImport: i0, type: NgxZendeskWebWidgetService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: function () { return [{ type: i1.NgxZendeskWebWidgetConfig }, { type: i2.WindowService }, { type: Document, decorators: [{ type: Inject, args: [DOCUMENT] }] }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXplbmRlc2std2ViLXdpZGdldC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXplbmRlc2std2ViLXdpZGdldC9zcmMvbGliL25neC16ZW5kZXNrLXdlYi13aWRnZXQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUduRCxPQUFPLEVBQUUsY0FBYyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbkQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7O0FBTTNDLE1BQU0sT0FBTywwQkFBMEI7SUFLckMsWUFDVSxNQUFpQyxFQUNqQyxhQUE0QixFQUNWLFNBQW1CO1FBRnJDLFdBQU0sR0FBTixNQUFNLENBQTJCO1FBQ2pDLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQ1YsY0FBUyxHQUFULFNBQVMsQ0FBVTtRQVB2QyxpQkFBWSxHQUFHLEtBQUssQ0FBQztRQVMzQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFFckIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsc0JBQXNCLEVBQUU7WUFDdkMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7Z0JBQ3BCLE9BQU87WUFDVCxDQUFDLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQztJQUVNLElBQUk7UUFDVCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUM3QixPQUFPO1lBQ1AsT0FBTyxDQUFDLElBQUksQ0FDViw0R0FBNEcsQ0FDN0csQ0FBQztZQUNGLE9BQU8sY0FBYyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1NBQ2xDO1FBRUQsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLGFB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QUM7UUFFcEIsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVPLGFBQWE7UUFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFO1lBQzNCLE1BQU0sSUFBSSxLQUFLLENBQ2IsOEVBQThFLENBQy9FLENBQUM7U0FDSDtJQUNILENBQUM7SUFFRCxJQUFJLGFBQWE7UUFDZixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDM0IsQ0FBQztJQUVELElBQUksRUFBRTtRQUNKLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUNsQixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsT0FBZSxFQUFFLE9BQWE7UUFDN0MsSUFBSSxDQUFDLEVBQUUsQ0FBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxTQUFpQixFQUFFLE9BQThCO1FBQ2hFLElBQUksQ0FBQyxFQUFFLENBQUMsY0FBYyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM5QyxDQUFDOzt1SEE1SlUsMEJBQTBCLHdGQVEzQixRQUFROzJIQVJQLDBCQUEwQixjQUZ6QixNQUFNOzJGQUVQLDBCQUEwQjtrQkFIdEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQVNJLE1BQU07MkJBQUMsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmd4WmVuZGVza1dlYldpZGdldENvbmZpZyB9IGZyb20gJy4vbmd4LXplbmRlc2std2ViLXdpZGdldC5jb25maWcnO1xuaW1wb3J0IHsgV2luZG93U2VydmljZSB9IGZyb20gJy4vd2luZG93LnNlcnZpY2UnO1xuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20sIG9mLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBOZ3haZW5kZXNrV2ViV2lkZ2V0WmVJbnN0YW5jZUludGVyZmFjZSB9IGZyb20gJy4vbmd4LXplbmRlc2std2ViLXdpZGdldC16ZS1pbnN0YW5jZS5pbnRlcmZhY2UnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBOZ3haZW5kZXNrV2ViV2lkZ2V0U2VydmljZSB7XG4gIHByaXZhdGUgX2luaXRpYWxpemVkID0gZmFsc2U7XG4gIHByaXZhdGUgX3dpbmRvdyE6IFdpbmRvdztcbiAgcHJpdmF0ZSBfekUhOiBOZ3haZW5kZXNrV2ViV2lkZ2V0WmVJbnN0YW5jZUludGVyZmFjZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNvbmZpZzogTmd4WmVuZGVza1dlYldpZGdldENvbmZpZyxcbiAgICBwcml2YXRlIHdpbmRvd1NlcnZpY2U6IFdpbmRvd1NlcnZpY2UsXG4gICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBfZG9jdW1lbnQ6IERvY3VtZW50XG4gICkge1xuICAgIHRoaXMuX3ZlcmlmeUNvbmZpZygpO1xuXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5sYXp5TG9hZFplbmRlc2tTY3JpcHRzKSB7XG4gICAgICB0aGlzLmluaXQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgLy8gbm9vcFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGluaXQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCF0aGlzLndpbmRvd1NlcnZpY2UuZ2V0KCkpIHtcbiAgICAgIC8vIG5vb3BcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgJ05neFplbmRlc2tXZWJXaWRnZXRTZXJ2aWNlLmluaXQoKTogVHJpZWQgaW5pdGlhbGl6aW5nIFplbmRlc2sgV2ViIFdpZGdldCwgYnV0IG5vIGJyb3dzZXIgd2luZG93IHdhcyBmb3VuZC4nXG4gICAgICApO1xuICAgICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKG9mKGZhbHNlKSk7XG4gICAgfVxuXG4gICAgY29uc3QgdyA9IHRoaXMud2luZG93U2VydmljZS5nZXQoKTtcbiAgICB0aGlzLl93aW5kb3cgPSB3ITtcbiAgICBsZXQgZG9jdW1lbnREb21haW4gPSB0aGlzLl9kb2N1bWVudC5kb21haW47XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWc7XG4gICAgY29uc3QgaW5qZWN0aW9uRWxlbWVudCA9IHRoaXMuZ2V0SW5qZWN0aW9uRWxlbWVudCgpO1xuICAgIGNvbnN0IGlGcmFtZUVsZW1lbnQgPSB0aGlzLmJ1aWxkSWZyYW1lRWxlbWVudCgpO1xuICAgIGNvbnN0IHNjcmlwdEVsZW1lbnQgPSB0aGlzLmJ1aWxkU2NyaXB0RWxlbWVudCgpO1xuXG4gICAgKHchIGFzIGFueSkuekVtYmVkIHx8XG4gICAgICAoZnVuY3Rpb24gKGU/LCB0Pykge1xuICAgICAgICBsZXQgYXJnczogYW55W10gPSBbXTtcbiAgICAgICAgKHchIGFzIGFueSkuekVtYmVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGFyZ3MucHVzaChhcmd1bWVudHMpO1xuICAgICAgICB9O1xuICAgICAgICAodyEgYXMgYW55KS56RSA9ICh3ISBhcyBhbnkpLnpFIHx8ICh3ISBhcyBhbnkpLnpFbWJlZDtcbiAgICAgICAgKHchIGFzIGFueSkuekVTZXR0aW5ncyA9IGNvbmZpZy56RVNldHRpbmdzO1xuXG4gICAgICAgIGlGcmFtZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIChldikgPT4ge1xuICAgICAgICAgIGNvbnN0IGlmcmFtZUVsZW1lbnRGcm9tRXZlbnQgPSBldi50YXJnZXQ7XG4gICAgICAgICAgaWYgKGlmcmFtZUVsZW1lbnRGcm9tRXZlbnQgaW5zdGFuY2VvZiBIVE1MSUZyYW1lRWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgaWZyYW1lRG9jdW1lbnRJbnN0YW5jZSA9XG4gICAgICAgICAgICAgIGlmcmFtZUVsZW1lbnRGcm9tRXZlbnQuY29udGVudERvY3VtZW50O1xuICAgICAgICAgICAgY29uc3QgaWZyYW1lV2luZG93SW5zdGFuY2UgPSBpZnJhbWVFbGVtZW50RnJvbUV2ZW50LmNvbnRlbnRXaW5kb3c7XG5cbiAgICAgICAgICAgIGxldCBpID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgaWZyYW1lV2luZG93SW5zdGFuY2U/LmRvY3VtZW50LmJvZHkgJiZcbiAgICAgICAgICAgICAgICBpZnJhbWVEb2N1bWVudEluc3RhbmNlXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaSk7XG5cbiAgICAgICAgICAgICAgICBpZnJhbWVEb2N1bWVudEluc3RhbmNlLmRvbWFpbiA9IGRvY3VtZW50RG9tYWluO1xuICAgICAgICAgICAgICAgIChpZnJhbWVEb2N1bWVudEluc3RhbmNlIGFzIGFueSkudCA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgKGlmcmFtZURvY3VtZW50SW5zdGFuY2UgYXMgYW55KS56ZW5kZXNrSG9zdCA9IGNvbmZpZy5hY2NvdW50VXJsO1xuICAgICAgICAgICAgICAgIChpZnJhbWVEb2N1bWVudEluc3RhbmNlIGFzIGFueSkuekVRdWV1ZSA9IGFyZ3M7XG5cbiAgICAgICAgICAgICAgICBpZnJhbWVEb2N1bWVudEluc3RhbmNlLmJvZHkuYXBwZW5kQ2hpbGQoc2NyaXB0RWxlbWVudCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgaW5qZWN0aW9uRWxlbWVudC5hcHBlbmRDaGlsZChpRnJhbWVFbGVtZW50KTtcbiAgICAgICAgfSk7XG4gICAgICB9KSgpO1xuXG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTG9hZGluZygpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRJbmplY3Rpb25FbGVtZW50KCk6IEVsZW1lbnQge1xuICAgIGxldCBlbGVtZW50cyA9IHRoaXMuX2RvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFxuICAgICAgdGhpcy5jb25maWcuaW5qZWN0aW9uVGFnXG4gICAgKTtcbiAgICBpZiAoZWxlbWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGVsZW1lbnQgZm91bmQgbWF0Y2hpbmcgaW5qZWN0aW9uVGFnIGZyb20gY29uZmlnJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVsZW1lbnRzWzBdO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5pc2hMb2FkaW5nKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IG8gPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuXG4gICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5faW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICAgIG8ubmV4dChmYWxzZSk7XG4gICAgICBvLmNvbXBsZXRlKCk7XG4gICAgfSwgdGhpcy5jb25maWcudGltZW91dCB8fCAzMDAwMCk7XG5cbiAgICAodGhpcy5fd2luZG93IGFzIGFueSkuekUoKCkgPT4ge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuXG4gICAgICB0aGlzLl96RSA9ICh0aGlzLl93aW5kb3cgYXMgYW55KS56RTtcbiAgICAgIHRoaXMuX2luaXRpYWxpemVkID0gdHJ1ZTtcblxuICAgICAgdGhpcy5jb25maWcuY2FsbGJhY2sodGhpcyk7XG5cbiAgICAgIG8ubmV4dCh0cnVlKTtcbiAgICAgIG8uY29tcGxldGUoKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBmaXJzdFZhbHVlRnJvbShvKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRJZnJhbWVFbGVtZW50KCk6IEhUTUxJRnJhbWVFbGVtZW50IHtcbiAgICBjb25zdCBpZnJhbWUgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcbiAgICBpZnJhbWUuc3JjID0gJ2phdmFzY3JpcHQ6ZmFsc2UnO1xuICAgIGlmcmFtZS50aXRsZSA9ICdaZW5kZXNrIFdlYiBXaWRnZXQnO1xuICAgIGlmcmFtZS5zdHlsZS5jc3NUZXh0ID0gJ2Rpc3BsYXk6IG5vbmUnO1xuXG4gICAgcmV0dXJuIGlmcmFtZTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRTY3JpcHRFbGVtZW50KCk6IEhUTUxTY3JpcHRFbGVtZW50IHtcbiAgICBjb25zdCBzY3JpcHQgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcblxuICAgIHNjcmlwdC50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7XG4gICAgc2NyaXB0LmlkID1cbiAgICAgICdiZS1zdXJlLW5vdC10by1zZXQtdGhlLWlkLXRvLXplLXNuaXBwZXQtYXMtdGhhdC1jaGFuZ2VzLXRoZS1iZWhhdmlvci1vZi10aGUtc25pcHBldCc7XG4gICAgc2NyaXB0LnNyYyA9ICdodHRwczovL3N0YXRpYy56ZGFzc2V0cy5jb20vZWtyL3NuaXBwZXQuanMnO1xuICAgIHNjcmlwdC5hc3luYyA9IHRydWU7XG5cbiAgICByZXR1cm4gc2NyaXB0O1xuICB9XG5cbiAgcHJpdmF0ZSBfdmVyaWZ5Q29uZmlnKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb25maWcuYWNjb3VudFVybCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnTmd4WmVuZGVza1dlYldpZGdldFNlcnZpY2U6IE5neFplbmRlc2tXZWJXaWRnZXRDb25maWcgaXMgbWlzc2luZyBhY2NvdW50VXJsLidcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGlzSW5pdGlhbGl6ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2luaXRpYWxpemVkO1xuICB9XG5cbiAgZ2V0IHpFKCk6IE5neFplbmRlc2tXZWJXaWRnZXRaZUluc3RhbmNlSW50ZXJmYWNlIHtcbiAgICByZXR1cm4gdGhpcy5fekU7XG4gIH1cblxuICBjb21tYW5kV2ViV2lkZ2V0KGNvbW1hbmQ6IHN0cmluZywgb3B0aW9ucz86IGFueSk6IHZvaWQge1xuICAgIHRoaXMuekUoJ3dlYldpZGdldCcsIGNvbW1hbmQsIG9wdGlvbnMpO1xuICB9XG5cbiAgb25XZWJXaWRnZXRFdmVudChldmVudE5hbWU6IHN0cmluZywgaGFuZGxlcjogKGV2ZW50PzogYW55KSA9PiB2b2lkKSB7XG4gICAgdGhpcy56RSgnd2ViV2lkZ2V0Om9uJywgZXZlbnROYW1lLCBoYW5kbGVyKTtcbiAgfVxufVxuIl19