mirror of
https://github.com/KevinMidboe/seasoned.git
synced 2026-03-10 19:39:10 +00:00
135 lines
3.8 KiB
TypeScript
135 lines
3.8 KiB
TypeScript
export const sortableSize = (string: string): number => {
|
|
const UNITS = ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
|
|
const [numStr, unit] = string.split(" ");
|
|
|
|
if (UNITS.indexOf(unit) === -1) return null;
|
|
|
|
const exponent = UNITS.indexOf(unit) * 3 + 4;
|
|
return Math.floor(Number(numStr) * 10 ** exponent);
|
|
};
|
|
|
|
export const parseJwt = (token: string) => {
|
|
const base64Url = token.split(".")[1];
|
|
const base64 = base64Url.replace(/-/g, "+").replace(/_/g, "/");
|
|
const jsonPayload = decodeURIComponent(
|
|
atob(base64)
|
|
.split("")
|
|
.map(c => {
|
|
return `%${`00${c.charCodeAt(0).toString(16)}`.slice(-2)}`;
|
|
})
|
|
.join("")
|
|
);
|
|
|
|
return JSON.parse(jsonPayload);
|
|
};
|
|
|
|
export const buildImageProxyUrl = (
|
|
width: number,
|
|
height: number,
|
|
asset: string
|
|
) => {
|
|
const proxyHost = `http://imgproxy.schleppe:8080/insecure/`;
|
|
const proxySizeOptions = `resize:fill:${Math.floor(width / 1)}:${Math.floor(
|
|
height / 1
|
|
)}:ce/q:85/plain/`;
|
|
const assetUrl = `https://image.tmdb.org/t/p/w500/${asset}`;
|
|
|
|
return `${proxyHost}${proxySizeOptions}${assetUrl}`;
|
|
};
|
|
|
|
export function focusFirstFormInput(formElement: HTMLFormElement): void {
|
|
if (!formElement) return;
|
|
|
|
const firstInput = formElement?.getElementsByTagName("input")[0];
|
|
if (!firstInput) return;
|
|
|
|
firstInput.focus();
|
|
}
|
|
|
|
export function focusOnNextElement(elementEvent: KeyboardEvent): void {
|
|
const { target } = elementEvent;
|
|
if (!target) return;
|
|
|
|
const form = document.getElementsByTagName("form")[0];
|
|
if (!form) return;
|
|
|
|
const inputElements = form.getElementsByTagName("input");
|
|
const targetIndex = Array.from(inputElements).findIndex(
|
|
element => element === target
|
|
);
|
|
if (targetIndex < inputElements.length) {
|
|
inputElements[targetIndex + 1].focus();
|
|
}
|
|
}
|
|
|
|
export function humanMinutes(minutes) {
|
|
if (minutes instanceof Array) {
|
|
/* eslint-disable-next-line prefer-destructuring, no-param-reassign */
|
|
minutes = minutes[0];
|
|
}
|
|
|
|
const hours = Math.floor(minutes / 60);
|
|
const minutesLeft = minutes - hours * 60;
|
|
|
|
if (minutesLeft === 0) {
|
|
return hours > 1 ? `${hours} hours` : `${hours} hour`;
|
|
}
|
|
|
|
if (hours === 0) {
|
|
return `${minutesLeft} min`;
|
|
}
|
|
|
|
return `${hours}h ${minutesLeft}m`;
|
|
}
|
|
|
|
export function getValueFromUrlQuery(queryParameter: string): string {
|
|
const params = new URLSearchParams(window.location.search);
|
|
return params.get(queryParameter) || "";
|
|
}
|
|
|
|
export function setUrlQueryParameter(parameter: string, value: string): void {
|
|
const params = new URLSearchParams();
|
|
params.append(parameter, value);
|
|
|
|
const url = `${window.location.protocol}//${window.location.hostname}${
|
|
window.location.port ? `:${window.location.port}` : ""
|
|
}${window.location.pathname}${params.toString().length ? `?${params}` : ""}`;
|
|
|
|
window.history.pushState({}, "search", url);
|
|
}
|
|
|
|
export function convertSecondsToHumanReadable(_value, values = null) {
|
|
let value = _value;
|
|
const highestValue = values ? values[0] : value;
|
|
|
|
// minutes
|
|
if (highestValue < 3600) {
|
|
const minutes = Math.floor(value / 60);
|
|
|
|
value = `${minutes} m`;
|
|
}
|
|
// hours and minutes
|
|
else if (highestValue > 3600 && highestValue < 86400) {
|
|
const hours = Math.floor(value / 3600);
|
|
const minutes = Math.floor((value % 3600) / 60);
|
|
|
|
value = hours !== 0 ? `${hours} h ${minutes} m` : `${minutes} m`;
|
|
}
|
|
// days and hours
|
|
else if (highestValue > 86400 && highestValue < 31557600) {
|
|
const days = Math.floor(value / 86400);
|
|
const hours = Math.floor((value % 86400) / 3600);
|
|
|
|
value = days !== 0 ? `${days} d ${hours} h` : `${hours} h`;
|
|
}
|
|
// years and days
|
|
else if (highestValue > 31557600) {
|
|
const years = Math.floor(value / 31557600);
|
|
const days = Math.floor((value % 31557600) / 86400);
|
|
|
|
value = years !== 0 ? `${years} y ${days} d` : `${days} d`;
|
|
}
|
|
|
|
return value;
|
|
}
|