Files
pargar/frontend/src/lib/utils.ts
T

41 lines
1.4 KiB
TypeScript
Raw Normal View History

import { clsx, type ClassValue } from "clsx";
import { twMerge } from "tailwind-merge";
export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs));
}
export function formatWinHWin(v: number, digits = 0) {
return new Intl.NumberFormat("fa-IR", { maximumFractionDigits: digits }).format(v);
}
export function formatFaNumber(value: number, digits = 0) {
return new Intl.NumberFormat("fa-IR", { maximumFractionDigits: digits }).format(value);
}
/** Streak label — never use a hyphen (۰-روزه looks like a negative). */
export function formatStreakLabel(days: number) {
const n = Number.isFinite(days) ? Math.max(0, Math.floor(days)) : 0;
return `${formatFaNumber(n)} روز`;
}
/** Quiz option letters: الف، ب، ج، د، … */
const FA_OPTION_LETTERS = ["الف", "ب", "ج", "د", "ه", "و"] as const;
/** Jalali day plus clock, for conversation rows. */
export function formatJalaliStamp(iso: string): string {
const d = new Date(iso);
if (Number.isNaN(d.getTime())) {
return "";
}
const day = new Intl.DateTimeFormat("fa-IR", { day: "numeric", month: "short" }).format(d);
const time = new Intl.DateTimeFormat("fa-IR", { hour: "2-digit", minute: "2-digit" }).format(d);
return `${day} · ${time}`;
}
export function formatOptionLetter(index: number): string {
if (index >= 0 && index < FA_OPTION_LETTERS.length) {
return FA_OPTION_LETTERS[index];
}
return formatFaNumber(index + 1);
}