frontend/app/lib/utils.ts
Nathan Lamy 85e2552db8
All checks were successful
Deploy to Netlify / Deploy to Netlify (push) Successful in 1m39s
feat: add colle details page
2025-07-29 23:25:10 +02:00

80 lines
1.8 KiB
TypeScript

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",
});
};
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
};