diff --git a/build/index.js b/build/index.js
index 0ca802ae..c989c62a 100644
--- a/build/index.js
+++ b/build/index.js
@@ -1626,7 +1626,9 @@ var ReplayRecFrame = /*#__PURE__*/function () {
}, {
key: "flushObserver",
value: function flushObserver() {
- this.rec.observerCallback(this.observer.takeRecords());
+ if (this.observer && typeof this.observer.takeRecords !== "undefined") {
+ this.rec.observerCallback(this.observer.takeRecords());
+ }
}
}]);
@@ -2869,7 +2871,11 @@ var Session = /*#__PURE__*/function () {
var userNameInfo = document.querySelector("#bb-user-name");
if (userNameInfo) {
- userNameInfo.textContent = session.name ? session.name : "";
+ if (session.name && src_Gleap.getInstance().showUserName) {
+ userNameInfo.textContent = session.name;
+ } else {
+ userNameInfo.textContent = "";
+ }
}
_this.notifySessionReady();
@@ -2927,9 +2933,7 @@ var Session = /*#__PURE__*/function () {
if (_this.session.userId.toString() !== userId.toString()) {
return true;
}
- } catch (exp) {
- console.log("Gleap: warn");
- }
+ } catch (exp) {}
if (userData) {
var userDataKeys = Object.keys(userData);
@@ -5177,13 +5181,14 @@ var AutoConfig = /*#__PURE__*/function () {
}();
AutoConfig_defineProperty(AutoConfig, "run", function () {
- /*const session = Session.getInstance();
- const cachedConfig = loadFromGleapCache(`config-${session.sdkKey}`);
+ var session = Session.getInstance();
+ /*const cachedConfig = loadFromGleapCache(`config-${session.sdkKey}`);
if (cachedConfig) {
AutoConfig.applyConfig(cachedConfig, false);
AutoConfig.loadConfigFromServer(true).catch(function (e) {});
return Promise.resolve();
}*/
+
return AutoConfig.loadConfigFromServer(false);
});
@@ -5552,7 +5557,13 @@ var Gleap_Gleap = /*#__PURE__*/function () {
var self = this;
window.onerror = function (msg, url, lineNo, columnNo, error) {
- var message = ["Message: " + msg, "URL: " + url, "Line: " + lineNo, "Column: " + columnNo, "Stack: " + (error && error.stack) ? error.stack : 0];
+ var stackTrace = "";
+
+ if (error !== null && typeof error.stack !== "undefined") {
+ stackTrace = error.stack;
+ }
+
+ var message = ["Message: " + msg, "URL: " + url, "Line: " + lineNo, "Column: " + columnNo, "Stack: " + stackTrace];
self.addLog(message, "ERROR");
if (self.enabledCrashDetector && !self.appCrashDetected && !self.currentlySendingBug) {
@@ -5564,7 +5575,7 @@ var Gleap_Gleap = /*#__PURE__*/function () {
url: url,
lineNo: lineNo,
columnNo: columnNo,
- stackTrace: error && error.stack ? error.stack : ""
+ stackTrace: stackTrace
}, Gleap.PRIORITY_MEDIUM, "CRASH", {
screenshot: true,
replays: true
@@ -6253,7 +6264,7 @@ var Gleap_Gleap = /*#__PURE__*/function () {
currentUrl: window.location.href,
language: navigator.language || navigator.userLanguage,
mobile: isMobile(),
- sdkVersion: "6.8.9",
+ sdkVersion: "6.8.10",
sdkType: "javascript"
};
}
@@ -6956,9 +6967,15 @@ var Gleap_Gleap = /*#__PURE__*/function () {
instance.stopBugReportingAnalytics();
instance.widgetOpened = true;
instance.openedMenu = true;
- instance.updateFeedbackButtonState(); // Start feedback type dialog
+ instance.updateFeedbackButtonState();
+ var displayUserName = "";
+
+ if (instance.showUserName && sessionInstance.session && sessionInstance.session.name) {
+ displayUserName = sessionInstance.session.name;
+ } // Start feedback type dialog
+
- createFeedbackTypeDialog(instance.feedbackTypeActions, instance.overrideLanguage, instance.customLogoUrl, instance.poweredByHidden, function () {}, "".concat(translateText("Hi", instance.overrideLanguage), " ").concat(instance.showUserName && sessionInstance.session.name ? sessionInstance.session.name : "", " ").concat(instance.welcomeIcon), translateText(instance.widgetInfo.dialogSubtitle, instance.overrideLanguage), fromBack);
+ createFeedbackTypeDialog(instance.feedbackTypeActions, instance.overrideLanguage, instance.customLogoUrl, instance.poweredByHidden, function () {}, "".concat(translateText("Hi", instance.overrideLanguage), " ").concat(displayUserName, " ").concat(instance.welcomeIcon), translateText(instance.widgetInfo.dialogSubtitle, instance.overrideLanguage), fromBack);
}
/**
* Register custom action
diff --git a/demo/main.js b/demo/main.js
index 4c97a7e0..227a2bdc 100755
--- a/demo/main.js
+++ b/demo/main.js
@@ -1,6 +1,7 @@
const Gleap = window.Gleap;
-Gleap.initialize("a5yVbBAxZ3SxYRneqPnETvEG58veOyQs");
+// Gleap.setApiUrl("http://localhost:9000");
+Gleap.initialize("DUPaIr7s689BBblcFI4pc5aBgYJTm7Sc");
Gleap.identify("12938", {
email: "lukas@gleap.io",
@@ -39,4 +40,5 @@ setTimeout(() => {
setTimeout(() => {
console.warn("Failed to attach button listener.");
+ x();
}, 4000);
\ No newline at end of file
diff --git a/package.json b/package.json
index 2fcb4eee..69f9d0b0 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "gleap",
- "version": "6.8.9",
+ "version": "6.8.10",
"main": "build/index.js",
"scripts": {
"start": "webpack serve",
diff --git a/published/6.8.10/appwidget.min.css b/published/6.8.10/appwidget.min.css
new file mode 100644
index 00000000..ecd67215
--- /dev/null
+++ b/published/6.8.10/appwidget.min.css
@@ -0,0 +1 @@
+*{box-sizing:border-box;margin:0;padding:0;border:none}.bb-feedback-dialog-backdrop{display:none!important}.bb-feedback-dialog-container{display:flex;justify-content:center;align-items:center;height:100vh;width:100vw}.bb-feedback-dialog{position:initial;animation-name:none;box-shadow:0 0 15px 0 rgba(0,0,0,.2);width:calc(100% - 20px)}.bb-feedback-dialog-header-close{position:absolute;top:20px;right:20px;display:flex;justify-content:center;align-items:center;cursor:pointer;-webkit-tap-highlight-color:transparent}.bb-feedback-dialog-header-close svg{width:24px;height:24px}.bb-feedback-dialog-header-next{height:40px;min-width:40px;display:flex;justify-content:center;align-items:center;background-color:#fff;border-radius:20px;padding-right:12px;padding-left:15px;box-shadow:0 5px 15px 0 rgb(0 0 0 / 15%)}.bb-feedback-dialog-header-next span{font-family:Inter,sans-serif;font-weight:600;font-size:16px;color:#192027;margin-right:10px}.bb-feedback-dialog-header-next svg{fill:#192027}.bb-feedback-dialog-header-next svg{width:18px;height:auto;transform:rotate(180deg)}.bb-feedback-dialog-header-next:hover{background-color:rgba(255,255,255,.75);cursor:pointer;-webkit-tap-highlight-color:transparent}.bb-screenshot-editor-canv{display:flex;justify-content:center;padding-top:20px;padding-left:20px;padding-right:20px}#bb-screenshot-editor-canvas{width:auto;height:auto;background-color:#fff;box-shadow:0 5px 20px 0 rgb(0 0 0 / 30%);border-radius:8px}.bb-drawing-container{display:flex;justify-content:center;padding-top:20px;padding-bottom:10px}.bb-drawing-tools{display:flex;align-items:center}.bb-drawing-tool-item{width:44px;height:44px;display:flex;justify-content:center;align-items:center;padding:11px;cursor:pointer;-webkit-tap-highlight-color:transparent;border-radius:16px}.bb-drawing-tool-item--last{margin-right:5px}.bb-drawing-tool-action{width:44px;height:44px;display:flex;justify-content:center;align-items:center;padding:11px;cursor:pointer;-webkit-tap-highlight-color:transparent}.bb-drawing-tool-action svg{width:32px;height:32px;object-fit:contain}.bb-drawing-tool-action--disabled{opacity:.2;cursor:not-allowed}.bb-drawing-tool-spacer{width:1px;height:32px;margin:0 10px}.bb-drawing-tool-item svg{width:32px;height:32px;object-fit:contain}.bb-drawing-coloritem{width:36px;height:36px;border-radius:100%;margin:0 4px;cursor:pointer;-webkit-tap-highlight-color:transparent}.bb-drawing-coloritem--active{border:4px solid #00000033}#bb-drawing-color{width:26px;height:26px;border-radius:100%;box-shadow:0 0 10px 0 rgb(0 0 0 / 15%);cursor:pointer;-webkit-tap-highlight-color:transparent;margin:9px 5px}#bb-drawing-colorpopup{display:none;position:fixed;bottom:85px;left:50%;transform:translate(-50%,0);background:#fff;padding:8px;border-radius:8px;box-shadow:0 0 10px 0 rgb(0 0 0 / 15%)}.bb-feedback-dialog-drawing{background-color:#fff;max-width:100%;width:auto}@media only screen and (max-width:767px) and (orientation:portrait){.bb-feedback-dialog-drawing{max-width:calc(100% - 20px);width:100%}}.bb-anim-fadein{animation-duration:0s!important;animation-fill-mode:both!important;animation-name:none!important}
\ No newline at end of file
diff --git a/published/6.8.10/index.js b/published/6.8.10/index.js
new file mode 100644
index 00000000..c989c62a
--- /dev/null
+++ b/published/6.8.10/index.js
@@ -0,0 +1,7221 @@
+(function webpackUniversalModuleDefinition(root, factory) {
+ if(typeof exports === 'object' && typeof module === 'object')
+ module.exports = factory();
+ else if(typeof define === 'function' && define.amd)
+ define([], factory);
+ else if(typeof exports === 'object')
+ exports["Gleap"] = factory();
+ else
+ root["Gleap"] = factory();
+})(this, function() {
+return /******/ (() => { // webpackBootstrap
+/******/ "use strict";
+/******/ // The require scope
+/******/ var __webpack_require__ = {};
+/******/
+/************************************************************************/
+/******/ /* webpack/runtime/define property getters */
+/******/ (() => {
+/******/ // define getter functions for harmony exports
+/******/ __webpack_require__.d = (exports, definition) => {
+/******/ for(var key in definition) {
+/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
+/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
+/******/ }
+/******/ }
+/******/ };
+/******/ })();
+/******/
+/******/ /* webpack/runtime/hasOwnProperty shorthand */
+/******/ (() => {
+/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
+/******/ })();
+/******/
+/************************************************************************/
+var __webpack_exports__ = {};
+
+// EXPORTS
+__webpack_require__.d(__webpack_exports__, {
+ "default": () => (/* binding */ src)
+});
+
+;// CONCATENATED MODULE: ./src/GleapHelper.js
+var resizeImage = function resizeImage(base64Str) {
+ var maxWidth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 400;
+ var maxHeight = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 400;
+ return new Promise(function (resolve, reject) {
+ var isJPEG = base64Str.indexOf("data:image/jpeg") === 0;
+ var img = new Image();
+ img.src = base64Str;
+
+ img.onerror = function () {
+ reject();
+ };
+
+ img.onload = function () {
+ var canvas = document.createElement("canvas");
+ var MAX_WIDTH = maxWidth;
+ var MAX_HEIGHT = maxHeight; // Adjust max width / height based on image props
+
+ if (maxWidth > img.width / 4) {
+ MAX_WIDTH = img.width / 4;
+ }
+
+ if (maxHeight > img.height / 4) {
+ MAX_HEIGHT = img.height / 4;
+ }
+
+ var width = img.width;
+ var height = img.height;
+
+ if (width > height) {
+ if (width > MAX_WIDTH) {
+ height *= MAX_WIDTH / width;
+ width = MAX_WIDTH;
+ }
+ } else {
+ if (height > MAX_HEIGHT) {
+ width *= MAX_HEIGHT / height;
+ height = MAX_HEIGHT;
+ }
+ }
+
+ canvas.width = width;
+ canvas.height = height;
+ var ctx = canvas.getContext("2d");
+ ctx.drawImage(img, 0, 0, width, height);
+
+ if (isJPEG) {
+ resolve(canvas.toDataURL("image/jpeg", 0.7));
+ } else {
+ resolve(canvas.toDataURL());
+ }
+ };
+ });
+};
+var isMobile = function isMobile() {
+ if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|ipad|iris|kindle|Android|Silk|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(navigator.userAgent) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(navigator.userAgent.substr(0, 4))) {
+ return true;
+ }
+
+ return false;
+};
+var loadFromGleapCache = function loadFromGleapCache(key) {
+ try {
+ var cachedData = localStorage.getItem("gleap-widget-".concat(key));
+
+ if (cachedData) {
+ var config = JSON.parse(cachedData);
+ return config;
+ }
+ } catch (exp) {}
+
+ return null;
+};
+var saveToGleapCache = function saveToGleapCache(key, data) {
+ var k = "gleap-widget-".concat(key);
+
+ if (data) {
+ try {
+ localStorage.setItem(k, JSON.stringify(data));
+ } catch (exp) {}
+ } else {
+ localStorage.removeItem(k);
+ }
+};
+;// CONCATENATED MODULE: ./src/ResourceExclusionList.js
+var blacklist = ["//fonts.googleapis.com", "//cdn.jsdelivr.net", "//cdnjs.cloudflare.com", "//ajax.googleapis.com", "//use.typekit.net", ".amazonaws.com", "//jssdk.gleap.io", ".gstatic.com"];
+var isBlacklisted = function isBlacklisted(url) {
+ if (!url) {
+ return false;
+ }
+
+ for (var i = 0; i < blacklist.length; i++) {
+ if (url.indexOf(blacklist[i]) !== -1) {
+ return true;
+ }
+ }
+
+ return false;
+};
+;// CONCATENATED MODULE: ./src/ScreenCapture.js
+
+
+var startScreenCapture = function startScreenCapture(isLiveSite) {
+ return prepareScreenshotData(isLiveSite);
+};
+
+var documentToHTML = function documentToHTML(clone) {
+ var html = "";
+ var node = window.document.doctype;
+
+ if (node) {
+ html = "";
+ }
+
+ if (clone && clone.childNodes && clone.childNodes.length > 0) {
+ for (var i = 0; i < clone.childNodes.length; i++) {
+ if (clone.childNodes[i]) {
+ html += clone.childNodes[i].outerHTML;
+ }
+ }
+ }
+
+ return html;
+};
+
+var replaceAsync = function replaceAsync(str, regex, asyncFn) {
+ return new Promise(function (resolve, reject) {
+ var promises = [];
+ str.replace(regex, function (match) {
+ for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ args[_key - 1] = arguments[_key];
+ }
+
+ var promise = asyncFn.apply(void 0, [match].concat(args));
+ promises.push(promise);
+ });
+ Promise.all(promises).then(function (data) {
+ resolve(str.replace(regex, function () {
+ return data.shift();
+ }));
+ })["catch"](function () {
+ reject();
+ });
+ });
+};
+
+var loadCSSUrlResources = function loadCSSUrlResources(data, basePath) {
+ return replaceAsync(data, /url\((.*?)\)/g, function (matchedData) {
+ return new Promise(function (resolve, reject) {
+ if (!matchedData) {
+ return resolve(matchedData);
+ }
+
+ var matchedUrl = matchedData.substr(4, matchedData.length - 5).replaceAll("'", "").replaceAll('"', ""); // Remote file or data
+
+ if (matchedUrl.indexOf("http") === 0 || matchedUrl.indexOf("//") === 0 || matchedUrl.indexOf("data") === 0) {
+ return resolve(matchedData);
+ }
+
+ try {
+ var resourcePath = matchedUrl;
+
+ if (basePath) {
+ resourcePath = basePath + "/" + matchedUrl;
+ }
+
+ return fetchCSSResource(resourcePath).then(function (resourceData) {
+ return resolve("url(" + resourceData + ")");
+ });
+ } catch (exp) {
+ return resolve(matchedData);
+ }
+ });
+ });
+};
+
+var fetchCSSResource = function fetchCSSResource(url) {
+ return new Promise(function (resolve, reject) {
+ if (url) {
+ var xhr = new XMLHttpRequest();
+
+ xhr.onload = function () {
+ var reader = new FileReader();
+
+ reader.onloadend = function () {
+ resolve(reader.result);
+ };
+
+ reader.onerror = function () {
+ reject();
+ };
+
+ reader.readAsDataURL(xhr.response);
+ };
+
+ xhr.onerror = function (err) {
+ resolve();
+ };
+
+ xhr.open("GET", url);
+ xhr.responseType = "blob";
+ xhr.send();
+ } else {
+ resolve();
+ }
+ });
+};
+
+var progressResource = function progressResource(data, elem, resolve, reject) {
+ resizeImage(data, 500, 500).then(function (data) {
+ elem.src = data;
+ resolve();
+ })["catch"](function () {
+ console.warn("BB: Image resize failed.");
+ resolve();
+ });
+};
+
+var fetchItemResource = function fetchItemResource(elem) {
+ return new Promise(function (resolve, reject) {
+ if (elem && elem.src) {
+ if (isBlacklisted(elem.src)) {
+ return resolve();
+ }
+
+ var xhr = new XMLHttpRequest();
+
+ xhr.onload = function () {
+ var reader = new FileReader();
+
+ reader.onloadend = function () {
+ progressResource(reader.result, elem, resolve, reject);
+ };
+
+ reader.onerror = function () {
+ resolve();
+ };
+
+ reader.readAsDataURL(xhr.response);
+ };
+
+ xhr.onerror = function (err) {
+ resolve();
+ };
+
+ var url = elem.src;
+ xhr.open("GET", url);
+ xhr.responseType = "blob";
+ xhr.send();
+ } else {
+ resolve();
+ }
+ });
+};
+
+var downloadAllImages = function downloadAllImages(dom) {
+ var imgItems = dom.querySelectorAll("img");
+ var imgItemsPromises = [];
+
+ for (var i = 0; i < imgItems.length; i++) {
+ var item = imgItems[i];
+ imgItemsPromises.push(fetchItemResource(item));
+ }
+
+ return Promise.all(imgItemsPromises);
+};
+
+var replaceStyleNodes = function replaceStyleNodes(clone, styleSheet, cssTextContent, styleId) {
+ {
+ var cloneTargetNode = null;
+
+ if (styleSheet.ownerNode) {
+ cloneTargetNode = clone.querySelector('[bb-styleid="' + styleId + '"]');
+ }
+
+ try {
+ if (cloneTargetNode) {
+ var replacementNode = null;
+
+ if (cssTextContent != "") {
+ // Create node.
+ var head = clone.querySelector("head");
+ var styleNode = window.document.createElement("style");
+ head.appendChild(styleNode);
+ styleNode.type = "text/css";
+
+ if (styleNode.styleSheet) {
+ styleNode.styleSheet.cssText = cssTextContent;
+ } else {
+ styleNode.appendChild(window.document.createTextNode(cssTextContent));
+ }
+
+ replacementNode = styleNode;
+ } else {
+ var linkNode = window.document.createElement("link");
+ linkNode.rel = "stylesheet";
+ linkNode.type = styleSheet.type;
+ linkNode.href = styleSheet.href;
+ linkNode.media = styleSheet.media;
+ replacementNode = linkNode;
+ }
+
+ if (replacementNode) {
+ cloneTargetNode.parentNode.insertBefore(replacementNode, cloneTargetNode);
+ cloneTargetNode.remove();
+ }
+ }
+ } catch (exp) {}
+ }
+};
+
+var downloadAllCSSUrlResources = function downloadAllCSSUrlResources(clone, remote) {
+ var promises = [];
+
+ var _loop = function _loop() {
+ var styleSheet = document.styleSheets[i];
+ cssRules = null;
+
+ try {
+ if (styleSheet.cssRules) {
+ cssRules = styleSheet.cssRules;
+ } else if (styleSheet.rules) {
+ cssRules = styleSheet.rules;
+ }
+ } catch (exp) {}
+
+ cssTextContent = "";
+
+ if (cssRules) {
+ for (cssRuleItem in cssRules) {
+ if (cssRules[cssRuleItem].cssText) {
+ cssTextContent += cssRules[cssRuleItem].cssText;
+ }
+ }
+ }
+
+ if (styleSheet && styleSheet.ownerNode) {
+ if (cssTextContent != "" && !remote) {
+ // Resolve resources.
+ var baseTags = document.getElementsByTagName("base");
+ basePathURL = baseTags.length ? baseTags[0].href.substr(location.origin.length, 999) : window.location.href;
+
+ if (styleSheet.href) {
+ basePathURL = styleSheet.href;
+ }
+
+ var basePath = basePathURL.substring(0, basePathURL.lastIndexOf("/"));
+ promises.push(loadCSSUrlResources(cssTextContent, basePath).then(function (replacedStyle) {
+ return {
+ styletext: replacedStyle,
+ stylesheet: styleSheet,
+ styleId: styleSheet.ownerNode.getAttribute("bb-styleid")
+ };
+ }));
+ } else {
+ promises.push(Promise.resolve({
+ styletext: cssTextContent,
+ stylesheet: styleSheet,
+ styleId: styleSheet.ownerNode.getAttribute("bb-styleid")
+ }));
+ }
+ }
+ };
+
+ for (var i = 0; i < document.styleSheets.length; i++) {
+ var cssRules;
+ var cssTextContent;
+ var cssRuleItem;
+ var basePathURL;
+
+ _loop();
+ }
+
+ return Promise.all(promises).then(function (results) {
+ if (results) {
+ for (var i = 0; i < results.length; i++) {
+ replaceStyleNodes(clone, results[i].stylesheet, results[i].styletext, results[i].styleId);
+ }
+ }
+
+ return true;
+ });
+};
+
+var prepareRemoteData = function prepareRemoteData(clone, remote) {
+ return new Promise(function (resolve, reject) {
+ if (remote) {
+ // Always download CSS.
+ return downloadAllCSSUrlResources(clone, remote).then(function () {
+ resolve();
+ })["catch"](function () {
+ resolve();
+ });
+ } else {
+ return downloadAllImages(clone).then(function () {
+ return downloadAllCSSUrlResources(clone, remote).then(function () {
+ resolve();
+ });
+ })["catch"](function () {
+ console.warn("Gleap: Failed with resolving local resources. Please contact the Gleap support team.");
+ resolve();
+ });
+ }
+ });
+};
+
+var deepClone = function deepClone(host) {
+ var shadowNodeId = 1;
+
+ var cloneNode = function cloneNode(node, parent, shadowRoot) {
+ var walkTree = function walkTree(nextn, nextp, innerShadowRoot) {
+ while (nextn) {
+ cloneNode(nextn, nextp, innerShadowRoot);
+ nextn = nextn.nextSibling;
+ }
+ };
+
+ var clone = node.cloneNode();
+
+ if (typeof clone.setAttribute !== "undefined") {
+ if (shadowRoot) {
+ clone.setAttribute("bb-shadow-child", shadowRoot);
+ }
+
+ if (node instanceof HTMLCanvasElement) {
+ clone.setAttribute("bb-canvas-data", node.toDataURL());
+ }
+
+ if (node instanceof HTMLCanvasElement) {
+ clone.setAttribute("bb-canvas-data", node.toDataURL());
+ }
+ }
+
+ if (node.nodeType == Node.ELEMENT_NODE) {
+ var tagName = node.tagName ? node.tagName.toUpperCase() : node.tagName;
+
+ if (tagName == "IFRAME" || tagName == "VIDEO" || tagName == "EMBED" || tagName == "IMG" || tagName == "SVG") {
+ var boundingRect = node.getBoundingClientRect();
+ clone.setAttribute("bb-element", true);
+ clone.setAttribute("bb-height", boundingRect.height);
+ clone.setAttribute("bb-width", boundingRect.width);
+ }
+
+ if (tagName == "DIV" && (node.scrollTop > 0 || node.scrollLeft > 0)) {
+ clone.setAttribute("bb-scrollpos", true);
+ clone.setAttribute("bb-scrolltop", node.scrollTop);
+ clone.setAttribute("bb-scrollleft", node.scrollLeft);
+ }
+
+ if (tagName === "SELECT" || tagName === "TEXTAREA" || tagName === "INPUT") {
+ var val = node.value;
+
+ if (node.getAttribute("gleap-ignore") === "value") {
+ val = new Array(val.length + 1).join("*");
+ }
+
+ clone.setAttribute("bb-data-value", val);
+
+ if ((node.type === "checkbox" || node.type === "radio") && node.checked) {
+ clone.setAttribute("bb-data-checked", true);
+ }
+ }
+ }
+
+ parent.appendChild(clone);
+
+ if (node.shadowRoot) {
+ walkTree(node.shadowRoot.firstChild, clone, shadowNodeId);
+
+ if (typeof clone.setAttribute !== "undefined") {
+ clone.setAttribute("bb-shadow-parent", shadowNodeId);
+ }
+
+ ++shadowNodeId;
+ }
+
+ walkTree(node.firstChild, clone);
+ };
+
+ var fragment = document.createDocumentFragment();
+ cloneNode(host, fragment);
+ return fragment;
+};
+
+var prepareScreenshotData = function prepareScreenshotData(remote) {
+ return new Promise(function (resolve, reject) {
+ var styleTags = window.document.querySelectorAll("style, link");
+
+ for (var i = 0; i < styleTags.length; ++i) {
+ styleTags[i].setAttribute("bb-styleid", i);
+ }
+
+ var clone = deepClone(window.document.documentElement); // Fix for web imports (depracted).
+
+ var linkImportElems = clone.querySelectorAll("link[rel=import]");
+
+ for (var i = 0; i < linkImportElems.length; ++i) {
+ var referenceNode = linkImportElems[i];
+
+ if (referenceNode && referenceNode.childNodes && referenceNode.childNodes.length > 0) {
+ var childNodes = referenceNode.childNodes;
+
+ while (childNodes.length > 0) {
+ referenceNode.parentNode.insertBefore(childNodes[0], referenceNode);
+ }
+
+ referenceNode.remove();
+ }
+ } // Remove all scripts & style
+
+
+ var scriptElems = clone.querySelectorAll("script, noscript");
+
+ for (var i = 0; i < scriptElems.length; ++i) {
+ scriptElems[i].remove();
+ } // Cleanup base path
+
+
+ var baseElems = clone.querySelectorAll("base");
+
+ for (var i = 0; i < baseElems.length; ++i) {
+ baseElems[i].remove();
+ } // Fix base node
+
+
+ var baseUrl = window.location.href.substring(0, window.location.href.lastIndexOf("/")) + "/";
+ var baseNode = window.document.createElement("base");
+ baseNode.href = baseUrl;
+ var head = clone.querySelector("head");
+ head.insertBefore(baseNode, head.firstChild); // Do further cleanup.
+
+ var dialogElems = clone.querySelectorAll(".bb-feedback-dialog-container, .bb-capture-editor-borderlayer");
+
+ for (var i = 0; i < dialogElems.length; ++i) {
+ dialogElems[i].remove();
+ } // Calculate heights
+
+
+ var bbElems = clone.querySelectorAll("[bb-element=true]");
+
+ for (var i = 0; i < bbElems.length; ++i) {
+ if (bbElems[i]) {
+ bbElems[i].style.height = bbElems[i].getAttribute("bb-height") + "px";
+ }
+ }
+
+ prepareRemoteData(clone, remote).then(function () {
+ var html = documentToHTML(clone);
+ resolve({
+ html: html,
+ baseUrl: baseUrl,
+ width: window.innerWidth,
+ height: window.innerHeight,
+ isMobile: isMobile()
+ });
+ });
+ });
+};
+;// CONCATENATED MODULE: ./src/Translation.js
+
+var translateText = function translateText(key, overrideLanguage) {
+ var instance = src_Gleap.getInstance();
+ var language = navigator.language;
+
+ if (overrideLanguage !== "") {
+ language = overrideLanguage;
+ }
+
+ var customTranslation = {};
+ var translationKeys = Object.keys(instance.customTranslation);
+
+ for (var i = 0; i < translationKeys.length; i++) {
+ var translationKey = translationKeys[i];
+
+ if (language && language.includes(translationKey)) {
+ if (instance.customTranslation[translationKey]) {
+ customTranslation = instance.customTranslation[translationKey];
+ }
+ }
+ }
+
+ if (customTranslation[key]) {
+ return customTranslation[key];
+ }
+
+ if (!key) {
+ return "";
+ }
+
+ return key;
+};
+;// CONCATENATED MODULE: ./src/UI.js
+function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
+
+function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
+
+function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
+
+function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
+
+function _iterableToArrayLimit(arr, i) { var _i = arr && (typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]); if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
+
+function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
+
+
+
+
+var calculateShadeColor = function calculateShadeColor(col, amt) {
+ col = col.replace(/^#/, "");
+ if (col.length === 3) col = col[0] + col[0] + col[1] + col[1] + col[2] + col[2];
+
+ var _col$match = col.match(/.{2}/g),
+ _col$match2 = _slicedToArray(_col$match, 3),
+ r = _col$match2[0],
+ g = _col$match2[1],
+ b = _col$match2[2];
+
+ var _ref = [parseInt(r, 16) + amt, parseInt(g, 16) + amt, parseInt(b, 16) + amt];
+ r = _ref[0];
+ g = _ref[1];
+ b = _ref[2];
+ r = Math.max(Math.min(255, r), 0).toString(16);
+ g = Math.max(Math.min(255, g), 0).toString(16);
+ b = Math.max(Math.min(255, b), 0).toString(16);
+ var rr = (r.length < 2 ? "0" : "") + r;
+ var gg = (g.length < 2 ? "0" : "") + g;
+ var bb = (b.length < 2 ? "0" : "") + b;
+ return "#".concat(rr).concat(gg).concat(bb);
+};
+
+var calculateContrast = function calculateContrast(hex) {
+ var r = parseInt(hex.substr(1, 2), 16),
+ g = parseInt(hex.substr(3, 2), 16),
+ b = parseInt(hex.substr(5, 2), 16),
+ yiq = (r * 299 + g * 587 + b * 114) / 1000;
+ return yiq >= 160 ? "#000000" : "#ffffff";
+};
+
+var injectStyledCSS = function injectStyledCSS(primaryColor, headerColor, buttonColor, borderRadius, backgroundColor) {
+ var contrastColor = calculateContrast(primaryColor);
+ var contrastHeaderColor = calculateContrast(headerColor);
+ var contrastButtonColor = calculateContrast(buttonColor);
+ var contrastBackgroundColor = calculateContrast(backgroundColor);
+ var isDarkMode = contrastBackgroundColor === "#ffffff";
+ var subTextColor = isDarkMode ? calculateShadeColor(backgroundColor, 100) : calculateShadeColor(backgroundColor, -120);
+ var backgroundColorHover = isDarkMode ? calculateShadeColor(backgroundColor, 30) : calculateShadeColor(backgroundColor, -12);
+ var hoverHoverColor = isDarkMode ? calculateShadeColor(backgroundColor, 80) : calculateShadeColor(backgroundColor, -30);
+ var borderColor = isDarkMode ? calculateShadeColor(backgroundColor, 70) : calculateShadeColor(backgroundColor, -70);
+ var borderRadius = parseInt(borderRadius, 10);
+
+ if (borderRadius === NaN || borderRadius === undefined) {
+ borderRadius = 20;
+ }
+
+ var containerBorderRadius = Math.round(borderRadius * 0.6);
+ var buttonBorderRadius = Math.round(borderRadius * 1.05);
+ var formItemBorderRadius = Math.round(borderRadius * 0.4);
+ var formItemSmallBorderRadius = Math.round(borderRadius * 0.25);
+ var colorStyleSheet = "\n .bb-capture-preview-retrybutton {\n color: ".concat(contrastBackgroundColor, ";\n border-radius: ").concat(buttonBorderRadius, "px;\n background-color: ").concat(backgroundColorHover, ";\n }\n .bb-capture-preview-retrybutton:hover {\n background-color: ").concat(hoverHoverColor, ";\n }\n .bb-feedback-dialog-success svg {\n box-shadow: inset 0px 0px 0px ").concat(primaryColor, ";\n }\n\n @keyframes bb-suc-fill {\n 100% {\n box-shadow: inset 0px 0px 0px 30px ").concat(primaryColor, ";\n }\n }\n .bb-feedback-dialog-success svg circle {\n stroke: ").concat(primaryColor, ";\n }\n .bb-capture-dismiss {\n background-color: ").concat(primaryColor, ";\n border-bottom-left-radius: ").concat(formItemSmallBorderRadius, "px;\n }\n .bb-capture-dismiss svg path {\n fill: ").concat(contrastColor, ";\n }\n .bb-capture-toolbar-item-spacer {\n background-color: ").concat(backgroundColorHover, ";\n }\n .bb-tooltip {\n border-radius: ").concat(formItemBorderRadius, "px;\n }\n @keyframes bbRecIconFade {\n 0% {\n fill: transparent;\n }\n 50% {\n fill: ").concat(hoverHoverColor, ";\n }\n 100% {\n fill: transparent;\n }\n }\n .bb-feedback-inputgroup--privacy-policy a,\n .bb-feedback-inputgroup--privacy-policy [type=\"checkbox\"]:not(:checked) + label,\n .bb-feedback-inputgroup--privacy-policy [type=\"checkbox\"]:checked + label {\n color: ").concat(contrastBackgroundColor, ";\n }\n .bb-capture-preview-sendbutton {\n color: ").concat(contrastColor, ";\n background-color: ").concat(primaryColor, ";\n border-radius: ").concat(buttonBorderRadius, "px;\n }\n .bb-capture-button-next {\n color: ").concat(contrastColor, ";\n background-color: ").concat(primaryColor, ";\n border-radius: ").concat(formItemSmallBorderRadius, "px;\n }\n .bb-feedback-capture-item {\n border-radius: ").concat(buttonBorderRadius, "px;\n background-color: ").concat(backgroundColorHover, ";\n }\n .bb-capture-preview-inner {\n background-color: ").concat(backgroundColor, ";\n border-radius: ").concat(formItemBorderRadius, "px;\n }\n .bb-feedback-capture-item .bb-item-title {\n color: ").concat(contrastBackgroundColor, ";\n }\n .bb-capture-toolbar-item-timer {\n color: ").concat(subTextColor, ";\n }\n .bb-feedback-capture-item-selected-icon path,\n .bb-feedback-capture-item-selected-action path,\n .bb-feedback-capture-item path {\n fill: ").concat(contrastBackgroundColor, ";\n }\n .bb-svg-path {\n fill: ").concat(contrastBackgroundColor, ";\n }\n .bb-feedback-capture-item-selected-button {\n border-radius: ").concat(formItemBorderRadius, "px;\n background-color: ").concat(backgroundColorHover, ";\n }\n .bb-feedback-capture-item-selected-label {\n color: ").concat(contrastBackgroundColor, ";\n }\n .bb-feedback-capture-item-selected-action:hover {\n background-color: ").concat(hoverHoverColor, ";\n border-radius: ").concat(formItemSmallBorderRadius, "px;\n }\n .bb-capture-toolbar-item {\n border-radius: ").concat(formItemBorderRadius, "px;\n }\n .bb-capture-toolbar {\n background-color: ").concat(backgroundColor, ";\n border-radius: ").concat(formItemBorderRadius, "px;\n }\n .bb-capture-toolbar-item-colorpicker {\n background-color: ").concat(backgroundColor, ";\n }\n .bb-capture-toolbar-item--active {\n background-color: ").concat(backgroundColorHover, ";\n }\n .bb-feedback-capture-item:hover {\n background-color: ").concat(hoverHoverColor, ";\n }\n .bb-feedback-onetofive-button {\n border-radius: ").concat(formItemSmallBorderRadius, "px;\n }\n .bb-feedback-button-classic {\n border-top-left-radius: ").concat(formItemBorderRadius, "px;\n border-top-right-radius: ").concat(formItemBorderRadius, "px;\n }\n .bb-logo-logo--default path {\n fill: ").concat(contrastButtonColor, ";\n }\n .bb-feedback-dialog-header-logo .bb-logo-logo--default path {\n fill: ").concat(contrastHeaderColor, ";\n }\n .bb-feedback-inputgroup textarea,\n .bb-feedback-inputgroup > input,\n .bb-feedback-inputgroup input {\n border-radius: ").concat(formItemBorderRadius, "px;\n }\n .bb-feedback-dialog-header-back:hover {\n background-color: ").concat(contrastHeaderColor, ";\n border-radius: ").concat(containerBorderRadius, "px;\n }\n .bb-feedback-dialog-header-next {\n background-color: ").concat(contrastHeaderColor, ";\n }\n .bb-feedback-dialog-header-next span {\n color: ").concat(headerColor, ";\n }\n .bb-feedback-dialog-header-next svg {\n fill: ").concat(headerColor, ";\n }\n .bb-feedback-type {\n border-radius: ").concat(containerBorderRadius, "px;\n background-color: ").concat(backgroundColor, ";\n }\n .bb-feedback-type-description,\n .bb-feedback-poweredbycontainer span,\n .bb-feedback-onetofive-description span {\n color: ").concat(subTextColor, ";\n }\n .bb-feedback-poweredbycontainer svg g {\n fill: ").concat(subTextColor, ";\n }\n .bb-feedback-type:hover {\n background-color: ").concat(backgroundColorHover, ";\n }\n #bb-drawing-colorpopup {\n background-color: ").concat(backgroundColor, ";\n }\n .bb-feedback-type-title,\n .bb-feedback-form-description,\n .bb-feedback-elementtitle,\n .bb-feedback-multiplechoice-container,\n .bb-feedback-dialog-info-text\n {\n color: ").concat(contrastBackgroundColor, ";\n }\n .bb-drawing-tool-spacer {\n background-color: ").concat(backgroundColorHover, ";\n }\n .bb-feedback-dialog {\n border-radius: ").concat(borderRadius, "px;\n background-color: ").concat(backgroundColor, ";\n }\n .bb-logo-arrowdown {\n fill: ").concat(contrastButtonColor, ";\n }\n .bb-feedback-dialog-header-back svg {\n fill: ").concat(contrastHeaderColor, ";\n }\n .bb-feedback-dialog-header-back:hover svg {\n fill: ").concat(headerColor, ";\n }\n .bb-feedback-dialog-header-close svg {\n fill: ").concat(contrastHeaderColor, ";\n }\n .bb-feedback-dialog-header-title,\n .bb-feedback-dialog-header-title span {\n color: ").concat(contrastHeaderColor, ";\n }\n .bb-feedback-dialog-header-title-small {\n color: ").concat(contrastHeaderColor, ";\n }\n .bb-feedback-dialog-header-description {\n color: ").concat(contrastHeaderColor, ";\n }\n .bb-feedback-onetofive-button-active,\n .bb-feedback-onetofive-button:hover {\n background-color: ").concat(primaryColor, ";\n color: ").concat(contrastColor, ";\n } \n .bb-feedback-button-icon {\n background-color: ").concat(buttonColor, ";\n }\n .bb-feedback-multiplechoice-checkmark {\n border: 2px solid ").concat(hoverHoverColor, ";\n }\n .bb-feedback-multiplechoice-container:hover\n input\n ~ .bb-feedback-multiplechoice-checkmark {\n border: 2px solid ").concat(primaryColor, ";\n }\n .bb-feedback-multiplechoice-container input:checked ~ .bb-feedback-multiplechoice-checkmark {\n background-color: ").concat(primaryColor, ";\n border: 2px solid ").concat(primaryColor, ";\n }\n .bb-feedback-dialog-header-button {\n color: ").concat(primaryColor, ";\n }\n .bb-drawing-tool-item--active {\n background-color: ").concat(backgroundColorHover, ";\n }\n .bb-capture-editor-borderlayer {\n border-color: ").concat(primaryColor, ";\n }\n .bb-feedback-button-classic {\n background-color: ").concat(buttonColor, ";\n color: ").concat(contrastButtonColor, ";\n }\n .bb-feedback-dialog-header {\n background-color: ").concat(headerColor, ";\n }\n .bb-form-progress-inner {\n background-color: ").concat(headerColor, "66;\n }\n .bb-feedback-inputgroup textarea,\n .bb-feedback-inputgroup > input,\n .bb-feedback-inputgroup input {\n background-color: ").concat(backgroundColor, ";\n color: ").concat(contrastBackgroundColor, ";\n border-color: ").concat(borderColor, ";\n }\n .bb-feedback-inputgroup textarea:focus {\n border-color: ").concat(primaryColor, ";\n }\n .bb-feedback-inputgroup > input:focus, .bb-feedback-inputgroup input:focus {\n border-color: ").concat(primaryColor, ";\n }\n .bb-feedback-send-button {\n color: ").concat(contrastColor, ";\n background-color: ").concat(primaryColor, ";\n border-radius: ").concat(buttonBorderRadius, "px;\n }\n .bb-double-bounce1,\n .bb-double-bounce2 {\n background-color: ").concat(primaryColor, ";\n }\n .bb-feedback-dialog-header-button-cancel {\n background-color: ").concat(primaryColor, ";\n }\n .bb-feedback-type-icon {\n background-color: ").concat(primaryColor, ";\n }\n .bb-feedback-inputgroup--privacy-policy\n [type=\"checkbox\"]:not(:checked)\n + label:after,\n .bb-feedback-inputgroup--privacy-policy\n [type=\"checkbox\"]:checked\n + label:after {\n color: ").concat(primaryColor, ";\n }\n ");
+ var oldNode = document.querySelector(".gleap-styles");
+
+ if (oldNode) {
+ oldNode.remove();
+ }
+
+ var node = document.createElement("style");
+ node.innerHTML = colorStyleSheet;
+ node.className = "gleap-styles";
+ src_Gleap.appendNode(node);
+};
+var getHeaderImage = function getHeaderImage(customLogoUrl) {
+ var headerImage = loadIcon("bblogo", "#fff");
+
+ if (customLogoUrl) {
+ headerImage = "");
+ }
+
+ return headerImage;
+};
+var createWidgetDialog = function createWidgetDialog(title, description, customLogoUrl, content, back) {
+ var showBack = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true;
+ var appendClass = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : "";
+ var elem = document.createElement("div");
+ elem.className = "bb-feedback-dialog-container";
+ elem.innerHTML = "
\n \n
\n ").concat(content, "\n
\n
Powered by\n
\n
\n
\n
");
+ src_Gleap.appendNode(elem);
+ var buttonType = src_Gleap.getInstance().buttonType;
+
+ if (buttonType === src_Gleap.FEEDBACK_BUTTON_BOTTOM_LEFT) {
+ elem.classList.add("bb-feedback-button--bottomleft");
+ }
+
+ if (buttonType === src_Gleap.FEEDBACK_BUTTON_NONE) {
+ elem.classList.add("bb-feedback-button--disabled");
+ }
+
+ if (buttonType === src_Gleap.FEEDBACK_BUTTON_CLASSIC || buttonType === src_Gleap.FEEDBACK_BUTTON_CLASSIC_LEFT || buttonType === src_Gleap.FEEDBACK_BUTTON_CLASSIC_BOTTOM) {
+ elem.classList.add("bb-feedback-button--classic");
+ }
+
+ if (buttonType === src_Gleap.FEEDBACK_BUTTON_CLASSIC_LEFT) {
+ elem.classList.add("bb-feedback-button--classic-left");
+ }
+
+ var closeButton = document.querySelector(".bb-feedback-dialog-header-close");
+
+ closeButton.onclick = function () {
+ if (closeButton && closeButton.getAttribute("d") === "t") {
+ return;
+ }
+
+ src_Gleap.getInstance().closeGleap();
+ }; // Hook back action
+
+
+ if (back) {
+ var backButton = document.querySelector(".bb-feedback-dialog-header-back");
+
+ backButton.onclick = function () {
+ if (backButton && backButton.getAttribute("d") === "t") {
+ return;
+ }
+
+ back();
+ };
+ }
+
+ return elem;
+};
+/**
+ * Creates the feedback type dialog
+ */
+
+var createFeedbackTypeDialog = function createFeedbackTypeDialog(feedbackTypeActions, overrideLanguage, customLogoUrl, poweredByHidden, selectedMenuOption, title, subtitle, fromBack) {
+ // Generate options
+ var optionsHTML = "";
+
+ for (var i = 0; i < feedbackTypeActions.length; i++) {
+ var action = feedbackTypeActions[i];
+ optionsHTML += "
\n
\n
\n
\n
\n
").concat(translateText(action.title, overrideLanguage), "
\n
").concat(translateText(action.description, overrideLanguage), "
\n
\n
");
+ }
+
+ optionsHTML += "
";
+ var dialog = createWidgetDialog(title, subtitle, customLogoUrl, optionsHTML, null, true, fromBack ? "bb-anim-fadeinfromback" : "bb-anim-fadein"); // Hook actions
+
+ var _loop = function _loop() {
+ var index = i;
+
+ document.getElementById("bb-feedback-type-".concat(index)).onclick = function () {
+ dialog.remove();
+
+ if (feedbackTypeActions[index].action) {
+ // Cleanup widget.
+ src_Gleap.getInstance().closeGleap(); // Call custom action.
+
+ feedbackTypeActions[index].action();
+ }
+
+ if (feedbackTypeActions[index].actionFlow) {
+ src_Gleap.startFeedbackFlow(feedbackTypeActions[index].actionFlow);
+ }
+
+ if (selectedMenuOption) {
+ selectedMenuOption();
+ }
+ };
+ };
+
+ for (var i = 0; i < feedbackTypeActions.length; i++) {
+ _loop();
+ }
+
+ validatePoweredBy(poweredByHidden);
+};
+var validatePoweredBy = function validatePoweredBy(poweredByHidden) {
+ var poweredByContainer = document.querySelector(".bb-feedback-poweredbycontainer");
+
+ if (poweredByHidden) {
+ poweredByContainer.style.display = "none";
+ } else {
+ poweredByContainer.onclick = function () {
+ window.open("https://www.gleap.io/", "_blank");
+ };
+ }
+};
+var setLoadingIndicatorProgress = function setLoadingIndicatorProgress(percentComplete) {
+ var loader = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "main";
+ var circle = window.document.querySelector(".bb-feedback-dialog-loading--".concat(loader, " .bb--progress-ring__circle"));
+ var circumference = 213.628300444;
+ var offset = circumference - percentComplete / 100 * circumference;
+
+ if (circle) {
+ circle.style.strokeDasharray = "".concat(circumference, " ").concat(circumference);
+ circle.style.strokeDashoffset = offset;
+ }
+};
+var loadIcon = function loadIcon(name, color) {
+ if (name === "bblogo") {
+ return "";
+ }
+
+ if (name === "dismiss") {
+ return "";
+ }
+
+ if (name === "screenshot") {
+ return "";
+ }
+
+ if (name === "success") {
+ return "";
+ }
+
+ if (name === "blur") {
+ return "";
+ }
+
+ if (name === "pen") {
+ return "";
+ }
+
+ if (name === "rect") {
+ return "";
+ }
+
+ if (name === "pointer") {
+ return "";
+ }
+
+ if (name === "clip") {
+ return "";
+ }
+
+ if (name === "mic") {
+ return "";
+ }
+
+ if (name === "camera") {
+ return "";
+ }
+
+ if (name === "recorderon") {
+ return "";
+ }
+
+ if (name === "recorderoff") {
+ return "";
+ }
+
+ if (name === "arrowdown") {
+ return "");
+ }
+
+ if (name === "arrowleft") {
+ return "");
+ }
+
+ if (name === "close") {
+ return "");
+ }
+
+ if (name === "undo") {
+ return "";
+ }
+
+ return "";
+};
+var toggleLoading = function toggleLoading(loading) {
+ var form = document.querySelector(".bb-feedback-form");
+ var loader = document.querySelector(".bb-feedback-dialog-loading--main");
+ var next = document.querySelector(".bb-feedback-dialog-header-back");
+ var close = document.querySelector(".bb-feedback-dialog-header-close");
+
+ if (loading) {
+ form.style.display = "none";
+ loader.style.display = "flex";
+
+ if (next) {
+ next.setAttribute("d", "t");
+ next.style.opacity = "0.2";
+ }
+
+ if (close) {
+ close.setAttribute("d", "t");
+ close.style.opacity = "0.2";
+ }
+ } else {
+ form.style.display = "block";
+ loader.style.display = "none";
+
+ if (next) {
+ next.setAttribute("d", "n");
+ next.style.opacity = "1";
+ }
+
+ if (close) {
+ close.setAttribute("d", "n");
+ close.style.opacity = "1";
+ }
+ }
+};
+;// CONCATENATED MODULE: ./src/NetworkInterception.js
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
+
+function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+
+var GleapNetworkIntercepter = /*#__PURE__*/function () {
+ function GleapNetworkIntercepter() {
+ _classCallCheck(this, GleapNetworkIntercepter);
+
+ _defineProperty(this, "requestId", 0);
+
+ _defineProperty(this, "requests", {});
+
+ _defineProperty(this, "externalConsoleLogs", []);
+
+ _defineProperty(this, "maxRequests", 10);
+
+ _defineProperty(this, "filters", []);
+
+ _defineProperty(this, "initialized", false);
+
+ _defineProperty(this, "stopped", false);
+ }
+
+ _createClass(GleapNetworkIntercepter, [{
+ key: "getRequests",
+ value: function getRequests() {
+ var requests = this.externalConsoleLogs.concat(Object.values(this.requests));
+
+ if (!this.filters || this.filters.length === 0) {
+ return requests;
+ } // Perform network log filtering.
+
+
+ for (var i = 0; i < requests.length; i++) {
+ var request = requests[i]; // Headers
+
+ if (request && request.request && request.request.headers) {
+ for (var j = 0; j < this.filters.length; j++) {
+ delete request.request.headers[this.filters[j]];
+ }
+ } // Payload
+
+
+ if (request && request.request && request.request.payload) {
+ var payloadObj = request.request.payload;
+
+ try {
+ payloadObj = JSON.parse(request.request.payload);
+ } catch (e) {}
+
+ if (payloadObj) {
+ for (var j = 0; j < this.filters.length; j++) {
+ delete payloadObj[this.filters[j]];
+ }
+
+ request.request.payload = JSON.stringify(payloadObj);
+ }
+ } // Response
+
+
+ if (request && request.response && request.response.responseText) {
+ try {
+ var data = JSON.parse(request.response.responseText);
+
+ for (var j = 0; j < this.filters.length; j++) {
+ delete data[this.filters[j]];
+ }
+
+ request.response.responseText = JSON.stringify(data);
+ } catch (e) {}
+ }
+ }
+
+ return requests;
+ }
+ }, {
+ key: "setMaxRequests",
+ value: function setMaxRequests(maxRequests) {
+ this.maxRequests = maxRequests;
+ }
+ }, {
+ key: "setStopped",
+ value: function setStopped(stopped) {
+ this.stopped = stopped;
+ }
+ }, {
+ key: "setFilters",
+ value: function setFilters(filters) {
+ if (filters) {
+ this.filters = filters;
+ }
+ }
+ }, {
+ key: "cleanRequests",
+ value: function cleanRequests() {
+ var keys = Object.keys(this.requests);
+
+ if (keys.length > this.maxRequests) {
+ var keysToRemove = keys.slice(0, keys.length - this.maxRequests);
+
+ for (var i = 0; i < keysToRemove.length; i++) {
+ delete this.requests[keysToRemove[i]];
+ }
+ }
+ }
+ }, {
+ key: "calcRequestTime",
+ value: function calcRequestTime(bbRequestId) {
+ if (!bbRequestId || !this.requests || !this.requests[bbRequestId]) {
+ return;
+ }
+
+ var startDate = this.requests[bbRequestId]["date"];
+
+ if (startDate) {
+ this.requests[bbRequestId]["duration"] = new Date().getTime() - startDate.getTime();
+ }
+ }
+ }, {
+ key: "calculateTextSize",
+ value: function calculateTextSize(text) {
+ var size = new TextEncoder().encode(text).length;
+ var kiloBytes = size / 1024;
+ var megaBytes = kiloBytes / 1024;
+ return megaBytes;
+ }
+ }, {
+ key: "fixPayload",
+ value: function fixPayload(payload) {
+ if (payload === undefined || payload === null) {
+ return "{}";
+ }
+
+ try {
+ if ((typeof TextDecoder === "undefined" ? "undefined" : _typeof(TextDecoder)) !== undefined && ArrayBuffer.isView(payload)) {
+ var value = new TextDecoder().decode(payload);
+ return value;
+ }
+ } catch (exp) {}
+
+ return payload;
+ }
+ }, {
+ key: "start",
+ value: function start() {
+ var _this = this;
+
+ if (this.initialized) {
+ return;
+ }
+
+ this.initialized = true;
+ var self = this;
+ this.interceptNetworkRequests({
+ onFetch: function onFetch(params, bbRequestId) {
+ if (_this.stopped || !bbRequestId || !_this.requests) {
+ return;
+ }
+
+ if (params.length > 0 && typeof params[0] !== "undefined" && typeof params[0].url !== "undefined") {
+ _this.requests[bbRequestId] = {
+ url: params[0].url,
+ date: new Date(),
+ request: {
+ payload: "",
+ headers: typeof params[0].headers !== "undefined" ? Object.fromEntries(params[0].headers.entries()) : {}
+ },
+ type: typeof params[0].method !== "undefined" ? params[0].method : ""
+ };
+ } else {
+ if (params.length >= 2 && params[1]) {
+ var method = params[1] && params[1].method ? params[1].method : "GET";
+ _this.requests[bbRequestId] = {
+ request: {
+ payload: self.fixPayload(params[1].body),
+ headers: params[1].headers
+ },
+ type: method,
+ url: params[0],
+ date: new Date()
+ };
+ } else {
+ _this.requests[bbRequestId] = {
+ url: params[0],
+ date: new Date()
+ };
+ }
+ }
+
+ _this.cleanRequests();
+ },
+ onFetchLoad: function onFetchLoad(req, bbRequestId) {
+ if (_this.stopped || !bbRequestId || !_this.requests || !_this.requests[bbRequestId]) {
+ return;
+ }
+
+ try {
+ _this.requests[bbRequestId]["success"] = true;
+ _this.requests[bbRequestId]["response"] = {
+ status: req.status,
+ statusText: "",
+ responseText: ""
+ };
+
+ _this.calcRequestTime(bbRequestId);
+ } catch (exp) {}
+
+ req.text().then(function (responseText) {
+ if (_this.requests[bbRequestId]) {
+ _this.requests[bbRequestId]["success"] = true;
+ _this.requests[bbRequestId]["response"] = {
+ status: req.status,
+ statusText: req.statusText,
+ responseText: self.calculateTextSize(responseText) > 0.5 ? "" : responseText
+ };
+ }
+
+ _this.calcRequestTime(bbRequestId);
+
+ _this.cleanRequests();
+ })["catch"](function (err) {
+ _this.cleanRequests();
+ });
+ },
+ onFetchFailed: function onFetchFailed(err, bbRequestId) {
+ if (_this.stopped || !bbRequestId || !_this.requests || !_this.requests[bbRequestId]) {
+ return;
+ }
+
+ _this.requests[bbRequestId]["success"] = false;
+
+ _this.calcRequestTime(bbRequestId);
+
+ _this.cleanRequests();
+ },
+ onOpen: function onOpen(request, args) {
+ if (_this.stopped) {
+ return;
+ }
+
+ if (request && request.bbRequestId && args.length >= 2 && _this.requests) {
+ _this.requests[request.bbRequestId] = {
+ type: args[0],
+ url: args[1],
+ date: new Date()
+ };
+ }
+
+ _this.cleanRequests();
+ },
+ onSend: function onSend(request, args) {
+ if (_this.stopped) {
+ return;
+ }
+
+ if (request && request.bbRequestId && _this.requests && _this.requests[request.bbRequestId]) {
+ _this.requests[request.bbRequestId]["request"] = {
+ payload: _this.fixPayload(args.length > 0 ? args[0] : "{}"),
+ headers: request.requestHeaders
+ };
+ }
+
+ _this.cleanRequests();
+ },
+ onError: function onError(request, args) {
+ if (!_this.stopped && _this.requests && request && request.currentTarget && request.currentTarget.bbRequestId && _this.requests[request.currentTarget.bbRequestId]) {
+ _this.requests[request.currentTarget.bbRequestId]["success"] = false;
+
+ _this.calcRequestTime(request.bbRequestId);
+ }
+
+ _this.cleanRequests();
+ },
+ onLoad: function onLoad(request, args) {
+ if (_this.stopped) {
+ return;
+ }
+
+ if (request && request.currentTarget && request.currentTarget.bbRequestId && _this.requests && _this.requests[request.currentTarget.bbRequestId]) {
+ var target = request.currentTarget;
+ var responseType = target.responseType;
+ var responseText = "<" + responseType + ">";
+
+ if (responseType === "" || responseType === "text") {
+ responseText = _this.calculateTextSize(target.responseText) > 0.5 ? "" : target.responseText;
+ }
+
+ _this.requests[target.bbRequestId]["success"] = true;
+ _this.requests[target.bbRequestId]["response"] = {
+ status: target.status,
+ statusText: target.statusText,
+ responseText: responseText
+ };
+
+ _this.calcRequestTime(target.bbRequestId);
+ }
+
+ _this.cleanRequests();
+ }
+ });
+ }
+ }, {
+ key: "interceptNetworkRequests",
+ value: function interceptNetworkRequests(callback) {
+ var self = this;
+ var open = XMLHttpRequest.prototype.open;
+ var send = XMLHttpRequest.prototype.send;
+ XMLHttpRequest.prototype.wrappedSetRequestHeader = XMLHttpRequest.prototype.setRequestHeader;
+
+ XMLHttpRequest.prototype.setRequestHeader = function (header, value) {
+ if (!this.requestHeaders) {
+ this.requestHeaders = {};
+ }
+
+ if (this.requestHeaders && this.requestHeaders.hasOwnProperty(header)) {
+ return;
+ }
+
+ if (!this.requestHeaders[header]) {
+ this.requestHeaders[header] = [];
+ }
+
+ this.requestHeaders[header].push(value);
+ this.wrappedSetRequestHeader(header, value);
+ };
+
+ XMLHttpRequest.prototype.open = function () {
+ this["bbRequestId"] = ++self.requestId;
+ callback.onOpen && callback.onOpen(this, arguments);
+
+ if (callback.onLoad) {
+ this.addEventListener("load", callback.onLoad.bind(callback));
+ }
+
+ if (callback.onError) {
+ this.addEventListener("error", callback.onError.bind(callback));
+ }
+
+ return open.apply(this, arguments);
+ };
+
+ XMLHttpRequest.prototype.send = function () {
+ callback.onSend && callback.onSend(this, arguments);
+ return send.apply(this, arguments);
+ };
+
+ if (window.fetch) {
+ (function () {
+ var originalFetch = window.fetch;
+
+ window.fetch = function () {
+ var bbRequestId = ++self.requestId;
+ callback.onFetch(arguments, bbRequestId);
+ return originalFetch.apply(this, arguments).then(function (response) {
+ if (response && typeof response.clone === "function") {
+ var data = response.clone();
+ callback.onFetchLoad(data, bbRequestId);
+ }
+
+ return response;
+ })["catch"](function (err) {
+ callback.onFetchFailed(err, bbRequestId);
+ throw err;
+ });
+ };
+ })();
+ }
+
+ return callback;
+ }
+ }, {
+ key: "blobToTextPromise",
+ value: function blobToTextPromise(blob) {
+ return new Promise(function (resolve, reject) {
+ var fr = new FileReader();
+
+ fr.onload = function (evt) {
+ if (evt && evt.target && evt.target.result) {
+ resolve(evt.target.result);
+ } else {
+ reject();
+ }
+ };
+
+ fr.onerror = function (err) {
+ reject(err);
+ };
+
+ fr.readAsText(blob);
+ });
+ }
+ }]);
+
+ return GleapNetworkIntercepter;
+}();
+
+/* harmony default export */ const NetworkInterception = (GleapNetworkIntercepter);
+;// CONCATENATED MODULE: ./src/ReplayConstants.js
+function ReplayConstants_typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ReplayConstants_typeof = function _typeof(obj) { return typeof obj; }; } else { ReplayConstants_typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ReplayConstants_typeof(obj); }
+
+var REPLAYREC_ADD = "p";
+var REPLAYREC_CANVAS_DATA = "c";
+var REPLAYREC_DELAY = "o";
+var REPLAYREC_FORCE_STYLE_FLUSH = "f";
+var REPLAYREC_INPUT = "i";
+var REPLAYREC_INPUTCHECK = "z";
+var REPLAYREC_MOUSE_MOVE = "m";
+var REPLAYREC_MOUSE_DOWN = "n";
+var REPLAYREC_ATTR = "r";
+var REPLAYREC_TEXT = "t";
+var REPLAYREC_MOUSE_UP = "u";
+var REPLAYREC_REMOVE = "v";
+var REPLAYREC_SCROLL = "s";
+var REPLAYREC_MAINSCROLL = "x";
+function gleapRoughSizeOfObject(object) {
+ var objectList = [];
+ var stack = [object];
+ var bytes = 0;
+
+ while (stack.length) {
+ var value = stack.pop();
+
+ if (typeof value === "boolean") {
+ bytes += 4;
+ } else if (typeof value === "string") {
+ bytes += value.length * 2;
+ } else if (typeof value === "number") {
+ bytes += 8;
+ } else if (ReplayConstants_typeof(value) === "object" && objectList.indexOf(value) === -1) {
+ objectList.push(value);
+
+ for (var i in value) {
+ stack.push(value[i]);
+ }
+ }
+ }
+
+ return bytes / 1024 / 1024;
+}
+;// CONCATENATED MODULE: ./src/ReplayRecFrame.js
+function ReplayRecFrame_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+
+function ReplayRecFrame_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function ReplayRecFrame_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function ReplayRecFrame_createClass(Constructor, protoProps, staticProps) { if (protoProps) ReplayRecFrame_defineProperties(Constructor.prototype, protoProps); if (staticProps) ReplayRecFrame_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+var ReplayRecFrame = /*#__PURE__*/function () {
+ function ReplayRecFrame(win, node, rec) {
+ var _this = this;
+
+ ReplayRecFrame_classCallCheck(this, ReplayRecFrame);
+
+ this.win = win;
+ this.node = node;
+ this.rec = rec;
+ this.initialState = {};
+ this.initialActions = [];
+
+ this.prepEvent = function (event) {
+ var _a;
+
+ _this.flushObserver();
+
+ return ((_a = event.target) === null || _a === void 0 ? void 0 : _a.ReplayRecID) || 0;
+ };
+
+ this.mouseListener = function (event) {
+ var x = event.clientX;
+ var y = event.clientY;
+ var target = event.target;
+ var mouseEventNode = _this.node;
+
+ if (!mouseEventNode.contains(target)) {
+ return;
+ }
+
+ _this.flushObserver();
+
+ var nodeRect = mouseEventNode.getBoundingClientRect();
+ x -= nodeRect.left;
+ y -= nodeRect.top;
+ var key;
+
+ switch (event.type) {
+ case "mousemove":
+ key = REPLAYREC_MOUSE_MOVE;
+ break;
+
+ case "mouseup":
+ key = REPLAYREC_MOUSE_UP;
+ break;
+
+ case "mousedown":
+ key = REPLAYREC_MOUSE_DOWN;
+ break;
+
+ default:
+ throw new Error("Unknown event type: ".concat(event.type));
+ }
+
+ _this.rec.actions.push(ReplayRecFrame_defineProperty({}, key, [Math.round(x), Math.round(y)]));
+ };
+
+ this.scrollListener = function (event) {
+ if (!_this.node.contains(event.target)) {
+ return;
+ }
+
+ var id = _this.prepEvent(event);
+
+ if (id) {
+ _this.rec.pushScrollAction(id, event.target);
+ }
+ };
+
+ this.mainScrollListener = function () {
+ _this.flushObserver();
+
+ _this.rec.actions.push(ReplayRecFrame_defineProperty({}, REPLAYREC_MAINSCROLL, [window.scrollX, window.scrollY]));
+ };
+
+ this.inputListener = function (event) {
+ if (!_this.node.contains(event.target)) {
+ return;
+ }
+
+ var id = _this.prepEvent(event);
+
+ if (id && "value" in event.target) {
+ var val = event.target.value;
+
+ if (event.target.type === "password" && val && val.length) {
+ val = new Array(val.length + 1).join("*");
+ }
+
+ if (event.target.getAttribute("gleap-ignore") === "value") {
+ val = new Array(val.length + 1).join("*");
+ }
+
+ _this.rec.actions.push(ReplayRecFrame_defineProperty({}, REPLAYREC_INPUT, [id, val]));
+ }
+
+ if (id && "type" in event.target && event.target.type === "checkbox") {
+ var checked = event.target.checked;
+
+ _this.rec.actions.push(ReplayRecFrame_defineProperty({}, REPLAYREC_INPUTCHECK, [id, checked]));
+ }
+ };
+
+ this.flushListener = function (event) {
+ if (!_this.node.contains(event.target)) {
+ return;
+ }
+
+ var id = _this.prepEvent(event);
+
+ if (id) {
+ _this.rec.actions.push(ReplayRecFrame_defineProperty({}, REPLAYREC_FORCE_STYLE_FLUSH, id));
+ }
+ };
+
+ this.canvasListener = function (event) {
+ if (!_this.node.contains(event.target)) {
+ return;
+ }
+
+ var id = _this.prepEvent(event);
+
+ if (id) {
+ _this.rec.actions.push(ReplayRecFrame_defineProperty({}, REPLAYREC_CANVAS_DATA, [id, event.target.toDataURL(), "didDraw"]));
+ }
+ };
+
+ this.focusListener = function () {};
+
+ node.ownerDocument.ReplayRecInner = this;
+ var initialActions = [];
+ var serializedNode = this.rec.serializeNode(this.node, initialActions);
+
+ if (serializedNode) {
+ this.initialState = serializedNode;
+ this.initialActions = initialActions; // Fix for patched mutation observer.
+
+ var GleapMutationObserver = MutationObserver;
+
+ if (window && window.Zone && window[window.Zone.__symbol__("MutationObserver")]) {
+ GleapMutationObserver = window[window.Zone.__symbol__("MutationObserver")];
+ }
+
+ this.observer = new GleapMutationObserver(rec.observerCallback);
+ this.observer.observe(node, {
+ attributes: true,
+ characterData: true,
+ childList: true,
+ subtree: true
+ }); // Get scroll position
+
+ this.mainScrollListener();
+ win.addEventListener("input", this.inputListener, {
+ capture: true,
+ passive: true
+ });
+ win.addEventListener("mousemove", this.mouseListener, {
+ capture: true,
+ passive: true
+ });
+ win.addEventListener("mousedown", this.mouseListener, {
+ capture: true,
+ passive: true
+ });
+ win.addEventListener("mouseup", this.mouseListener, {
+ capture: true,
+ passive: true
+ });
+ win.addEventListener("forceStyleFlush", this.flushListener, {
+ capture: true,
+ passive: true
+ });
+ win.addEventListener("didDrawCanvas", this.canvasListener, {
+ capture: true,
+ passive: true
+ });
+ win.addEventListener("focus", this.focusListener, {
+ capture: true,
+ passive: true
+ });
+ win.addEventListener("scroll", this.mainScrollListener, {
+ capture: true,
+ passive: true
+ });
+ }
+ }
+
+ ReplayRecFrame_createClass(ReplayRecFrame, [{
+ key: "stop",
+ value: function stop() {
+ this.flushObserver();
+ this.observer.disconnect();
+ this.win.removeEventListener("input", this.inputListener, {
+ capture: true,
+ passive: true
+ });
+ this.win.removeEventListener("mousemove", this.mouseListener, {
+ capture: true,
+ passive: true
+ });
+ this.win.removeEventListener("mousedown", this.mouseListener, {
+ capture: true,
+ passive: true
+ });
+ this.win.removeEventListener("mouseup", this.mouseListener, {
+ capture: true,
+ passive: true
+ });
+ this.win.removeEventListener("forceStyleFlush", this.flushListener, {
+ capture: true,
+ passive: true
+ });
+ this.win.removeEventListener("didDrawCanvas", this.canvasListener, {
+ capture: true,
+ passive: true
+ });
+ this.win.removeEventListener("focus", this.focusListener, {
+ capture: true,
+ passive: true
+ });
+ this.win.removeEventListener("scroll", this.mainScrollListener, {
+ capture: true,
+ passive: true
+ });
+ this.rec.deleteAllReplayRecIDs(this.node);
+ }
+ }, {
+ key: "flushObserver",
+ value: function flushObserver() {
+ if (this.observer && typeof this.observer.takeRecords !== "undefined") {
+ this.rec.observerCallback(this.observer.takeRecords());
+ }
+ }
+ }]);
+
+ return ReplayRecFrame;
+}();
+
+
+;// CONCATENATED MODULE: ./src/ReplayRecorder.js
+function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = ReplayRecorder_unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
+
+function ReplayRecorder_unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return ReplayRecorder_arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return ReplayRecorder_arrayLikeToArray(o, minLen); }
+
+function ReplayRecorder_arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
+
+function ReplayRecorder_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function ReplayRecorder_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function ReplayRecorder_createClass(Constructor, protoProps, staticProps) { if (protoProps) ReplayRecorder_defineProperties(Constructor.prototype, protoProps); if (staticProps) ReplayRecorder_defineProperties(Constructor, staticProps); return Constructor; }
+
+function ReplayRecorder_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+
+
+
+
+
+
+var ReplayRecorder = /*#__PURE__*/function () {
+ function ReplayRecorder() {
+ var _this = this;
+
+ ReplayRecorder_classCallCheck(this, ReplayRecorder);
+
+ ReplayRecorder_defineProperty(this, "fetchCSSResource", function (url) {
+ var self = _this;
+ return new Promise(function (resolve, reject) {
+ if (url) {
+ var xhr = new XMLHttpRequest();
+
+ xhr.onload = function () {
+ var reader = new FileReader();
+
+ reader.onloadend = function () {
+ resolve(reader.result);
+ };
+
+ reader.onerror = function () {
+ resolve();
+ };
+
+ reader.readAsDataURL(xhr.response);
+ };
+
+ xhr.onerror = function (err) {
+ resolve();
+ };
+
+ xhr.open("GET", url);
+ xhr.responseType = "blob";
+ xhr.send();
+ } else {
+ resolve();
+ }
+ });
+ });
+
+ ReplayRecorder_defineProperty(this, "replaceAsync", function (str, regex, asyncFn) {
+ return new Promise(function (resolve, reject) {
+ var promises = [];
+ str.replace(regex, function (match) {
+ for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ args[_key - 1] = arguments[_key];
+ }
+
+ var promise = asyncFn.apply(void 0, [match].concat(args));
+ promises.push(promise);
+ });
+ Promise.all(promises).then(function (data) {
+ resolve(str.replace(regex, function () {
+ return data.shift();
+ }));
+ })["catch"](function () {
+ reject();
+ });
+ });
+ });
+
+ ReplayRecorder_defineProperty(this, "validateStylesheetResources", function (data, url) {
+ var basePath = url.substring(0, url.lastIndexOf("/"));
+ var split = data.split(",");
+
+ if (split.length !== 2) {
+ return Promise.reject();
+ }
+
+ data = atob(split[1]);
+ delete split[1];
+ return _this.replaceAsync(data, /url\((.*?)\)/g, function (matchedData) {
+ return new Promise(function (resolve, reject) {
+ var matchedUrl = matchedData.substr(4, matchedData.length - 5).replaceAll("'", "").replaceAll('"', ""); // Remote file or data
+
+ if (matchedUrl.indexOf("http") === 0 || matchedUrl.indexOf("//") === 0 || matchedUrl.indexOf("data") === 0) {
+ return resolve(matchedData);
+ }
+
+ try {
+ var resourcePath = matchedUrl;
+
+ if (basePath) {
+ resourcePath = basePath + "/" + matchedUrl;
+ }
+
+ return _this.fetchCSSResource(resourcePath).then(function (resourceData) {
+ if (matchedUrl.indexOf("data:text/html") === 0) {
+ return resolve(matchedData);
+ }
+
+ return resolve("url(" + resourceData + ")");
+ });
+ } catch (exp) {
+ return resolve(matchedData);
+ }
+ });
+ }).then(function (result) {
+ return split[0] + "," + btoa(result);
+ });
+ });
+
+ ReplayRecorder_defineProperty(this, "progressResource", function (data, src, resolve, reject) {
+ if (data && data.indexOf("data:text/css") === 0) {
+ _this.validateStylesheetResources(data, src).then(function (data) {
+ _this.resourcesToResolve[src] = data;
+ resolve();
+ });
+ } else if (data && (data.indexOf("data:image/jpeg") === 0 || data.indexOf("data:image/png") === 0)) {
+ resizeImage(data, 500, 500).then(function (data) {
+ _this.resourcesToResolve[src] = data;
+ resolve();
+ });
+ } else {
+ _this.resourcesToResolve[src] = data;
+ resolve();
+ }
+ });
+
+ ReplayRecorder_defineProperty(this, "fetchItemResource", function (src) {
+ var self = _this;
+ return new Promise(function (resolve, reject) {
+ if (src) {
+ var xhr = new XMLHttpRequest();
+
+ xhr.onload = function () {
+ var reader = new FileReader();
+
+ reader.onloadend = function () {
+ self.progressResource(reader.result, src, resolve, reject);
+ };
+
+ reader.onerror = function () {
+ resolve();
+ };
+
+ reader.readAsDataURL(xhr.response);
+ };
+
+ xhr.onerror = function (err) {
+ resolve();
+ };
+
+ var url = src;
+ xhr.open("GET", url);
+ xhr.responseType = "blob";
+ xhr.send();
+ } else {
+ resolve();
+ }
+ });
+ });
+
+ this.stopped = false;
+ this.startDate = Date.now();
+ this.node = document.documentElement;
+ this.nextID = 1;
+ this.actions = [];
+ this.actionsSize = 0;
+ this.lastActionTime = Date.now();
+ this.observerCallback = this.callback.bind(this);
+ this.resourcesToResolve = {};
+ this.rootFrame = new ReplayRecFrame(window, this.node, this);
+ this.evaluateFocus();
+ this.result = null;
+ this.finalizingResult = false;
+ }
+
+ ReplayRecorder_createClass(ReplayRecorder, [{
+ key: "isFull",
+ value: function isFull() {
+ if (this.actions && this.actionsSize > 10) {
+ return true;
+ }
+
+ return false;
+ }
+ }, {
+ key: "fetchImageResources",
+ value: function fetchImageResources() {
+ var resolvePromises = [];
+ var resourceKeys = Object.keys(this.resourcesToResolve);
+
+ for (var i = 0; i < resourceKeys.length; i++) {
+ if (!isBlacklisted(resourceKeys[i])) {
+ resolvePromises.push(this.fetchItemResource(resourceKeys[i]));
+ }
+ }
+
+ return Promise.all(resolvePromises);
+ }
+ }, {
+ key: "stop",
+ value: function stop() {
+ var _this2 = this;
+
+ var fetchResources = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+ this.stopped = true;
+
+ if (!this.rootFrame) {
+ this.rootFrame = null;
+ return;
+ }
+
+ var replayResult = {
+ startDate: this.startDate,
+ initialState: this.rootFrame.initialState,
+ initialActions: this.rootFrame.initialActions,
+ actions: this.actions,
+ baseUrl: window.location.origin,
+ width: window.innerWidth,
+ height: window.innerHeight,
+ resourcesToResolve: this.resourcesToResolve,
+ isMobile: isMobile()
+ };
+ this.rootFrame.stop();
+ this.rootFrame = null;
+ this.finalizingResult = true;
+
+ if (fetchResources) {
+ return this.fetchImageResources().then(function () {
+ _this2.cleanupAfterStop(replayResult);
+ });
+ } else {
+ this.cleanupAfterStop(replayResult);
+ }
+ }
+ }, {
+ key: "cleanupAfterStop",
+ value: function cleanupAfterStop(replayResult) {
+ this.cleanupResources();
+ this.result = replayResult;
+ this.finalizingResult = false;
+ }
+ }, {
+ key: "cleanupResources",
+ value: function cleanupResources() {
+ var resourceKeys = Object.keys(this.resourcesToResolve);
+
+ for (var i = 0; i < resourceKeys.length; i++) {
+ if (this.resourcesToResolve[resourceKeys[i]] === "--") {
+ delete this.resourcesToResolve[resourceKeys[i]];
+ }
+ }
+ }
+ }, {
+ key: "evaluateFocus",
+ value: function evaluateFocus() {
+ this.rootFrame.flushObserver();
+ }
+ }, {
+ key: "allowAttribute",
+ value: function allowAttribute(e, name) {
+ // eslint-disable-next-line default-case
+ switch (name) {
+ case "srcdoc":
+ if (e.tagName === "IFRAME") {
+ return false;
+ }
+
+ break;
+
+ case "title":
+ return false;
+ }
+
+ return true;
+ }
+ }, {
+ key: "pushScrollAction",
+ value: function pushScrollAction(id, element, actionsList) {
+ var actions = actionsList ? actionsList : this.actions;
+ var scrolledIntoView = element.elementScrolledIntoView;
+
+ if (scrolledIntoView) {
+ var a = {};
+
+ if (scrolledIntoView.ReplayRecID) {
+ var scrolledIntoViewOffset = "elementScrolledIntoViewOffset" in element ? element.elementScrolledIntoViewOffset : null;
+ a[REPLAYREC_SCROLL] = [id, scrolledIntoView.ReplayRecID, scrolledIntoViewOffset];
+ } else {
+ if (scrolledIntoView !== "bottom") {
+ throw new Error("Unknown scrolledIntoView: ".concat(scrolledIntoView));
+ }
+
+ a[REPLAYREC_SCROLL] = [id, scrolledIntoView];
+ }
+
+ actions.push(a);
+ }
+ }
+ }, {
+ key: "serializeNode",
+ value: function serializeNode(node, actions) {
+ if ("ReplayRecID" in node) {
+ return null;
+ }
+
+ var id = this.nextID++;
+ var obj = {
+ id: id
+ };
+ node.ReplayRecID = id;
+
+ switch (node.nodeType) {
+ case Node.ELEMENT_NODE:
+ {
+ var tag = node.tagName; // eslint-disable-next-line default-case
+
+ switch (tag) {
+ case "INPUT":
+ case "TEXTAREA":
+ {
+ var a = {};
+ var val = node.value;
+
+ if (node.type && node.type === "password" && val && val.length) {
+ val = new Array(val.length + 1).join("*");
+ }
+
+ if (node.getAttribute("gleap-ignore") === "value") {
+ val = new Array(val.length + 1).join("*");
+ }
+
+ a[REPLAYREC_INPUT] = [id, val];
+ actions.push(a);
+ var listener = node.ownerDocument.ReplayRecInner.scrollListener;
+ node.addEventListener("scroll", listener, {
+ passive: true
+ });
+ break;
+ }
+
+ case "PRE":
+ case "DIV":
+ {
+ if (node.classList.contains("bb-hidden")) {
+ delete node.ReplayRecID;
+ return null;
+ } // In Pernosco all scrollable elements happen to be DIV/INPUT/TEXTAREA
+
+
+ var _listener = node.ownerDocument.ReplayRecInner.scrollListener;
+ node.addEventListener("scroll", _listener, {
+ passive: true
+ });
+ break;
+ }
+
+ case "SCRIPT":
+ case "LINK":
+ delete node.ReplayRecID;
+ var nodeRel = node.getAttribute("rel"); // Stylesheets
+
+ if (node && node.href && (node.href.includes(".css") || nodeRel && nodeRel.includes("stylesheet"))) {
+ this.resourcesToResolve[node.getAttribute("href")] = "--";
+ break;
+ } // HTML Imports
+
+
+ if (nodeRel && nodeRel === "import") {
+ break;
+ }
+
+ return null;
+
+ case "CANVAS":
+ {
+ var _a = {};
+ _a[REPLAYREC_CANVAS_DATA] = [id, node.toDataURL()];
+ actions.push(_a);
+ break;
+ }
+ }
+
+ obj[""] = tag;
+ var attrs = {};
+ var hasAttr = false;
+
+ var _iterator = _createForOfIteratorHelper(node.attributes),
+ _step;
+
+ try {
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
+ var _a2 = _step.value;
+ var name = _a2.name;
+
+ if (this.allowAttribute(node, name)) {
+ attrs[name] = _a2.value;
+ hasAttr = true;
+ }
+ }
+ } catch (err) {
+ _iterator.e(err);
+ } finally {
+ _iterator.f();
+ }
+
+ if (hasAttr) {
+ obj.a = attrs;
+
+ if (obj.a && obj.a.src && tag !== "SOURCE" && tag !== "IFRAME") {
+ this.optionallyAddAttribute("src", obj.a.src);
+ }
+ }
+
+ var children = [];
+
+ var _iterator2 = _createForOfIteratorHelper(node.childNodes),
+ _step2;
+
+ try {
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
+ var c = _step2.value;
+ var serialized = this.serializeNode(c, actions);
+
+ if (serialized) {
+ children.push(serialized);
+ }
+ }
+ } catch (err) {
+ _iterator2.e(err);
+ } finally {
+ _iterator2.f();
+ }
+
+ if (children.length > 0) {
+ obj.c = children;
+ }
+
+ if (node.scrollLeft || node.scrollTop) {
+ this.pushScrollAction(id, node, actions);
+ }
+
+ break;
+ }
+
+ case Node.TEXT_NODE:
+ case Node.CDATA_SECTION_NODE:
+ {
+ // Check if it's a child of a style node.
+ var parentNode = node.parentNode;
+
+ if (node.parentNode && parentNode.tagName && parentNode.tagName === "STYLE" && parentNode.ownerDocument) {
+ var styleSheets = parentNode.ownerDocument.styleSheets;
+
+ if (styleSheets) {
+ for (var i = 0; i < styleSheets.length; i++) {
+ var styleSheet = styleSheets[i];
+
+ if (styleSheet.ownerNode && styleSheet.ownerNode.ReplayRecID && parentNode.ReplayRecID === styleSheet.ownerNode.ReplayRecID) {
+ var cssRules = null;
+
+ if (styleSheet.cssRules) {
+ cssRules = styleSheet.cssRules;
+ } else if (styleSheet.rules) {
+ cssRules = styleSheet.rules;
+ }
+
+ if (cssRules) {
+ var cssTextContent = "";
+
+ for (var cssRuleItem in cssRules) {
+ if (cssRules[cssRuleItem].cssText) {
+ cssTextContent += cssRules[cssRuleItem].cssText;
+ }
+ }
+
+ obj.d = cssTextContent;
+ }
+ }
+ }
+ }
+ } // Simply pass the data of the text.
+
+
+ var data = node.data;
+
+ if (data.length > 0 && !obj.d) {
+ obj.d = data;
+ }
+
+ break;
+ }
+
+ case Node.PROCESSING_INSTRUCTION_NODE:
+ case Node.COMMENT_NODE:
+ break;
+
+ default:
+ delete node.ReplayRecID;
+ throw new Error("Bad node ".concat(node));
+ }
+
+ return obj;
+ }
+ }, {
+ key: "delay",
+ value: function delay(seconds) {
+ this.lastActionTime -= seconds * 1000;
+ }
+ }, {
+ key: "deleteAllReplayRecIDs",
+ value: function deleteAllReplayRecIDs(e) {
+ delete e.ReplayRecID;
+ var listener = e.ownerDocument.ReplayRecInner.scrollListener;
+ e.removeEventListener("scroll", listener, {
+ passive: true
+ });
+
+ for (var c = e.firstChild; c; c = c.nextSibling) {
+ if (c.ReplayRecID) {
+ this.deleteAllReplayRecIDs(c);
+ }
+ }
+ }
+ }, {
+ key: "optionallyAddAttribute",
+ value: function optionallyAddAttribute(name, value) {
+ if (name === "src" && value) {
+ var url = value;
+
+ if (url.indexOf("data") !== 0) {
+ this.resourcesToResolve[url] = "--";
+ }
+ }
+ }
+ }, {
+ key: "appendAction",
+ value: function appendAction(action) {
+ this.actions.push(action);
+ var self = this;
+ setTimeout(function () {
+ self.actionsSize += gleapRoughSizeOfObject(action);
+ }, 0);
+ }
+ }, {
+ key: "callback",
+ value: function callback(records, // eslint-disable-next-line @typescript-eslint/no-unused-vars
+ observer) {
+ var now = Date.now();
+
+ if (now > this.lastActionTime) {
+ var a = {};
+ a[REPLAYREC_DELAY] = now - this.lastActionTime;
+ this.appendAction(a);
+ }
+
+ this.lastActionTime = Date.now();
+
+ try {
+ var _iterator3 = _createForOfIteratorHelper(records),
+ _step3;
+
+ try {
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
+ var r = _step3.value;
+
+ if (r.target.ReplayRecID && r.type === "childList") {
+ var _iterator5 = _createForOfIteratorHelper(r.removedNodes),
+ _step5;
+
+ try {
+ for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
+ var child = _step5.value;
+ var childID = child.ReplayRecID;
+
+ if (!childID) {
+ continue;
+ }
+
+ var _a4 = {};
+ _a4[REPLAYREC_REMOVE] = childID;
+ this.appendAction(_a4);
+ this.deleteAllReplayRecIDs(child);
+ }
+ } catch (err) {
+ _iterator5.e(err);
+ } finally {
+ _iterator5.f();
+ }
+ }
+ }
+ } catch (err) {
+ _iterator3.e(err);
+ } finally {
+ _iterator3.f();
+ }
+
+ var nodesWithAddedChildren = [];
+
+ var _iterator4 = _createForOfIteratorHelper(records),
+ _step4;
+
+ try {
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
+ var _r = _step4.value;
+ var target = _r.target;
+ var id = target.ReplayRecID;
+
+ if (!id) {
+ continue;
+ } // eslint-disable-next-line default-case
+
+
+ switch (_r.type) {
+ case "attributes":
+ {
+ var attributeName = _r.attributeName;
+
+ if (this.allowAttribute(target, attributeName)) {
+ var _a5 = {};
+ _a5[REPLAYREC_ATTR] = [id, attributeName, target.getAttribute(attributeName)];
+
+ if (target.tagName !== "SOURCE") {
+ this.optionallyAddAttribute(attributeName, target.getAttribute(attributeName));
+ }
+
+ this.appendAction(_a5);
+ }
+
+ break;
+ }
+
+ case "characterData":
+ {
+ var _a6 = {};
+
+ if (target.nodeType === Node.TEXT_NODE) {
+ _a6[REPLAYREC_TEXT] = [id, target.data];
+ }
+
+ this.appendAction(_a6);
+ break;
+ }
+
+ case "childList":
+ {
+ if (_r.addedNodes.length > 0 && !target.ReplayRecNodesAdded) {
+ target.ReplayRecNodesAdded = true;
+ nodesWithAddedChildren.push(target);
+ }
+ }
+ }
+ }
+ } catch (err) {
+ _iterator4.e(err);
+ } finally {
+ _iterator4.f();
+ }
+
+ for (var _i = 0, _nodesWithAddedChildr = nodesWithAddedChildren; _i < _nodesWithAddedChildr.length; _i++) {
+ var node = _nodesWithAddedChildr[_i];
+ delete node.ReplayRecNodesAdded;
+
+ for (var c = node.lastChild; c; c = c.previousSibling) {
+ if (c.ReplayRecID) {
+ continue;
+ }
+
+ var _a3 = {};
+ var actions = [];
+ var serializedNode = this.serializeNode(c, actions);
+
+ if (!serializedNode) {
+ continue;
+ }
+
+ var nextSibling = c.nextSibling;
+ _a3[REPLAYREC_ADD] = [node.ReplayRecID, nextSibling ? nextSibling.ReplayRecID : null, serializedNode, actions];
+ this.appendAction(_a3);
+ }
+ }
+ } catch (ex) {
+ throw ex;
+ }
+ }
+ }]);
+
+ return ReplayRecorder;
+}();
+
+
+;// CONCATENATED MODULE: ./src/ScreenDrawer.js
+function ScreenDrawer_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function ScreenDrawer_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function ScreenDrawer_createClass(Constructor, protoProps, staticProps) { if (protoProps) ScreenDrawer_defineProperties(Constructor.prototype, protoProps); if (staticProps) ScreenDrawer_defineProperties(Constructor, staticProps); return Constructor; }
+
+function ScreenDrawer_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+
+var ScreenDrawer = /*#__PURE__*/function () {
+ function ScreenDrawer(rerender) {
+ var _this = this;
+
+ ScreenDrawer_classCallCheck(this, ScreenDrawer);
+
+ ScreenDrawer_defineProperty(this, "rerender", void 0);
+
+ ScreenDrawer_defineProperty(this, "svgElement", null);
+
+ ScreenDrawer_defineProperty(this, "path", null);
+
+ ScreenDrawer_defineProperty(this, "strPath", void 0);
+
+ ScreenDrawer_defineProperty(this, "strokeWidth", 12);
+
+ ScreenDrawer_defineProperty(this, "strokeWidthRect", 6);
+
+ ScreenDrawer_defineProperty(this, "bufferSize", 4);
+
+ ScreenDrawer_defineProperty(this, "buffer", []);
+
+ ScreenDrawer_defineProperty(this, "startPoint", null);
+
+ ScreenDrawer_defineProperty(this, "tool", "rect");
+
+ ScreenDrawer_defineProperty(this, "color", "#EB144C");
+
+ ScreenDrawer_defineProperty(this, "mouseDown", null);
+
+ ScreenDrawer_defineProperty(this, "mouseMove", null);
+
+ ScreenDrawer_defineProperty(this, "mouseUp", null);
+
+ ScreenDrawer_defineProperty(this, "resizeListener", null);
+
+ ScreenDrawer_defineProperty(this, "pathBuffer", []);
+
+ var self = this;
+ this.rerender = rerender;
+ this.svgElement = document.querySelector(".bb-capture-svg");
+ this.svgElement.style.minHeight = "".concat(document.documentElement.scrollHeight, "px"); // Window resize listener.
+
+ this.resizeListener = function (e) {
+ self.svgElement.style.minHeight = "".concat(document.documentElement.scrollHeight, "px");
+ };
+
+ window.addEventListener("resize", this.resizeListener, true);
+
+ this.mouseDown = function (e) {
+ e.preventDefault();
+ var colorpicker = document.querySelector(".bb-capture-toolbar-item-colorpicker");
+
+ if (colorpicker) {
+ colorpicker.style.display = "none";
+ }
+
+ self.fadeOutToolbar();
+
+ if (self.tool === "pen" || self.tool === "blur") {
+ self.mouseDownPen(e);
+ }
+
+ if (self.tool === "rect") {
+ self.mouseDownRect(e);
+ }
+ };
+
+ this.mouseMove = function (e) {
+ e.preventDefault();
+
+ if (self.tool === "pen" || self.tool === "blur") {
+ self.mouseMovePen(e);
+ }
+
+ if (self.tool === "rect") {
+ self.mouseMoveRect(e);
+ }
+ };
+
+ this.mouseUp = function (e) {
+ e.preventDefault();
+ self.fadeInToolbar();
+
+ if (self.tool === "pen" || self.tool === "blur") {
+ self.mouseUpPen(e);
+ }
+
+ if (self.tool === "rect") {
+ self.mouseUpRect(e);
+ }
+ };
+
+ this.svgElement.addEventListener("mousedown", this.mouseDown);
+ this.svgElement.addEventListener("mousemove", this.mouseMove);
+ this.svgElement.addEventListener("mouseup", this.mouseUp);
+ this.svgElement.addEventListener("touchstart", this.mouseDown, false);
+ this.svgElement.addEventListener("touchmove", this.mouseMove, false);
+ this.svgElement.addEventListener("touchend", this.mouseUp, false);
+ setTimeout(function () {
+ _this.rerender();
+ }, 100);
+ }
+
+ ScreenDrawer_createClass(ScreenDrawer, [{
+ key: "clear",
+ value: function clear() {
+ if (this.svgElement) {
+ while (this.svgElement.firstChild) {
+ this.svgElement.firstChild.remove();
+ }
+ }
+ }
+ }, {
+ key: "destroy",
+ value: function destroy() {
+ this.svgElement.removeEventListener("mousedown", this.mouseDown);
+ this.svgElement.removeEventListener("mousemove", this.mouseMove);
+ this.svgElement.removeEventListener("mouseup", this.mouseUp);
+ this.svgElement.removeEventListener("touchstart", this.mouseDown);
+ this.svgElement.removeEventListener("touchmove", this.mouseMove);
+ this.svgElement.removeEventListener("touchend", this.mouseUp);
+ window.removeEventListener("resize", this.resizeListener);
+ }
+ }, {
+ key: "mouseUpPen",
+ value: function mouseUpPen() {
+ if (this.path) {
+ this.path = null;
+ }
+ }
+ }, {
+ key: "mouseUpRect",
+ value: function mouseUpRect() {
+ if (this.path) {
+ this.path = null;
+ }
+ }
+ }, {
+ key: "mouseMovePen",
+ value: function mouseMovePen(e) {
+ if (this.path) {
+ this.appendToBuffer(this.getMousePosition(e));
+ this.updateSvgPath();
+ }
+ }
+ }, {
+ key: "mouseMoveRect",
+ value: function mouseMoveRect(e) {
+ if (this.path) {
+ var p = this.getMousePosition(e);
+ var w = Math.abs(p.x - this.startPoint.x);
+ var h = Math.abs(p.y - this.startPoint.y);
+ var x = p.x;
+ var y = p.y;
+
+ if (p.x > this.startPoint.x) {
+ x = this.startPoint.x;
+ }
+
+ if (p.y > this.startPoint.y) {
+ y = this.startPoint.y;
+ }
+
+ this.path.setAttributeNS(null, "x", x);
+ this.path.setAttributeNS(null, "y", y);
+ this.path.setAttributeNS(null, "width", w);
+ this.path.setAttributeNS(null, "height", h);
+ }
+ }
+ }, {
+ key: "mouseDownRect",
+ value: function mouseDownRect(e) {
+ this.path = document.createElementNS("http://www.w3.org/2000/svg", "rect");
+ this.path.setAttribute("fill", "none");
+ this.path.setAttribute("stroke", this.color);
+ this.path.setAttribute("stroke-linecap", "round");
+ this.path.setAttribute("stroke-width", this.strokeWidthRect);
+ this.startPoint = this.getMousePosition(e);
+ this.appendPathToSvg(this.path);
+ }
+ }, {
+ key: "mouseDownPen",
+ value: function mouseDownPen(e) {
+ var color = this.color + "AA";
+ var strokeWidth = this.strokeWidth;
+
+ if (this.tool === "blur") {
+ color = "#000000";
+ strokeWidth = 40;
+ }
+
+ this.path = document.createElementNS("http://www.w3.org/2000/svg", "path");
+ this.path.setAttribute("fill", "none");
+ this.path.setAttribute("stroke", color);
+ this.path.setAttribute("stroke-linecap", "round");
+ this.path.setAttribute("stroke-width", strokeWidth);
+ this.buffer = [];
+ var pt = this.getMousePosition(e);
+ this.appendToBuffer(pt);
+ this.strPath = "M" + pt.x + " " + pt.y;
+ this.path.setAttribute("d", this.strPath);
+ this.appendPathToSvg(this.path);
+ }
+ }, {
+ key: "setTool",
+ value: function setTool(tool) {
+ this.tool = tool;
+ }
+ }, {
+ key: "setColor",
+ value: function setColor(color) {
+ this.color = color;
+ }
+ }, {
+ key: "getMousePosition",
+ value: function getMousePosition(e) {
+ if (e.touches && e.touches.length > 0) {
+ return {
+ x: e.touches[0].pageX,
+ y: e.touches[0].pageY
+ };
+ }
+
+ return {
+ x: e.pageX,
+ y: e.pageY
+ };
+ } // Calculate the average point, starting at offset in the buffer
+
+ }, {
+ key: "getAveragePoint",
+ value: function getAveragePoint(offset) {
+ var len = this.buffer.length;
+
+ if (len % 2 === 1 || len >= this.bufferSize) {
+ var totalX = 0;
+ var totalY = 0;
+ var pt, i;
+ var count = 0;
+
+ for (i = offset; i < len; i++) {
+ count++;
+ pt = this.buffer[i];
+ totalX += pt.x;
+ totalY += pt.y;
+ }
+
+ return {
+ x: totalX / count,
+ y: totalY / count
+ };
+ }
+
+ return null;
+ }
+ }, {
+ key: "updateSvgPath",
+ value: function updateSvgPath() {
+ var pt = this.getAveragePoint(0);
+
+ if (pt) {
+ // Get the smoothed part of the path that will not change
+ this.strPath += " L" + pt.x + " " + pt.y; // Get the last part of the path (close to the current mouse position)
+ // This part will change if the mouse moves again
+
+ var tmpPath = "";
+
+ for (var offset = 2; offset < this.buffer.length; offset += 2) {
+ pt = this.getAveragePoint(offset);
+ tmpPath += " L" + pt.x + " " + pt.y;
+ } // Set the complete current path coordinates
+
+
+ this.path.setAttribute("d", this.strPath + tmpPath);
+ }
+ }
+ }, {
+ key: "appendToBuffer",
+ value: function appendToBuffer(pt) {
+ this.buffer.push(pt);
+
+ while (this.buffer.length > this.bufferSize) {
+ this.buffer.shift();
+ }
+ }
+ }, {
+ key: "appendPathToSvg",
+ value: function appendPathToSvg(path) {
+ this.svgElement.appendChild(path);
+ this.pathBuffer.push(path);
+ this.rerender();
+ }
+ }, {
+ key: "removeLastAddedPathFromSvg",
+ value: function removeLastAddedPathFromSvg() {
+ if (this.pathBuffer.length <= 0 || !this.svgElement) {
+ return;
+ }
+
+ this.svgElement.removeChild(this.pathBuffer[this.pathBuffer.length - 1]);
+ this.pathBuffer.pop();
+ this.rerender();
+ }
+ }, {
+ key: "fadeOutToolbar",
+ value: function fadeOutToolbar() {
+ var fadeTarget = document.querySelector(".bb-capture-toolbar");
+
+ if (fadeTarget) {
+ fadeTarget.style.opacity = 0;
+ fadeTarget.style.pointerEvents = "none";
+ }
+ }
+ }, {
+ key: "fadeInToolbar",
+ value: function fadeInToolbar() {
+ var fadeTarget = document.querySelector(".bb-capture-toolbar");
+
+ if (fadeTarget) {
+ fadeTarget.style.opacity = 1;
+ fadeTarget.style.pointerEvents = "auto";
+ }
+ }
+ }]);
+
+ return ScreenDrawer;
+}();
+;// CONCATENATED MODULE: ./src/ScrollStopper.js
+function ScrollStopper_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function ScrollStopper_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function ScrollStopper_createClass(Constructor, protoProps, staticProps) { if (protoProps) ScrollStopper_defineProperties(Constructor.prototype, protoProps); if (staticProps) ScrollStopper_defineProperties(Constructor, staticProps); return Constructor; }
+
+function ScrollStopper_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+
+var ScrollStopper = /*#__PURE__*/function () {
+ function ScrollStopper() {
+ ScrollStopper_classCallCheck(this, ScrollStopper);
+
+ ScrollStopper_defineProperty(this, "keys", {
+ 37: 1,
+ 38: 1,
+ 39: 1,
+ 40: 1
+ });
+
+ ScrollStopper_defineProperty(this, "supportsPassive", false);
+
+ ScrollStopper_defineProperty(this, "wheelOpt", this.supportsPassive ? {
+ passive: false
+ } : false);
+
+ ScrollStopper_defineProperty(this, "wheelEvent", "onwheel" in document.createElement("div") ? "wheel" : "mousewheel");
+
+ ScrollStopper_defineProperty(this, "scrollDisabled", false);
+
+ var self = this;
+
+ try {
+ window.addEventListener("test", null, Object.defineProperty({}, "passive", {
+ get: function get() {
+ self.supportsPassive = true;
+ self.wheelOpt = self.supportsPassive ? {
+ passive: false
+ } : false;
+ }
+ }));
+ } catch (e) {}
+ }
+
+ ScrollStopper_createClass(ScrollStopper, [{
+ key: "preventDefault",
+ value: function preventDefault(e) {
+ e.preventDefault();
+ }
+ }, {
+ key: "preventDefaultForScrollKeys",
+ value: function preventDefaultForScrollKeys(e) {
+ if (this.keys && this.keys[e.keyCode]) {
+ this.preventDefault(e);
+ return false;
+ }
+ }
+ }], [{
+ key: "getInstance",
+ value: // ScrollStopper singleton
+ function getInstance() {
+ if (!this.instance) {
+ this.instance = new ScrollStopper();
+ return this.instance;
+ } else {
+ return this.instance;
+ }
+ }
+ }, {
+ key: "disableScroll",
+ value: function disableScroll() {
+ var instance = this.getInstance();
+
+ if (instance.scrollDisabled) {
+ return;
+ }
+
+ instance.scrollDisabled = true;
+ window.addEventListener("DOMMouseScroll", instance.preventDefault, false); // older FF
+
+ window.addEventListener(instance.wheelEvent, instance.preventDefault, instance.wheelOpt); // modern desktop
+
+ window.addEventListener("touchmove", instance.preventDefault, instance.wheelOpt); // mobile
+
+ window.addEventListener("keydown", instance.preventDefaultForScrollKeys, false);
+ }
+ }, {
+ key: "enableScroll",
+ value: function enableScroll() {
+ var instance = this.getInstance();
+
+ if (!instance.scrollDisabled) {
+ return;
+ }
+
+ instance.scrollDisabled = false;
+ window.removeEventListener("DOMMouseScroll", instance.preventDefault, false);
+ window.removeEventListener(instance.wheelEvent, instance.preventDefault, instance.wheelOpt);
+ window.removeEventListener("touchmove", instance.preventDefault, instance.wheelOpt);
+ window.removeEventListener("keydown", instance.preventDefaultForScrollKeys, false);
+ }
+ }]);
+
+ return ScrollStopper;
+}();
+
+ScrollStopper_defineProperty(ScrollStopper, "instance", void 0);
+;// CONCATENATED MODULE: ./src/Session.js
+function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
+
+function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { Session_defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
+
+function Session_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Session_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Session_createClass(Constructor, protoProps, staticProps) { if (protoProps) Session_defineProperties(Constructor.prototype, protoProps); if (staticProps) Session_defineProperties(Constructor, staticProps); return Constructor; }
+
+function Session_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+
+
+
+
+var Session = /*#__PURE__*/function () {
+ function Session() {
+ var _this = this;
+
+ Session_classCallCheck(this, Session);
+
+ Session_defineProperty(this, "apiUrl", "https://api.gleap.io");
+
+ Session_defineProperty(this, "widgetUrl", "https://widget.gleap.io");
+
+ Session_defineProperty(this, "sdkKey", null);
+
+ Session_defineProperty(this, "session", {
+ gleapId: null,
+ gleapHash: null,
+ name: "",
+ email: "",
+ userId: ""
+ });
+
+ Session_defineProperty(this, "ready", false);
+
+ Session_defineProperty(this, "onSessionReadyListener", []);
+
+ Session_defineProperty(this, "setOnSessionReady", function (onSessionReady) {
+ if (_this.ready) {
+ onSessionReady();
+ } else {
+ _this.onSessionReadyListener.push(onSessionReady);
+ }
+ });
+
+ Session_defineProperty(this, "injectSession", function (http) {
+ if (http && _this.session) {
+ http.setRequestHeader("Api-Token", _this.sdkKey);
+ http.setRequestHeader("Gleap-Id", _this.session.gleapId);
+ http.setRequestHeader("Gleap-Hash", _this.session.gleapHash);
+ }
+ });
+
+ Session_defineProperty(this, "clearSession", function () {
+ var renewSession = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
+
+ try {
+ localStorage.removeItem("bb-remember-reportedBy");
+ saveToGleapCache("session-".concat(_this.sdkKey), null);
+ } catch (exp) {}
+
+ _this.session = {
+ id: null,
+ hash: null,
+ type: null,
+ name: "",
+ email: ""
+ }; // Start guest session.
+
+ if (renewSession) {
+ _this.startSession();
+ }
+ });
+
+ Session_defineProperty(this, "validateSession", function (session) {
+ if (!session) {
+ return;
+ }
+
+ saveToGleapCache("session-".concat(_this.sdkKey), session);
+ _this.session = session;
+ _this.ready = true; // Optionally update UI.
+
+ var userNameInfo = document.querySelector("#bb-user-name");
+
+ if (userNameInfo) {
+ if (session.name && src_Gleap.getInstance().showUserName) {
+ userNameInfo.textContent = session.name;
+ } else {
+ userNameInfo.textContent = "";
+ }
+ }
+
+ _this.notifySessionReady();
+ });
+
+ Session_defineProperty(this, "startSession", function () {
+ // Check if session is already ready.
+ var cachedSession = loadFromGleapCache("session-".concat(_this.sdkKey));
+
+ if (cachedSession) {
+ _this.validateSession(cachedSession);
+ }
+
+ var self = _this;
+ var http = new XMLHttpRequest();
+ http.open("POST", self.apiUrl + "/sessions");
+ http.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
+ http.setRequestHeader("Api-Token", self.sdkKey);
+
+ try {
+ if (_this.session && _this.session.gleapId && _this.session.gleapHash) {
+ http.setRequestHeader("Gleap-Id", _this.session.gleapId);
+ http.setRequestHeader("Gleap-Hash", _this.session.gleapHash);
+ }
+
+ http.setRequestHeader("App-Widget", src_Gleap.getInstance().widgetOnly);
+ } catch (exp) {}
+
+ http.onerror = function (error) {
+ self.clearSession(false);
+ };
+
+ http.onreadystatechange = function (e) {
+ if (http.readyState === XMLHttpRequest.DONE) {
+ if (http.status === 200 || http.status === 201) {
+ try {
+ var sessionData = JSON.parse(http.responseText);
+ self.validateSession(sessionData);
+ } catch (exp) {}
+ } else {
+ self.clearSession(false);
+ }
+ }
+ };
+
+ http.send(JSON.stringify({}));
+ });
+
+ Session_defineProperty(this, "checkIfSessionNeedsUpdate", function (userId, userData) {
+ if (!_this.session || !_this.session.userId || !userId) {
+ return true;
+ }
+
+ try {
+ if (_this.session.userId.toString() !== userId.toString()) {
+ return true;
+ }
+ } catch (exp) {}
+
+ if (userData) {
+ var userDataKeys = Object.keys(userData);
+
+ for (var i = 0; i < userDataKeys.length; i++) {
+ var userDataKey = userDataKeys[i];
+
+ if (_this.session[userDataKey] !== userData[userDataKey]) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ });
+
+ Session_defineProperty(this, "identifySession", function (userId, userData) {
+ if (!_this.checkIfSessionNeedsUpdate(userId, userData)) {
+ return;
+ }
+
+ var self = _this;
+ return new Promise(function (resolve, reject) {
+ // Wait for gleap session to be ready.
+ _this.setOnSessionReady(function () {
+ if (!self.session.gleapId || !self.session.gleapHash) {
+ return reject();
+ }
+
+ var http = new XMLHttpRequest();
+ http.open("POST", self.apiUrl + "/sessions/identify");
+ http.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
+ http.setRequestHeader("Api-Token", self.sdkKey);
+
+ try {
+ http.setRequestHeader("Gleap-Id", self.session.gleapId);
+ http.setRequestHeader("Gleap-Hash", self.session.gleapHash);
+ } catch (exp) {}
+
+ http.onerror = function () {
+ reject();
+ };
+
+ http.onreadystatechange = function (e) {
+ if (http.readyState === XMLHttpRequest.DONE) {
+ if (http.status === 200 || http.status === 201) {
+ try {
+ var sessionData = JSON.parse(http.responseText);
+ self.validateSession(sessionData);
+ resolve(sessionData);
+ } catch (exp) {
+ reject(exp);
+ }
+ } else {
+ self.clearSession(true);
+ reject();
+ }
+ }
+ };
+
+ http.send(JSON.stringify(_objectSpread(_objectSpread({}, userData), {}, {
+ userId: userId
+ })));
+ });
+ });
+ });
+ }
+
+ Session_createClass(Session, [{
+ key: "notifySessionReady",
+ value: function notifySessionReady() {
+ if (this.onSessionReadyListener.length > 0) {
+ for (var i = 0; i < this.onSessionReadyListener.length; i++) {
+ this.onSessionReadyListener[i]();
+ }
+ }
+
+ this.onSessionReadyListener = [];
+ }
+ }], [{
+ key: "getInstance",
+ value: // Session singleton
+ function getInstance() {
+ if (!this.instance) {
+ this.instance = new Session();
+ return this.instance;
+ } else {
+ return this.instance;
+ }
+ }
+ }]);
+
+ return Session;
+}();
+
+Session_defineProperty(Session, "instance", void 0);
+
+
+;// CONCATENATED MODULE: ./src/ScreenRecorder.js
+function ScreenRecorder_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function ScreenRecorder_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function ScreenRecorder_createClass(Constructor, protoProps, staticProps) { if (protoProps) ScreenRecorder_defineProperties(Constructor.prototype, protoProps); if (staticProps) ScreenRecorder_defineProperties(Constructor, staticProps); return Constructor; }
+
+function ScreenRecorder_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+
+
+var ScreenRecorder = /*#__PURE__*/function () {
+ function ScreenRecorder(rerender, permissionErrorText) {
+ var _this = this;
+
+ ScreenRecorder_classCallCheck(this, ScreenRecorder);
+
+ ScreenRecorder_defineProperty(this, "rerender", void 0);
+
+ ScreenRecorder_defineProperty(this, "stream", void 0);
+
+ ScreenRecorder_defineProperty(this, "mediaRecorder", void 0);
+
+ ScreenRecorder_defineProperty(this, "audioMuted", false);
+
+ ScreenRecorder_defineProperty(this, "audioAvailable", true);
+
+ ScreenRecorder_defineProperty(this, "available", true);
+
+ ScreenRecorder_defineProperty(this, "isRecording", false);
+
+ ScreenRecorder_defineProperty(this, "file", null);
+
+ ScreenRecorder_defineProperty(this, "maxRecordTime", 180);
+
+ ScreenRecorder_defineProperty(this, "recordTime", 0);
+
+ ScreenRecorder_defineProperty(this, "recordingTimer", null);
+
+ ScreenRecorder_defineProperty(this, "permissionErrorText", "");
+
+ ScreenRecorder_defineProperty(this, "startScreenRecording", function () {
+ var self = this;
+
+ if (!navigator.mediaDevices || !navigator.mediaDevices.getDisplayMedia || this.isRecording) {
+ this.available = false;
+ this.rerender();
+ return;
+ }
+
+ navigator.mediaDevices.getDisplayMedia({
+ video: true,
+ audio: true
+ }).then(function (displayStream) {
+ self.stream = displayStream;
+
+ if (!self.audioMuted) {
+ self.startAudioRecording();
+ } else {
+ self.audioAvailable = false;
+ self.handleRecord({
+ stream: displayStream
+ });
+ }
+
+ self.rerender();
+ })["catch"](function (err) {
+ window.alert(self.permissionErrorText);
+ self.rerender();
+ });
+ });
+
+ ScreenRecorder_defineProperty(this, "stopScreenRecording", function () {
+ if (!this.mediaRecorder || !this.stream || !this.isRecording) {
+ return;
+ }
+
+ if (this.recordingTimer) {
+ clearInterval(this.recordingTimer);
+ this.recordingTimer = null;
+ }
+
+ this.mediaRecorder.stop();
+ this.stream.getTracks().forEach(function (track) {
+ track.stop();
+ });
+ this.rerender();
+ });
+
+ ScreenRecorder_defineProperty(this, "startAudioRecording", function () {
+ var self = this;
+
+ if (!this.stream) {
+ return;
+ }
+
+ navigator.mediaDevices.getUserMedia({
+ audio: true,
+ video: false
+ }).then(function (voiceStream) {
+ for (var i = 0; i < voiceStream.getAudioTracks().length; i++) {
+ self.stream.addTrack(voiceStream.getAudioTracks()[i]);
+ }
+
+ self.audioMuted = false;
+ self.audioAvailable = true;
+ self.handleRecord({
+ stream: self.stream
+ });
+ self.rerender();
+ })["catch"](function (audioErr) {
+ self.audioAvailable = false;
+ self.handleRecord({
+ stream: self.stream
+ });
+ self.rerender();
+ });
+ });
+
+ ScreenRecorder_defineProperty(this, "toggleAudio", function () {
+ this.audioMuted = !this.audioMuted;
+ this.rerender();
+
+ if (!this.stream) {
+ return;
+ }
+
+ var audioTracks = this.stream.getAudioTracks();
+
+ for (var i = 0; i < audioTracks.length; i++) {
+ var audioTrack = audioTracks[i];
+ audioTrack.enabled = !this.audioMuted;
+ }
+ });
+
+ ScreenRecorder_defineProperty(this, "clearPreview", function () {
+ document.querySelector(".bb-capture-preview video").src = null;
+ this.file = null;
+ this.rerender();
+ });
+
+ ScreenRecorder_defineProperty(this, "handleRecord", function (_ref) {
+ var stream = _ref.stream,
+ _ref$mimeType = _ref.mimeType,
+ mimeType = _ref$mimeType === void 0 ? "video/mp4" : _ref$mimeType;
+ var self = this;
+ var recordedChunks = [];
+ this.mediaRecorder = new MediaRecorder(stream);
+ this.isRecording = true;
+ this.recordTime = 0; // Set timer.
+
+ var timerLabel = document.querySelector(".bb-capture-toolbar-item-timer");
+ this.recordingTimer = setInterval(function () {
+ self.recordTime++;
+ var remainingTime = self.maxRecordTime - self.recordTime;
+
+ if (remainingTime > 0) {
+ timerLabel.innerHTML = self.formatTime(remainingTime);
+ } else {
+ timerLabel.innerHTML = "3:00";
+ self.stopScreenRecording();
+ }
+ }, 1000);
+
+ this.mediaRecorder.ondataavailable = function (e) {
+ if (e.data.size > 0) {
+ recordedChunks.push(e.data);
+ }
+ };
+
+ stream.getVideoTracks()[0].onended = function () {
+ self.prepareRecording(recordedChunks, mimeType);
+ };
+
+ this.mediaRecorder.onstop = function () {
+ self.prepareRecording(recordedChunks, mimeType);
+ };
+
+ this.mediaRecorder.start(200); // here 200ms is interval of chunk collection
+
+ self.rerender();
+ });
+
+ ScreenRecorder_defineProperty(this, "prepareRecording", function (recordedChunks, mimeType) {
+ var completeBlob = new Blob(recordedChunks, {
+ type: mimeType
+ });
+ this.file = new File([completeBlob], "screen-recording.mp4", {
+ type: "video/mp4"
+ });
+ var previewVideoElement = document.querySelector(".bb-capture-preview video");
+
+ if (previewVideoElement) {
+ previewVideoElement.src = URL.createObjectURL(completeBlob);
+ this.audioAvailable = true;
+ this.isRecording = false;
+ this.rerender();
+ }
+ });
+
+ this.rerender = rerender;
+ this.permissionErrorText = permissionErrorText;
+
+ if (!navigator.mediaDevices || !navigator.mediaDevices.getDisplayMedia) {
+ this.available = false;
+ }
+
+ setTimeout(function () {
+ _this.rerender();
+ }, 100);
+ }
+
+ ScreenRecorder_createClass(ScreenRecorder, [{
+ key: "formatTime",
+ value: function formatTime(s) {
+ return (s - (s %= 60)) / 60 + (9 < s ? ":" : ":0") + s;
+ }
+ }]);
+
+ return ScreenRecorder;
+}();
+
+ScreenRecorder_defineProperty(ScreenRecorder, "uploadScreenRecording", function (screenRecordingData) {
+ return new Promise(function (resolve, reject) {
+ if (screenRecordingData == null) {
+ resolve(null);
+ }
+
+ var xhr = new XMLHttpRequest();
+ xhr.open("POST", Session.getInstance().apiUrl + "/uploads/sdk");
+ Session.getInstance().injectSession(xhr);
+ var formdata = new FormData();
+ formdata.append("file", screenRecordingData);
+ xhr.send(formdata);
+
+ xhr.onerror = function () {
+ reject();
+ };
+
+ xhr.onreadystatechange = function () {
+ if (xhr.readyState == 4) {
+ if (xhr.status == 200) {
+ resolve(JSON.parse(xhr.response).fileUrl);
+ } else {
+ reject();
+ }
+ }
+ };
+ });
+});
+;// CONCATENATED MODULE: ./src/MarkerManager.js
+function MarkerManager_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function MarkerManager_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function MarkerManager_createClass(Constructor, protoProps, staticProps) { if (protoProps) MarkerManager_defineProperties(Constructor.prototype, protoProps); if (staticProps) MarkerManager_defineProperties(Constructor, staticProps); return Constructor; }
+
+function MarkerManager_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+
+
+
+
+
+
+
+
+var MarkerManager = /*#__PURE__*/function () {
+ function MarkerManager(type) {
+ MarkerManager_classCallCheck(this, MarkerManager);
+
+ MarkerManager_defineProperty(this, "type", "screenshot");
+
+ MarkerManager_defineProperty(this, "dragCursor", null);
+
+ MarkerManager_defineProperty(this, "screenRecorder", null);
+
+ MarkerManager_defineProperty(this, "callback", null);
+
+ MarkerManager_defineProperty(this, "screenDrawer", null);
+
+ MarkerManager_defineProperty(this, "escListener", null);
+
+ MarkerManager_defineProperty(this, "pageLeaveListener", null);
+
+ MarkerManager_defineProperty(this, "overrideLanguage", src_Gleap.getInstance().overrideLanguage);
+
+ MarkerManager_defineProperty(this, "showNextStep", function () {
+ // Adapt the UI
+ this.showWidgetUI();
+
+ if (this.callback) {
+ this.callback(true);
+ }
+ });
+
+ this.type = type;
+ }
+
+ MarkerManager_createClass(MarkerManager, [{
+ key: "hideWidgetUI",
+ value: function hideWidgetUI() {
+ var feedbackButton = document.querySelector(".bb-feedback-button");
+
+ if (feedbackButton) {
+ feedbackButton.style.display = "none";
+ }
+
+ var dialogUI = document.querySelector(".bb-feedback-dialog-container");
+
+ if (dialogUI) {
+ dialogUI.style.display = "none";
+ }
+ }
+ }, {
+ key: "showWidgetUI",
+ value: function showWidgetUI() {
+ if (this.type === "screenshot") {
+ ScrollStopper.enableScroll();
+ } // Stop screenrecording.
+
+
+ if (this.screenRecorder) {
+ this.screenRecorder.stopScreenRecording();
+ } // Unregister ESC listener
+
+
+ this.unregisterListeners(); // Cleanup mouse pointer
+
+ this.cleanupMousePointer();
+
+ if (this.screenDrawer) {
+ this.screenDrawer.destroy();
+ } // Remove the toolbar UI
+
+
+ var dialog = document.querySelector(".bb-capture-toolbar");
+
+ if (dialog) {
+ dialog.remove();
+ } // Remove the preview UI
+
+
+ var videoPreviewContainer = document.querySelector(".bb-capture-preview");
+
+ if (videoPreviewContainer) {
+ videoPreviewContainer.remove();
+ } // Feedback button
+
+
+ var feedbackButton = document.querySelector(".bb-feedback-button");
+
+ if (feedbackButton) {
+ feedbackButton.style.display = "flex";
+ } // Feedback dialog container
+
+
+ var dialogUI = document.querySelector(".bb-feedback-dialog-container");
+
+ if (dialogUI) {
+ dialogUI.style.display = "block";
+ } // Dismiss button
+
+
+ var dismissUI = document.querySelector(".bb-capture-dismiss");
+
+ if (dismissUI) {
+ dismissUI.style.display = "none";
+ } // Hide the color picker
+
+
+ var colorPicker = document.querySelector(".bb-capture-toolbar-item-colorpicker");
+
+ if (colorPicker) {
+ colorPicker.style.display = "none";
+ } // Border layer
+
+
+ var borderLayer = document.querySelector(".bb-capture-editor-borderlayer");
+
+ if (borderLayer) {
+ borderLayer.style.display = "none";
+ }
+ }
+ }, {
+ key: "clear",
+ value: function clear() {
+ var captureEditor = document.querySelector(".bb-capture-editor");
+
+ if (captureEditor) {
+ captureEditor.remove();
+ }
+ }
+ }, {
+ key: "setMouseMove",
+ value: function setMouseMove(x, y) {
+ if (!this.dragCursor) {
+ return;
+ }
+
+ this.dragCursor.style.left = "".concat(x + 6, "px");
+ this.dragCursor.style.top = "".concat(y - 26, "px");
+ this.dragCursor.style.right = null;
+ }
+ }, {
+ key: "mouseMoveEventHandler",
+ value: function mouseMoveEventHandler(e) {
+ var x = e.pageX - document.documentElement.scrollLeft;
+ var y = e.pageY - document.documentElement.scrollTop;
+ this.setMouseMove(x, y);
+ }
+ }, {
+ key: "touchMoveEventHandler",
+ value: function touchMoveEventHandler(e) {
+ var x = e.touches[0].pageX - document.documentElement.scrollLeft;
+ var y = e.touches[0].pageY - document.documentElement.scrollTop;
+ this.setMouseMove(x, y);
+ }
+ }, {
+ key: "setupMousePointer",
+ value: function setupMousePointer() {
+ var self = this;
+ this.dragCursor = document.querySelector(".bb-capture-editor-drag-info");
+ var captureSVG = document.querySelector(".bb-capture-svg");
+ captureSVG.addEventListener("mouseenter", function (e) {
+ self.dragCursor.style.opacity = 1;
+ });
+ captureSVG.addEventListener("mouseleave", function (e) {
+ self.dragCursor.style.opacity = 0;
+ });
+ document.documentElement.addEventListener("mousemove", this.mouseMoveEventHandler.bind(this));
+ document.documentElement.addEventListener("touchmove", this.touchMoveEventHandler.bind(this));
+ }
+ }, {
+ key: "cleanupMousePointer",
+ value: function cleanupMousePointer() {
+ document.documentElement.removeEventListener("mousemove", this.mouseMoveEventHandler);
+ document.documentElement.removeEventListener("touchmove", this.touchMoveEventHandler);
+
+ if (this.dragCursor) {
+ this.dragCursor.remove();
+ }
+ }
+ }, {
+ key: "createEditorUI",
+ value: function createEditorUI() {
+ // Add HTML for drawing and recording
+ var bugReportingEditor = document.createElement("div");
+ bugReportingEditor.className = "bb-capture-editor";
+ bugReportingEditor.innerHTML = "\n \n \n ".concat(loadIcon("dismiss"), "
\n ").concat(loadIcon("rect"), "
\n \n \n \n ");
+ src_Gleap.appendNode(bugReportingEditor);
+ }
+ }, {
+ key: "unregisterListeners",
+ value: function unregisterListeners() {
+ if (this.escListener) {
+ document.removeEventListener("keydown", this.escListener);
+ }
+
+ if (this.pageLeaveListener) {
+ window.removeEventListener("beforeunload", this.pageLeaveListener);
+ } // Register Gleap listener.
+
+
+ src_Gleap.getInstance().registerEscListener();
+ }
+ }, {
+ key: "registerListeners",
+ value: function registerListeners() {
+ var self = this; // Esc listener
+
+ this.escListener = function (evt) {
+ evt = evt || window.event;
+ var isEscape = false;
+ var isEnter = false;
+
+ if ("key" in evt) {
+ isEscape = evt.key === "Escape" || evt.key === "Esc";
+ isEnter = evt.key === "Enter";
+ } else {
+ isEscape = evt.keyCode === 27;
+ isEnter = evt.keyCode === 13;
+ }
+
+ if (isEscape) {
+ self.dismiss();
+ }
+
+ if (self.type === "screenshot" && isEnter) {
+ self.showNextStep();
+ }
+ };
+
+ document.addEventListener("keydown", this.escListener); // Page leave listener
+
+ this.pageLeaveListener = function (event) {
+ event.preventDefault();
+ event.returnValue = "";
+ };
+
+ window.addEventListener("beforeunload", this.pageLeaveListener); // Unregister Gleap listener.
+
+ src_Gleap.getInstance().unregisterEscListener();
+ }
+ }, {
+ key: "show",
+ value: function show(callback) {
+ this.callback = callback;
+ var self = this;
+ this.registerListeners(); // Hide widget UI
+
+ this.hideWidgetUI(); // Create the editor UI
+
+ this.createEditorUI(); // Setup the mouse pointer
+
+ this.setupMousePointer(); // Setup screenshot data
+
+ if (this.type === "screenshot") {
+ // Overwrite snapshot position
+ src_Gleap.getInstance().snapshotPosition = {
+ x: window.scrollX,
+ y: window.scrollY
+ }; // Disable scroll
+
+ ScrollStopper.disableScroll();
+ } else {
+ // Setup screen recording
+ this.setupScreenRecording();
+ } // Hook up the drawing.
+
+
+ this.screenDrawer = new ScreenDrawer(this.captureScreenDrawerRerender.bind(this));
+ this.setupColorPicker();
+ this.setupToolbar();
+ }
+ }, {
+ key: "setupColorPicker",
+ value: function setupColorPicker() {
+ var self = this;
+ var selectedColor = document.querySelector(".bb-capture-toolbar-item-selectedcolor");
+ var colorItems = document.querySelectorAll(".bb-capture-toolbar-item-color");
+ var colorpicker = document.querySelector(".bb-capture-toolbar-item-colorpicker");
+
+ var _loop = function _loop() {
+ var colorItem = colorItems[i];
+ var hexColor = colorItem.getAttribute("data-color");
+ colorItem.style.backgroundColor = hexColor;
+
+ colorItem.onclick = function () {
+ if (colorItem) {
+ self.screenDrawer.setColor(hexColor);
+
+ if (colorpicker) {
+ colorpicker.style.display = "none";
+ }
+
+ selectedColor.style.backgroundColor = colorItem.style.backgroundColor;
+ MarkerManager.setPenColor(hexColor);
+ }
+ };
+ };
+
+ for (var i = 0; i < colorItems.length; i++) {
+ _loop();
+ }
+ }
+ }, {
+ key: "dismiss",
+ value: function dismiss() {
+ this.showWidgetUI();
+
+ if (this.callback) {
+ this.callback(false);
+ }
+ }
+ }, {
+ key: "setupToolbar",
+ value: function setupToolbar() {
+ var self = this; // Hook up dismiss button
+
+ var dismissButton = document.querySelector(".bb-capture-dismiss");
+
+ dismissButton.onclick = function () {
+ self.dismiss();
+ }; // Hook up send button
+
+
+ var nextButton = document.querySelector(".bb-capture-button-next");
+
+ if (nextButton) {
+ nextButton.onclick = this.showNextStep.bind(this);
+ }
+
+ var colorpicker = document.querySelector(".bb-capture-toolbar-item-colorpicker"); // Capture SVG ref
+
+ var captureSVG = document.querySelector(".bb-capture-svg"); // Setup toolbar items
+
+ var toolbarItems = document.querySelectorAll(".bb-capture-toolbar-item");
+
+ var _loop2 = function _loop2() {
+ var toolbarItem = toolbarItems[i];
+
+ toolbarItem.onclick = function () {
+ var type = toolbarItem.getAttribute("data-type");
+
+ if (colorpicker && type !== "colorpicker") {
+ colorpicker.style.display = "none";
+ } // Mic & recording buttons
+
+
+ if (type === "mic") {
+ self.screenRecorder.toggleAudio();
+ }
+
+ if (type === "recording") {
+ if (self.screenRecorder.isRecording) {
+ self.screenRecorder.stopScreenRecording();
+ } else {
+ self.screenRecorder.startScreenRecording();
+ }
+ } // Marker buttons
+
+
+ if (self.type === "capture" && !self.screenRecorder.isRecording) {
+ // Inactivate buttons.
+ return;
+ }
+
+ if (type === "pen" || type === "blur" || type === "rect" || type === "pointer") {
+ var toolbarTools = document.querySelectorAll(".bb-capture-toolbar-item-tool");
+
+ for (var j = 0; j < toolbarTools.length; j++) {
+ toolbarTools[j].classList.remove("bb-capture-toolbar-item--active");
+ }
+
+ toolbarItem.classList.add("bb-capture-toolbar-item--active");
+ self.screenDrawer.setTool(type);
+ self.dragCursor.innerHTML = "";
+
+ if (type === "pointer") {
+ captureSVG.style.pointerEvents = "none";
+ } else {
+ captureSVG.style.pointerEvents = "auto";
+
+ try {
+ var svgClone = toolbarItem.querySelector("svg").cloneNode(true);
+
+ if (svgClone && self.dragCursor) {
+ self.dragCursor.appendChild(svgClone);
+ }
+ } catch (exp) {}
+ }
+ }
+
+ if (type === "colorpicker") {
+ if (colorpicker.style.display === "flex") {
+ colorpicker.style.display = "none";
+ } else {
+ colorpicker.style.display = "flex";
+ }
+ }
+
+ if (type === "undo") {
+ self.screenDrawer.removeLastAddedPathFromSvg();
+ }
+ };
+ };
+
+ for (var i = 0; i < toolbarItems.length; i++) {
+ _loop2();
+ }
+ }
+ }, {
+ key: "captureScreenDrawerRerender",
+ value: function captureScreenDrawerRerender() {
+ if (!this.screenDrawer) {
+ return;
+ }
+
+ var itemInactiveClass = "bb-capture-editor-item-inactive";
+ var toolbarItems = document.querySelectorAll(".bb-capture-toolbar-item");
+
+ for (var i = 0; i < toolbarItems.length; i++) {
+ var toolbarItem = toolbarItems[i];
+ var type = toolbarItem.getAttribute("data-type");
+
+ switch (type) {
+ case "undo":
+ if (this.screenDrawer.pathBuffer != null && this.screenDrawer.pathBuffer.length > 0) {
+ toolbarItem.classList.remove(itemInactiveClass);
+ } else {
+ toolbarItem.classList.add(itemInactiveClass);
+ }
+
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+ }, {
+ key: "captureRenderer",
+ value: function captureRenderer() {
+ if (!this.screenRecorder) {
+ return;
+ }
+
+ if (this.screenRecorder.file) {
+ src_Gleap.getInstance().screenRecordingData = this.screenRecorder.file;
+ }
+
+ var itemInactiveClass = "bb-capture-editor-item-inactive";
+ var timerLabel = document.querySelector(".bb-capture-toolbar-item-timer");
+ var toolbarItems = document.querySelectorAll(".bb-capture-toolbar-item");
+ var screenRecordingTooltip = document.querySelector(".bb-tooltip-screen-recording");
+ var audioRecordingTooltip = document.querySelector(".bb-tooltip-audio-recording");
+ var captureEditor = document.querySelector(".bb-capture-editor");
+ var recordingClass = "bb-capture-editor-recording";
+ var notRecordingClass = "bb-capture-editor-notrecording";
+
+ if (this.screenRecorder.isRecording) {
+ captureEditor.classList.add(recordingClass);
+ captureEditor.classList.remove(notRecordingClass);
+ } else {
+ captureEditor.classList.add(notRecordingClass);
+ captureEditor.classList.remove(recordingClass);
+ } // Update UI.
+
+
+ var dialog = document.querySelector(".bb-capture-toolbar");
+ var videoPreviewContainer = document.querySelector(".bb-capture-preview");
+ videoPreviewContainer.style.display = this.screenRecorder.file ? "flex" : "none";
+ dialog.style.display = !this.screenRecorder.file ? "flex" : "none";
+
+ for (var i = 0; i < toolbarItems.length; i++) {
+ var toolbarItem = toolbarItems[i];
+ var type = toolbarItem.getAttribute("data-type");
+
+ switch (type) {
+ case "mic":
+ if (this.screenRecorder.audioAvailable && this.screenRecorder.available) {
+ toolbarItem.classList.remove(itemInactiveClass);
+
+ if (!this.screenRecorder.audioMuted) {
+ toolbarItem.classList.remove("bb-capture-toolbar-item--inactivecross");
+ audioRecordingTooltip.innerHTML = translateText("Mute", this.overrideLanguage);
+ } else {
+ toolbarItem.classList.add("bb-capture-toolbar-item--inactivecross");
+ audioRecordingTooltip.innerHTML = translateText("Unmute", this.overrideLanguage);
+ }
+ } else {
+ toolbarItem.classList.add(itemInactiveClass);
+ toolbarItem.classList.add("bb-capture-toolbar-item--inactivecross");
+ audioRecordingTooltip.innerHTML = translateText("Browser not supported", this.overrideLanguage);
+ }
+
+ break;
+
+ case "recording":
+ if (this.screenRecorder.available) {
+ toolbarItem.classList.remove(itemInactiveClass);
+
+ if (this.screenRecorder.isRecording) {
+ toolbarItem.setAttribute("data-active", "true");
+ screenRecordingTooltip.innerHTML = translateText("Stop recording", this.overrideLanguage);
+ timerLabel.style.display = "block";
+ } else {
+ toolbarItem.setAttribute("data-active", "false");
+ screenRecordingTooltip.innerHTML = translateText("Start recording", this.overrideLanguage);
+ timerLabel.style.display = "none";
+ }
+ } else {
+ // Recording is not available.
+ toolbarItem.classList.add(itemInactiveClass);
+ screenRecordingTooltip.innerHTML = translateText("Browser not supported", this.overrideLanguage);
+ }
+
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+ }, {
+ key: "setupScreenRecording",
+ value: function setupScreenRecording() {
+ var self = this; // Hook preview next button
+
+ var nextButtonPreview = document.querySelector(".bb-capture-preview-sendbutton");
+ nextButtonPreview.onclick = this.showNextStep.bind(this); // Hook retry button
+
+ var retryButton = document.querySelector(".bb-capture-preview-retrybutton");
+
+ retryButton.onclick = function () {
+ self.screenRecorder.clearPreview();
+
+ if (self.screenDrawer) {
+ self.screenDrawer.clear();
+ }
+ }; // Setup screen recorder
+
+
+ this.screenRecorder = new ScreenRecorder(this.captureRenderer.bind(this), translateText("You denied access to screen sharing. Please turn it on in your browser settings.", this.overrideLanguage));
+ }
+ }], [{
+ key: "setPenColor",
+ value: function setPenColor(hexColor) {
+ var penTips = document.querySelectorAll(".bb-pen-tip");
+
+ for (var j = 0; j < penTips.length; j++) {
+ penTips[j].style.fill = hexColor;
+ }
+ }
+ }]);
+
+ return MarkerManager;
+}();
+
+
+;// CONCATENATED MODULE: ./src/FeedbackForm.js
+
+
+
+
+var formPageClass = "bb-feedback-formpage";
+
+var getTitleHTML = function getTitleHTML(title, overrideLanguage, required) {
+ if (title === undefined) {
+ return "";
+ }
+
+ return "".concat(translateText(title, overrideLanguage)).concat(required ? "*" : "", "
");
+};
+
+var getDescriptionHTML = function getDescriptionHTML(description, overrideLanguage) {
+ if (description === undefined || description.length === 0) {
+ return "";
+ }
+
+ return "".concat(translateText(description, overrideLanguage), "
");
+};
+
+var getFormPageClass = function getFormPageClass(formPage) {
+ if (formPage === undefined) {
+ return "";
+ }
+
+ return "".concat(formPageClass, " ").concat(formPageClass, "-").concat(formPage);
+};
+
+var renderButtonsForPage = function renderButtonsForPage(currentPage, totalPages, overrideLanguage) {
+ var lastButton = currentPage === totalPages - 1;
+ return "");
+};
+
+var isTypeAutoNext = function isTypeAutoNext(type) {
+ if (type === "rating" || type === "onetofive") {
+ return true;
+ }
+
+ return false;
+};
+
+var buildForm = function buildForm(feedbackOptions, overrideLanguage) {
+ var form = feedbackOptions.form;
+ var formHTML = "";
+
+ for (var i = 0; i < form.length; i++) {
+ var formItem = form[i];
+
+ if (!formItem) {
+ break;
+ } // Determine current page.
+
+
+ var currentPage = formItem.page;
+ var formItemData = "bb-form-page=\"".concat(currentPage, "\" bb-form-item=\"").concat(encodeURIComponent(JSON.stringify(formItem)), "\"");
+
+ if (formItem.type === "text") {
+ formHTML += "\n ").concat(getDescriptionHTML(formItem.description, overrideLanguage), "\n ").concat(getTitleHTML(formItem.title, overrideLanguage, formItem.required), "\n \n
");
+ }
+
+ if (formItem.type === "capture") {
+ formHTML += "");
+ }
+
+ if (formItem.type === "upload") {
+ var acceptAttribute = "";
+
+ if (formItem.restrictions && formItem.restrictions.length > 0) {
+ acceptAttribute = "accept=\"".concat(formItem.restrictions, "\"");
+ }
+
+ formHTML += "");
+ }
+
+ if (formItem.type === "textarea") {
+ formHTML += "\n ").concat(getDescriptionHTML(formItem.description, overrideLanguage), "\n ").concat(getTitleHTML(formItem.title, overrideLanguage, formItem.required), "\n \n
");
+ }
+
+ if (formItem.type === "privacypolicy") {
+ formHTML += "");
+ }
+
+ if (formItem.type === "rating") {
+ formHTML += "\n ").concat(getDescriptionHTML(formItem.description, overrideLanguage), "\n ").concat(getTitleHTML(formItem.title, overrideLanguage, formItem.required), "\n
\n
\n - \n
\n \n \n \n
\n \n - \n
\n \n \n \n
\n \n - \n \n
\n - \n
\n \n \n \n
\n \n - \n
\n \n \n
\n \n
\n
\n
");
+ }
+
+ if (formItem.type === "onetofive") {
+ var getNumberButtonHTML = function getNumberButtonHTML(formItem, number) {
+ return "").concat(number, "
");
+ };
+
+ formHTML += "\n ").concat(getDescriptionHTML(formItem.description, overrideLanguage), "\n ").concat(getTitleHTML(formItem.title, overrideLanguage, formItem.required), "\n
\n
\n ").concat(getNumberButtonHTML(formItem, 1), "\n ").concat(getNumberButtonHTML(formItem, 2), "\n ").concat(getNumberButtonHTML(formItem, 3), "\n ").concat(getNumberButtonHTML(formItem, 4), "\n ").concat(getNumberButtonHTML(formItem, 5), "\n
\n
").concat(translateText(formItem.lowestValueLabel, overrideLanguage), "").concat(translateText(formItem.highestValueLabel, overrideLanguage), "
\n
");
+ }
+
+ if (formItem.type === "multiplechoice" && formItem.choices && formItem.choices.length > 0) {
+ var getOptionHTML = function getOptionHTML(formItem, value) {
+ return "");
+ };
+
+ var optionHTML = "";
+
+ if (formItem.randomizeChoices) {
+ formItem.choices = shuffle(formItem.choices);
+ }
+
+ for (var j = 0; j < formItem.choices.length; j++) {
+ optionHTML += getOptionHTML(formItem, formItem.choices[j]);
+ }
+
+ formHTML += "\n ").concat(getDescriptionHTML(formItem.description, overrideLanguage), "\n ").concat(getTitleHTML(formItem.title, overrideLanguage, formItem.required), "\n \n ").concat(optionHTML, "\n
");
+ }
+
+ if ((form[i + 1] && form[i + 1].page !== currentPage || i + 1 === form.length) && !isTypeAutoNext(formItem.type)) {
+ formHTML += renderButtonsForPage(currentPage, feedbackOptions.pages, overrideLanguage);
+ }
+ }
+
+ return formHTML;
+};
+
+function shuffle(array) {
+ var currentIndex = array.length,
+ randomIndex;
+
+ while (currentIndex != 0) {
+ randomIndex = Math.floor(Math.random() * currentIndex);
+ currentIndex--;
+ var _ref = [array[randomIndex], array[currentIndex]];
+ array[currentIndex] = _ref[0];
+ array[randomIndex] = _ref[1];
+ }
+
+ return array;
+}
+
+var getFormData = function getFormData(form) {
+ var formData = {};
+
+ for (var i = 0; i < form.length; i++) {
+ var formItem = form[i];
+ var formElement = document.querySelector(".bb-feedback-".concat(formItem.name));
+
+ if (formElement && formElement.value) {
+ formData[formItem.name] = formElement.value;
+ }
+ }
+
+ return formData;
+};
+var rememberForm = function rememberForm(form) {
+ for (var i = 0; i < form.length; i++) {
+ var formItem = form[i];
+
+ if (formItem.remember) {
+ var formElement = document.querySelector(".bb-feedback-".concat(formItem.name));
+
+ if (formElement && formElement.value) {
+ try {
+ localStorage.setItem("bb-remember-".concat(formItem.name), formElement.value);
+ } catch (exp) {}
+ }
+ }
+ }
+};
+
+var validateEmail = function validateEmail(email) {
+ var re = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
+ return re.test(String(email).toLowerCase());
+};
+
+var validateFormItem = function validateFormItem(formItem) {
+ var shouldShowError = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
+ var valid = true;
+ var formElement = document.querySelector(".bb-feedback-".concat(formItem.name));
+
+ if (!formElement) {
+ return false;
+ }
+
+ var formElementDirtyFlag = formElement.getAttribute("bb-dirty");
+ var showError = shouldShowError && formElementDirtyFlag === "true";
+
+ if ((formItem.type === "text" || formItem.type === "textarea") && formItem.required) {
+ if (!formElement.value || formElement.value === "") {
+ showError && formElement.classList.add("bb-feedback-required");
+ valid = false;
+ } else {
+ formElement.classList.remove("bb-feedback-required");
+ }
+ }
+
+ if (formItem.type === "text" && formItem.inputtype === "email" && formItem.required) {
+ if (!validateEmail(formElement.value)) {
+ showError && formElement.classList.add("bb-feedback-required");
+ valid = false;
+ } else {
+ formElement.classList.remove("bb-feedback-required");
+ }
+ }
+
+ if (formItem.type === "upload" && formItem.required) {
+ if (!formElement.value || formElement.value === "") {
+ showError && formElement.parentElement.classList.add("bb-feedback-required");
+ valid = false;
+ } else {
+ formElement.parentElement.classList.remove("bb-feedback-required");
+ }
+ }
+
+ if (formItem.type === "rating" && formItem.required) {
+ if (!formElement.value || formElement.value === "") {
+ showError && formElement.parentElement.classList.add("bb-feedback-required");
+ valid = false;
+ } else {
+ formElement.parentElement.classList.remove("bb-feedback-required");
+ }
+ }
+
+ if (formItem.type === "onetofive" && formItem.required) {
+ if (!formElement.value || formElement.value === "") {
+ showError && formElement.parentElement.classList.add("bb-feedback-required");
+ valid = false;
+ } else {
+ formElement.parentElement.classList.remove("bb-feedback-required");
+ }
+ }
+
+ if (formItem.type === "multiplechoice" && formItem.required) {
+ if (!formElement.value || formElement.value === "") {
+ showError && formElement.parentElement.classList.add("bb-feedback-required");
+ valid = false;
+ } else {
+ formElement.parentElement.classList.remove("bb-feedback-required");
+ }
+ }
+
+ if (formItem.type === "privacypolicy" && formItem.required) {
+ if (!formElement.checked) {
+ showError && formElement.parentElement.classList.add("bb-feedback-required");
+ valid = false;
+ } else {
+ formElement.parentElement.classList.remove("bb-feedback-required");
+ }
+ }
+
+ return valid;
+};
+
+var updateFormProgressBar = function updateFormProgressBar(currentPage, pages) {
+ var innerProgressBar = document.querySelector(".bb-form-progress-inner");
+
+ if (innerProgressBar && pages > 0) {
+ var progress = Math.round((currentPage + 1) / pages * 100);
+
+ if (progress > 100) {
+ progress = 100;
+ }
+
+ innerProgressBar.style.width = "".concat(progress, "%");
+ }
+};
+
+var handleNextFormStep = function handleNextFormStep(currentPage, pages, submitForm) {
+ if (!validateFormPage(currentPage)) {
+ return;
+ }
+
+ updateFormProgressBar(currentPage + 1, pages);
+
+ if (currentPage === pages - 1) {
+ submitForm();
+ } else {
+ showFormPage(currentPage + 1);
+ }
+};
+
+var showFormPage = function showFormPage(pageToShow) {
+ var formPagesToHide = document.querySelectorAll(".".concat(formPageClass));
+
+ for (var i = 0; i < formPagesToHide.length; i++) {
+ if (formPagesToHide[i]) {
+ formPagesToHide[i].style.display = "none";
+ }
+ }
+
+ var formPagesToShow = document.querySelectorAll(".".concat(formPageClass, "-").concat(pageToShow));
+
+ for (var i = 0; i < formPagesToShow.length; i++) {
+ if (formPagesToShow[i]) {
+ formPagesToShow[i].style.display = "flex";
+ }
+ }
+};
+
+var addDirtyFlagToFormElement = function addDirtyFlagToFormElement(formElement) {
+ formElement.setAttribute("bb-dirty", "true");
+};
+
+var hookForm = function hookForm(formOptions, submitForm, overrideLanguage) {
+ var form = formOptions.form;
+ var singlePageForm = formOptions.singlePageForm; // Hook up submit buttons
+
+ var sendButtons = document.querySelectorAll(".bb-feedback-send-button");
+
+ var _loop = function _loop() {
+ var sendButton = sendButtons[i];
+
+ sendButton.onclick = function () {
+ if (sendButton && sendButton.getAttribute("disabled") !== "true" && sendButton.getAttribute("bb-form-page")) {
+ var currentPage = parseInt(sendButton.getAttribute("bb-form-page"));
+ handleNextFormStep(currentPage, formOptions.pages, submitForm);
+ }
+ };
+ };
+
+ for (var i = 0; i < sendButtons.length; i++) {
+ _loop();
+ } // Hook up form
+
+
+ var _loop2 = function _loop2() {
+ var formItem = form[i];
+
+ if (!formItem) {
+ return "break";
+ }
+
+ var formInput = document.querySelector(".bb-feedback-".concat(formItem.name));
+
+ if (!formInput) {
+ return "break";
+ }
+
+ var currentPage = parseInt(formInput.getAttribute("bb-form-page"));
+
+ if (formItem.type === "text") {
+ if (formItem.remember && !(formItem.defaultValue && formItem.defaultValue.length > 0)) {
+ try {
+ var rememberedValue = localStorage.getItem("bb-remember-".concat(formItem.name));
+
+ if (rememberedValue) {
+ formInput.value = rememberedValue;
+ formItem.defaultValue = rememberedValue;
+ }
+ } catch (exp) {}
+ }
+
+ if (formItem.defaultValue) {
+ formInput.value = formItem.defaultValue;
+ } // Check if the email is valid.
+
+
+ if (!validateEmail(formItem.defaultValue)) {
+ formItem.defaultValue = "";
+ formInput.value = "";
+ }
+
+ if (formItem.defaultValue && formItem.defaultValue.length > 0 && formItem.hideOnDefaultSet) {
+ formInput.parentElement.classList.add("bb-feedback-form--hidden");
+ }
+
+ formInput.addEventListener("focusin", function () {
+ addDirtyFlagToFormElement(formInput);
+ });
+ formInput.addEventListener("focusout", function () {
+ validateFormPage(currentPage);
+ });
+
+ formInput.oninput = function () {
+ validateFormPage(currentPage, false);
+ };
+ }
+
+ if (formItem.type === "privacypolicy") {
+ formInput.onchange = function () {
+ addDirtyFlagToFormElement(formInput);
+ validateFormPage(currentPage);
+ };
+ }
+
+ if (formItem.type === "capture") {
+ (function () {
+ var captureItemsContainer = document.querySelector(".bb-feedback-capture-items");
+ var captureItems = document.querySelectorAll(".bb-feedback-capture-item");
+ var selectedItem = document.querySelector(".bb-feedback-capture-item-selected");
+ var selectedItemLabel = document.querySelector(".bb-feedback-capture-item-selected-label");
+ var selectedItemAction = document.querySelector(".bb-feedback-capture-item-selected-action");
+
+ var _loop3 = function _loop3() {
+ var captureItem = captureItems[j];
+ var type = captureItem.getAttribute("data-type");
+
+ captureItem.onclick = function () {
+ var manager = new MarkerManager(type);
+ manager.show(function (success) {
+ if (!success) {
+ manager.clear();
+ } else {
+ var actionLabel = "";
+
+ if (type === "screenshot") {
+ actionLabel = translateText("Screenshot", overrideLanguage);
+ } else {
+ actionLabel = translateText("Screen recording", overrideLanguage);
+ }
+
+ selectedItemLabel.innerHTML = actionLabel;
+ captureItemsContainer.style.display = "none";
+ selectedItem.style.display = "flex";
+
+ selectedItemAction.onclick = function () {
+ manager.clear();
+ captureItemsContainer.style.display = "flex";
+ selectedItem.style.display = "none";
+ };
+ }
+ });
+ };
+ };
+
+ for (j = 0; j < captureItems.length; j++) {
+ _loop3();
+ } // Wire autostart.
+
+
+ if (formItem.autostartDrawing) {
+ var captureButton = document.querySelector('.bb-feedback-capture-item[data-type="screenshot"]');
+
+ if (captureButton) {
+ captureButton.click();
+ }
+ }
+ })();
+ }
+
+ if (formItem.type === "upload") {
+ var formFileUploadInput = document.querySelector(".bb-form-fileupload-".concat(formItem.name));
+ var fileSizeInfo = document.querySelector(".bb-feedback-filesizeinfo-".concat(formItem.name));
+
+ if (formFileUploadInput) {
+ formFileUploadInput.addEventListener("change", function () {
+ addDirtyFlagToFormElement(formInput);
+ validateFormPage(currentPage);
+
+ if (fileSizeInfo) {
+ fileSizeInfo.style.display = "none";
+ }
+
+ if (formFileUploadInput.files && formFileUploadInput.files.length > 0) {
+ var file = formFileUploadInput.files[0];
+
+ if (file.size / 1024 / 1024 > 3) {
+ if (fileSizeInfo) {
+ fileSizeInfo.style.display = "block";
+ }
+
+ return;
+ }
+
+ var formData = new FormData();
+ formData.append("file", file);
+ var uploadLoader = document.querySelector(".bb-feedback-dialog-loading--".concat(formItem.name));
+
+ if (uploadLoader) {
+ uploadLoader.style.display = "flex";
+ formFileUploadInput.style.display = "none";
+ }
+
+ var xhr = new XMLHttpRequest();
+ xhr.open("POST", Session.getInstance().apiUrl + "/uploads/attachments");
+ Session.getInstance().injectSession(xhr);
+
+ xhr.upload.onprogress = function (e) {
+ if (e.lengthComputable) {
+ var percentComplete = parseInt(e.loaded / e.total * 100);
+ setLoadingIndicatorProgress(percentComplete, formItem.name);
+ }
+ };
+
+ xhr.onerror = function () {
+ if (uploadLoader) {
+ uploadLoader.style.display = "none";
+ }
+
+ formFileUploadInput.style.display = "block";
+ };
+
+ xhr.onreadystatechange = function () {
+ if (xhr.readyState == 4 && xhr.status == 200 && xhr.responseText) {
+ try {
+ var data = JSON.parse(xhr.responseText);
+
+ if (data.fileUrls && data.fileUrls.length > 0) {
+ formInput.value = data.fileUrls[0];
+
+ if (!singlePageForm) {
+ handleNextFormStep(currentPage, formOptions.pages, submitForm);
+ }
+ }
+ } catch (exp) {}
+
+ if (uploadLoader) {
+ uploadLoader.style.display = "none";
+ }
+
+ formFileUploadInput.style.display = "block";
+ }
+ };
+
+ xhr.send(formData);
+ }
+ });
+ }
+ }
+
+ if (formItem.type === "textarea") {
+ formInput.style.height = "inherit";
+ formInput.style.height = formInput.scrollHeight + "px";
+ formInput.addEventListener("focusin", function () {
+ addDirtyFlagToFormElement(formInput);
+ });
+
+ formInput.oninput = function () {
+ formInput.style.height = "inherit";
+ formInput.style.height = formInput.scrollHeight + "px";
+ validateFormPage(currentPage);
+ };
+ }
+
+ if (formItem.type === "rating") {
+ var ratingItems = document.querySelectorAll(".bb-feedback-rating-".concat(formItem.name, " .bb-feedback-emojigroup li"));
+
+ var _loop4 = function _loop4() {
+ var ratingItem = ratingItems[j];
+ ratingItem.addEventListener("click", function (e) {
+ if (!ratingItem) {
+ return;
+ }
+
+ formInput.value = ratingItem.getAttribute("data-value");
+ validateFormPage(currentPage);
+ var lastActiveItem = document.querySelector(".bb-feedback-rating-".concat(formItem.name, " .bb-feedback-emojigroup li.bb-feedback-active"));
+
+ if (lastActiveItem) {
+ lastActiveItem.classList.remove("bb-feedback-active");
+ }
+
+ ratingItem.classList.add("bb-feedback-active");
+ e.preventDefault();
+
+ if (!singlePageForm) {
+ handleNextFormStep(currentPage, formOptions.pages, submitForm);
+ }
+ });
+ };
+
+ for (j = 0; j < ratingItems.length; j++) {
+ _loop4();
+ }
+ }
+
+ if (formItem.type === "onetofive") {
+ var onetofiveItems = document.querySelectorAll(".bb-feedback-onetofive-".concat(formItem.name, " .bb-feedback-onetofive-button"));
+
+ var _loop5 = function _loop5() {
+ var onetofiveItem = onetofiveItems[j];
+ onetofiveItem.addEventListener("click", function (e) {
+ if (!onetofiveItem) {
+ return;
+ }
+
+ formInput.value = onetofiveItem.getAttribute("data-value");
+ validateFormPage(currentPage);
+ var lastActiveItem = document.querySelector(".bb-feedback-onetofive-".concat(formItem.name, " .bb-feedback-onetofive-button-active"));
+
+ if (lastActiveItem) {
+ lastActiveItem.classList.remove("bb-feedback-onetofive-button-active");
+ }
+
+ onetofiveItem.classList.add("bb-feedback-onetofive-button-active");
+ e.preventDefault();
+
+ if (!singlePageForm) {
+ handleNextFormStep(currentPage, formOptions.pages, submitForm);
+ }
+ });
+ };
+
+ for (j = 0; j < onetofiveItems.length; j++) {
+ _loop5();
+ }
+ }
+
+ if (formItem.type === "multiplechoice") {
+ var multiplechoiceItems = document.querySelectorAll(".bb-feedback-multiplechoice-".concat(formItem.name, " .bb-feedback-multiplechoice-container"));
+
+ var _loop6 = function _loop6() {
+ var multiplechoiceItem = multiplechoiceItems[j];
+ multiplechoiceItem.addEventListener("click", function (e) {
+ if (!multiplechoiceItem) {
+ return;
+ }
+
+ formInput.value = multiplechoiceItem.getAttribute("data-value");
+ validateFormPage(currentPage);
+ });
+ };
+
+ for (j = 0; j < multiplechoiceItems.length; j++) {
+ _loop6();
+ }
+ } // Validate form item initially.
+
+
+ validateFormPage(currentPage, false);
+ };
+
+ for (var i = 0; i < form.length; i++) {
+ var j;
+ var j;
+ var j;
+ var j;
+
+ var _ret = _loop2();
+
+ if (_ret === "break") break;
+ } // Show first page.
+
+
+ showFormPage(0);
+ updateFormProgressBar(0, formOptions.pages);
+};
+var validateFormPage = function validateFormPage(page) {
+ var showError = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
+ var formValid = true;
+ var formElementsToCheck = document.querySelectorAll("[bb-form-page=\"".concat(page, "\"]"));
+
+ for (var i = 0; i < formElementsToCheck.length; i++) {
+ var formElementToCheck = formElementsToCheck[i];
+
+ if (formElementToCheck && formElementToCheck.getAttribute("bb-form-item")) {
+ var formItem = JSON.parse(decodeURIComponent(formElementToCheck.getAttribute("bb-form-item")));
+
+ if (!validateFormItem(formItem, showError)) {
+ formValid = false;
+ }
+ }
+ }
+
+ var currentNextButton = document.querySelector(".bb-feedback-next-btn-".concat(page));
+
+ if (currentNextButton) {
+ if (!formValid) {
+ currentNextButton.setAttribute("disabled", "true");
+ currentNextButton.classList.add("bb-feedback-send-button--disabled");
+ } else {
+ currentNextButton.removeAttribute("disabled");
+ currentNextButton.classList.remove("bb-feedback-send-button--disabled");
+ }
+ }
+
+ return formValid;
+};
+;// CONCATENATED MODULE: ./src/UXDetectors.js
+var getSelectorFromTarget = function getSelectorFromTarget(target) {
+ var className = target.className !== "" ? "." + target.className : "";
+ var targetId = target.id !== "" ? "#" + target.id : "";
+ return [target.nodeName, className, targetId].join(" ");
+};
+
+var detectRageClicks = function detectRageClicks(subscribe, options) {
+ var interval = options.interval,
+ limit = options.limit;
+ var count = 1;
+ var countClear = setInterval(function () {
+ count = 1;
+ }, interval);
+
+ var listener = function listener(event) {
+ if (count === limit) {
+ subscribe(getSelectorFromTarget(event.target), function () {
+ clearInterval(countClear);
+ document.removeEventListener("click", listener);
+ });
+ }
+
+ count++;
+ };
+
+ document.addEventListener("click", listener);
+};
+
+var startRageClickDetector = function startRageClickDetector(callback) {
+ detectRageClicks(function (target, unsubscribe) {
+ callback(target);
+ }, {
+ interval: 750,
+ limit: 4
+ });
+};
+;// CONCATENATED MODULE: ./src/DrawingCanvas.js
+
+
+
+var createScreenshotEditor = function createScreenshotEditor(screenshot, onDone, onCancel, overrideLanguage, showBack) {
+ var elem = document.createElement("div");
+ elem.className = "bb-feedback-dialog-container";
+ elem.innerHTML = "");
+ document.body.appendChild(elem);
+ setTimeout(function () {
+ var drawingDialog = document.querySelector(".bb-feedback-dialog-drawing");
+
+ if (drawingDialog) {
+ drawingDialog.classList.remove("bb-anim-fadeinright");
+ }
+ }, 500);
+ var drawBack = document.querySelector(".bb-drawing-tool-back");
+ var canvas = document.getElementById("bb-screenshot-editor-canvas");
+ var ctx = canvas.getContext("2d");
+ var currentColor = "#EB144C";
+ var currentTool = "pen";
+ var baseImage = null;
+ var drawingStack = [];
+ var drawingHistory = [];
+
+ function getCanvasScale() {
+ return canvas.width / canvas.offsetWidth;
+ }
+
+ function updateDrawingTools() {
+ var scale = getCanvasScale();
+
+ if (currentTool === "pen") {
+ ctx.lineWidth = 8 * scale;
+ ctx.strokeStyle = currentColor;
+ ctx.lineCap = "round";
+ } else {
+ ctx.lineWidth = 34 * scale;
+ ctx.strokeStyle = "#000";
+ ctx.lineCap = "round";
+ }
+
+ drawingStack.push({
+ t: "t",
+ lw: ctx.lineWidth,
+ ss: ctx.strokeStyle
+ });
+ }
+
+ function validateBackButton() {
+ var disabled = "bb-drawing-tool-action--disabled";
+
+ if (drawingHistory.length > 0) {
+ drawBack.classList.remove(disabled);
+ } else {
+ drawBack.classList.add(disabled);
+ }
+ }
+
+ function drawBackAction() {
+ drawingHistory.pop(); // Redraw base image
+
+ ctx.drawImage(baseImage, 0, 0); // Replay
+
+ for (var i = 0; i < drawingHistory.length; i++) {
+ var steps = drawingHistory[i];
+
+ for (var j = 0; j < steps.length; j++) {
+ var step = steps[j];
+
+ if (step.t === "t") {
+ ctx.lineWidth = step.lw;
+ ctx.strokeStyle = step.ss;
+ ctx.lineCap = "round";
+ }
+
+ if (step.t === "m") {
+ ctx.beginPath();
+ ctx.lineTo(step.x, step.y);
+ }
+
+ if (step.t === "l") {
+ ctx.lineTo(step.x, step.y);
+ ctx.stroke();
+ }
+ }
+ } // Reset tools to current
+
+
+ updateDrawingTools(); // Update back button
+
+ validateBackButton();
+ }
+
+ var resizeCanvas = function resizeCanvas() {
+ // Calculate canvas scale.
+ var vw = Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0);
+ var vh = Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0);
+ var ratio = 0;
+ var maxWidth = Math.min(vw - 60, 700);
+ var maxHeight = Math.min(vh - 200, 700);
+ var width = canvas.width;
+ var height = canvas.height;
+
+ if (width > maxWidth) {
+ ratio = maxWidth / width;
+ height = height * ratio;
+ width = width * ratio;
+ }
+
+ if (height > maxHeight) {
+ ratio = maxHeight / height;
+ width = width * ratio;
+ height = height * ratio;
+ }
+
+ canvas.style.width = "".concat(width, "px");
+ canvas.style.height = "".concat(height, "px");
+ };
+
+ drawBack.addEventListener("click", function () {
+ drawBackAction();
+ });
+ var backButton = document.querySelector(".bb-feedback-dialog-header-back");
+ backButton.addEventListener("click", function () {
+ window.removeEventListener("resize", resizeCanvas);
+ onCancel();
+ });
+ var nextButton = document.querySelector(".bb-feedback-dialog-header-next");
+ nextButton.addEventListener("click", function () {
+ window.removeEventListener("resize", resizeCanvas);
+ onDone(canvas.toDataURL("image/png"));
+ });
+ var colorItem = document.getElementById("bb-drawing-color");
+ var colorPopup = document.getElementById("bb-drawing-colorpopup");
+ colorPopup.style.display = "none";
+ colorItem.addEventListener("click", function () {
+ if (colorPopup.style.display === "none") {
+ colorPopup.style.display = "flex";
+ } else {
+ colorPopup.style.display = "none";
+ }
+ }); // Prepare tools
+
+ var drawingItems = document.querySelectorAll(".bb-drawing-tool-item");
+
+ var selectTool = function selectTool(tool) {
+ var activeTool = "bb-drawing-tool-item--active";
+
+ for (var i = 0; i < drawingItems.length; i++) {
+ var drawingItem = drawingItems[i];
+ var drawingItemTool = drawingItem.getAttribute("data-tool");
+
+ if (drawingItemTool === tool) {
+ drawingItem.classList.add(activeTool);
+ } else {
+ drawingItem.classList.remove(activeTool);
+ }
+ }
+
+ currentTool = tool;
+ updateDrawingTools();
+ };
+
+ var _loop = function _loop() {
+ var drawingItem = drawingItems[i];
+ var tool = drawingItem.getAttribute("data-tool");
+ drawingItem.addEventListener("click", function () {
+ selectTool(tool);
+ });
+ };
+
+ for (var i = 0; i < drawingItems.length; i++) {
+ _loop();
+ } // Prepare drawing color.
+
+
+ var drawingColorActive = "bb-drawing-coloritem--active";
+ var drawingColors = document.querySelectorAll(".bb-drawing-coloritem");
+
+ var _loop2 = function _loop2() {
+ var drawingColor = drawingColors[i];
+ var color = drawingColor.getAttribute("data-color");
+ drawingColor.style.backgroundColor = color;
+ drawingColor.addEventListener("click", function () {
+ for (var j = 0; j < drawingColors.length; j++) {
+ drawingColors[j].classList.remove(drawingColorActive);
+ }
+
+ currentColor = color;
+ MarkerManager.setPenColor(color);
+ colorItem.style.backgroundColor = color;
+ drawingColor.classList.add(drawingColorActive);
+ selectTool("pen");
+ updateDrawingTools();
+ });
+ };
+
+ for (var i = 0; i < drawingColors.length; i++) {
+ _loop2();
+ } // Draw screenshot.
+
+
+ baseImage = new Image();
+
+ baseImage.onload = function () {
+ ctx.canvas.width = this.width;
+ ctx.canvas.height = this.height;
+ resizeCanvas();
+ ctx.drawImage(this, 0, 0);
+ updateDrawingTools();
+ };
+
+ baseImage.src = screenshot;
+ window.addEventListener("resize", resizeCanvas);
+ var isIdle = true;
+
+ function drawstart(event) {
+ var scale = getCanvasScale();
+ ctx.beginPath();
+ var x = (event.pageX - canvas.offsetLeft) * scale;
+ var y = (event.pageY - canvas.offsetTop) * scale;
+ ctx.lineTo(x, y);
+ drawingStack.push({
+ t: "m",
+ x: x,
+ y: y
+ });
+ isIdle = false;
+ }
+
+ function drawmove(event) {
+ if (isIdle) return;
+ var scale = getCanvasScale();
+ var x = (event.pageX - canvas.offsetLeft) * scale;
+ var y = (event.pageY - canvas.offsetTop) * scale;
+ ctx.lineTo(x, y);
+ ctx.stroke();
+ drawingStack.push({
+ t: "l",
+ x: x,
+ y: y
+ });
+ }
+
+ function drawend(event) {
+ if (isIdle) return;
+ drawmove(event);
+ drawingHistory.push(drawingStack);
+ drawingStack = [];
+ validateBackButton();
+ isIdle = true;
+ }
+
+ function touchstart(event) {
+ drawstart(event.touches[0]);
+ }
+
+ function touchmove(event) {
+ drawmove(event.touches[0]);
+ event.preventDefault();
+ }
+
+ function touchend(event) {
+ drawend(event.changedTouches[0]);
+ }
+
+ canvas.addEventListener("touchstart", touchstart, false);
+ canvas.addEventListener("touchmove", touchmove, false);
+ canvas.addEventListener("touchend", touchend, false);
+ canvas.addEventListener("mousedown", drawstart, false);
+ canvas.addEventListener("mousemove", drawmove, false);
+ canvas.addEventListener("mouseup", drawend, false);
+};
+;// CONCATENATED MODULE: ./src/StreamedEvent.js
+function StreamedEvent_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function StreamedEvent_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function StreamedEvent_createClass(Constructor, protoProps, staticProps) { if (protoProps) StreamedEvent_defineProperties(Constructor.prototype, protoProps); if (staticProps) StreamedEvent_defineProperties(Constructor, staticProps); return Constructor; }
+
+function StreamedEvent_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+
+
+
+
+var StreamedEvent = /*#__PURE__*/function () {
+ function StreamedEvent() {
+ var _this = this;
+
+ StreamedEvent_classCallCheck(this, StreamedEvent);
+
+ StreamedEvent_defineProperty(this, "eventArray", []);
+
+ StreamedEvent_defineProperty(this, "streamedEventArray", []);
+
+ StreamedEvent_defineProperty(this, "eventMaxLength", 500);
+
+ StreamedEvent_defineProperty(this, "lastUrl", undefined);
+
+ StreamedEvent_defineProperty(this, "startEventStream", function () {
+ var self = _this;
+ var interval = 1500;
+
+ if (Session.getInstance().ready && self.streamedEventArray && self.streamedEventArray.length > 0) {
+ self.streamEvents();
+ interval = 3000;
+ }
+
+ setTimeout(function () {
+ self.startEventStream();
+ }, interval);
+ });
+
+ StreamedEvent_defineProperty(this, "streamEvents", function () {
+ if (Session.getInstance().ready) {
+ var http = new XMLHttpRequest();
+ http.open("POST", Session.getInstance().apiUrl + "/sessions/stream");
+ http.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
+ Session.getInstance().injectSession(http);
+
+ http.onerror = function (error) {
+ Session.getInstance().clearSession(true);
+ };
+
+ http.onreadystatechange = function (e) {
+ if (http.readyState === XMLHttpRequest.DONE) {
+ if (http.status === 200 || http.status === 201) {
+ try {
+ var action = JSON.parse(http.responseText);
+ src_Gleap.getInstance().performAction(action);
+ } catch (exp) {}
+ } else {
+ Session.getInstance().clearSession(true);
+ }
+ }
+ };
+
+ http.send(JSON.stringify({
+ events: _this.streamedEventArray
+ }));
+ _this.streamedEventArray = [];
+ }
+ });
+ }
+
+ StreamedEvent_createClass(StreamedEvent, [{
+ key: "start",
+ value: function start() {
+ this.startEventStream();
+ this.startPageListener();
+ }
+ }, {
+ key: "startPageListener",
+ value: function startPageListener() {
+ this.logEvent("sessionStarted");
+ var self = this;
+ setInterval(function () {
+ var currentUrl = window.location.href;
+
+ if (currentUrl && currentUrl !== self.lastUrl) {
+ self.lastUrl = currentUrl;
+ self.logEvent("pageView", {
+ page: currentUrl
+ });
+ }
+ }, 1000);
+ }
+ }, {
+ key: "logEvent",
+ value: function logEvent(name, data) {
+ var log = {
+ name: name,
+ date: new Date()
+ };
+
+ if (data) {
+ log.data = gleapDataParser(data);
+ }
+
+ this.eventArray.push(log);
+ this.streamedEventArray.push(log); // Check max size of event log
+
+ if (this.eventArray.length > this.eventMaxLength) {
+ this.eventArray.shift();
+ } // Check max size of streamed event log
+
+
+ if (this.streamedEventArray.length > this.eventMaxLength) {
+ this.streamedEventArray.shift();
+ }
+ }
+ }], [{
+ key: "getInstance",
+ value: // Session singleton
+ function getInstance() {
+ if (!this.instance) {
+ this.instance = new StreamedEvent();
+ return this.instance;
+ } else {
+ return this.instance;
+ }
+ }
+ }]);
+
+ return StreamedEvent;
+}();
+
+StreamedEvent_defineProperty(StreamedEvent, "instance", void 0);
+
+
+;// CONCATENATED MODULE: ./src/AutoConfig.js
+function AutoConfig_typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { AutoConfig_typeof = function _typeof(obj) { return typeof obj; }; } else { AutoConfig_typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return AutoConfig_typeof(obj); }
+
+function AutoConfig_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function AutoConfig_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function AutoConfig_createClass(Constructor, protoProps, staticProps) { if (protoProps) AutoConfig_defineProperties(Constructor.prototype, protoProps); if (staticProps) AutoConfig_defineProperties(Constructor, staticProps); return Constructor; }
+
+function AutoConfig_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+
+
+
+
+
+var AutoConfig = /*#__PURE__*/function () {
+ function AutoConfig() {
+ AutoConfig_classCallCheck(this, AutoConfig);
+ }
+
+ AutoConfig_createClass(AutoConfig, null, [{
+ key: "applyConfig",
+ value:
+ /**
+ * Applies the Gleap config.
+ * @param {*} config
+ */
+ function applyConfig(config, soft) {
+ try {
+ var item;
+
+ var _ret = function () {
+ var flowConfig = config.flowConfig;
+ var projectActions = config.projectActions;
+
+ if (flowConfig.color) {
+ src_Gleap.setStyles({
+ primaryColor: flowConfig.color,
+ headerColor: flowConfig.headerColor,
+ buttonColor: flowConfig.buttonColor,
+ borderRadius: flowConfig.borderRadius,
+ backgroundColor: flowConfig.backgroundColor ? flowConfig.backgroundColor : "#FFFFFF"
+ });
+ } // If it's only a soft update, return here.
+
+
+ if (soft) {
+ return {
+ v: void 0
+ };
+ }
+
+ if (flowConfig.logo && flowConfig.logo.length > 0) {
+ src_Gleap.setLogoUrl(flowConfig.logo);
+ }
+
+ if (flowConfig.hideBranding) {
+ src_Gleap.enablePoweredBy();
+ }
+
+ if (flowConfig.enableReplays) {
+ src_Gleap.enableReplays(flowConfig.enableReplays);
+ }
+
+ src_Gleap.enableShortcuts(flowConfig.enableShortcuts ? true : false);
+
+ if (flowConfig.enableNetworkLogs) {
+ src_Gleap.enableNetworkLogger();
+ }
+
+ if (flowConfig.networkLogPropsToIgnore) {
+ src_Gleap.setNetworkLogFilters(flowConfig.networkLogPropsToIgnore);
+ }
+
+ if (!flowConfig.enableConsoleLogs) {
+ src_Gleap.disableConsoleLogOverwrite();
+ }
+
+ if (typeof flowConfig.enableCrashDetector !== "undefined" && flowConfig.enableCrashDetector) {
+ src_Gleap.enableCrashDetector(true, flowConfig.enableCrashDetector);
+ }
+
+ if (typeof flowConfig.enableRageClickDetector !== "undefined" && flowConfig.enableRageClickDetector) {
+ src_Gleap.enableRageClickDetector(flowConfig.rageClickDetectorIsSilent);
+ }
+
+ if (flowConfig.customTranslations) {
+ src_Gleap.setCustomTranslation(flowConfig.customTranslations);
+ }
+
+ if (typeof flowConfig.feedbackButtonPosition !== "undefined" && flowConfig.feedbackButtonPosition.length > 0) {
+ src_Gleap.setButtonType(flowConfig.feedbackButtonPosition);
+ }
+
+ if (typeof flowConfig.widgetButtonText !== "undefined" && flowConfig.widgetButtonText.length > 0) {
+ src_Gleap.setFeedbackButtonText(flowConfig.widgetButtonText);
+ }
+
+ if (typeof flowConfig.hideWavingHandAfterName !== "undefined" && flowConfig.hideWavingHandAfterName) {
+ src_Gleap.setWelcomeIcon("");
+ }
+
+ if (typeof flowConfig.hideUsersName !== "undefined" && flowConfig.hideUsersName) {
+ src_Gleap.setShowUserName(false);
+ }
+
+ if (flowConfig.widgetInfoTitle && flowConfig.widgetInfoTitle.length > 0) {
+ src_Gleap.setWidgetInfo({
+ title: flowConfig.widgetInfoTitle
+ });
+ }
+
+ if (flowConfig.widgetInfoSubtitle && flowConfig.widgetInfoSubtitle.length > 0) {
+ src_Gleap.setWidgetInfo({
+ subtitle: flowConfig.widgetInfoSubtitle
+ });
+ }
+
+ if (flowConfig.widgetInfoDialogSubtitle && flowConfig.widgetInfoDialogSubtitle.length > 0) {
+ src_Gleap.setWidgetInfo({
+ dialogSubtitle: flowConfig.widgetInfoDialogSubtitle
+ });
+ }
+
+ var instance = src_Gleap.getInstance();
+
+ if (flowConfig.enableMenu && flowConfig.menuItems && flowConfig.menuItems.length > 0) {
+ var menuItems = [];
+
+ var _loop = function _loop(i) {
+ var menuItem = flowConfig.menuItems[i];
+ var actionFlow = null;
+ var action = null;
+
+ if (menuItem.actionType === "OPEN_INTERCOM") {
+ action = function action() {
+ if (instance.widgetCallback) {
+ return;
+ }
+
+ if (typeof Intercom !== "undefined") {
+ Intercom("showNewMessage");
+ }
+ };
+ } else if (menuItem.actionType === "REDIRECT_URL") {
+ if (instance.widgetCallback) {
+ action = function action() {
+ instance.widgetCallback("openExternalURL", {
+ url: menuItem.actionBody
+ });
+ };
+ } else {
+ if (menuItem.actionOpenInNewTab) {
+ action = function action() {
+ window.open(menuItem.actionBody, "_blank").focus();
+ };
+ } else {
+ action = function action() {
+ window.location.href = menuItem.actionBody;
+ };
+ }
+ }
+ } else if (menuItem.actionType === "CUSTOM_ACTION") {
+ action = function action() {
+ src_Gleap.triggerCustomAction(menuItem.actionBody);
+ };
+ } else {
+ actionFlow = menuItem.actionType;
+ } // Action flow
+
+
+ if (actionFlow != null || action != null) {
+ item = {
+ title: menuItem.title,
+ description: menuItem.description,
+ icon: menuItem.icon,
+ color: menuItem.color
+ };
+
+ if (actionFlow) {
+ item["actionFlow"] = actionFlow;
+ }
+
+ if (action) {
+ item["action"] = action;
+ }
+
+ menuItems.push(item);
+ }
+ };
+
+ for (var i = 0; i < flowConfig.menuItems.length; i++) {
+ _loop(i);
+ }
+
+ src_Gleap.setMenuOptions(menuItems);
+ }
+
+ if (projectActions) {
+ src_Gleap.setFeedbackActions(projectActions);
+ }
+
+ if (flowConfig.buttonLogo && flowConfig.buttonLogo.length > 0) {
+ src_Gleap.setButtonLogoUrl(flowConfig.buttonLogo);
+ }
+ }();
+
+ if (AutoConfig_typeof(_ret) === "object") return _ret.v;
+ } catch (e) {}
+ }
+ }]);
+
+ return AutoConfig;
+}();
+
+AutoConfig_defineProperty(AutoConfig, "run", function () {
+ var session = Session.getInstance();
+ /*const cachedConfig = loadFromGleapCache(`config-${session.sdkKey}`);
+ if (cachedConfig) {
+ AutoConfig.applyConfig(cachedConfig, false);
+ AutoConfig.loadConfigFromServer(true).catch(function (e) {});
+ return Promise.resolve();
+ }*/
+
+ return AutoConfig.loadConfigFromServer(false);
+});
+
+AutoConfig_defineProperty(AutoConfig, "loadConfigFromServer", function (soft) {
+ return new Promise(function (resolve, reject) {
+ var session = Session.getInstance();
+ var http = new XMLHttpRequest();
+ http.open("GET", session.widgetUrl + "/widget/" + session.sdkKey + "/config");
+ http.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
+ session.injectSession(http);
+
+ http.onerror = function () {
+ reject();
+ };
+
+ http.onreadystatechange = function (e) {
+ if (http.readyState === XMLHttpRequest.DONE) {
+ if (http.status === 200 || http.status === 201) {
+ try {
+ var config = JSON.parse(http.responseText);
+
+ try {
+ saveToGleapCache("config-".concat(session.sdkKey), config);
+ } catch (exp) {}
+
+ AutoConfig.applyConfig(config, soft);
+ return resolve();
+ } catch (e) {}
+ }
+
+ reject();
+ }
+ };
+
+ http.send();
+ });
+});
+
+
+;// CONCATENATED MODULE: ./src/NetworkUtils.js
+var isLocalNetwork = function isLocalNetwork() {
+ var hostname = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window.location.hostname;
+ return ["localhost", "127.0.0.1", "0.0.0.0", "", "::1"].includes(hostname) || hostname.startsWith("192.168.") || hostname.startsWith("10.0.") || hostname.endsWith(".local") || !hostname.includes(".");
+};
+;// CONCATENATED MODULE: ./src/Gleap.js
+function Gleap_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Gleap_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Gleap_createClass(Constructor, protoProps, staticProps) { if (protoProps) Gleap_defineProperties(Constructor.prototype, protoProps); if (staticProps) Gleap_defineProperties(Constructor, staticProps); return Constructor; }
+
+function Gleap_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
+
+function Gleap_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { Gleap_ownKeys(Object(source), true).forEach(function (key) { Gleap_defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { Gleap_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
+
+function Gleap_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if (typeof HTMLCanvasElement !== "undefined" && HTMLCanvasElement.prototype) {
+ HTMLCanvasElement.prototype.__originalGetContext = HTMLCanvasElement.prototype.getContext;
+
+ HTMLCanvasElement.prototype.getContext = function (type, options) {
+ return this.__originalGetContext(type, Gleap_objectSpread(Gleap_objectSpread({}, options), {}, {
+ preserveDrawingBuffer: true
+ }));
+ };
+}
+
+var gleapDataParser = function gleapDataParser(data) {
+ if (typeof data === "string" || data instanceof String) {
+ try {
+ return JSON.parse(data);
+ } catch (e) {
+ return {};
+ }
+ }
+
+ return data;
+};
+
+var Gleap_Gleap = /*#__PURE__*/function () {
+ /**
+ * Main constructor
+ */
+ function Gleap() {
+ var _this = this;
+
+ Gleap_classCallCheck(this, Gleap);
+
+ Gleap_defineProperty(this, "uiContainer", null);
+
+ Gleap_defineProperty(this, "widgetOnly", false);
+
+ Gleap_defineProperty(this, "widgetStartFlow", undefined);
+
+ Gleap_defineProperty(this, "widgetCallback", null);
+
+ Gleap_defineProperty(this, "overrideLanguage", "");
+
+ Gleap_defineProperty(this, "screenshot", null);
+
+ Gleap_defineProperty(this, "autostartDrawing", false);
+
+ Gleap_defineProperty(this, "actionLog", []);
+
+ Gleap_defineProperty(this, "logArray", []);
+
+ Gleap_defineProperty(this, "customData", {});
+
+ Gleap_defineProperty(this, "formData", {});
+
+ Gleap_defineProperty(this, "excludeData", {});
+
+ Gleap_defineProperty(this, "logMaxLength", 500);
+
+ Gleap_defineProperty(this, "buttonType", Gleap.FEEDBACK_BUTTON_NONE);
+
+ Gleap_defineProperty(this, "feedbackType", "BUG");
+
+ Gleap_defineProperty(this, "sessionStart", new Date());
+
+ Gleap_defineProperty(this, "customActionCallbacks", []);
+
+ Gleap_defineProperty(this, "poweredByHidden", false);
+
+ Gleap_defineProperty(this, "enabledCrashDetector", false);
+
+ Gleap_defineProperty(this, "enabledCrashDetectorSilent", false);
+
+ Gleap_defineProperty(this, "enabledRageClickDetector", false);
+
+ Gleap_defineProperty(this, "enabledRageClickDetectorSilent", false);
+
+ Gleap_defineProperty(this, "appCrashDetected", false);
+
+ Gleap_defineProperty(this, "rageClickDetected", false);
+
+ Gleap_defineProperty(this, "currentlySendingBug", false);
+
+ Gleap_defineProperty(this, "isLiveSite", false);
+
+ Gleap_defineProperty(this, "replaysEnabled", false);
+
+ Gleap_defineProperty(this, "customLogoUrl", null);
+
+ Gleap_defineProperty(this, "shortcutsEnabled", true);
+
+ Gleap_defineProperty(this, "silentBugReport", false);
+
+ Gleap_defineProperty(this, "initialized", false);
+
+ Gleap_defineProperty(this, "screenshotFeedbackOptions", null);
+
+ Gleap_defineProperty(this, "customerInfo", {});
+
+ Gleap_defineProperty(this, "showUserName", true);
+
+ Gleap_defineProperty(this, "welcomeIcon", "👋");
+
+ Gleap_defineProperty(this, "feedbackButtonText", "Feedback");
+
+ Gleap_defineProperty(this, "widgetInfo", {
+ title: "Feedback",
+ subtitle: "var us know how we can do better.",
+ dialogSubtitle: "Report a bug, or share your feedback with us."
+ });
+
+ Gleap_defineProperty(this, "originalConsoleLog", void 0);
+
+ Gleap_defineProperty(this, "severity", "LOW");
+
+ Gleap_defineProperty(this, "appVersionCode", "");
+
+ Gleap_defineProperty(this, "appBuildNumber", "");
+
+ Gleap_defineProperty(this, "mainColor", "#485bff");
+
+ Gleap_defineProperty(this, "feedbackTypeActions", []);
+
+ Gleap_defineProperty(this, "customTranslation", {});
+
+ Gleap_defineProperty(this, "networkIntercepter", new NetworkInterception());
+
+ Gleap_defineProperty(this, "replay", null);
+
+ Gleap_defineProperty(this, "escListener", null);
+
+ Gleap_defineProperty(this, "feedbackButton", null);
+
+ Gleap_defineProperty(this, "fakeLoading", null);
+
+ Gleap_defineProperty(this, "fakeLoadingProgress", 0);
+
+ Gleap_defineProperty(this, "widgetOpened", false);
+
+ Gleap_defineProperty(this, "openedMenu", false);
+
+ Gleap_defineProperty(this, "showInfoPopup", false);
+
+ Gleap_defineProperty(this, "snapshotPosition", {
+ x: 0,
+ y: 0
+ });
+
+ Gleap_defineProperty(this, "eventListeners", {});
+
+ Gleap_defineProperty(this, "feedbackActions", {});
+
+ Gleap_defineProperty(this, "actionToPerform", undefined);
+
+ Gleap_defineProperty(this, "screenRecordingData", null);
+
+ Gleap_defineProperty(this, "screenRecordingUrl", null);
+
+ Gleap_defineProperty(this, "getWidgetDialogClass", function () {
+ if (_this.appCrashDetected || _this.rageClickDetected) {
+ return "bb-feedback-dialog--crashed";
+ }
+
+ return "";
+ });
+
+ if (typeof window !== "undefined") {
+ this.init();
+ }
+ }
+ /**
+ * Sets a custom UI container.
+ */
+
+
+ Gleap_createClass(Gleap, [{
+ key: "postInit",
+ value: function postInit() {
+ if (!this.widgetCallback) {
+ // Start event stream only on web.
+ StreamedEvent.getInstance().start();
+ }
+
+ var self = this;
+
+ if (document.readyState === "complete" || document.readyState === "loaded" || document.readyState === "interactive") {
+ self.checkForInitType();
+ } else {
+ document.addEventListener("DOMContentLoaded", function (event) {
+ self.checkForInitType();
+ });
+ }
+
+ if (this.widgetCallback) {
+ self.widgetCallback("sessionReady");
+ }
+ }
+ }, {
+ key: "unregisterEscListener",
+ value: function unregisterEscListener() {
+ if (this.escListener) {
+ document.removeEventListener("keydown", this.escListener);
+ }
+ }
+ }, {
+ key: "registerEscListener",
+ value: function registerEscListener() {
+ var self = this;
+
+ this.escListener = function (evt) {
+ evt = evt || window.event;
+ var isEscape = false;
+
+ if ("key" in evt) {
+ isEscape = evt.key === "Escape" || evt.key === "Esc";
+ } else {
+ isEscape = evt.keyCode === 27;
+ }
+
+ if (isEscape) {
+ self.closeGleap(true);
+ }
+ };
+
+ document.addEventListener("keydown", this.escListener);
+ }
+ /**
+ * Indentifies the user session
+ * @param {string} userId
+ * @param {*} userData
+ */
+
+ }, {
+ key: "notifyEvent",
+ value:
+ /**
+ * Notify all registrants for event.
+ */
+ function notifyEvent(event) {
+ var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+ var eventListeners = this.eventListeners[event];
+
+ if (eventListeners) {
+ for (var i = 0; i < eventListeners.length; i++) {
+ var eventListener = eventListeners[i];
+
+ if (eventListener) {
+ eventListener(data);
+ }
+ }
+ }
+ }
+ /**
+ * Appends a node to the widgets container.
+ * @param {*} node
+ */
+
+ }, {
+ key: "getFeedbackOptions",
+ value: function getFeedbackOptions(feedbackFlow) {
+ var feedbackOptions = null; // Try to load the specific feedback flow.
+
+ if (feedbackFlow) {
+ feedbackOptions = this.feedbackActions[feedbackFlow];
+ } // Fallback
+
+
+ if (!feedbackOptions) {
+ feedbackOptions = this.feedbackActions.bugreporting;
+ } // Deep copy to prevent changes.
+
+
+ try {
+ feedbackOptions = JSON.parse(JSON.stringify(feedbackOptions));
+ } catch (e) {}
+
+ return feedbackOptions;
+ }
+ /**
+ * Starts the bug reporting flow.
+ */
+
+ }, {
+ key: "stopBugReportingAnalytics",
+ value: function stopBugReportingAnalytics() {
+ this.networkIntercepter.setStopped(true);
+
+ if (this.replay && !this.replay.stopped) {
+ this.replay.stop(!this.isLiveSite);
+ }
+ }
+ }, {
+ key: "startCrashDetection",
+ value: function startCrashDetection() {
+ var self = this;
+
+ window.onerror = function (msg, url, lineNo, columnNo, error) {
+ var stackTrace = "";
+
+ if (error !== null && typeof error.stack !== "undefined") {
+ stackTrace = error.stack;
+ }
+
+ var message = ["Message: " + msg, "URL: " + url, "Line: " + lineNo, "Column: " + columnNo, "Stack: " + stackTrace];
+ self.addLog(message, "ERROR");
+
+ if (self.enabledCrashDetector && !self.appCrashDetected && !self.currentlySendingBug) {
+ self.appCrashDetected = true;
+
+ if (self.enabledCrashDetectorSilent) {
+ return Gleap.sendSilentReport({
+ errorMessage: msg,
+ url: url,
+ lineNo: lineNo,
+ columnNo: columnNo,
+ stackTrace: stackTrace
+ }, Gleap.PRIORITY_MEDIUM, "CRASH", {
+ screenshot: true,
+ replays: true
+ });
+ } else {
+ Gleap.startFeedbackFlow("crash");
+ }
+ }
+
+ return false;
+ };
+ }
+ }, {
+ key: "truncateString",
+ value: function truncateString(str, num) {
+ if (str.length > num) {
+ return str.slice(0, num) + "...";
+ } else {
+ return str;
+ }
+ }
+ }, {
+ key: "addLog",
+ value: function addLog(args, priority) {
+ if (!args) {
+ return;
+ }
+
+ var log = "";
+
+ for (var i = 0; i < args.length; i++) {
+ log += args[i] + " ";
+ }
+
+ this.logArray.push({
+ log: this.truncateString(log, 1000),
+ date: new Date(),
+ priority: priority
+ });
+
+ if (this.logArray.length > this.logMaxLength) {
+ this.logArray.shift();
+ }
+ }
+ }, {
+ key: "overwriteConsoleLog",
+ value: function overwriteConsoleLog() {
+ var self = this;
+
+ window.console = function (origConsole) {
+ if (!window.console || !origConsole) {
+ origConsole = {};
+ }
+
+ self.originalConsoleLog = origConsole;
+ return Gleap_objectSpread(Gleap_objectSpread({}, origConsole), {}, {
+ log: function log() {
+ self.addLog(arguments, "INFO");
+ origConsole.log && origConsole.log.apply(origConsole, arguments);
+ },
+ warn: function warn() {
+ self.addLog(arguments, "WARNING");
+ origConsole.warn && origConsole.warn.apply(origConsole, arguments);
+ },
+ error: function error() {
+ self.addLog(arguments, "ERROR");
+ origConsole.error && origConsole.error.apply(origConsole, arguments);
+ },
+ info: function info(v) {
+ self.addLog(arguments, "INFO");
+ origConsole.info && origConsole.info.apply(origConsole, arguments);
+ }
+ });
+ }(window.console);
+ }
+ }, {
+ key: "resetLoading",
+ value: function resetLoading(resetProgress) {
+ if (this.fakeLoading) {
+ clearInterval(this.fakeLoading);
+ }
+
+ this.fakeLoading = null;
+ this.fakeLoadingProgress = 0;
+
+ if (resetProgress) {
+ setLoadingIndicatorProgress(1);
+ }
+ }
+ }, {
+ key: "createFeedbackFormDialog",
+ value: function createFeedbackFormDialog(feedbackOptions) {
+ var self = this;
+ var formData = buildForm(feedbackOptions, this.overrideLanguage);
+ var title = translateText(feedbackOptions.title, this.overrideLanguage);
+ var htmlContent = "".concat(translateText("Something went wrong, please try again.", self.overrideLanguage), "
\n \n
\n \n ").concat(loadIcon("success", this.mainColor), "\n
").concat(translateText(feedbackOptions.thanksMessage ? feedbackOptions.thanksMessage : "Thank you!", this.overrideLanguage), "
\n
\n \n ").concat(formData, "\n
");
+ createWidgetDialog(title, null, this.customLogoUrl, htmlContent, function () {
+ self.goBackToMainMenu();
+ }, this.openedMenu, "bb-anim-fadeinright ".concat(this.getWidgetDialogClass(), " bb-feedback-dialog-form"));
+ this.openedMenu = true;
+ this.resetLoading(true);
+ validatePoweredBy(this.poweredByHidden);
+ hookForm(feedbackOptions, function () {
+ self.formSubmitAction(feedbackOptions);
+ }, this.overrideLanguage);
+ }
+ }, {
+ key: "formSubmitAction",
+ value: function formSubmitAction(feedbackOptions) {
+ var self = this; // Remember form items
+
+ rememberForm(feedbackOptions.form); // Show loading spinner
+
+ toggleLoading(true); // Hide error message
+
+ var errorForm = document.querySelector(".bb-feedback-dialog-error");
+
+ if (errorForm) {
+ errorForm.style.display = "none";
+ } // Start fake loading
+
+
+ self.fakeLoading = setInterval(function () {
+ if (self.fakeLoadingProgress > 75) {
+ self.resetLoading(false);
+ return;
+ }
+
+ self.fakeLoadingProgress += 2;
+ setLoadingIndicatorProgress(self.fakeLoadingProgress);
+ }, 75); // Send form
+
+ var formData = getFormData(feedbackOptions.form);
+ self.formData = formData;
+ self.excludeData = feedbackOptions.excludeData ? feedbackOptions.excludeData : {};
+ self.feedbackType = feedbackOptions.feedbackType ? feedbackOptions.feedbackType : "BUG";
+
+ if (self.widgetOnly && self.widgetCallback) {
+ self.widgetCallback("sendFeedback", {
+ type: self.feedbackType,
+ formData: self.formData,
+ screenshot: self.screenshot,
+ excludeData: self.excludeData
+ });
+ } else {
+ self.checkReplayLoaded();
+ }
+ }
+ }, {
+ key: "checkReplayLoaded",
+ value: function checkReplayLoaded() {
+ var _this2 = this;
+
+ var retries = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
+
+ if (this.replaysEnabled && !(this.replay && this.replay.result) && retries < 5) {
+ // Replay is not ready yet.
+ setTimeout(function () {
+ _this2.checkReplayLoaded(++retries);
+ }, 1000);
+ } else {
+ this.checkForScreenRecording();
+ }
+ }
+ }, {
+ key: "checkForScreenRecording",
+ value: function checkForScreenRecording() {
+ var self = this;
+
+ if (this.screenRecordingData != null) {
+ ScreenRecorder.uploadScreenRecording(this.screenRecordingData).then(function (recordingUrl) {
+ self.screenRecordingUrl = recordingUrl;
+ self.takeScreenshotAndSend();
+ })["catch"](function (err) {
+ self.takeScreenshotAndSend();
+ });
+ } else {
+ this.takeScreenshotAndSend();
+ }
+ }
+ }, {
+ key: "takeScreenshotAndSend",
+ value: function takeScreenshotAndSend() {
+ var _this3 = this;
+
+ var self = this;
+
+ if (this.excludeData && this.excludeData.screenshot) {
+ // Screenshot excluded.
+ this.sendBugReportToServer();
+ } else {
+ return startScreenCapture(this.isLiveSite).then(function (data) {
+ // Set scroll position
+ if (data) {
+ data["x"] = self.snapshotPosition.x;
+ data["y"] = self.snapshotPosition.y;
+ }
+
+ _this3.sendBugReportToServer(data);
+ })["catch"](function (err) {
+ _this3.showError();
+ });
+ }
+ }
+ }, {
+ key: "reportCleanupOnClose",
+ value: function reportCleanupOnClose() {
+ try {
+ Gleap.enableReplays(this.replaysEnabled);
+ } catch (exp) {}
+
+ try {
+ this.networkIntercepter.setStopped(false);
+ } catch (exp) {}
+
+ this.actionToPerform = undefined;
+
+ if (this.widgetCallback) {
+ this.widgetCallback("closeGleap", {});
+ }
+ }
+ }, {
+ key: "closeModalUI",
+ value: function closeModalUI(cleanUp) {
+ var dialogContainer = document.querySelector(".bb-feedback-dialog-container");
+
+ if (dialogContainer) {
+ dialogContainer.remove();
+ }
+ }
+ }, {
+ key: "closeGleap",
+ value: function closeGleap() {
+ var cleanUp = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
+
+ if (cleanUp) {
+ this.reportCleanupOnClose();
+ }
+
+ ScrollStopper.enableScroll();
+ this.currentlySendingBug = false;
+ this.widgetOpened = false;
+ this.openedMenu = false;
+ this.appCrashDetected = false;
+ this.rageClickDetected = false;
+ this.updateFeedbackButtonState(); // Remove editor.
+
+ var editorContainer = document.querySelector(".bb-capture-editor");
+
+ if (editorContainer) {
+ editorContainer.remove();
+ }
+
+ this.notifyEvent("close");
+ this.closeModalUI(cleanUp);
+ }
+ }, {
+ key: "init",
+ value: function init() {
+ this.overwriteConsoleLog();
+ this.startCrashDetection();
+ this.registerKeyboardListener();
+ this.registerEscListener(); // Initially check network
+
+ if (isLocalNetwork()) {
+ this.isLiveSite = false;
+ } else {
+ this.isLiveSite = true;
+ }
+ }
+ }, {
+ key: "registerKeyboardListener",
+ value: function registerKeyboardListener() {
+ var self = this;
+
+ var charForEvent = function charForEvent(event) {
+ var code;
+
+ if (event.key !== undefined) {
+ code = event.key;
+ } else if (event.keyIdentifier !== undefined) {
+ code = event.keyIdentifier;
+ } else if (event.keyCode !== undefined) {
+ code = event.keyCode;
+ }
+
+ return code;
+ };
+
+ document.addEventListener("keyup", function (e) {
+ var _char = charForEvent(e);
+
+ if (e.ctrlKey && (_char === "i" || _char === "I" || _char === 73) && self.shortcutsEnabled) {
+ self.autostartDrawing = true;
+ Gleap.startFeedbackFlow();
+ }
+ });
+ }
+ }, {
+ key: "checkForInitType",
+ value: function checkForInitType() {
+ var _this4 = this;
+
+ if (window && window.onGleapLoaded) {
+ window.onGleapLoaded(Gleap);
+ }
+
+ setInterval(function () {
+ if (_this4.replay && _this4.replay.isFull()) {
+ Gleap.enableReplays(_this4.replaysEnabled);
+ }
+ }, 1000);
+
+ if (this.widgetOnly) {
+ // App widget
+ var _self = this;
+
+ if (_self.widgetStartFlow) {
+ Gleap.startFeedbackFlow(_self.widgetStartFlow);
+ } else {
+ if (_self.feedbackTypeActions.length > 0) {
+ Gleap.startFeedbackTypeSelection();
+ } else {
+ Gleap.startFeedbackFlow();
+ }
+ }
+ } else {
+ // Web widget
+ Session.getInstance().setOnSessionReady(function () {
+ _this4.injectFeedbackButton();
+ });
+ }
+ }
+ }, {
+ key: "injectFeedbackButton",
+ value: function injectFeedbackButton() {
+ var self = this;
+ var buttonIcon = "";
+
+ if (self.customButtonLogoUrl) {
+ buttonIcon = "");
+ } else {
+ buttonIcon = loadIcon("bblogo", "#fff");
+ }
+
+ var elem = document.createElement("div");
+ elem.className = "bb-feedback-button";
+
+ if (this.buttonType === Gleap.FEEDBACK_BUTTON_CLASSIC || this.buttonType === Gleap.FEEDBACK_BUTTON_CLASSIC_BOTTOM || this.buttonType === Gleap.FEEDBACK_BUTTON_CLASSIC_LEFT) {
+ elem.innerHTML = "").concat(translateText(this.feedbackButtonText, this.overrideLanguage), "
");
+ } else {
+ elem.innerHTML = "".concat(buttonIcon).concat(loadIcon("arrowdown", "#fff"), "
");
+ }
+
+ elem.onclick = function () {
+ self.feedbackButtonPressed();
+ };
+
+ Gleap.appendNode(elem);
+
+ if (this.buttonType === Gleap.FEEDBACK_BUTTON_NONE) {
+ elem.classList.add("bb-feedback-button--disabled");
+ }
+
+ if (this.buttonType === Gleap.FEEDBACK_BUTTON_BOTTOM_LEFT) {
+ elem.classList.add("bb-feedback-button--bottomleft");
+ }
+
+ this.feedbackButton = elem;
+ }
+ }, {
+ key: "showGleap",
+ value: function showGleap() {
+ if (this.widgetOpened) {
+ return;
+ }
+
+ if (this.feedbackTypeActions.length > 0) {
+ Gleap.startFeedbackTypeSelection();
+ } else {
+ Gleap.startFeedbackFlow();
+ } // Remove shoutout.
+
+
+ var feedbackShoutout = window.document.getElementsByClassName("bb-feedback-button-shoutout");
+
+ if (feedbackShoutout && feedbackShoutout.length > 0) {
+ feedbackShoutout[0].remove();
+ } // Prevent shoutout from showing again.
+
+
+ try {
+ localStorage.setItem("bb-fto", true);
+ } catch (exp) {}
+
+ this.notifyEvent("open");
+ }
+ }, {
+ key: "feedbackButtonPressed",
+ value: function feedbackButtonPressed() {
+ if (this.widgetOpened) {
+ this.closeGleap();
+ return;
+ }
+
+ this.showGleap();
+ }
+ }, {
+ key: "updateFeedbackButtonState",
+ value: function updateFeedbackButtonState() {
+ var _this5 = this;
+
+ var retry = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+
+ if (this.feedbackButton === null) {
+ if (!retry) {
+ setTimeout(function () {
+ _this5.updateFeedbackButtonState(true);
+ }, 500);
+ }
+
+ return;
+ }
+
+ var sendingClass = "bb-feedback-button--sending";
+
+ if (this.widgetOpened) {
+ this.feedbackButton.classList.add(sendingClass);
+ } else {
+ this.feedbackButton.classList.remove(sendingClass);
+ }
+
+ var crashedClass = "bb-feedback-button--crashed";
+
+ if (this.appCrashDetected || this.rageClickDetected) {
+ this.feedbackButton.classList.add(crashedClass);
+ } else {
+ this.feedbackButton.classList.remove(crashedClass);
+ }
+
+ var dialogContainer = document.querySelector(".bb-feedback-dialog-container");
+ var containerFocusClass = "bb-feedback-dialog-container--focused";
+
+ if (dialogContainer) {
+ if (this.appCrashDetected || this.rageClickDetected) {
+ dialogContainer.classList.add(containerFocusClass);
+ } else {
+ dialogContainer.classList.remove(containerFocusClass);
+ }
+ }
+ }
+ }, {
+ key: "showSuccessMessage",
+ value: function showSuccessMessage() {
+ var success = document.querySelector(".bb-feedback-dialog-success");
+ var form = document.querySelector(".bb-feedback-form");
+ var loader = document.querySelector(".bb-feedback-dialog-loading");
+ form.style.display = "none";
+ loader.style.display = "none";
+ success.style.display = "flex";
+ }
+ }, {
+ key: "performAction",
+ value: function performAction(action) {
+ if (action && action.outbound && action.actionType) {
+ this.actionToPerform = action;
+ Gleap.startFeedbackFlow(action.actionType);
+ }
+ }
+ }, {
+ key: "sendBugReportToServer",
+ value: function sendBugReportToServer(screenshotData) {
+ var self = this;
+ var http = new XMLHttpRequest();
+ http.open("POST", Session.getInstance().apiUrl + "/bugs");
+ http.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
+ Session.getInstance().injectSession(http);
+
+ http.onerror = function (error) {
+ if (self.silentBugReport) {
+ self.closeGleap();
+ return;
+ }
+
+ self.showError();
+ };
+
+ http.upload.onprogress = function (e) {
+ if (self.silentBugReport) {
+ self.closeGleap();
+ return;
+ }
+
+ if (e.lengthComputable) {
+ var percentComplete = parseInt(e.loaded / e.total * 100);
+
+ if (percentComplete > 25 && percentComplete > self.fakeLoadingProgress) {
+ if (self.fakeLoading) {
+ self.resetLoading(false);
+ }
+
+ setLoadingIndicatorProgress(percentComplete);
+ }
+ }
+ };
+
+ http.onreadystatechange = function (e) {
+ if (self.silentBugReport) {
+ self.closeGleap();
+ return;
+ }
+
+ if (http.readyState === XMLHttpRequest.DONE) {
+ if (http.status === 200 || http.status === 201) {
+ self.notifyEvent("feedback-sent");
+ self.showSuccessAndClose();
+ } else {
+ self.showError(http.status);
+ }
+ }
+ };
+
+ var bugReportData = {
+ priority: this.severity,
+ customData: this.customData,
+ metaData: this.getMetaData(),
+ consoleLog: this.logArray,
+ networkLogs: this.networkIntercepter.getRequests(),
+ customEventLog: StreamedEvent.getInstance().eventArray,
+ type: this.feedbackType,
+ formData: this.formData,
+ isSilent: this.silentBugReport
+ };
+
+ if (this.actionToPerform && this.actionToPerform.outbound) {
+ bugReportData["outbound"] = this.actionToPerform.outbound;
+ }
+
+ if (screenshotData && screenshotData.fileUrl) {
+ bugReportData["screenshotUrl"] = screenshotData.fileUrl;
+ }
+
+ if (screenshotData && screenshotData.html) {
+ bugReportData["screenshotData"] = screenshotData;
+ }
+
+ if (this.replay && this.replay.result) {
+ bugReportData["webReplay"] = this.replay.result;
+ }
+
+ if (this.screenRecordingUrl && this.screenRecordingUrl != "uploading") {
+ bugReportData["screenRecordingUrl"] = this.screenRecordingUrl;
+ } // Exclude data logic.
+
+
+ var keysToExclude = Object.keys(this.excludeData);
+
+ for (var _i = 0; _i < keysToExclude.length; _i++) {
+ var keyToExclude = keysToExclude[_i];
+
+ if (this.excludeData[keyToExclude] === true) {
+ delete bugReportData[keyToExclude];
+
+ if (keyToExclude === "screenshot") {
+ delete bugReportData.screenshotData;
+ delete bugReportData.screenshotUrl;
+ }
+
+ if (keyToExclude === "replays") {
+ delete bugReportData.webReplay;
+ }
+ }
+ }
+
+ http.send(JSON.stringify(bugReportData));
+ }
+ }, {
+ key: "jsonSize",
+ value: function jsonSize(obj) {
+ var size = new TextEncoder().encode(JSON.stringify(obj)).length;
+ var kiloBytes = size / 1024;
+ var megaBytes = kiloBytes / 1024;
+ }
+ }, {
+ key: "showSuccessAndClose",
+ value: function showSuccessAndClose() {
+ var self = this;
+ self.showSuccessMessage();
+ setTimeout(function () {
+ self.closeGleap();
+ }, 2800);
+ }
+ }, {
+ key: "showError",
+ value: function showError(error) {
+ if (this.silentBugReport) {
+ this.closeGleap();
+ return;
+ }
+
+ var errorText = translateText("Something went wrong, please try again.", self.overrideLanguage);
+
+ if (error === 429) {
+ errorText = translateText("Too many requests, please try again later.", self.overrideLanguage);
+ }
+
+ this.notifyEvent("error-while-sending");
+ toggleLoading(false);
+ document.querySelector(".bb-feedback-dialog-error").innerHTML = errorText;
+ document.querySelector(".bb-feedback-dialog-error").style.display = "flex";
+ document.querySelector(".bb-form-progress").style.display = "none";
+ }
+ }, {
+ key: "getMetaData",
+ value: function getMetaData() {
+ var nAgt = navigator.userAgent;
+ var browserName = navigator.appName;
+ var fullVersion = "" + parseFloat(navigator.appVersion);
+ var majorVersion = parseInt(navigator.appVersion, 10);
+ var nameOffset, verOffset, ix; // In Opera, the true version is after "Opera" or after "Version"
+
+ if ((verOffset = nAgt.indexOf("Opera")) !== -1) {
+ browserName = "Opera";
+ fullVersion = nAgt.substring(verOffset + 6);
+ if ((verOffset = nAgt.indexOf("Version")) !== -1) fullVersion = nAgt.substring(verOffset + 8);
+ } // In MSIE, the true version is after "MSIE" in userAgent
+ else if ((verOffset = nAgt.indexOf("MSIE")) !== -1) {
+ browserName = "Microsoft Internet Explorer";
+ fullVersion = nAgt.substring(verOffset + 5);
+ } // In Chrome, the true version is after "Chrome"
+ else if ((verOffset = nAgt.indexOf("Chrome")) !== -1) {
+ browserName = "Chrome";
+ fullVersion = nAgt.substring(verOffset + 7);
+ } // In Safari, the true version is after "Safari" or after "Version"
+ else if ((verOffset = nAgt.indexOf("Safari")) !== -1) {
+ browserName = "Safari";
+ fullVersion = nAgt.substring(verOffset + 7);
+ if ((verOffset = nAgt.indexOf("Version")) !== -1) fullVersion = nAgt.substring(verOffset + 8);
+ } // In Firefox, the true version is after "Firefox"
+ else if ((verOffset = nAgt.indexOf("Firefox")) !== -1) {
+ browserName = "Firefox";
+ fullVersion = nAgt.substring(verOffset + 8);
+ } // In most other browsers, "name/version" is at the end of userAgent
+ else if ((nameOffset = nAgt.lastIndexOf(" ") + 1) < (verOffset = nAgt.lastIndexOf("/"))) {
+ browserName = nAgt.substring(nameOffset, verOffset);
+ fullVersion = nAgt.substring(verOffset + 1);
+
+ if (browserName.toLowerCase() === browserName.toUpperCase()) {
+ browserName = navigator.appName;
+ }
+ } // trim the fullVersion string at semicolon/space if present
+
+
+ if ((ix = fullVersion.indexOf(";")) !== -1) fullVersion = fullVersion.substring(0, ix);
+ if ((ix = fullVersion.indexOf(" ")) !== -1) fullVersion = fullVersion.substring(0, ix);
+ majorVersion = parseInt("" + fullVersion, 10);
+
+ if (isNaN(majorVersion)) {
+ fullVersion = "" + parseFloat(navigator.appVersion);
+ majorVersion = parseInt(navigator.appVersion, 10);
+ }
+
+ var OSName = "Unknown OS";
+ if (navigator.appVersion.indexOf("Win") !== -1) OSName = "Windows";
+ if (navigator.appVersion.indexOf("Mac") !== -1) OSName = "MacOS";
+ if (navigator.appVersion.indexOf("X11") !== -1) OSName = "UNIX";
+ if (navigator.appVersion.indexOf("Linux") !== -1) OSName = "Linux";
+ if (navigator.appVersion.indexOf("iPad") !== -1) OSName = "iPad";
+ if (navigator.appVersion.indexOf("iPhone") !== -1) OSName = "iPhone";
+ if (navigator.appVersion.indexOf("Android") !== -1) OSName = "Android";
+ var now = new Date();
+ var sessionDuration = (now.getTime() - this.sessionStart.getTime()) / 1000;
+ return {
+ browserName: browserName + "(" + fullVersion + ")",
+ userAgent: nAgt,
+ browser: navigator.appName,
+ systemName: OSName,
+ buildVersionNumber: this.appBuildNumber,
+ releaseVersionNumber: this.appVersionCode,
+ sessionDuration: sessionDuration,
+ devicePixelRatio: window.devicePixelRatio,
+ screenWidth: window.screen.width,
+ screenHeight: window.screen.height,
+ innerWidth: window.innerWidth,
+ innerHeight: window.innerHeight,
+ currentUrl: window.location.href,
+ language: navigator.language || navigator.userLanguage,
+ mobile: isMobile(),
+ sdkVersion: "6.8.10",
+ sdkType: "javascript"
+ };
+ }
+ }, {
+ key: "showBugReportEditor",
+ value: function showBugReportEditor(feedbackOptions) {
+ // Native screenshot SDK.
+ if (!feedbackOptions.disableUserScreenshot) {
+ if (this.screenshot) {
+ this.showMobileScreenshotEditor(feedbackOptions);
+ return;
+ } // Fetch screenshot from native SDK.
+
+
+ if (this.widgetOnly && this.widgetCallback) {
+ this.screenshotFeedbackOptions = feedbackOptions;
+ this.widgetCallback("requestScreenshot", {});
+ return;
+ }
+ }
+
+ this.createFeedbackFormDialog(feedbackOptions);
+ }
+ }, {
+ key: "goBackToMainMenu",
+ value: function goBackToMainMenu() {
+ if (this.feedbackTypeActions.length > 0) {
+ // Go back to menu
+ this.closeGleap(false);
+ Gleap.startFeedbackTypeSelection(true);
+ } else {
+ // Close
+ this.closeGleap();
+ }
+ }
+ }, {
+ key: "showMobileScreenshotEditor",
+ value: function showMobileScreenshotEditor(feedbackOptions) {
+ var self = this;
+ createScreenshotEditor(this.screenshot, function (screenshot) {
+ // Update screenshot.
+ self.screenshot = screenshot;
+ self.closeModalUI();
+ self.createFeedbackFormDialog(feedbackOptions);
+ }, function () {
+ self.goBackToMainMenu();
+ }, this.overrideLanguage, this.feedbackTypeActions.length > 0);
+ }
+ }], [{
+ key: "getInstance",
+ value: // Feedback button types
+ // Bug priorities
+ // Gleap singleton
+ function getInstance() {
+ if (!this.instance) {
+ this.instance = new Gleap();
+ return this.instance;
+ } else {
+ return this.instance;
+ }
+ }
+ }, {
+ key: "setUIContainer",
+ value: function setUIContainer(container) {
+ var instance = this.getInstance();
+ instance.uiContainer = container;
+ }
+ /**
+ * Attaches external network logs that get merged with the internal network logs.
+ * @param {*} externalConsoleLogs
+ */
+
+ }, {
+ key: "attachNetworkLogs",
+ value: function attachNetworkLogs(externalConsoleLogs) {
+ this.getInstance().networkIntercepter.externalConsoleLogs = externalConsoleLogs;
+ }
+ /**
+ * Set if you running on a live site or local environment.
+ * @param {*} isLiveSite
+ */
+
+ }, {
+ key: "setLiveSite",
+ value: function setLiveSite(isLiveSite) {
+ var instance = this.getInstance();
+ instance.isLiveSite = isLiveSite;
+ }
+ /**
+ * Initializes the SDK
+ * @param {*} sdkKey
+ */
+
+ }, {
+ key: "initialize",
+ value: function initialize(sdkKey, gleapId, gleapHash) {
+ var instance = this.getInstance();
+
+ if (instance.initialized) {
+ console.warn("Gleap already initialized.");
+ return;
+ }
+
+ instance.initialized = true; // Set default session (i.e. from the app SDK).
+
+ if (gleapId && gleapHash) {
+ try {
+ var oldSession = loadFromGleapCache("session-".concat(sdkKey));
+
+ if (!oldSession) {
+ oldSession = {};
+ }
+
+ if (oldSession.gleapId !== gleapId) {
+ oldSession = {};
+ }
+
+ oldSession.gleapId = gleapId;
+ oldSession.gleapHash = gleapHash;
+ saveToGleapCache("session-".concat(sdkKey), oldSession);
+ } catch (exp) {}
+ }
+
+ var sessionInstance = Session.getInstance();
+ sessionInstance.sdkKey = sdkKey;
+ sessionInstance.setOnSessionReady(function () {
+ // Run auto configuration.
+ setTimeout(function () {
+ AutoConfig.run().then(function () {
+ instance.postInit();
+ })["catch"](function (err) {});
+ }, 0);
+ });
+ sessionInstance.startSession();
+ }
+ }, {
+ key: "identify",
+ value: function identify(userId, userData) {
+ return Session.getInstance().identifySession(userId, gleapDataParser(userData));
+ }
+ /**
+ * Clears the current user session
+ */
+
+ }, {
+ key: "clearIdentity",
+ value: function clearIdentity() {
+ Session.getInstance().clearSession();
+ }
+ /**
+ * Widget opened status
+ * @returns {boolean} isOpened
+ */
+
+ }, {
+ key: "isOpened",
+ value: function isOpened() {
+ return this.getInstance().openedMenu;
+ }
+ /**
+ * Hides any open Gleap dialogs.
+ */
+
+ }, {
+ key: "hide",
+ value: function hide() {
+ var instance = this.getInstance();
+ instance.closeGleap();
+ }
+ /**
+ * Starts the Gleap flow.
+ */
+
+ }, {
+ key: "open",
+ value: function open() {
+ var instance = this.getInstance();
+ instance.showGleap();
+ }
+ /**
+ * Sets a custom translation
+ * @param {*} customTranslation
+ */
+
+ }, {
+ key: "setCustomTranslation",
+ value: function setCustomTranslation(customTranslation) {
+ var instance = this.getInstance();
+ instance.customTranslation = customTranslation;
+ }
+ /**
+ * Sets a custom screenshot
+ * @param {*} screenshot
+ */
+
+ }, {
+ key: "setScreenshot",
+ value: function setScreenshot(screenshot) {
+ var instance = this.getInstance();
+ instance.screenshot = screenshot; // Open screenshot
+
+ if (instance.screenshotFeedbackOptions) {
+ instance.showMobileScreenshotEditor(instance.screenshotFeedbackOptions);
+ instance.screenshotFeedbackOptions = null;
+ }
+ }
+ /**
+ * Sets the feedback button text
+ * @param {string} feedbackButtonText
+ */
+
+ }, {
+ key: "setFeedbackButtonText",
+ value: function setFeedbackButtonText(feedbackButtonText) {
+ var instance = this.getInstance();
+ instance.feedbackButtonText = feedbackButtonText;
+ }
+ /**
+ * Enable replays
+ * @param {*} enabled
+ */
+
+ }, {
+ key: "enableReplays",
+ value: function enableReplays(enabled) {
+ var instance = this.getInstance();
+ instance.replaysEnabled = enabled;
+
+ if (enabled) {
+ if (instance.replay) {
+ instance.replay.stop();
+ instance.replay = null;
+ }
+
+ instance.replay = new ReplayRecorder();
+ } else {
+ if (instance.replay) {
+ instance.replay.stop();
+ instance.replay = null;
+ }
+ }
+ }
+ /**
+ * Logs a custom event
+ * @param {string} name
+ * @param {any} data
+ */
+
+ }, {
+ key: "logEvent",
+ value: function logEvent(name, data) {
+ StreamedEvent.getInstance().logEvent(name, data);
+ }
+ /**
+ * Show info popup
+ * @param {boolean} showInfoPopup
+ */
+
+ }, {
+ key: "showInfoPopup",
+ value: function showInfoPopup(_showInfoPopup) {
+ this.getInstance().showInfoPopup = _showInfoPopup;
+ }
+ /**
+ * Set widget only
+ * @param {boolean} widgetOnly
+ */
+
+ }, {
+ key: "isWidgetOnly",
+ value: function isWidgetOnly(widgetOnly) {
+ this.getInstance().widgetOnly = widgetOnly;
+ }
+ /**
+ * Set widget only start feedback flow
+ * @param {boolean} widgetStartFlow
+ */
+
+ }, {
+ key: "setWidgetStartFlow",
+ value: function setWidgetStartFlow(widgetStartFlow) {
+ this.getInstance().widgetStartFlow = widgetStartFlow;
+ }
+ /**
+ * Set welcome icon
+ * @param {string} welcomeIcon
+ */
+
+ }, {
+ key: "setWelcomeIcon",
+ value: function setWelcomeIcon(welcomeIcon) {
+ this.getInstance().welcomeIcon = welcomeIcon;
+ }
+ /**
+ * Show or hide the user name within the widget header
+ * @param {boolean} showUserName
+ */
+
+ }, {
+ key: "setShowUserName",
+ value: function setShowUserName(showUserName) {
+ this.getInstance().showUserName = showUserName;
+ }
+ /**
+ * Sets the button type.
+ * @param {string} buttonType
+ */
+
+ }, {
+ key: "setButtonType",
+ value: function setButtonType(buttonType) {
+ this.getInstance().buttonType = buttonType;
+ }
+ /**
+ * Register events for Gleap.
+ * @param {*} eventName
+ * @param {*} callback
+ */
+
+ }, {
+ key: "on",
+ value: function on(eventName, callback) {
+ var instance = this.getInstance();
+
+ if (!instance.eventListeners[eventName]) {
+ instance.eventListeners[eventName] = [];
+ }
+
+ instance.eventListeners[eventName].push(callback);
+ }
+ }, {
+ key: "appendNode",
+ value: function appendNode(node) {
+ var instance = this.getInstance();
+
+ if (instance.uiContainer) {
+ instance.uiContainer.appendChild(node);
+ } else {
+ document.body.appendChild(node);
+ }
+ }
+ /**
+ * Sets the native widget callback
+ * @param {*} widgetCallback
+ */
+
+ }, {
+ key: "widgetCallback",
+ value: function widgetCallback(_widgetCallback) {
+ this.getInstance().widgetCallback = _widgetCallback;
+ }
+ /**
+ * Enable or disable shortcuts
+ * @param {boolean} enabled
+ */
+
+ }, {
+ key: "enableShortcuts",
+ value: function enableShortcuts(enabled) {
+ this.getInstance().shortcutsEnabled = enabled;
+ }
+ /**
+ * Enable Intercom compatibility mode
+ */
+
+ }, {
+ key: "enableIntercomCompatibilityMode",
+ value: function enableIntercomCompatibilityMode() {}
+ /**
+ * Show or hide the feedback button
+ * @param {*} show
+ * @returns
+ */
+
+ }, {
+ key: "showFeedbackButton",
+ value: function showFeedbackButton(show) {
+ var feedbackButton = this.getInstance().feedbackButton;
+
+ if (!feedbackButton) {
+ return;
+ }
+
+ if (show) {
+ feedbackButton.style.display = "flex";
+ } else {
+ feedbackButton.style.display = "none";
+ }
+ }
+ /**
+ * Hides the powered by Gleap logo.
+ * @param {boolean} hide
+ */
+
+ }, {
+ key: "enablePoweredBy",
+ value: function enablePoweredBy(enabled) {
+ this.getInstance().poweredByHidden = !enabled;
+ }
+ /**
+ * Enables the network logger.
+ */
+
+ }, {
+ key: "enableNetworkLogger",
+ value: function enableNetworkLogger() {
+ this.getInstance().networkIntercepter.start();
+ }
+ /**
+ * Enables the network logger.
+ */
+
+ }, {
+ key: "setNetworkLogFilters",
+ value: function setNetworkLogFilters(filters) {
+ this.getInstance().networkIntercepter.setFilters(filters);
+ }
+ /**
+ * Sets the logo url.
+ * @param {string} logoUrl
+ */
+
+ }, {
+ key: "setLogoUrl",
+ value: function setLogoUrl(logoUrl) {
+ this.getInstance().customLogoUrl = logoUrl;
+ }
+ /**
+ * Sets the button logo url.
+ * @param {string} logoUrl
+ */
+
+ }, {
+ key: "setButtonLogoUrl",
+ value: function setButtonLogoUrl(logoUrl) {
+ this.getInstance().customButtonLogoUrl = logoUrl;
+ }
+ /**
+ * Enables the privacy policy.
+ * @param {boolean} enabled
+ */
+
+ }, {
+ key: "enablePrivacyPolicy",
+ value: function enablePrivacyPolicy(enabled) {}
+ /**
+ * Sets the privacy policy url.
+ * @param {string} privacyPolicyUrl
+ */
+
+ }, {
+ key: "setPrivacyPolicyUrl",
+ value: function setPrivacyPolicyUrl(privacyPolicyUrl) {}
+ /**
+ * Sets the widget info texts.
+ * @param {string} widgetInfo
+ */
+
+ }, {
+ key: "setWidgetInfo",
+ value: function setWidgetInfo(widgetInfo) {
+ if (!widgetInfo) {
+ return;
+ }
+
+ this.getInstance().widgetInfo = Object.assign(this.getInstance().widgetInfo, widgetInfo);
+ }
+ /**
+ * Sets the app version code.
+ * @param {string} appVersionCode
+ */
+
+ }, {
+ key: "setAppVersionCode",
+ value: function setAppVersionCode(appVersionCode) {
+ this.getInstance().appVersionCode = appVersionCode;
+ }
+ /**
+ * Sets the app version code.
+ * @param {string} appVersionCode
+ */
+
+ }, {
+ key: "setAppBuildNumber",
+ value: function setAppBuildNumber(appBuildNumber) {
+ this.getInstance().appBuildNumber = appBuildNumber;
+ }
+ /**
+ * Set a custom api url.
+ * @param {string} apiUrl
+ */
+
+ }, {
+ key: "setApiUrl",
+ value: function setApiUrl(apiUrl) {
+ Session.getInstance().apiUrl = apiUrl;
+ }
+ /**
+ * Set a custom widget api url.
+ * @param {string} widgetUrl
+ */
+
+ }, {
+ key: "setWidgetUrl",
+ value: function setWidgetUrl(widgetUrl) {
+ Session.getInstance().widgetUrl = widgetUrl;
+ }
+ /**
+ * Set custom data that will be attached to the bug-report.
+ * @param {*} data
+ */
+
+ }, {
+ key: "attachCustomData",
+ value: function attachCustomData(data) {
+ var instance = this.getInstance();
+ instance.customData = Object.assign(instance.customData, gleapDataParser(data));
+ }
+ /**
+ * Add one key value pair to the custom data object
+ * @param {*} key The key of the custom data entry you want to add.
+ * @param {*} value The custom data you want to add.
+ */
+
+ }, {
+ key: "setCustomData",
+ value: function setCustomData(key, value) {
+ this.getInstance().customData[key] = value;
+ }
+ /**
+ * Remove one key value pair of the custom data object
+ * @param {*} key The key of the custom data entry you want to remove.
+ */
+
+ }, {
+ key: "removeCustomData",
+ value: function removeCustomData(key) {
+ delete this.getInstance().customData[key];
+ }
+ /**
+ * Clear the custom data
+ */
+
+ }, {
+ key: "clearCustomData",
+ value: function clearCustomData() {
+ this.getInstance().customData = {};
+ }
+ /**
+ * Override the browser language. Currently supported languages:
+ * - en
+ * - de
+ * - fr
+ * - it
+ * - es
+ * @param {string} language country code with two letters
+ */
+
+ }, {
+ key: "setLanguage",
+ value: function setLanguage(language) {
+ this.getInstance().overrideLanguage = language;
+ }
+ /**
+ * Enables crash detection.
+ * @param {*} enabled
+ * @param {*} silent
+ */
+
+ }, {
+ key: "enableCrashDetector",
+ value: function enableCrashDetector(enabled) {
+ var silent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+ var instance = this.getInstance();
+ instance.enabledCrashDetector = enabled;
+ instance.enabledCrashDetectorSilent = silent;
+ }
+ /**
+ * Enables rage click detection.
+ * @param {*} silent
+ */
+
+ }, {
+ key: "enableRageClickDetector",
+ value: function enableRageClickDetector() {
+ var silent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+ var instance = this.getInstance();
+
+ if (instance.enabledRageClickDetector) {
+ return;
+ }
+
+ instance.enabledRageClickDetector = true;
+ instance.enabledRageClickDetectorSilent = silent;
+ startRageClickDetector(function (target) {
+ instance.rageClickDetected = true;
+
+ if (instance.enabledRageClickDetectorSilent) {
+ Gleap.sendSilentReport({
+ description: "Rage click detected."
+ });
+ } else {
+ Gleap.startFeedbackFlow("crash");
+ }
+ });
+ }
+ /**
+ * Sets a custom color scheme.
+ * @param {string} primaryColor
+ */
+
+ }, {
+ key: "setColors",
+ value: function setColors(primaryColor, headerColor, buttonColor) {
+ var backgroundColor = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "#ffffff";
+ this.setStyles({
+ headerColor: headerColor,
+ primaryColor: primaryColor,
+ buttonColor: buttonColor,
+ backgroundColor: backgroundColor
+ });
+ }
+ /**
+ * Sets a custom color scheme.
+ * @param {any} styles
+ */
+
+ }, {
+ key: "setStyles",
+ value: function setStyles(styles) {
+ this.getInstance().mainColor = styles.primaryColor;
+ var headerColor = styles.headerColor ? styles.headerColor : styles.primaryColor;
+ var buttonColor = styles.buttonColor ? styles.buttonColor : styles.primaryColor;
+ var borderRadius = styles.borderRadius != null ? styles.borderRadius : 20;
+ var backgroundColor = styles.backgroundColor != null ? styles.backgroundColor : "#fff";
+
+ if (document.readyState === "complete" || document.readyState === "loaded" || document.readyState === "interactive") {
+ injectStyledCSS(styles.primaryColor, headerColor, buttonColor, borderRadius, backgroundColor);
+ } else {
+ document.addEventListener("DOMContentLoaded", function (event) {
+ injectStyledCSS(styles.primaryColor, headerColor, buttonColor, borderRadius, backgroundColor);
+ });
+ }
+ }
+ /**
+ * Sends a silent feedback report
+ * @param {*} formData
+ * @param {*} priority
+ * @param {*} feedbackType
+ */
+
+ }, {
+ key: "sendSilentReport",
+ value: function sendSilentReport(formData) {
+ var priority = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Gleap.PRIORITY_MEDIUM;
+ var feedbackType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "BUG";
+ var excludeData = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
+ var instance = this.getInstance();
+ var sessionInstance = Session.getInstance();
+
+ if (!sessionInstance.ready) {
+ return;
+ }
+
+ instance.excludeData = excludeData ? excludeData : {};
+ instance.severity = priority;
+ instance.feedbackType = feedbackType;
+ instance.formData = formData ? formData : {};
+
+ if (sessionInstance.session.email) {
+ instance.formData.reportedBy = sessionInstance.session.email;
+ }
+
+ this.startFeedbackFlow(null, true);
+ }
+ /**
+ * Reports a bug silently
+ * @param {*} description
+ * @deprecated Please use sendSilentReport instead.
+ */
+
+ }, {
+ key: "sendSilentBugReport",
+ value: function sendSilentBugReport(description) {
+ var priority = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Gleap.PRIORITY_MEDIUM;
+ return Gleap.sendSilentReport({
+ description: description
+ }, priority, "BUG");
+ }
+ /**
+ * Starts the feedback type selection flow.
+ */
+
+ }, {
+ key: "startFeedbackTypeSelection",
+ value: function startFeedbackTypeSelection() {
+ var fromBack = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+ var sessionInstance = Session.getInstance();
+ var instance = this.getInstance();
+ instance.stopBugReportingAnalytics();
+ instance.widgetOpened = true;
+ instance.openedMenu = true;
+ instance.updateFeedbackButtonState();
+ var displayUserName = "";
+
+ if (instance.showUserName && sessionInstance.session && sessionInstance.session.name) {
+ displayUserName = sessionInstance.session.name;
+ } // Start feedback type dialog
+
+
+ createFeedbackTypeDialog(instance.feedbackTypeActions, instance.overrideLanguage, instance.customLogoUrl, instance.poweredByHidden, function () {}, "".concat(translateText("Hi", instance.overrideLanguage), " ").concat(displayUserName, " ").concat(instance.welcomeIcon), translateText(instance.widgetInfo.dialogSubtitle, instance.overrideLanguage), fromBack);
+ }
+ /**
+ * Register custom action
+ */
+
+ }, {
+ key: "registerCustomAction",
+ value: function registerCustomAction(customAction) {
+ var instance = this.getInstance();
+
+ if (instance.customActionCallbacks) {
+ instance.customActionCallbacks.push(customAction);
+ }
+ }
+ /**
+ * Triggers a custom action
+ */
+
+ }, {
+ key: "triggerCustomAction",
+ value: function triggerCustomAction(name) {
+ var instance = this.getInstance();
+
+ if (instance.widgetCallback) {
+ instance.widgetCallback("customActionCalled", {
+ name: name
+ });
+ }
+
+ if (instance.customActionCallbacks) {
+ for (var i = 0; i < instance.customActionCallbacks.length; i++) {
+ var callback = instance.customActionCallbacks[i];
+
+ if (callback) {
+ callback({
+ name: name
+ });
+ }
+ }
+ }
+ }
+ /**
+ * Sets the feedback flow options.
+ */
+
+ }, {
+ key: "setFeedbackActions",
+ value: function setFeedbackActions(feedbackActions) {
+ this.getInstance().feedbackActions = feedbackActions;
+ }
+ /**
+ * Sets the menu options.
+ */
+
+ }, {
+ key: "setMenuOptions",
+ value: function setMenuOptions(options) {
+ this.getInstance().feedbackTypeActions = options;
+ }
+ }, {
+ key: "startFeedbackFlow",
+ value: function startFeedbackFlow(feedbackFlow) {
+ var silentBugReport = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+ var sessionInstance = Session.getInstance();
+ var instance = this.getInstance();
+
+ if (instance.currentlySendingBug) {
+ return;
+ }
+
+ if (!sessionInstance.ready) {
+ return;
+ } // Initially set scroll position
+
+
+ instance.snapshotPosition = {
+ x: window.scrollX,
+ y: window.scrollY
+ }; // Get feedback options
+
+ var feedbackOptions = instance.getFeedbackOptions(feedbackFlow);
+
+ if (!feedbackOptions) {
+ return;
+ }
+
+ instance.notifyEvent("flow-started", feedbackOptions);
+ instance.closeModalUI();
+ instance.currentlySendingBug = true;
+ instance.silentBugReport = silentBugReport;
+
+ if (!silentBugReport) {
+ instance.widgetOpened = true;
+ }
+
+ if (feedbackOptions.form && feedbackOptions.form.length > 0) {
+ // Cleanup form from unsupported items.
+ var newFormArray = [];
+
+ for (var i = 0; i < feedbackOptions.form.length; i++) {
+ var feedbackOption = feedbackOptions.form[i];
+
+ if (feedbackOption && feedbackOption.type !== "privacypolicy" && feedbackOption.type !== "spacer" && feedbackOption.type !== "submit" && feedbackOption.name !== "reportedBy") {
+ newFormArray.push(feedbackOption);
+ }
+ }
+
+ var emailFormItem = feedbackOptions.collectEmail === true || feedbackOptions.collectEmail === undefined ? {
+ title: "Email",
+ placeholder: "Your e-mail",
+ type: "text",
+ inputtype: "email",
+ name: "reportedBy",
+ required: true,
+ remember: true
+ } : null; // Collect email when user needs to enter it.
+
+ if (emailFormItem && !(sessionInstance.session && sessionInstance.session.email)) {
+ emailFormItem.hideOnDefaultSet = false;
+ newFormArray.push(emailFormItem);
+ } // Update form.
+
+
+ feedbackOptions.form = newFormArray;
+ feedbackOptions.pages = feedbackOptions.singlePageForm === true ? 1 : newFormArray.length; // Add page id's
+
+ for (var i = 0; i < feedbackOptions.form.length; i++) {
+ var feedbackOption = feedbackOptions.form[i];
+
+ if (feedbackOptions.singlePageForm === true) {
+ feedbackOption.page = 0;
+ } else {
+ feedbackOption.page = i;
+ }
+ } // Add email as hidden default option.
+
+
+ if (emailFormItem && sessionInstance.session && sessionInstance.session.email) {
+ emailFormItem.hideOnDefaultSet = true;
+ emailFormItem.defaultValue = sessionInstance.session.email;
+ emailFormItem.page = feedbackOptions.form[feedbackOptions.form.length - 1].page;
+ newFormArray.push(emailFormItem);
+ } // Inject privacy policy.
+
+
+ if (!feedbackOptions.disableUserScreenshot && !instance.widgetCallback) {
+ var captureItem = {
+ name: "capture",
+ type: "capture",
+ enableScreenshot: true,
+ autostartDrawing: instance.autostartDrawing,
+ enableCapture: feedbackOptions.enableUserScreenRecording ? true : false,
+ captureTitle: translateText("Record screen", instance.overrideLanguage),
+ captureTooltip: translateText("Record your screen to showcase the bug", instance.overrideLanguage),
+ screenshotTitle: translateText("Mark the bug", instance.overrideLanguage),
+ screenshotTooltip: translateText("Draw on the screen to mark the bug", instance.overrideLanguage),
+ page: feedbackOptions.form[feedbackOptions.form.length - 1].page
+ };
+ feedbackOptions.form.push(captureItem);
+ } // Inject privacy policy.
+
+
+ if (feedbackOptions.privacyPolicyEnabled) {
+ var policyItem = {
+ name: "privacypolicy",
+ type: "privacypolicy",
+ required: true,
+ url: feedbackOptions.privacyPolicyUrl,
+ page: feedbackOptions.form[feedbackOptions.form.length - 1].page
+ };
+ feedbackOptions.form.push(policyItem);
+ }
+ } // Disable autostart drawing for the next call.
+
+
+ instance.autostartDrawing = false; // Stop bug analytics.
+
+ instance.stopBugReportingAnalytics();
+
+ if (instance.silentBugReport) {
+ // Move on
+ instance.checkReplayLoaded();
+ } else {
+ // Show editor
+ instance.showBugReportEditor(feedbackOptions);
+ }
+
+ instance.updateFeedbackButtonState();
+ }
+ }, {
+ key: "disableConsoleLogOverwrite",
+ value: function disableConsoleLogOverwrite() {
+ window.console = this.getInstance().originalConsoleLog;
+ }
+ }]);
+
+ return Gleap;
+}(); // Check for unperformed Gleap actions.
+
+
+Gleap_defineProperty(Gleap_Gleap, "FEEDBACK_BUTTON_BOTTOM_RIGHT", "BOTTOM_RIGHT");
+
+Gleap_defineProperty(Gleap_Gleap, "FEEDBACK_BUTTON_BOTTOM_LEFT", "BOTTOM_LEFT");
+
+Gleap_defineProperty(Gleap_Gleap, "FEEDBACK_BUTTON_CLASSIC", "BUTTON_CLASSIC");
+
+Gleap_defineProperty(Gleap_Gleap, "FEEDBACK_BUTTON_CLASSIC_LEFT", "BUTTON_CLASSIC_LEFT");
+
+Gleap_defineProperty(Gleap_Gleap, "FEEDBACK_BUTTON_CLASSIC_BOTTOM", "BUTTON_CLASSIC_BOTTOM");
+
+Gleap_defineProperty(Gleap_Gleap, "FEEDBACK_BUTTON_NONE", "BUTTON_NONE");
+
+Gleap_defineProperty(Gleap_Gleap, "PRIORITY_LOW", "LOW");
+
+Gleap_defineProperty(Gleap_Gleap, "PRIORITY_MEDIUM", "MEDIUM");
+
+Gleap_defineProperty(Gleap_Gleap, "PRIORITY_HIGH", "HIGH");
+
+Gleap_defineProperty(Gleap_Gleap, "instance", void 0);
+
+if (typeof window !== "undefined") {
+ var GleapActions = window.GleapActions;
+
+ if (GleapActions && GleapActions.length > 0) {
+ for (var i = 0; i < GleapActions.length; i++) {
+ var GLAction = GleapActions[i];
+
+ if (GLAction && GLAction.e && Gleap_Gleap[GLAction.e]) {
+ Gleap_Gleap[GLAction.e].apply(Gleap_Gleap, GLAction.a);
+ }
+ }
+ }
+}
+
+/* harmony default export */ const src_Gleap = (Gleap_Gleap);
+;// CONCATENATED MODULE: ./src/index.js
+
+/* harmony default export */ const src = (src_Gleap);
+__webpack_exports__ = __webpack_exports__.default;
+/******/ return __webpack_exports__;
+/******/ })()
+;
+});
\ No newline at end of file
diff --git a/published/6.8.10/index.min.css b/published/6.8.10/index.min.css
new file mode 100644
index 00000000..50e0a60e
--- /dev/null
+++ b/published/6.8.10/index.min.css
@@ -0,0 +1 @@
+@import url(https://fonts.googleapis.com/css2?family=Inter:wght@100;300;400;500;600;700&display=swap);.bb-feedback-dialog-container input{margin:0;padding:0;border:none}.bb-feedback-button{margin:0;position:fixed;bottom:20px;right:20px;border-radius:30px;cursor:pointer;-webkit-tap-highlight-color:transparent;background-color:transparent;color:#000;z-index:2147483100;box-sizing:border-box;display:flex;align-items:center;padding:0}.bb-feedback-button--disabled .bb-feedback-button-icon{display:none!important}.bb-feedback-button--disabled .bb-feedback-button-text{display:none}.bb-feedback-button--bottomleft{bottom:20px;right:auto;left:20px}.bb-feedback-button-shoutout{position:fixed;bottom:22px;right:94px;animation-duration:.2s;animation-fill-mode:both;animation-name:bbFadeInUp}.bb-feedback-button--bottomleft .bb-feedback-button-shoutout{right:auto;left:94px}.bb-feedback-button-text{padding:8px 12px;display:flex;flex-direction:column;align-items:flex-start;justify-content:center;background-color:#fff;border-radius:8px;box-shadow:0 0 14px 0 rgba(0,0,0,.15);position:relative;z-index:99}.bb-feedback-button-text:before{content:"";position:absolute;box-shadow:rgba(0,0,0,.04) 6px 6px 5px;transform:rotate(315deg);bottom:16px;right:-4px;border-width:10px;border-style:solid;border-color:transparent #fff #fff transparent}.bb-feedback-button--bottomleft .bb-feedback-button-text:before{display:none}.bb-feedback-button-text:after{content:"";position:absolute;bottom:12px;right:0;background-color:#fff;width:5px;height:30px}.bb-feedback-button-text-title{font-family:Inter,sans-serif;font-size:14px;color:#666;line-height:18px;max-width:220px}.bb-feedback-button-text-title b{color:#000;font-weight:600}.bb-logo-logo--default path{fill:#fff}.bb-feedback-capture-item-selected{display:none}.bb-feedback-capture-item-selected-button{display:flex;font-family:Inter,sans-serif;border-radius:21px;box-sizing:border-box;padding:5px 8px;width:auto;margin-top:5px;margin-bottom:0;margin-right:auto;justify-content:flex-start;align-items:center;height:39px}.bb-feedback-capture-item-selected-label{font-size:14px;line-height:19px;font-weight:600;font-weight:400;margin-left:8px}.bb-feedback-capture-item-selected-icon{display:flex;justify-content:center;align-items:center}.bb-feedback-capture-item-selected-icon svg{width:18px;height:18px;object-fit:contain}.bb-feedback-capture-item-selected-action{display:flex;justify-content:center;align-items:center;cursor:pointer;-webkit-tap-highlight-color:transparent;padding:5px;margin-left:8px}.bb-feedback-capture-item-selected-action svg{width:14px;height:14px;object-fit:contain}.bb-feedback-capture-items{display:flex;justify-content:flex-start;flex-wrap:wrap}.bb-feedback-capture-item{font-family:Inter,sans-serif;border-radius:21px;box-sizing:border-box;padding:8px 12px;width:auto;margin-top:5px;margin-right:8px;margin-bottom:0;cursor:pointer;-webkit-tap-highlight-color:transparent;display:flex;justify-content:center;align-items:center;position:relative;height:39px}.bb-feedback-capture-item:last-of-type{margin-right:0}.bb-feedback-capture-item:hover{background-color:#ddd}.bb-feedback-capture-item .bb-item-title{font-size:14px;line-height:19px;font-weight:600;color:#333;font-weight:400;margin-left:8px}.bb-feedback-capture-item svg{width:18px;height:18px;object-fit:contain}.bb-feedback-button-icon{width:60px;height:60px;border-radius:60px;background-color:#485bff;transition:box-shadow .3s ease-in-out;box-shadow:0 1px 3px rgba(0,0,0,.15),0 0 20px rgba(0,0,0,.1);position:relative}.bb-feedback-button-classic{cursor:pointer;-webkit-tap-highlight-color:transparent;top:50%;right:0;position:fixed;transform:rotate(-90deg) translate(50%,-50%);transform-origin:100% 50%;padding:9px 20px;text-align:center;background-color:#485bff;border-top-left-radius:8px;border-top-right-radius:8px;font-family:Inter,sans-serif;font-size:16px;color:#fff;box-shadow:0 0 14px 0 rgba(0,0,0,.25);animation-duration:.2s;animation-fill-mode:both;animation-name:bbFadeInOpacity}.bb-feedback-button-classic--left{top:50%;left:0;right:auto;transform:rotate(90deg) translate(-50%,-100%);transform-origin:0 0}.bb-feedback-button-classic--bottom{top:auto;bottom:0;transform:none;right:20px}.bb-feedback-button--sending .bb-feedback-button-classic{animation-duration:.2s;animation-fill-mode:both;animation-name:bbFadeOutRight}.bb-feedback-button .bb-logo-logo{position:absolute;width:38px;height:38px;top:11px;left:11px;object-fit:contain;animation-duration:.3s;animation-fill-mode:both;animation-name:bbZoomIn}.bb-feedback-button .bb-logo-arrowdown{position:absolute;width:18px;height:18px;top:23px;left:21px;object-fit:contain;animation-duration:.3s;animation-fill-mode:both}.bb-feedback-button .bb-logo-arrowdown{animation-name:bbZoomOut}.bb-feedback-button--sending .bb-logo-arrowdown{animation-name:bbZoomIn}.bb-feedback-button--sending .bb-logo-logo{animation-name:bbZoomOut}.bb-feedback-button-icon:hover{box-shadow:0 1px 3px rgba(0,0,0,.25),0 0 20px rgba(0,0,0,.2)}.bb-feedback-button--bottomleft.bb-feedback-button--sending{padding-left:0;padding-right:5px}.bb-feedback-button--sending .bb-feedback-button-text{animation-name:bbFadeOutDown}.bb-feedback-button--sending .bb-feedback-button-icon{display:flex}.bb-feedback-dialog{width:90%;max-width:365px;box-shadow:0 4px 12px rgba(0,0,0,.1),0 2px 4px rgba(0,0,0,.1);border-radius:20px;box-sizing:border-box;position:fixed;right:16px;bottom:92px;z-index:2147483105;overflow:hidden}.bb-feedback-button--bottomleft .bb-feedback-dialog{right:auto;left:16px}.bb-feedback-button--classic .bb-feedback-dialog,.bb-feedback-button--disabled .bb-feedback-dialog{bottom:20px}.bb-feedback-button--classic-left .bb-feedback-dialog{right:auto;left:16px}.bb-feedback-form-description{font-size:16px;line-height:19px;font-family:Inter,sans-serif;color:#000;font-weight:400;margin-top:5px;margin-bottom:10px}.bb-feedback-form--hidden{display:none!important}.bb-feedback-form{margin:25px;margin-bottom:22px;position:relative;flex-grow:1}.bb-feedback-dialog-header{display:flex;align-items:flex-start;justify-content:center;padding:25px;box-sizing:border-box;background-color:#485bff;flex-direction:column;padding-bottom:58px;position:relative}.bb-feedback-dialog-header-button-cancel svg{width:10px;height:10px}.bb-feedback-dialog-header-button-cancel:hover svg{opacity:.6}.bb-feedback-dialog-header-title,.bb-feedback-dialog-header-title span{font-weight:400;text-align:center;color:#fff;font-family:Inter,sans-serif;text-align:left;margin-top:15px;font-weight:600;font-size:22px;line-height:26px}#bb-user-name{text-transform:capitalize}.bb-feedback-dialog-header-description{font-weight:400;text-align:center;color:#fff;font-family:Inter,sans-serif;text-align:left;font-weight:400;margin-top:5px;font-size:16px;line-height:19px}.bb-feedback-dialog-header-back svg{fill:#fff}.bb-feedback-dialog-header-back:hover svg{fill:#fff}.bb-logo-arrowdown{fill:#fff}.bb-feedback-dialog-header-logo img,.bb-feedback-dialog-header-logo svg{height:40px;width:auto;max-width:200px;object-fit:contain;text-align:left}.bb-feedback-dialog-header-back{width:40px;height:40px;min-width:40px;display:flex;justify-content:center;align-items:center}.bb-feedback-dialog-header-back svg{width:18px;height:18px;object-fit:contain}.bb-feedback-dialog-header-back--close svg{width:26px}.bb-feedback-dialog-header-back:hover{background-color:#fff;border-radius:11px;cursor:pointer;-webkit-tap-highlight-color:transparent}.bb-feedback-dialog-header--back{display:flex;flex-direction:row;width:100%;align-items:center;padding:12px;padding-top:12px}.bb-feedback-dialog-header--back .bb-feedback-dialog-header-text{flex-grow:1;padding-left:8px}.bb-feedback-dialog-header--backhidden .bb-feedback-dialog-header-text{padding-left:0}.bb-feedback-dialog-header--backhidden{padding:21px;padding-top:21px}.bb-feedback-dialog-header--back .bb-feedback-dialog-header-title{margin-top:0;line-height:22px;font-family:Inter,sans-serif;font-size:18px;font-weight:600}.bb-feedback-dialog-header--back .bb-feedback-dialog-header-title-small{margin-top:0;line-height:22px;font-family:Inter,sans-serif;font-size:16px;font-weight:600}.bb-feedback-dialog-header--back .bb-feedback-dialog-header-description{font-family:Inter,sans-serif;font-size:14px;line-height:18px;margin-top:5px}.bb-feedback-dialog-header--backhidden .bb-feedback-dialog-header-back{display:none!important}.bb-feedback-types{margin:35px 0;margin-top:-45px;margin-bottom:20px;flex-grow:1;z-index:1}.bb-feedback-type{display:flex;justify-content:flex-start;align-items:center;padding:9px;margin:12px 25px;cursor:pointer;-webkit-tap-highlight-color:transparent;border:1px solid transparent;border-radius:12px;background-color:#fff;box-sizing:border-box;box-shadow:0 0 12px rgba(0,0,0,.05),0 1px 3px rgba(0,0,0,.1);transition:box-shadow .2s ease-in-out}.bb-feedback-type:hover{background-color:#fff;box-shadow:0 0 12px rgba(0,0,0,.1),0 1px 3px rgba(0,0,0,.2)}.bb-feedback-type-icon{width:44px;height:44px;min-width:44px;background-color:#485bff;border-radius:44px;margin-right:12px;padding:10px;box-sizing:border-box}.bb-feedback-type-icon img{width:100%;height:100%;object-fit:contain}.bb-feedback-type-text{flex-grow:1}.bb-feedback-type-title{font-family:Inter,sans-serif;font-weight:500;font-size:16px;line-height:18px;margin-bottom:3px;color:#000}.bb-feedback-multiplechoice{display:flex;flex-direction:column;margin-bottom:20px}.bb-feedback-multiplechoice-container{font-family:Inter,sans-serif;display:block;position:relative;margin-bottom:12px;cursor:pointer;-webkit-tap-highlight-color:transparent;user-select:none;padding-left:35px;font-size:15px;line-height:25px;min-height:25px}.bb-feedback-multiplechoice-container:first-of-type{margin-top:8px}.bb-feedback-multiplechoice-container input{position:absolute;opacity:0;cursor:pointer;-webkit-tap-highlight-color:transparent}.bb-feedback-multiplechoice-checkmark{position:absolute;top:0;left:0;height:25px;width:25px;border-radius:50%;box-sizing:border-box}.bb-feedback-multiplechoice-container:hover input~.bb-feedback-multiplechoice-checkmark{border:2px solid #59617d}.bb-feedback-multiplechoice-container input:checked~.bb-feedback-multiplechoice-checkmark{border:2px solid #000}.bb-feedback-multiplechoice-checkmark:after{content:"";position:absolute;display:none}.bb-feedback-multiplechoice-container input:checked~.bb-feedback-multiplechoice-checkmark:after{display:block}.bb-feedback-multiplechoice-container .bb-feedback-multiplechoice-checkmark:after{top:5.5px;left:6px;width:9px;height:9px;border-radius:50%;background:#fff}.bb-feedback-onetofive{display:flex;flex-direction:column;animation-duration:.3s;animation-fill-mode:both;animation-name:bbFadeInRight}.bb-feedback-onetofive-description{display:flex;flex-direction:row;justify-content:space-between}.bb-feedback-onetofive-description span{color:#59617d;font-size:13px;font-weight:500;margin-bottom:20px;font-family:Inter,sans-serif}.bb-feedback-onetofive-buttons{display:flex;justify-content:space-between;margin-bottom:8px}.bb-feedback-onetofive-button{font-family:Inter,sans-serif;cursor:pointer;-webkit-tap-highlight-color:transparent;padding:0;background-color:#eceaf3;color:#59617d;border-radius:5px;width:calc(20% - 2px);text-align:center;line-height:44px;min-height:44px;font-size:17px;font-weight:500}.bb-feedback-onetofive-button-active,.bb-feedback-onetofive-button:hover{background-color:#59617d;color:#fff}.bb-feedback-type-description{font-family:Inter,sans-serif;color:#59617d;font-size:14px;line-height:16px;font-weight:400}.bb-feedback-elementtitle{font-family:Inter,sans-serif;font-size:15px;line-height:19px;text-align:left;margin-bottom:5px;margin-top:4px;font-weight:500;color:#000}.bb-feedback-elementtitle span{font-family:Inter,sans-serif;font-size:15px;line-height:19px;text-align:left;margin-bottom:12px;margin-top:0;font-weight:500;color:#ed4337;margin-left:3px}.bb-feedback-dialog-info-text{font-family:Inter,sans-serif;color:#000;font-size:16px;padding-top:20px;text-align:center;line-height:21px}.bb-feedback-dialog-success{display:flex;justify-content:center;align-items:center;flex-direction:column;padding:50px;display:none;flex-grow:1}.bb-feedback-dialog-success svg{width:56px;height:56px;border-radius:50%;display:block;stroke-width:2;stroke:#fff;stroke-miterlimit:10;animation:bb-suc-fill .4s ease-in-out .4s forwards,bb-suc-scale .3s ease-in-out .9s both}.bb-feedback-dialog-success svg path{transform-origin:50% 50%;stroke-dasharray:48;stroke-dashoffset:48;animation:bb-suc-stroke .3s cubic-bezier(.65,0,.45,1) .8s forwards}.bb-feedback-dialog-success svg circle{stroke-dasharray:166;stroke-dashoffset:166;stroke-width:3;stroke-miterlimit:10;fill:none;animation:bb-suc-stroke .6s cubic-bezier(.65,0,.45,1) forwards}@keyframes bb-suc-stroke{100%{stroke-dashoffset:0}}@keyframes bb-suc-scale{0%,100%{transform:none}50%{transform:scale3d(1.1,1.1,1)}}.bb-feedback-dialog-body{display:flex;flex-grow:1;flex-direction:column;z-index:1}.bb-feedback-dialog-form .bb-feedback-dialog-body{max-height:calc(100vh - 200px);overflow-y:auto}.bb-feedback-inputgroup{display:flex;justify-content:center;margin-bottom:12px;padding:0;flex-direction:column;animation-duration:.3s;animation-fill-mode:both;animation-name:bbFadeInRight}.bb-form-progress{position:absolute;top:-25px;left:-25px;right:-25px}.bb-form-progress-inner{width:0;height:4px;background-color:#485bff44;transition:width .5s ease-in-out}.bb-feedback-formpage{display:none}.bb-feedback-inputgroup-spacer{display:flex;height:10px}.bb-feedback-inputgroup-button{display:flex;align-items:center;justify-content:flex-end;flex-direction:row;margin-top:20px}.bb-feedback-inputgroup-text{font-family:Inter,sans-serif;color:#000;font-size:16px;font-weight:400}.bb-feedback-inputgroup-label{font-family:Inter,sans-serif;padding:0;margin-bottom:5px;color:#000;font-size:14px;font-weight:600}.bb-feedback-send-button{font-family:Inter,sans-serif;background-color:#485bff;border-radius:21px;box-sizing:border-box;padding:12px 26px;font-size:16px;line-height:19px;font-weight:600;color:#fff;text-align:center;width:100%;margin-top:0;margin-bottom:0;cursor:pointer;-webkit-tap-highlight-color:transparent}.bb-feedback-send-button--disabled{background-color:#dee1ea!important;color:#9b9fae!important;opacity:1!important;cursor:not-allowed!important}.bb-feedback-send-button:hover{opacity:.9}.bb-feedback-back-button{width:auto;color:#59617d;font-weight:400;font-size:14px;line-height:19px;text-decoration:underline;cursor:pointer;-webkit-tap-highlight-color:transparent;margin-right:30px}.bb-feedback-back-button:hover{color:#000}.bb-feedback-inputgroup input,.bb-feedback-inputgroup>input{font-size:15px;-webkit-appearance:none;-moz-appearance:none;appearance:none;font-family:Inter,sans-serif;width:auto;padding:11px 12px;outline:0;border:1px solid #eee;background-color:#fff;border-radius:8px;box-sizing:border-box;color:#000;font-weight:400}.bb-feedback-inputgroup input:focus,.bb-feedback-inputgroup>input:focus{border-color:#485bff}input.bb-feedback-required,textarea.bb-feedback-required{border:1px solid #da0e07!important;background-color:#da0e0710!important}.bb-feedback-rating{flex-direction:column}.bb-feedback-emojigroup{--normal:#eceaf3;--normal-shadow:#d9d8e3;--normal-mouth:#9795a4;--normal-eye:#595861;--active:#f8da69;--active-shadow:#f4b555;--active-mouth:#f05136;--active-eye:#313036;--active-tear:#76b5e7;--active-shadow-angry:#e94f1d;margin:0;padding:0;list-style:none;display:flex;justify-content:center;margin-bottom:10px;margin-top:8px}.bb-feedback-required .bb-feedback-emojigroup{--normal:#fde6e6;--normal-shadow:#ffbdbd}.bb-feedback-emojigroup li{position:relative;border-radius:50%;background:var(--sb,var(--normal));box-shadow:inset 3px -3px 4px var(--sh,var(--normal-shadow));transition:background .4s,box-shadow .4s,transform .3s;-webkit-tap-highlight-color:transparent}.bb-feedback-emojigroup li:not(:last-child){margin-right:10px}@media only screen and (max-width:330px){.bb-feedback-emojigroup li:not(:last-child){margin-right:5px}}.bb-feedback-emojigroup li div{width:45px;height:45px;position:relative;transform:perspective(240px) translateZ(4px)}.bb-feedback-emojigroup li div svg,.bb-feedback-emojigroup li div:after,.bb-feedback-emojigroup li div:before{display:block;position:absolute;left:var(--l,9px);top:var(--t,13px);width:var(--w,8px);height:var(--h,2px);transform:rotate(var(--r,0deg)) scale(var(--sc,1)) translateZ(0)}.bb-feedback-emojigroup li div svg{fill:none;stroke:var(--s);stroke-width:2px;stroke-linecap:round;stroke-linejoin:round;transition:stroke .4s}.bb-feedback-emojigroup li div svg.bb-feedback-eye{--s:var(--e, var(--normal-eye));--t:17px;--w:10px;--h:4px}.bb-feedback-emojigroup li div svg.bb-feedback-eye.bb-feedback-right{--l:28px}.bb-feedback-emojigroup li div svg.bb-feedback-mouth{--s:var(--m, var(--normal-mouth));--l:14px;--t:25px;--w:18px;--h:10px}.bb-feedback-emojigroup li div:after,.bb-feedback-emojigroup li div:before{content:"";z-index:var(--zi,1);border-radius:var(--br,1px);background:var(--b,var(--e,var(--normal-eye)));transition:background .4s}.bb-feedback-emojigroup li.bb-feedback-angry{--step-1-rx:-24deg;--step-1-ry:20deg;--step-2-rx:-24deg;--step-2-ry:-20deg}.bb-feedback-emojigroup li.bb-feedback-angry div:before{--r:20deg;top:12px;left:11px}.bb-feedback-emojigroup li.bb-feedback-angry div:after{--l:23px;--r:-20deg;top:12px;left:28px}.bb-feedback-emojigroup li.bb-feedback-angry div svg.bb-feedback-eye{stroke-dasharray:4.55;stroke-dashoffset:8.15}.bb-feedback-emojigroup li.bb-feedback-angry.bb-feedback-active,.bb-feedback-emojigroup li.bb-feedback-angry:hover{animation:angry 1s linear}.bb-feedback-emojigroup li.bb-feedback-angry.bb-feedback-active div:before,.bb-feedback-emojigroup li.bb-feedback-angry:hover div:before{--middle-y:-2px;--middle-r:22deg;animation:toggle .8s linear forwards}.bb-feedback-emojigroup li.bb-feedback-angry.bb-feedback-active div:after,.bb-feedback-emojigroup li.bb-feedback-angry:hover div:after{--middle-y:1px;--middle-r:-18deg;animation:toggle .8s linear forwards}.bb-feedback-emojigroup li.bb-feedback-sad{--step-1-rx:20deg;--step-1-ry:-12deg;--step-2-rx:-18deg;--step-2-ry:14deg}.bb-feedback-emojigroup li.bb-feedback-sad div:after,.bb-feedback-emojigroup li.bb-feedback-sad div:before{--b:var(--active-tear);--sc:0;--w:5px;--h:5px;--t:15px;--br:50%}.bb-feedback-emojigroup li.bb-feedback-sad div:after{--l:25px}.bb-feedback-emojigroup li.bb-feedback-sad div svg.bb-feedback-eye{--t:16px}.bb-feedback-emojigroup li.bb-feedback-sad div svg.bb-feedback-mouth{--t:25px;stroke-dasharray:9.5;stroke-dashoffset:33.25}.bb-feedback-emojigroup li.bb-feedback-sad.bb-feedback-active div:after,.bb-feedback-emojigroup li.bb-feedback-sad.bb-feedback-active div:before,.bb-feedback-emojigroup li.bb-feedback-sad:hover div:after,.bb-feedback-emojigroup li.bb-feedback-sad:hover div:before{animation:tear .6s linear forwards}.bb-feedback-emojigroup li.bb-feedback-ok{--step-1-rx:4deg;--step-1-ry:-22deg;--step-1-rz:6deg;--step-2-rx:4deg;--step-2-ry:22deg;--step-2-rz:-6deg}.bb-feedback-emojigroup li.bb-feedback-ok div:before{--l:15px;--t:15px;--h:4px;--w:4px;--br:50%;box-shadow:12px 0 0 var(--e,var(--normal-eye))}.bb-feedback-emojigroup li.bb-feedback-ok div:after{--l:16px;--t:27px;--w:14px;--h:2px;--br:1px;--b:var(--m, var(--normal-mouth))}.bb-feedback-emojigroup li.bb-feedback-ok.bb-feedback-active div:before,.bb-feedback-emojigroup li.bb-feedback-ok:hover div:before{--middle-s-y:0.35;animation:toggle .2s linear forwards}.bb-feedback-emojigroup li.bb-feedback-ok.bb-feedback-active div:after,.bb-feedback-emojigroup li.bb-feedback-ok:hover div:after{--middle-s-x:0.5;animation:toggle .7s linear forwards}.bb-feedback-emojigroup li.bb-feedback-good{--step-1-rx:-14deg;--step-1-rz:10deg;--step-2-rx:10deg;--step-2-rz:-8deg}.bb-feedback-emojigroup li.bb-feedback-good div:before{--b:var(--m, var(--normal-mouth));--w:5px;--h:5px;--br:50%;--t:22px;--zi:0;opacity:.5;box-shadow:16px 0 0 var(--b);filter:blur(2px)}.bb-feedback-emojigroup li.bb-feedback-good div:after{--sc:0}.bb-feedback-emojigroup li.bb-feedback-good div svg.bb-feedback-eye{--t:15px;--sc:-1;stroke-dasharray:4.55;stroke-dashoffset:8.15}.bb-feedback-emojigroup li.bb-feedback-good div svg.bb-feedback-mouth{--t:22px;--sc:-1;stroke-dasharray:13.3;stroke-dashoffset:23.75}.bb-feedback-emojigroup li.bb-feedback-good.bb-feedback-active div svg.bb-feedback-mouth,.bb-feedback-emojigroup li.bb-feedback-good:hover div svg.bb-feedback-mouth{--middle-y:1px;--middle-s:-1;animation:toggle .8s linear forwards}.bb-feedback-emojigroup li.bb-feedback-happy div{--step-1-rx:18deg;--step-1-ry:24deg;--step-2-rx:18deg;--step-2-ry:-24deg}.bb-feedback-emojigroup li.bb-feedback-happy div:before{--sc:0}.bb-feedback-emojigroup li.bb-feedback-happy div:after{--b:var(--m, var(--normal-mouth));--l:14px;--t:25px;--w:18px;--h:8px;--br:0 0 8px 8px}.bb-feedback-emojigroup li.bb-feedback-happy div svg.bb-feedback-eye{--t:14px;--sc:-1}.bb-feedback-emojigroup li.bb-feedback-happy.bb-feedback-active div:after,.bb-feedback-emojigroup li.bb-feedback-happy:hover div:after{--middle-s-x:0.95;--middle-s-y:0.75;animation:toggle .8s linear forwards}.bb-feedback-emojigroup li:not(.active){cursor:pointer;-webkit-tap-highlight-color:transparent}.bb-feedback-emojigroup li:not(.active):active{transform:scale(.925)}.bb-feedback-emojigroup li.bb-feedback-active,.bb-feedback-emojigroup li:hover{--sb:var(--active);--sh:var(--active-shadow);--m:var(--active-mouth);--e:var(--active-eye)}.bb-feedback-emojigroup li.bb-feedback-active div,.bb-feedback-emojigroup li:hover div{animation:shake .8s linear forwards}@keyframes shake{30%{transform:perspective(240px) rotateX(var(--step-1-rx,0deg)) rotateY(var(--step-1-ry,0deg)) rotateZ(var(--step-1-rz,0deg)) translateZ(10px)}60%{transform:perspective(240px) rotateX(var(--step-2-rx,0deg)) rotateY(var(--step-2-ry,0deg)) rotateZ(var(--step-2-rz,0deg)) translateZ(10px)}100%{transform:perspective(240px) translateZ(4px)}}@keyframes tear{0%{opacity:0;transform:translateY(-2px) scale(0) translateZ(0)}50%{transform:translateY(12px) scale(.6,1.2) translateZ(0)}20%,80%{opacity:1}100%{opacity:0;transform:translateY(24px) translateX(4px) rotateZ(-30deg) scale(.7,1.1) translateZ(0)}}@keyframes toggle{50%{transform:translateY(var(--middle-y,0)) scale(var(--middle-s-x,var(--middle-s,1)),var(--middle-s-y,var(--middle-s,1))) rotate(var(--middle-r,0deg))}}@keyframes angry{40%{background:var(--active)}45%{box-shadow:inset 3px -3px 4px var(--active-shadow),inset 0 8px 10px var(--active-shadow-angry)}}.bb-feedback-inputgroup textarea{font-size:15px;line-height:19px;font-weight:400;font-family:Inter,sans-serif;outline:0;-webkit-appearance:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;resize:none;width:auto;height:auto;padding:11px 12px;margin:0;box-sizing:border-box;border:1px solid #eee;background-color:#fff;border-radius:8px;box-sizing:border-box;color:#000;max-height:140px;min-height:60px}.bb-feedback-inputgroup textarea:focus{border-color:#485bff}.bb-feedback-inputgroup--privacy-policy{font-family:Inter,sans-serif;padding:8px 0;font-size:14px;font-weight:400;flex-direction:row;width:100%;justify-content:flex-start;align-items:center}.bb-feedback-inputgroup--privacy-policy a{margin-top:0;margin-bottom:0;display:inline;text-decoration:underline;font-family:Inter,sans-serif;font-size:14px;font-weight:400}.bb-feedback-inputgroup--privacy-policy [type=checkbox]:checked,.bb-feedback-inputgroup--privacy-policy [type=checkbox]:not(:checked){position:absolute;left:0;opacity:.01}.bb-feedback-inputgroup--privacy-policy [type=checkbox]:checked+label,.bb-feedback-inputgroup--privacy-policy [type=checkbox]:not(:checked)+label{font-family:Inter,sans-serif;position:relative;padding-left:2em;font-size:14px;font-weight:400;line-height:1.7;cursor:pointer;-webkit-tap-highlight-color:transparent}.bb-feedback-inputgroup--privacy-policy [type=checkbox]:checked+label:before,.bb-feedback-inputgroup--privacy-policy [type=checkbox]:not(:checked)+label:before{content:"";position:absolute;left:0;top:0;width:1.4em;height:1.4em;border:1px solid #0d1018;background:#fff;border-radius:.2em;-webkit-transition:all 275ms;transition:all 275ms}.bb-feedback-inputgroup--privacy-policy [type=checkbox]:checked+label:after,.bb-feedback-inputgroup--privacy-policy [type=checkbox]:not(:checked)+label:after{content:"✕";position:absolute;top:.525em;left:.18em;font-family:Inter,sans-serif;font-size:1.375em;color:#485bff;line-height:0;-webkit-transition:all .2s;transition:all .2s}.bb-feedback-inputgroup--privacy-policy [type=checkbox]:not(:checked)+label:after{opacity:0;-webkit-transform:scale(0) rotate(45deg);transform:scale(0) rotate(45deg)}.bb-feedback-inputgroup--privacy-policy [type=checkbox]:checked+label:after{opacity:1;-webkit-transform:scale(1) rotate(0);transform:scale(1) rotate(0)}.bb-feedback-inputgroup--privacy-policy.bb-feedback-required [type=checkbox]:checked+label .bb-feedback-inputgroup--privacy-policy.bb-feedback-required,.bb-feedback-inputgroup--privacy-policy.bb-feedback-required [type=checkbox]:not(:checked)+label,.bb-feedback-inputgroup--privacy-policy.bb-feedback-required a{color:#da0e07}.bb-feedback-importance{font-family:Inter,sans-serif;margin:20px;margin-bottom:-8px;font-weight:600;color:#222426;font-size:14px;font-weight:400}.bb-feedback-image{position:relative}.bb-feedback-poweredbycontainer{display:flex;justify-content:center;align-items:center;margin-top:0;margin-bottom:0;cursor:pointer;-webkit-tap-highlight-color:transparent;margin:0;padding:25px 25px;padding-top:0;padding-bottom:20px;margin-top:-16px}.bb-feedback-poweredbycontainer span{font-family:Inter,sans-serif;font-weight:400;font-size:14px;color:#59617d}.bb-feedback-poweredbycontainer svg{height:16px;width:auto;margin-left:4px;margin-top:2px}.bb--edit-button{position:absolute;top:calc(50% - 25px);left:100px;width:50px;height:50px;border-radius:50%;background-color:rgba(0,0,0,.45);cursor:pointer;-webkit-tap-highlight-color:transparent;display:flex;justify-content:center;align-items:center}.bb-feedback-dialog-error{background-color:#da0e0710;padding:16px 25px;margin:0;font-size:14px;font-weight:400;font-family:Inter,sans-serif;color:#da0e07;display:none}.bb-feedback-filesizeinfo{display:none;font-size:14px;font-weight:400;font-family:Inter,sans-serif;color:#da0e07;margin-top:10px}.bb-feedback-dialog-loading{display:none;justify-content:center;align-items:center;flex-grow:1}.bb-feedback-dialog-loading--main{padding:20px}.bb--progress-ring__circle{transition:.2s stroke-dashoffset;transform:rotate(-90deg);transform-origin:50% 50%}.bb--edit-button svg{width:60%}.bb-screenshot-editor-canvas{position:absolute;top:0;left:0;width:100vw;height:100vh;height:-webkit-fill-available;cursor:crosshair;z-index:916777267}.bb-capture-svg{position:absolute;z-index:916777264;top:0;left:0;right:0;width:100%;height:100%;padding:0;margin:0;cursor:crosshair}@keyframes bbRecIconContFade{0%{fill:#b10802}50%{fill:red}100%{fill:#b10802}}.bb-rec-on-circle{animation-name:bbRecIconFade;animation-duration:2s;animation-iteration-count:infinite;animation-direction:alternate}.bb-rec-on-cont{animation-name:bbRecIconContFade;animation-duration:2s;animation-iteration-count:infinite;animation-direction:alternate}.bb-capture-editor-drag-info{position:fixed;top:-200px;left:0;z-index:916777266;transition:opacity .3s ease-in-out}.bb-capture-editor-drag-info svg{width:24px;height:24px}.bb-capture-editor-borderlayer{position:fixed;top:0;left:0;width:100vw;height:100vh;border:4px solid #485bff;cursor:crosshair;z-index:916777260;box-sizing:border-box;pointer-events:none}.bb-feedback-dialog-backdrop{display:none}.bb-capture-editor-notrecording .bb-capture-editor-borderlayer{background-color:rgba(0,0,0,.8)}.bb-capture-editor-recording .bb-capture-dismiss{display:none}.bb-capture-editor-item-inactive{opacity:.3;cursor:not-allowed!important}.bb-capture-editor-notrecording .bb-capture-toolbar-drawingitem{opacity:.3;cursor:not-allowed!important}.bb-capture-editor-notrecording .bb-capture-editor-drag-info{display:none}.bb-capture-editor-notrecording .bb-capture-svg{pointer-events:none!important}.bb-screenshot-editor--marked .bb-capture-editor-borderlayer,.bb-screenshot-editor--marked .bb-screenshot-editor-canvas{cursor:default}.bb-capture-toolbar{position:fixed;top:20px;left:50%;transform:translateX(-50%);z-index:916777268;background-color:#fff;padding:5px;display:flex;align-items:center;border-radius:8px;box-shadow:0 1px 3px rgba(0,0,0,.15),0 0 20px rgba(0,0,0,.1);transition:opacity .3s ease-in-out}.bb-capture-dismiss{position:fixed;top:0;right:0;z-index:916777268;cursor:pointer;-webkit-tap-highlight-color:transparent;width:36px;height:36px;display:flex;justify-content:center;align-items:center}.bb-capture-dismiss svg{width:20px;height:20px;object-fit:contain}.bb-capture-button-next{font-family:Inter,sans-serif;box-sizing:border-box;font-weight:600;text-align:center;width:auto;cursor:pointer;-webkit-tap-highlight-color:transparent;margin:0;line-height:36px;padding:0 12px;font-size:15px;margin-left:12px}.bb-capture-toolbar-item-spacer{width:1px;height:38px;min-width:1px;margin:0 5px}.bb-capture-toolbar-item{width:42px;height:38px;min-width:42px;display:flex;align-items:center;justify-content:center;cursor:pointer;-webkit-tap-highlight-color:transparent;position:relative;margin-right:5px}.bb-capture-toolbar-item svg{width:23px;height:23px;object-fit:contain}.bb-capture-toolbar-item-selectedcolor{border-radius:100%;width:20px;height:20px;background-color:#db4035}.bb-capture-toolbar-item[data-type=undo] svg{width:18px;height:18px}.bb-capture-toolbar-item[data-active=true]{position:relative}.bb-capture-preview{display:none;background-color:rgba(0,0,0,.6);position:fixed;top:0;left:0;width:100vw;height:100vh;justify-content:center;align-items:center;z-index:916777270}.bb-capture-preview-inner{background-color:#fff;padding:0;box-shadow:0 1px 3px rgba(0,0,0,.15),0 0 20px rgba(0,0,0,.1);border-radius:8px;flex-direction:column;max-width:640px;width:100%;margin:20px}.bb-capture-preview-inner video{border-radius:8px 8px 0 0;display:block;border:0;outline:0;width:100%;max-height:60vh}.bb-capture-preview-buttons{display:flex;justify-content:space-between;padding:14px}.bb-capture-preview-retrybutton{font-family:Inter,sans-serif;border-radius:21px;box-sizing:border-box;padding:12px 26px;font-size:16px;line-height:19px;font-weight:600;text-align:center;margin-top:0;margin-bottom:0;cursor:pointer;-webkit-tap-highlight-color:transparent}.bb-capture-preview-sendbutton{font-family:Inter,sans-serif;border-radius:21px;box-sizing:border-box;padding:12px 26px;font-size:16px;line-height:19px;font-weight:600;text-align:center;margin-top:0;margin-bottom:0;cursor:pointer;-webkit-tap-highlight-color:transparent}.bb-capture-preview-retrybutton:hover,.bb-capture-preview-sendbutton:hover{opacity:.9}.bb-capture-toolbar-item-recording{margin-right:0}.bb-capture-toolbar-item-recording svg{width:33px;height:33px}.bb-capture-toolbar-item-colorpicker{position:fixed;top:70px;left:50%;transform:translateX(-50%);z-index:916777268;background-color:#fff;display:none;padding:10px;box-shadow:0 1px 3px rgba(0,0,0,.15),0 0 20px rgba(0,0,0,.1);border-radius:8px}.bb-capture-toolbar-item-color{width:20px;height:20px;border-radius:100%;margin-right:12px;box-shadow:0 0 3px rgba(0,0,0,.15);cursor:pointer;-webkit-tap-highlight-color:transparent}.bb-capture-toolbar-item-color:hover{box-shadow:0 0 6px rgba(0,0,0,.25)}.bb-capture-toolbar-item-color:last-of-type{margin-right:0}.bb-capture-toolbar-item-recording[data-active=true] svg:first-of-type{display:none}.bb-capture-toolbar-item-recording[data-active=true] svg:nth-of-type(2){display:block}.bb-capture-toolbar-item-recording[data-active=false] svg:first-of-type{display:block}.bb-capture-toolbar-item-recording[data-active=false] svg:nth-of-type(2){display:none}.bb-capture-toolbar-item--active{background-color:#eee}.bb-capture-toolbar-item:hover svg{opacity:1}.bb-capture-toolbar-item--active{background-color:#f8f8f8}.bb-capture-toolbar-item--active svg{opacity:1}.bb-capture-toolbar-item--inactivecross::before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;height:3px;width:26px;margin:auto;border-radius:4px;background-color:#e80000;transform:rotate(45deg)}.bb-capture-toolbar-item--inactivecross svg{fill:#eee}.bb-capture-toolbar-item-timer{text-align:left;line-height:32px;font-size:14px;margin:5px;min-width:40px;display:none}.bb-feedback-capture-item .bb-tooltip{background-color:#555;color:#fff;visibility:hidden;font-size:13px;text-align:center;padding:8px 10px;position:absolute;z-index:1;top:initial;bottom:42px;left:50%;opacity:0;transition:opacity .3s;transform:translateX(-50%);width:190px}.bb-feedback-capture-item:nth-of-type(2) .bb-tooltip{left:auto;right:0;transform:none}.bb-feedback-capture-item .bb-tooltip::after{content:"";position:absolute;top:100%;left:50%;margin-left:-5px;border-width:5px;border-style:solid;transform:rotate(0);border-color:#555 transparent transparent transparent}.bb-feedback-capture-item:nth-of-type(2) .bb-tooltip::after{left:auto;right:25%}.bb-feedback-capture-item:hover .bb-tooltip{visibility:visible;opacity:1}.bb-capture-toolbar-item .bb-tooltip{background-color:#555;color:#fff;visibility:hidden;font-size:14px;text-align:center;padding:5px 10px;position:absolute;z-index:1;top:45px;left:0;transform:translateX(calc(-50% + 21px));opacity:0;transition:opacity .3s;white-space:nowrap}.bb-capture-toolbar-item .bb-tooltip::after{content:"";position:absolute;bottom:100%;left:50%;margin-left:-5px;border-width:5px;border-style:solid;transform:rotate(180deg);border-color:#555 transparent transparent transparent}.bb-capture-toolbar-item:hover .bb-tooltip{visibility:visible;opacity:1}.bb-anim-fadein{animation-duration:.3s;animation-fill-mode:both;animation-name:bbFadeInUp}.bb-anim-fadeinfromback{overflow:hidden}.bb-anim-fadeinfromback .bb-feedback-dialog-header>div{animation-duration:.3s;animation-fill-mode:both;animation-name:bbFadeInLeft;animation-timing-function:cubic-bezier(.465,.183,.153,.946)}.bb-anim-fadeinfromback .bb-feedback-dialog-body{animation-duration:.3s;animation-fill-mode:both;animation-name:bbFadeInLeft;animation-timing-function:cubic-bezier(.465,.183,.153,.946)}.bb-anim-fadeinright{overflow:hidden}.bb-anim-fadeinright .bb-feedback-dialog-header>div{animation-duration:.3s;animation-fill-mode:both;animation-name:bbFadeInRight;animation-timing-function:cubic-bezier(.465,.183,.153,.946)}.bb-anim-fadeinright .bb-feedback-dialog-body{animation-duration:.3s;animation-fill-mode:both;animation-name:bbFadeInRight;animation-timing-function:cubic-bezier(.465,.183,.153,.946)}.bb-feedback-dialog-header-close{position:absolute;top:20px;right:20px;display:none;justify-content:center;align-items:center;cursor:pointer;-webkit-tap-highlight-color:transparent}.bb-feedback-dialog-header-close svg{width:24px;height:24px}.bb-feedback-button--classic .bb-feedback-dialog-header-close,.bb-feedback-button--disabled .bb-feedback-dialog-header-close{display:flex}.bb-select-capture-options{display:flex}.bb-select-capture-options div:first-of-type{margin-right:5px}.bb-select-capture-options div:last-of-type{margin-left:5px}.bb-select-capture-option{font-family:Inter,sans-serif;background-color:#dee1ea;border-radius:21px;box-sizing:border-box;padding:12px 26px;font-size:16px;line-height:19px;font-weight:600;color:#9b9fae;text-align:center;width:100%;margin-top:0;margin-bottom:0;cursor:pointer;-webkit-tap-highlight-color:transparent}.bb-select-capture-option--active{background-color:#485bff;color:#fff}.bb-capture-options{display:none}.bb-capture-options--active{display:flex}@media only screen and (max-width:450px){.bb-feedback-dialog{width:calc(100% - 20px);box-sizing:border-box;max-width:inherit;position:fixed;bottom:10px;left:10px;right:10px;display:flex;flex-direction:column}.bb-tooltip{display:none!important}.bb-capture-toolbar-item-colorpicker{top:75px}.bb-capture-button-next{margin-left:auto}.bb-capture-dismiss{display:none}.bb-capture-toolbar{top:15px;right:15px;left:15px;width:auto;transform:none}.bb-feedback-dialog-backdrop{display:block;position:fixed;top:0;left:0;width:100vw;height:100vh;height:-webkit-fill-available;z-index:916777230;box-sizing:border-box;pointer-events:none;background-color:rgba(0,0,0,.6)}.bb-capture-editor-drag-info{display:none}.bb-feedback-button--bottomleft .bb-feedback-dialog{left:10px;right:10px}.bb-feedback-dialog-header-close{display:flex}.bb-capture-editor-borderlayer{border-width:4px}.bb-feedback-inputgroup textarea{font-size:16px}.bb-feedback-inputgroup input,.bb-feedback-inputgroup>input{font-size:16px}.bb-feedback-dialog-form .bb-feedback-dialog-body{max-height:calc(100vh - 84px);overflow-y:auto}}.bb-feedback-button--crashed .bb-feedback-button-icon{background-color:#ed4337}.bb-feedback-button--crashed .bb-feedback-button-icon:hover{background-color:#c7372d}.bb-feedback-dialog--crashed .bb-feedback-dialog-header{background:linear-gradient(135deg,#ed4337 0,#c7372d 100%)}.bb-feedback-dialog--crashed .bb-feedback-dialog-header-title{color:#fff}.bb-feedback-dialog--crashed .bb-feedback-send-button{color:#fff}.bb-feedback-dialog--crashed .bb-feedback-send-button{background-color:#ed4337}.bb-feedback-dialog--crashed .bb-feedback-inputgroup--privacy-policy [type=checkbox]:checked+label:after,.bb-feedback-dialog--crashed .bb-feedback-inputgroup--privacy-policy [type=checkbox]:not(:checked)+label:after{color:#ed4337}.bb-feedback-dialog--crashed .bb-form-progress-inner{background-color:#ed433766!important}@media print{.bb-feedback-button{display:none!important}}@keyframes bbFadeOutRight{from{opacity:1}to{opacity:0;transform:translate3d(100%,0,0)}}@keyframes bbFadeOutDown{from{opacity:1}to{opacity:0;transform:translate3d(0,100%,0)}}@keyframes bbFadeInUp{from{opacity:0;transform:translate3d(0,100%,0)}to{opacity:1;transform:translate3d(0,0,0)}}@keyframes bbFadeInOpacity{from{opacity:0}to{opacity:1}}@keyframes bbFadeInLeft{from{opacity:0;transform:translate3d(-100%,0,0)}to{opacity:1;transform:translate3d(0,0,0)}}@keyframes bbFadeInRight{from{opacity:0;transform:translate3d(100%,0,0)}to{opacity:1;transform:translate3d(0,0,0)}}@keyframes bbFadeOutRight{from{opacity:1}to{opacity:0}}@keyframes bbZoomOut{from{opacity:1}50%{opacity:0;transform:scale3d(.3,.3,.3)}to{opacity:0}}@keyframes bbZoomIn{from{opacity:0;transform:scale3d(.3,.3,.3)}50%{opacity:1}}
\ No newline at end of file
diff --git a/published/latest/index.js b/published/latest/index.js
index 0ca802ae..c989c62a 100644
--- a/published/latest/index.js
+++ b/published/latest/index.js
@@ -1626,7 +1626,9 @@ var ReplayRecFrame = /*#__PURE__*/function () {
}, {
key: "flushObserver",
value: function flushObserver() {
- this.rec.observerCallback(this.observer.takeRecords());
+ if (this.observer && typeof this.observer.takeRecords !== "undefined") {
+ this.rec.observerCallback(this.observer.takeRecords());
+ }
}
}]);
@@ -2869,7 +2871,11 @@ var Session = /*#__PURE__*/function () {
var userNameInfo = document.querySelector("#bb-user-name");
if (userNameInfo) {
- userNameInfo.textContent = session.name ? session.name : "";
+ if (session.name && src_Gleap.getInstance().showUserName) {
+ userNameInfo.textContent = session.name;
+ } else {
+ userNameInfo.textContent = "";
+ }
}
_this.notifySessionReady();
@@ -2927,9 +2933,7 @@ var Session = /*#__PURE__*/function () {
if (_this.session.userId.toString() !== userId.toString()) {
return true;
}
- } catch (exp) {
- console.log("Gleap: warn");
- }
+ } catch (exp) {}
if (userData) {
var userDataKeys = Object.keys(userData);
@@ -5177,13 +5181,14 @@ var AutoConfig = /*#__PURE__*/function () {
}();
AutoConfig_defineProperty(AutoConfig, "run", function () {
- /*const session = Session.getInstance();
- const cachedConfig = loadFromGleapCache(`config-${session.sdkKey}`);
+ var session = Session.getInstance();
+ /*const cachedConfig = loadFromGleapCache(`config-${session.sdkKey}`);
if (cachedConfig) {
AutoConfig.applyConfig(cachedConfig, false);
AutoConfig.loadConfigFromServer(true).catch(function (e) {});
return Promise.resolve();
}*/
+
return AutoConfig.loadConfigFromServer(false);
});
@@ -5552,7 +5557,13 @@ var Gleap_Gleap = /*#__PURE__*/function () {
var self = this;
window.onerror = function (msg, url, lineNo, columnNo, error) {
- var message = ["Message: " + msg, "URL: " + url, "Line: " + lineNo, "Column: " + columnNo, "Stack: " + (error && error.stack) ? error.stack : 0];
+ var stackTrace = "";
+
+ if (error !== null && typeof error.stack !== "undefined") {
+ stackTrace = error.stack;
+ }
+
+ var message = ["Message: " + msg, "URL: " + url, "Line: " + lineNo, "Column: " + columnNo, "Stack: " + stackTrace];
self.addLog(message, "ERROR");
if (self.enabledCrashDetector && !self.appCrashDetected && !self.currentlySendingBug) {
@@ -5564,7 +5575,7 @@ var Gleap_Gleap = /*#__PURE__*/function () {
url: url,
lineNo: lineNo,
columnNo: columnNo,
- stackTrace: error && error.stack ? error.stack : ""
+ stackTrace: stackTrace
}, Gleap.PRIORITY_MEDIUM, "CRASH", {
screenshot: true,
replays: true
@@ -6253,7 +6264,7 @@ var Gleap_Gleap = /*#__PURE__*/function () {
currentUrl: window.location.href,
language: navigator.language || navigator.userLanguage,
mobile: isMobile(),
- sdkVersion: "6.8.9",
+ sdkVersion: "6.8.10",
sdkType: "javascript"
};
}
@@ -6956,9 +6967,15 @@ var Gleap_Gleap = /*#__PURE__*/function () {
instance.stopBugReportingAnalytics();
instance.widgetOpened = true;
instance.openedMenu = true;
- instance.updateFeedbackButtonState(); // Start feedback type dialog
+ instance.updateFeedbackButtonState();
+ var displayUserName = "";
+
+ if (instance.showUserName && sessionInstance.session && sessionInstance.session.name) {
+ displayUserName = sessionInstance.session.name;
+ } // Start feedback type dialog
+
- createFeedbackTypeDialog(instance.feedbackTypeActions, instance.overrideLanguage, instance.customLogoUrl, instance.poweredByHidden, function () {}, "".concat(translateText("Hi", instance.overrideLanguage), " ").concat(instance.showUserName && sessionInstance.session.name ? sessionInstance.session.name : "", " ").concat(instance.welcomeIcon), translateText(instance.widgetInfo.dialogSubtitle, instance.overrideLanguage), fromBack);
+ createFeedbackTypeDialog(instance.feedbackTypeActions, instance.overrideLanguage, instance.customLogoUrl, instance.poweredByHidden, function () {}, "".concat(translateText("Hi", instance.overrideLanguage), " ").concat(displayUserName, " ").concat(instance.welcomeIcon), translateText(instance.widgetInfo.dialogSubtitle, instance.overrideLanguage), fromBack);
}
/**
* Register custom action
diff --git a/src/AutoConfig.js b/src/AutoConfig.js
index 1c651d66..60b447c3 100644
--- a/src/AutoConfig.js
+++ b/src/AutoConfig.js
@@ -5,12 +5,12 @@ import Session from "./Session";
export default class AutoConfig {
static run = () => {
const session = Session.getInstance();
- const cachedConfig = loadFromGleapCache(`config-${session.sdkKey}`);
+ /*const cachedConfig = loadFromGleapCache(`config-${session.sdkKey}`);
if (cachedConfig) {
AutoConfig.applyConfig(cachedConfig, false);
AutoConfig.loadConfigFromServer(true).catch(function (e) {});
return Promise.resolve();
- }
+ }*/
return AutoConfig.loadConfigFromServer(false);
};
diff --git a/src/Gleap.js b/src/Gleap.js
index 0cc91b71..6309c3a4 100755
--- a/src/Gleap.js
+++ b/src/Gleap.js
@@ -796,6 +796,15 @@ class Gleap {
instance.openedMenu = true;
instance.updateFeedbackButtonState();
+ var displayUserName = "";
+ if (
+ instance.showUserName &&
+ sessionInstance.session &&
+ sessionInstance.session.name
+ ) {
+ displayUserName = sessionInstance.session.name;
+ }
+
// Start feedback type dialog
createFeedbackTypeDialog(
instance.feedbackTypeActions,
@@ -806,11 +815,9 @@ class Gleap {
`${translateText(
"Hi",
instance.overrideLanguage
- )} ${
- instance.showUserName && sessionInstance.session.name
- ? sessionInstance.session.name
- : ""
- } ${instance.welcomeIcon}`,
+ )} ${displayUserName} ${
+ instance.welcomeIcon
+ }`,
translateText(
instance.widgetInfo.dialogSubtitle,
instance.overrideLanguage
@@ -1061,12 +1068,16 @@ class Gleap {
startCrashDetection() {
const self = this;
window.onerror = function (msg, url, lineNo, columnNo, error) {
+ var stackTrace = "";
+ if (error !== null && typeof error.stack !== "undefined") {
+ stackTrace = error.stack;
+ }
var message = [
"Message: " + msg,
"URL: " + url,
"Line: " + lineNo,
"Column: " + columnNo,
- "Stack: " + (error && error.stack) ? error.stack : "",
+ "Stack: " + stackTrace,
];
self.addLog(message, "ERROR");
@@ -1083,7 +1094,7 @@ class Gleap {
url: url,
lineNo: lineNo,
columnNo: columnNo,
- stackTrace: error && error.stack ? error.stack : "",
+ stackTrace: stackTrace,
},
Gleap.PRIORITY_MEDIUM,
"CRASH",
diff --git a/src/ReplayRecFrame.js b/src/ReplayRecFrame.js
index 9db560fb..d2ac1f2d 100644
--- a/src/ReplayRecFrame.js
+++ b/src/ReplayRecFrame.js
@@ -231,6 +231,8 @@ export default class ReplayRecFrame {
}
flushObserver() {
- this.rec.observerCallback(this.observer.takeRecords());
+ if (this.observer && typeof this.observer.takeRecords !== "undefined") {
+ this.rec.observerCallback(this.observer.takeRecords());
+ }
}
}
diff --git a/src/Session.js b/src/Session.js
index 7e9c3ac4..55c8830d 100644
--- a/src/Session.js
+++ b/src/Session.js
@@ -77,8 +77,11 @@ export default class Session {
// Optionally update UI.
const userNameInfo = document.querySelector("#bb-user-name");
if (userNameInfo) {
- userNameInfo.textContent =
- session.name && Gleap.getInstance().showUserName ? session.name : "";
+ if (session.name && Gleap.getInstance().showUserName) {
+ userNameInfo.textContent = session.name;
+ } else {
+ userNameInfo.textContent = "";
+ }
}
this.notifySessionReady();