mirror of
https://github.com/hanzo-io/cloud.git
synced 2026-10-30 18:57:42 +00:00
217 lines
4.9 KiB
JavaScript
217 lines
4.9 KiB
JavaScript
import dayjs, { dayjsLocal } from '../utils/dayjs';
|
|
import { getTeam } from '../data/team';
|
|
import { format } from 'sql-formatter';
|
|
|
|
export function bytes(bytes, decimals = 2, current = 0) {
|
|
if (bytes === 0) return '0 Bytes';
|
|
|
|
const k = 1024;
|
|
const dm = decimals < 0 ? 0 : decimals;
|
|
const sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
|
|
let i = Math.floor(Math.log(Math.abs(bytes)) / Math.log(k));
|
|
if (i < 0) i++;
|
|
|
|
return (
|
|
parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i + current]
|
|
);
|
|
}
|
|
|
|
export function duration(value) {
|
|
if (!value) return;
|
|
|
|
let [hours, minutes, seconds] = value.split(':');
|
|
[hours, minutes, seconds] = [
|
|
parseInt(hours),
|
|
parseInt(minutes),
|
|
parseInt(seconds),
|
|
];
|
|
|
|
let format = '';
|
|
if (hours > 0) {
|
|
format = 'H[h] m[m] s[s]';
|
|
} else if (minutes > 0) {
|
|
format = 'm[m] s[s]';
|
|
} else {
|
|
format = 's[s]';
|
|
}
|
|
return dayjs.duration({ hours, minutes, seconds }).format(format);
|
|
}
|
|
|
|
export function plural(number, singular, plural) {
|
|
if (typeof number === 'string') {
|
|
number = parseInt(number);
|
|
}
|
|
if (number === 1) {
|
|
return singular;
|
|
}
|
|
return plural;
|
|
}
|
|
|
|
export function planTitle(plan) {
|
|
if (plan === undefined) return;
|
|
const $team = getTeam();
|
|
const india = $team.doc?.currency === 'INR';
|
|
const priceField = india ? 'price_inr' : 'price_usd';
|
|
const price =
|
|
plan?.block_monthly == 1 ? plan[priceField] * 12 : plan[priceField];
|
|
return price > 0 ? `${userCurrency(price, 0)}` : plan.plan_title;
|
|
}
|
|
|
|
export function userCurrency(value, fractions = 2) {
|
|
const $team = getTeam();
|
|
if (!$team.doc?.currency) return value;
|
|
return currency(value, $team.doc?.currency, fractions);
|
|
}
|
|
|
|
export function currency(value, currency, fractions = 2) {
|
|
return new Intl.NumberFormat('en-US', {
|
|
style: 'currency',
|
|
currency,
|
|
maximumFractionDigits: fractions,
|
|
}).format(value);
|
|
}
|
|
|
|
export function numberK(number) {
|
|
if (number < 1000) {
|
|
return number;
|
|
} else {
|
|
let value = Math.round(number / 1000, 1);
|
|
|
|
// To handle cases like 8.0, 9.0 etc.
|
|
if (value == number / 1000) {
|
|
value = parseInt(value);
|
|
}
|
|
// To handle cases like 8999 -> 9k and not 9.0k
|
|
else if (value - 1 == number / 1000) {
|
|
value = parseInt(value);
|
|
}
|
|
|
|
return `${value}k`;
|
|
}
|
|
}
|
|
|
|
export function pricePerDay(price) {
|
|
let daysInThisMonth = dayjs().daysInMonth();
|
|
return price / daysInThisMonth;
|
|
}
|
|
|
|
export function date(dateTimeString, format = 'LLLL') {
|
|
if (!dateTimeString) return;
|
|
return dayjsLocal(dateTimeString).format(format);
|
|
}
|
|
|
|
export function commaSeparator(arr, separator) {
|
|
let joinedString = arr.slice(0, -1).join(', ');
|
|
|
|
if (arr.length > 1) {
|
|
joinedString += ` ${separator} ${arr[arr.length - 1]}`;
|
|
} else {
|
|
joinedString += arr[0];
|
|
}
|
|
|
|
return joinedString;
|
|
}
|
|
|
|
export function commaAnd(arr) {
|
|
return commaSeparator(arr, 'and');
|
|
}
|
|
|
|
export function formatSQL(query) {
|
|
try {
|
|
return format(query, {
|
|
language: 'mariadb',
|
|
tabWidth: 2,
|
|
keywordCase: 'upper',
|
|
});
|
|
} catch (_) {
|
|
return query;
|
|
}
|
|
}
|
|
|
|
export function formatSeconds(seconds) {
|
|
if (seconds === 0) return '0s';
|
|
if (seconds <= 60) return `${seconds}s`;
|
|
|
|
const hours = Math.floor(seconds / 3600);
|
|
const minutes = Math.floor((seconds % 3600) / 60);
|
|
const remainingSeconds = seconds % 60;
|
|
|
|
let result = [];
|
|
|
|
if (hours > 0) {
|
|
result.push(`${hours}h`);
|
|
}
|
|
|
|
if (minutes > 0) {
|
|
result.push(`${minutes}m`);
|
|
}
|
|
|
|
if (remainingSeconds > 0) {
|
|
result.push(`${remainingSeconds}s`);
|
|
}
|
|
|
|
return result.join(' ');
|
|
}
|
|
|
|
export function formatCommaSeperatedNumber(number) {
|
|
let numStr = number.toString();
|
|
|
|
let lastThree = numStr.slice(-3);
|
|
let remaining = numStr.slice(0, -3);
|
|
|
|
let parts = [];
|
|
while (remaining.length > 2) {
|
|
parts.push(remaining.slice(-2));
|
|
remaining = remaining.slice(0, -2);
|
|
}
|
|
|
|
if (remaining) {
|
|
parts.push(remaining);
|
|
}
|
|
|
|
let result = parts.reverse().join(',') + ',' + lastThree;
|
|
// truncate , at start or end
|
|
result = result.replace(/^,/, '');
|
|
result = result.replace(/,$/, '');
|
|
return result;
|
|
}
|
|
|
|
export function formatMilliseconds(ms) {
|
|
if (ms < 100) {
|
|
return `${ms.toFixed(3).replace(/\.?0+$/, '')}ms`; // Keep milliseconds if less than 100 and remove unnecessary zeros
|
|
} else if (ms < 60000) {
|
|
// Less than 1 minute, convert to seconds
|
|
let seconds = ms / 1000;
|
|
return `${seconds.toFixed(1).replace(/\.?0+$/, '')}s`;
|
|
} else {
|
|
// Convert to minutes
|
|
let minutes = ms / 60000;
|
|
return `${minutes.toFixed(1).replace(/\.?0+$/, '')}m`;
|
|
}
|
|
}
|
|
|
|
export function formatValue(value, type) {
|
|
switch (type) {
|
|
case 'bytes':
|
|
return bytes(value);
|
|
case 'date':
|
|
return date(value);
|
|
case 'duration':
|
|
return duration(value);
|
|
case 'durationSeconds':
|
|
return formatSeconds(value);
|
|
case 'durationMilliseconds':
|
|
return formatMilliseconds(value);
|
|
case 'commaSeperatedNumber':
|
|
return formatCommaSeperatedNumber(value);
|
|
case 'numberK':
|
|
return numberK(value);
|
|
case 'pricePerDay':
|
|
return pricePerDay(value);
|
|
case 'sql':
|
|
return formatSQL(value);
|
|
default:
|
|
return value;
|
|
}
|
|
}
|