@funnelenvy-npm/fe-dev-utils
Version:
Helper function to build client side A/B tests
56 lines (55 loc) • 2.29 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const on_error_1 = __importDefault(require("../on-error"));
const getElement = ({ condition, activity = "", errorHandler = null, outTimer = 10000, }) => {
let selectors = Array.isArray(condition) ? condition : [condition];
let results = {};
return new Promise((resolve, reject) => {
const observer = new MutationObserver(() => {
selectors = selectors.filter((selector) => {
const els = document.querySelectorAll(selector);
if (els.length > 0) {
results[selector] = els;
return false; // Remove from selectors to check
}
return true;
});
if (selectors.length === 0) {
observer.disconnect();
resolve(results);
}
});
// Initial check in case elements are already present
selectors.forEach((selector) => {
const els = document.querySelectorAll(selector);
if (els.length > 0) {
results[selector] = els;
selectors = selectors.filter((s) => s !== selector); // Remove found selector
}
});
if (selectors.length === 0) {
resolve(results);
return;
}
// Observe mutations in the document
observer.observe(document.body, { childList: true, subtree: true });
// Set a timeout to reject the promise if elements are not found within the given time
setTimeout(() => {
observer.disconnect();
if (selectors.length > 0) {
const error = new Error(`Timeout while waiting for selectors: ${selectors.join(', ')}`);
if (errorHandler && typeof errorHandler === 'function') {
errorHandler({ activity, error });
}
else {
(0, on_error_1.default)({ activity, error });
}
reject(error);
}
}, outTimer);
});
};
exports.default = getElement;