49 lines
1.4 KiB
TypeScript
49 lines
1.4 KiB
TypeScript
import { clsx, type ClassValue } from "clsx";
|
|
import { twMerge } from "tailwind-merge";
|
|
|
|
export function cn(...inputs: ClassValue[]) {
|
|
return twMerge(clsx(inputs));
|
|
}
|
|
|
|
export function formatPrice(cents: number): string {
|
|
return new Intl.NumberFormat("de-DE", {
|
|
style: "currency",
|
|
currency: "EUR",
|
|
maximumFractionDigits: 0,
|
|
}).format(cents / 100);
|
|
}
|
|
|
|
export function formatDate(date: Date | string): string {
|
|
const d = typeof date === "string" ? new Date(date) : date;
|
|
return new Intl.DateTimeFormat("de-DE", {
|
|
day: "2-digit",
|
|
month: "short",
|
|
year: "numeric",
|
|
}).format(d);
|
|
}
|
|
|
|
export function formatDateShort(date: Date | string): string {
|
|
const d = typeof date === "string" ? new Date(date) : date;
|
|
return new Intl.DateTimeFormat("de-DE", {
|
|
day: "2-digit",
|
|
month: "2-digit",
|
|
year: "2-digit",
|
|
}).format(d);
|
|
}
|
|
|
|
export function nightsBetween(arrival: Date | string, departure: Date | string): number {
|
|
const a = typeof arrival === "string" ? new Date(arrival) : arrival;
|
|
const d = typeof departure === "string" ? new Date(departure) : departure;
|
|
return Math.round((d.getTime() - a.getTime()) / (1000 * 60 * 60 * 24));
|
|
}
|
|
|
|
export function parseJsonArray<T = string>(raw: string | null | undefined): T[] {
|
|
if (!raw) return [];
|
|
try {
|
|
const parsed = JSON.parse(raw);
|
|
return Array.isArray(parsed) ? (parsed as T[]) : [];
|
|
} catch {
|
|
return [];
|
|
}
|
|
}
|