25 lines
818 B
TypeScript
25 lines
818 B
TypeScript
|
|
import { clsx, type ClassValue } from "clsx";
|
||
|
|
import { twMerge } from "tailwind-merge";
|
||
|
|
|
||
|
|
/** Merge conditional class names and de-duplicate Tailwind utilities. */
|
||
|
|
export function cn(...inputs: ClassValue[]) {
|
||
|
|
return twMerge(clsx(inputs));
|
||
|
|
}
|
||
|
|
|
||
|
|
/** Format a number of cents (e.g. 900) as a currency string ("$9"). */
|
||
|
|
export function formatPrice(cents: number, currency = "USD") {
|
||
|
|
const dollars = cents / 100;
|
||
|
|
return new Intl.NumberFormat("en-US", {
|
||
|
|
style: "currency",
|
||
|
|
currency,
|
||
|
|
maximumFractionDigits: dollars % 1 === 0 ? 0 : 2,
|
||
|
|
}).format(dollars);
|
||
|
|
}
|
||
|
|
|
||
|
|
/** The monthly usage bucket key, e.g. "2026-06". Pass a date for testability. */
|
||
|
|
export function periodKey(date: Date): string {
|
||
|
|
const y = date.getUTCFullYear();
|
||
|
|
const m = String(date.getUTCMonth() + 1).padStart(2, "0");
|
||
|
|
return `${y}-${m}`;
|
||
|
|
}
|