Files
Website/resources/js/helpers/common.js

319 lines
6.9 KiB
JavaScript

const transitionEndEventName = () => {
var i,
undefined,
el = document.createElement("div"),
transitions = {
transition: "transitionend",
OTransition: "otransitionend",
MozTransition: "transitionend",
WebkitTransition: "webkitTransitionEnd",
};
for (i in transitions) {
if (transitions.hasOwnProperty(i) && el.style[i] !== undefined) {
return transitions[i];
}
}
return null;
};
const waitForElementRender = (elem) => {
return new Promise((resolve) => {
if (document.contains(elem.value)) {
return resolve(elem.value);
}
const MutationObserver =
window.MutationObserver ||
window.WebKitMutationObserver ||
window.MozMutationObserver;
const observer = new MutationObserver((mutations) => {
if (document.contains(elem.value)) {
resolve(elem.value);
observer.disconnect();
}
});
observer.observe(document.body, {
childList: true,
subtree: true,
});
});
};
const transitionEnter = (elem, transition) => {
waitForElementRender(elem).then((e) => {
window.setTimeout(() => {
e.classList.replace(
transition + "-enter-from",
transition + "-enter-active"
);
const transitionName = transitionEndEventName();
e.addEventListener(
transitionName,
() => {
e.classList.replace(
transition + "-enter-active",
transition + "-enter-to"
);
},
false
);
}, 1);
});
};
const transitionLeave = (elem, transition, callback = null) => {
elem.value.classList.remove(transition + "-enter-to");
elem.value.classList.add(transition + "-leave-from");
window.setTimeout(() => {
elem.value.classList.replace(
transition + "-leave-from",
transition + "-leave-active"
);
const transitionName = transitionEndEventName();
elem.value.addEventListener(
transitionName,
() => {
elem.value.classList.replace(
transition + "-leave-active",
transition + "-leave-to"
);
if (callback) {
callback();
}
},
false
);
}, 1);
};
export const monthString = [
"Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
"Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec",
];
export const fullMonthString = [
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December",
];
/**
*
* @param target
*/
export function isBool(target) {
return typeof target === "boolean";
}
/**
*
* @param target
*/
export function isNumber(target) {
return typeof target === "number";
}
/**
*
* @param target
*/
export function isObject(target) {
return typeof target === "object" && target !== null;
}
/**
*
* @param target
*/
export function isString(target) {
return typeof target === "string" && target !== null;
}
/**
*
* @param target
* @param def
*/
export function parseErrorType(
target,
def = "An unknown error occurred. Please try again later."
) {
if (target.response?.message) {
return target.response.message;
} else if (target instanceof Error) {
target.message;
} else if (isString(err)) {
return target;
}
return def;
}
export const buildUrlQuery = (url, query) => {
let s = "";
if (Object.keys(query).length > 0) {
s = "?";
}
s += Object.keys(query)
.map((key) => key + "=" + query[key])
.join("&");
return url + s;
};
export const toParamString = (obj, q = true) => {
let s = "";
if (q && Object.keys(obj).length > 0) {
s = "?";
}
s += Object.keys(obj)
.map((key) => key + "=" + obj[key])
.join("&");
return s;
};
export const getLocale = () => {
return (
navigator.userLanguage ||
(navigator.languages &&
navigator.languages.length &&
navigator.languages[0]) ||
navigator.language ||
navigator.browserLanguage ||
navigator.systemLanguage ||
"en"
);
};
export const debounce = (fn, delay) => {
var timeoutID = null;
return function () {
clearTimeout(timeoutID);
var args = arguments;
var that = this;
timeoutID = setTimeout(function () {
fn.apply(that, args);
}, delay);
};
};
export const bytesReadable = (bytes) => {
if (isNaN(bytes)) {
return "0 Bytes";
}
if (Math.abs(bytes) < 1024) {
return bytes + " Bytes";
}
const units = ["KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
let u = -1;
const r = 10 ** 1;
do {
bytes /= 1000;
++u;
} while (
Math.round(Math.abs(bytes) * r) / r >= 1000 &&
u < units.length - 1
);
return bytes.toFixed(1) + " " + units[u];
};
export const arrayIncludesMatchBasic = (arr, str) => {
let matches = false;
arr.every((elem) => {
elem = elem.replace(/[|\\{}()[\]^$+?.]/g, "\\$&");
let regex = new RegExp("^" + elem.replace("*", ".*?") + "$", "i");
if (str.match(regex)) {
matches = true;
}
return !matches;
});
return matches;
};
export const excerpt = (txt, maxLen = 150, strip = true) => {
if (strip) {
txt = stripHtmlTags(replaceHtmlEntites(txt));
}
let txtPieces = txt.split(" ");
let excerptPieces = [];
let curLen = 0;
txtPieces.every((itm) => {
if (curLen + itm.length >= maxLen) {
return false;
}
excerptPieces.push(itm);
curLen += itm.length + 1;
return true;
});
return excerptPieces.join(" ") + (curLen < txt.length ? "..." : "");
};
export const stripHtmlTags = (txt) => {
txt = txt.replace(/<(p|br)([ /]*?>|[ /]+.*?>)/g, " ");
return txt.replace(/<[a-zA-Z/][^>]+(>|$)/g, "");
};
export const replaceHtmlEntites = (txt) => {
var translate_re = /&(nbsp|amp|quot|lt|gt);/g;
var translate = {
nbsp: " ",
amp: "&",
quot: '"',
lt: "<",
gt: ">",
};
return txt.replace(translate_re, function (match, entity) {
return translate[entity];
});
};
export const isUUID = (uuid) => {
return /^[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(
uuid
);
};
export {
transitionEndEventName,
waitForElementRender,
transitionEnter,
transitionLeave,
};