Refactor event date handling: Update event model to use DateTime type for date fields in Prisma schema. Modify API routes and UI components to ensure consistent date formatting and handling, improving data integrity and user experience across event management and display.

This commit is contained in:
Julien Froidefond
2025-12-10 05:32:23 +01:00
parent fdd860c456
commit 1b07fe8ae5
9 changed files with 160 additions and 49 deletions

View File

@@ -6,7 +6,7 @@ import { useRouter } from "next/navigation";
interface Event {
id: string;
date: string;
date: string | Date;
name: string;
description: string;
type: "SUMMIT" | "LAUNCH" | "FESTIVAL" | "COMPETITION" | "CODE_KATA";
@@ -107,19 +107,39 @@ export default function EventsPageSection({
.filter((e) => e.status === "UPCOMING" || e.status === "LIVE")
.sort((a, b) => {
// Trier par date décroissante (du plus récent au plus ancien)
return b.date.localeCompare(a.date);
const dateA = typeof a.date === "string" ? new Date(a.date) : a.date;
const dateB = typeof b.date === "string" ? new Date(b.date) : b.date;
return dateB.getTime() - dateA.getTime();
});
const pastEvents = events
.filter((e) => e.status === "PAST")
.sort((a, b) => {
// Trier par date décroissante (du plus récent au plus ancien)
return b.date.localeCompare(a.date);
const dateA = typeof a.date === "string" ? new Date(a.date) : a.date;
const dateB = typeof b.date === "string" ? new Date(b.date) : b.date;
return dateB.getTime() - dateA.getTime();
});
// Créer un map des événements par date pour le calendrier
const eventsByDate: Record<string, Event[]> = {};
events.forEach((event) => {
const dateKey = event.date; // YYYY-MM-DD
// Convertir la date en string YYYY-MM-DD pour le calendrier
let eventDate: Date;
if (typeof event.date === "string") {
eventDate = new Date(event.date);
} else if (event.date instanceof Date) {
eventDate = event.date;
} else {
// Fallback si c'est déjà un objet Date
eventDate = new Date(event.date);
}
// Utiliser UTC pour éviter les problèmes de fuseau horaire
const year = eventDate.getUTCFullYear();
const month = String(eventDate.getUTCMonth() + 1).padStart(2, "0");
const day = String(eventDate.getUTCDate()).padStart(2, "0");
const dateKey = `${year}-${month}-${day}`; // YYYY-MM-DD
if (!eventsByDate[dateKey]) {
eventsByDate[dateKey] = [];
}
@@ -173,15 +193,17 @@ export default function EventsPageSection({
// Fonctions pour le calendrier
const getDaysInMonth = (date: Date) => {
const year = date.getFullYear();
const month = date.getMonth();
return new Date(year, month + 1, 0).getDate();
// Utiliser UTC pour correspondre au format des événements
const year = date.getUTCFullYear();
const month = date.getUTCMonth();
return new Date(Date.UTC(year, month + 1, 0)).getUTCDate();
};
const getFirstDayOfMonth = (date: Date) => {
const year = date.getFullYear();
const month = date.getMonth();
return new Date(year, month, 1).getDay();
// Utiliser UTC pour correspondre au format des événements
const year = date.getUTCFullYear();
const month = date.getUTCMonth();
return new Date(Date.UTC(year, month, 1)).getUTCDay();
};
const formatMonthYear = (date: Date) => {
@@ -206,8 +228,9 @@ export default function EventsPageSection({
days.push(day);
}
const year = currentMonth.getFullYear();
const month = currentMonth.getMonth() + 1;
// Utiliser UTC pour correspondre au format des événements
const year = currentMonth.getUTCFullYear();
const month = currentMonth.getUTCMonth() + 1;
return (
<div className="bg-black/60 border border-pixel-gold/30 rounded-lg p-4 backdrop-blur-sm max-w-2xl mx-auto">
@@ -267,7 +290,13 @@ export default function EventsPageSection({
day
).padStart(2, "0")}`;
const dayEvents = eventsByDate[dateKey] || [];
const isToday = new Date().toISOString().split("T")[0] === dateKey;
// Vérifier si c'est aujourd'hui en utilisant UTC
const today = new Date();
const todayKey = `${today.getUTCFullYear()}-${String(
today.getUTCMonth() + 1
).padStart(2, "0")}-${String(today.getUTCDate()).padStart(2, "0")}`;
const isToday = todayKey === dateKey;
const hasEvents = dayEvents.length > 0;
// Déterminer la couleur principale selon le type d'événement
@@ -374,7 +403,17 @@ export default function EventsPageSection({
{/* Date */}
<div className="text-white text-sm font-bold uppercase tracking-widest mb-3">
{event.date}
{typeof event.date === "string"
? new Date(event.date).toLocaleDateString("fr-FR", {
day: "numeric",
month: "long",
year: "numeric",
})
: event.date.toLocaleDateString("fr-FR", {
day: "numeric",
month: "long",
year: "numeric",
})}
</div>
{/* Event Name */}
@@ -651,7 +690,17 @@ export default function EventsPageSection({
{/* Date */}
<div className="text-white text-lg font-bold uppercase tracking-widest mb-4">
{selectedEvent.date}
{typeof selectedEvent.date === "string"
? new Date(selectedEvent.date).toLocaleDateString("fr-FR", {
day: "numeric",
month: "long",
year: "numeric",
})
: selectedEvent.date.toLocaleDateString("fr-FR", {
day: "numeric",
month: "long",
year: "numeric",
})}
</div>
{/* Event Details */}