import React, { useEffect, useState } from 'react' import { Link, useParams } from 'react-router-dom' import { Helmet } from 'react-helmet-async' import { getEvent } from '../utils/api' import { googleCalendarUrl, downloadICS } from '../utils/calendar' import { track, events as ga } from '../utils/analytics' const apiBaseUrl = (import.meta.env.VITE_API_BASE_URL || '').replace(/\/$/, '') function parseTime(timeStr) { if (!timeStr) return '10:00' const match = `${timeStr}`.match(/(\d+):(\d+)\s*(AM|PM)/i) if (!match) return '10:00' let hours = parseInt(match[1], 10) const minutes = match[2] const period = match[3].toUpperCase() if (period === 'PM' && hours !== 12) hours += 12 if (period === 'AM' && hours === 12) hours = 0 return `${hours.toString().padStart(2, '0')}:${minutes}` } function resolveImageUrl(value, fallback) { if (typeof value === 'string') { const trimmed = value.trim() if (!trimmed) return fallback if (/^(?:https?:)?\/\//i.test(trimmed) || trimmed.startsWith('data:')) { return trimmed } const path = trimmed.startsWith('/') ? trimmed : `/${trimmed}` if (apiBaseUrl) { return `${apiBaseUrl}${path}` } return path } return fallback } function getFallbackImage(event) { return '' } function formatDate(dateStr) { const date = new Date(dateStr + 'T00:00:00') if (Number.isNaN(date.getTime())) return dateStr return date.toLocaleDateString('en-US', { weekday: 'long', month: 'long', day: 'numeric', year: 'numeric', timeZone: 'America/Chicago', }) } function formatTime(timeStr) { if (!timeStr) return 'TBA' return timeStr } export default function EventDetail() { const { slug } = useParams() const [event, setEvent] = useState(null) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) useEffect(() => { let ignore = false async function load() { setLoading(true) setError(null) try { const data = await getEvent(slug) if (!ignore) { setEvent(data) } } catch (err) { if (!ignore) { setError(err) setEvent(null) } } finally { if (!ignore) { setLoading(false) } } } load() return () => { ignore = true } }, [slug]) useEffect(() => { if (event) { track(ga.EVENT_DETAILS_VIEW, { slug: event.slug }) } }, [event]) if (loading) { return (

Loading event...

) } if (error) { return (

Unable to load this event. Please try again later.

) } if (!event) { return (

Event not found.

) } const time24 = parseTime(event.time || '10:00 AM') const start = new Date(`${event.date}T${time24}:00`) const end = new Date(start.getTime() + 60 * 60 * 1000) const fallbackImage = getFallbackImage(event) const coverImage = resolveImageUrl(event.image, fallbackImage) const displayDate = formatDate(event.date) const displayTime = formatTime(event.time) const eventUrl = typeof window !== 'undefined' ? window.location.href : '' const jsonLd = { '@context': 'https://schema.org', '@type': 'Event', name: event.title, startDate: start.toISOString(), endDate: end.toISOString(), eventAttendanceMode: 'https://schema.org/OfflineEventAttendanceMode', location: { '@type': 'Place', name: 'Annaville SDA Church', address: '2710 Violet Rd, Corpus Christi, TX 78410', }, description: event.description, } return (
{event.title} | Events
← Back to all events
{coverImage && (
{`${event.title}
)}

{event.category || 'Featured Event'}

{event.title}

{displayDate} • {displayTime} CT{event.location ? ` • ${event.location}` : ''}

{`${event.description || ''}`.split(/\n{2,}/).map((paragraph, idx) => (

{paragraph}

))}
Add to Google Calendar
) }