import { type ClassValue, clsx } from "clsx"; import { DateTime } from "luxon"; import type { NavigateFunction } from "react-router"; import { twMerge } from "tailwind-merge"; export function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs)); } /** * === STRING UTILS === */ export function capitalizeFirstLetter(str: string): string { return str.charAt(0).toUpperCase() + str.slice(1); } export function titleCase(str: string) { return str.replace( /\w\S*/g, (text) => text.charAt(0).toUpperCase() + text.substring(1).toLowerCase() ); } /** * === NAVIGATION UTILS === */ // Force a reload of the page export function forceReload() { window.location.reload(); } export function goBack(navigate: NavigateFunction) { let canGoBack = false; // Check if there is a history stack to go back to try { canGoBack = window.history.length > 1; } catch (e) { canGoBack = false; } if (!canGoBack) { return navigate("/"); } else { return navigate(-1); } } /** * === COLLES UTILS === */ export const formatDate = (date: string) => { const dt = DateTime.fromISO(date).setLocale("fr"); const str = dt.toLocaleString({ weekday: "long", day: "numeric", month: "long", year: "numeric", }); return titleCase(str); }; export const formatTime = (date: string) => { const dt = DateTime.fromISO(date).setLocale("fr"); return dt.toLocaleString({ hour: "2-digit", minute: "2-digit", })?.replace(":", "h") || "N/A"; }; export const formatGrade = (grade?: number) => { if (grade === undefined || grade === null || grade < 0 || grade > 20) return "N/A"; const rounded = Math.round(grade * 10) / 10; const str = rounded % 1 === 0 ? rounded.toFixed(0) // no decimals if .0 : rounded.toFixed(1); // one decimal otherwise return str.replace(".", ",").padStart(2, "0"); // pad with zero if needed };