diff --git a/src/pages/events/index.tsx b/src/pages/events/index.tsx index 2fd08203..f0113062 100644 --- a/src/pages/events/index.tsx +++ b/src/pages/events/index.tsx @@ -1,6 +1,7 @@ 'use client'; import { useState, useEffect, useCallback } from 'react'; +import { LoadingSkeleton } from '@/components/ui/LoadingSkeleton'; import Head from 'next/head'; import Link from 'next/link'; import { useRouter } from 'next/router'; @@ -21,13 +22,27 @@ export default function EventsPage() { const [error, setError] = useState(null); useEffect(() => { + const abortController = new AbortController(); + apiClient - .get('/api/events') + .get('/api/events', { signal: abortController.signal }) .then((data) => setEvents(data.map((e) => ({ ...e, start: new Date(e.start), end: new Date(e.end) }))), ) - .catch((err: Error) => setError(err.message)) - .finally(() => setLoading(false)); + .catch((err: Error) => { + if (err.name !== 'AbortError') { + setError('Failed to load events. Please try again later.'); + } + }) + .finally(() => { + if (!abortController.signal.aborted) { + setLoading(false); + } + }); + + return () => { + abortController.abort(); + }; }, []); const handleSelectSlot = useCallback( @@ -80,13 +95,27 @@ export default function EventsPage() { {loading && ( -
-
+
+
)} {error && ( -
- {error} +
+
+
+ ⚠️ +
+
+

Error Loading Events

+

{error}

+
+
+
)} {!loading && !error && (