120 lines
2.9 KiB
TypeScript
120 lines
2.9 KiB
TypeScript
import { clsx, type ClassValue } from "clsx";
|
|
import { twMerge } from "tailwind-merge";
|
|
|
|
import {
|
|
ACCOUNT_TYPE_LABELS,
|
|
ACCOUNT_TYPE_PLAYER_COUNTS,
|
|
ACCOUNT_TYPE_PRICES,
|
|
ACTIVATE_STATUS_LABELS,
|
|
REQUEST_STATUS_LABELS,
|
|
TRIAL_ACCOUNT_TYPE_LABELS,
|
|
type AccountType,
|
|
type ActivateStatus,
|
|
type PaidAccountType,
|
|
type RequestStatus,
|
|
} from "@/lib/constants";
|
|
|
|
export function cn(...inputs: ClassValue[]) {
|
|
return twMerge(clsx(inputs));
|
|
}
|
|
|
|
export function getAccountTypeLabel(accountType: number): string {
|
|
return (
|
|
ACCOUNT_TYPE_LABELS[accountType as AccountType] ?? `${accountType}? (N/A)`
|
|
);
|
|
}
|
|
|
|
export function getTrialAccountTypeLabel(accountType: number): string {
|
|
return (
|
|
TRIAL_ACCOUNT_TYPE_LABELS[accountType as PaidAccountType] ??
|
|
`${accountType}? (N/A)`
|
|
);
|
|
}
|
|
|
|
export function getAccountTypePlayerCount(accountType: number): number {
|
|
return ACCOUNT_TYPE_PLAYER_COUNTS[accountType as PaidAccountType] ?? 0;
|
|
}
|
|
|
|
export function getAccountTypePrice(accountType: number): number {
|
|
return ACCOUNT_TYPE_PRICES[accountType as PaidAccountType] ?? 0;
|
|
}
|
|
|
|
export function getActivateStatusLabel(activateStatus: number): string {
|
|
return (
|
|
ACTIVATE_STATUS_LABELS[activateStatus as ActivateStatus] ??
|
|
`${activateStatus}? (N/A)`
|
|
);
|
|
}
|
|
|
|
export function getRequestStatusLabel(status: number): string {
|
|
return REQUEST_STATUS_LABELS[status as RequestStatus] ?? `${status}? (N/A)`;
|
|
}
|
|
|
|
export function calculateUpgradePrice(
|
|
requestedAccountType: number,
|
|
registeredAccountType: number
|
|
): number {
|
|
return (
|
|
getAccountTypePrice(requestedAccountType) -
|
|
getAccountTypePrice(registeredAccountType)
|
|
);
|
|
}
|
|
|
|
export function formatDate(value: Date | string | null | undefined): string {
|
|
const date = toDate(value);
|
|
|
|
if (!date) {
|
|
return "";
|
|
}
|
|
|
|
const year = date.getFullYear();
|
|
const month = String(date.getMonth() + 1).padStart(2, "0");
|
|
const day = String(date.getDate()).padStart(2, "0");
|
|
|
|
return `${year}-${month}-${day}`;
|
|
}
|
|
|
|
export function formatDateTime(
|
|
value: Date | string | null | undefined
|
|
): string {
|
|
const date = toDate(value);
|
|
|
|
if (!date) {
|
|
return "";
|
|
}
|
|
|
|
const hours = String(date.getHours()).padStart(2, "0");
|
|
const minutes = String(date.getMinutes()).padStart(2, "0");
|
|
const seconds = String(date.getSeconds()).padStart(2, "0");
|
|
|
|
return `${formatDate(date)} ${hours}:${minutes}:${seconds}`;
|
|
}
|
|
|
|
export function calculateExtendedAvailableDate(
|
|
availableDate: Date,
|
|
now = new Date()
|
|
): Date {
|
|
const baseDate =
|
|
availableDate.getTime() < now.getTime() ? now : availableDate;
|
|
const extendedDate = new Date(baseDate);
|
|
|
|
extendedDate.setFullYear(extendedDate.getFullYear() + 1);
|
|
extendedDate.setHours(0, 0, 0, 0);
|
|
|
|
return extendedDate;
|
|
}
|
|
|
|
function toDate(value: Date | string | null | undefined): Date | null {
|
|
if (!value) {
|
|
return null;
|
|
}
|
|
|
|
const date = value instanceof Date ? value : new Date(value);
|
|
|
|
if (Number.isNaN(date.getTime())) {
|
|
return null;
|
|
}
|
|
|
|
return date;
|
|
}
|