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:
@@ -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 */}
|
||||
|
||||
Reference in New Issue
Block a user