319 lines
6.9 KiB
JavaScript
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,
|
|
};
|