mirror of
https://github.com/idanoo/autobrr
synced 2025-07-23 08:49:13 +00:00

* feat(releases): show details in list view * fix(releases): activitytable columns type * fix(releases): incognito mode * feat(releases): move details button * do we wanna truncate? * fix(web): release column width at full size --------- Co-authored-by: martylukyy <35452459+martylukyy@users.noreply.github.com>
140 lines
4.5 KiB
TypeScript
140 lines
4.5 KiB
TypeScript
/*
|
|
* Copyright (c) 2021 - 2024, Ludvig Lundgren and the autobrr contributors.
|
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
|
*/
|
|
|
|
import { formatDistanceToNowStrict, formatISO9075 } from "date-fns";
|
|
|
|
// sleep for x ms
|
|
export function sleep(ms: number) {
|
|
return new Promise(resolve => setTimeout(resolve, ms));
|
|
}
|
|
|
|
// get baseUrl sent from server rendered index template
|
|
export function baseUrl() {
|
|
let baseUrl = "";
|
|
if (window.APP.baseUrl) {
|
|
if (window.APP.baseUrl === "{{.BaseUrl}}") {
|
|
baseUrl = "/";
|
|
} else {
|
|
baseUrl = window.APP.baseUrl;
|
|
}
|
|
}
|
|
return baseUrl;
|
|
}
|
|
|
|
// get sseBaseUrl for SSE
|
|
export function sseBaseUrl() {
|
|
if (process.env.NODE_ENV === "development")
|
|
return "http://localhost:7474/";
|
|
|
|
return `${window.location.origin}${baseUrl()}`;
|
|
}
|
|
|
|
export function classNames(...classes: string[]) {
|
|
return classes.filter(Boolean).join(" ");
|
|
}
|
|
|
|
// column widths for inputs etc
|
|
export type COL_WIDTHS = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12;
|
|
|
|
// simplify date
|
|
export function simplifyDate(date?: string) {
|
|
if (typeof(date) === "string" && date !== "0001-01-01T00:00:00Z") {
|
|
return formatISO9075(new Date(date));
|
|
}
|
|
return "n/a";
|
|
}
|
|
|
|
// if empty date show as n/a
|
|
export function IsEmptyDate(date?: string) {
|
|
if (typeof(date) === "string" && date !== "0001-01-01T00:00:00Z") {
|
|
return formatDistanceToNowStrict(
|
|
new Date(date),
|
|
{ addSuffix: true }
|
|
);
|
|
}
|
|
return "n/a";
|
|
}
|
|
|
|
export function slugify(str: string) {
|
|
return str
|
|
.normalize("NFKD")
|
|
.toLowerCase()
|
|
.replace(/[^\w\s-]/g, "")
|
|
.trim()
|
|
.replace(/[-\s]+/g, "-");
|
|
}
|
|
|
|
// WARNING: This is not a drop in replacement solution and
|
|
// it might not work for some edge cases. Test your code!
|
|
export const get = <T> (obj: T, path: string|Array<any>, defValue?: string) => {
|
|
// If path is not defined or it has false value
|
|
if (!path)
|
|
return undefined;
|
|
// Check if path is string or array. Regex : ensure that we do not have '.' and brackets.
|
|
// Regex explained: https://regexr.com/58j0k
|
|
const pathArray = Array.isArray(path) ? path : path.match(/([^[.\]])+/g);
|
|
// Find value
|
|
const result = pathArray && pathArray.reduce(
|
|
(prevObj, key) => prevObj && prevObj[key],
|
|
obj
|
|
);
|
|
// If found value is undefined return default value; otherwise return the value
|
|
return result === undefined ? defValue : result;
|
|
};
|
|
|
|
const UNITS = ['byte', 'kilobyte', 'megabyte', 'gigabyte', 'terabyte', 'petabyte']
|
|
const BYTES_PER_KB = 1000
|
|
|
|
|
|
/**
|
|
* Format bytes as human-readable text.
|
|
*
|
|
* @param sizeBytes Number of bytes.
|
|
*
|
|
* @return Formatted string.
|
|
*/
|
|
export function humanFileSize(sizeBytes: number | bigint): string {
|
|
let size = Math.abs(Number(sizeBytes))
|
|
|
|
let u = 0
|
|
while (size >= BYTES_PER_KB && u < UNITS.length - 1) {
|
|
size /= BYTES_PER_KB
|
|
++u
|
|
}
|
|
|
|
return new Intl.NumberFormat([], {
|
|
style: 'unit',
|
|
unit: UNITS[u],
|
|
unitDisplay: 'short',
|
|
maximumFractionDigits: 1,
|
|
}).format(size)
|
|
}
|
|
|
|
export const RandomLinuxIsos = (count: number) => {
|
|
const linuxIsos = [
|
|
"ubuntu-20.04.4-lts-focal-fossa-desktop-amd64-secure-boot",
|
|
"debian-11.3.0-bullseye-amd64-DVD-1-with-nonfree-firmware-netinst",
|
|
"fedora-36-workstation-x86_64-live-iso-with-rpmfusion-free-and-nonfree",
|
|
"archlinux-2023.04.01-x86_64-advanced-installation-environment",
|
|
"linuxmint-20.3-uma-cinnamon-64bit-full-multimedia-support-edition",
|
|
"centos-stream-9-x86_64-dvd1-full-install-iso-with-extended-repositories",
|
|
"opensuse-tumbleweed-20230415-DVD-x86_64-full-packaged-desktop-environments",
|
|
"manjaro-kde-21.1.6-210917-linux514-full-hardware-support-edition",
|
|
"elementaryos-6.1-odin-amd64-20230104-iso-with-pantheon-desktop-environment",
|
|
"pop_os-21.10-amd64-nvidia-proprietary-drivers-included-live",
|
|
"kali-linux-2023.2-live-amd64-iso-with-persistent-storage-and-custom-tools",
|
|
"zorin-os-16-pro-ultimate-edition-64-bit-r1-iso-with-windows-app-support",
|
|
"endeavouros-2023.04.15-x86_64-iso-with-offline-installer-and-xfce4",
|
|
"mx-linux-21.2-aarch64-xfce-iso-with-ahs-enabled-kernel-and-snapshot-feature",
|
|
"solus-4.3-budgie-desktop-environment-full-iso-with-software-center",
|
|
"slackware-15.0-install-dvd-iso-with-extended-documentation-and-extras",
|
|
"alpine-standard-3.15.0-x86_64-iso-for-container-and-server-use",
|
|
"gentoo-livecd-amd64-minimal-20230407-stage3-tarball-included",
|
|
"peppermint-11-20210903-amd64-iso-with-hybrid-lxde-xfce-desktop",
|
|
"deepin-20.3-amd64-iso-with-deepin-desktop-environment-and-app-store"
|
|
];
|
|
|
|
return Array.from({ length: count }, () => linuxIsos[Math.floor(Math.random() * linuxIsos.length)]);
|
|
};
|