xssbook2/web/public/js/lib.js
2024-03-30 12:14:42 -04:00

110 lines
2 KiB
JavaScript

///
/// document ready functions
///
let ready = false;
$(function() {
ready = true;
});
var r$ = function(callback) {
if (ready) {
callback();
} else {
$(function() {
callback();
});
}
}
///
/// dom observer
/// checks for elements on the DOM now and added later
///
function observe(containerSelector, elementSelector, callback) {
r$(() => {
$(containerSelector + ' ' + elementSelector).each(function (_, e) {
let me = $(e);
callback(me);
});
var onMutationsObserved = function(mutations) {
mutations.forEach(function(mutation) {
if (mutation.addedNodes.length) {
var elements = $(mutation.addedNodes).find(elementSelector);
for (var i = 0, len = elements.length; i < len; i++) {
let me = elements[i];
me = $(me);
callback(me);
}
}
});
};
var target = $(containerSelector)[0];
if (!target) {
console.warn('[observe] didnt find container: ', containerSelector);
return;
}
var config = { childList: true, subtree: true };
var MutationObserver = window.MutationObserver;
var observer = new MutationObserver(onMutationsObserved);
observer.observe(target, config);
});
}
///
/// ajax setup
///
let ajaxHeaders = {};
ajaxHeaders['Content-Type'] = 'application/json';
if (jwtStr) {
ajaxHeaders['Authorization'] = 'Bearer ' + jwtStr
}
$.ajaxSetup({
headers: ajaxHeaders
})
///
/// ajax error handle
///
var errorToast = (xhr) => {
let data = xhr.responseJSON;
let msg = data.message;
let detail = data.details;
let hint = data.hint;
let query = '?msg=' + msg;
if (detail) {
query += '&detail=' + detail;
}
if (hint) {
query += '&hint=' + hint;
}
let url = '/template/toast' + query;
$.get(url, function (data) {
$('#toast-container').prepend(data);
})
}
observe('#toast-container', '.action-close-toast', function(el) {
el.on('click', function() {
el.parent().remove();
});
setTimeout(function() {
el.parent().remove();
}, 5000);
});