diff --git a/frontend/src/pages/admin/EventDetailsPage.tsx b/frontend/src/pages/admin/EventDetailsPage.tsx index 6ad0c5c1..0517a9b2 100644 --- a/frontend/src/pages/admin/EventDetailsPage.tsx +++ b/frontend/src/pages/admin/EventDetailsPage.tsx @@ -23,7 +23,25 @@ import { EyeOff, Type } from 'lucide-react'; -import { parseISO, differenceInDays } from 'date-fns'; +import { parseISO, differenceInDays, isValid } from 'date-fns'; + +// Helper to safely parse dates that might be strings, Date objects, or timestamps +const safeParseDate = (dateValue: unknown): Date => { + if (!dateValue) { + return new Date(); + } + if (dateValue instanceof Date) { + return dateValue; + } + if (typeof dateValue === 'number') { + return new Date(dateValue); + } + if (typeof dateValue === 'string') { + const parsed = parseISO(dateValue); + return isValid(parsed) ? parsed : new Date(dateValue); + } + return new Date(); +}; import { toast } from 'react-toastify'; import { useLocalizedDate } from '../../hooks/useLocalizedDate'; @@ -331,7 +349,7 @@ export const EventDetailsPage: React.FC = () => { ); } - const daysUntilExpiration = differenceInDays(parseISO(event.expires_at), new Date()); + const daysUntilExpiration = differenceInDays(safeParseDate(event.expires_at), new Date()); const isExpired = daysUntilExpiration <= 0; const isExpiring = daysUntilExpiration > 0 && daysUntilExpiration <= 7; @@ -339,7 +357,7 @@ export const EventDetailsPage: React.FC = () => { setEditForm({ welcome_message: event.welcome_message || '', color_theme: event.color_theme || '', - expires_at: format(parseISO(event.expires_at), 'yyyy-MM-dd'), + expires_at: format(safeParseDate(event.expires_at), 'yyyy-MM-dd'), allow_user_uploads: event.allow_user_uploads || false, upload_category_id: event.upload_category_id || null, hero_photo_id: event.hero_photo_id || null, @@ -536,7 +554,7 @@ export const EventDetailsPage: React.FC = () => {
- {format(parseISO(event.event_date), 'PPP')} + {format(safeParseDate(event.event_date), 'PPP')} {event.event_type} {
{t('events.created')}
- {format(parseISO(event.created_at), 'PP')} + {format(safeParseDate(event.created_at), 'PP')}
{t('events.expires')}
- {format(parseISO(event.expires_at), 'PP')} + {format(safeParseDate(event.expires_at), 'PP')} {!event.is_archived && daysUntilExpiration > 0 && ( {t('events.daysLeft', { count: daysUntilExpiration })} @@ -1228,7 +1246,7 @@ export const EventDetailsPage: React.FC = () => {

{t('events.archivedOn')}

- {event.archived_at && format(parseISO(event.archived_at), 'PPp')} + {event.archived_at && format(safeParseDate(event.archived_at), 'PPp')}

diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index 7b109e21..3bf58754 100644 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -29,11 +29,11 @@ const config: VitestUserConfig = { host: true, proxy: { '/api': { - target: 'http://localhost:3002', + target: 'http://localhost:3001', changeOrigin: true, }, '/photos': { - target: 'http://localhost:3002', + target: 'http://localhost:3001', changeOrigin: true, }, },