-
Notifications
You must be signed in to change notification settings - Fork 12.5k
Expand file tree
/
Copy pathEventDetail.js
More file actions
96 lines (83 loc) · 2.18 KB
/
EventDetail.js
File metadata and controls
96 lines (83 loc) · 2.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import { Suspense } from 'react';
import {
useRouteLoaderData,
json,
redirect,
defer,
Await,
} from 'react-router-dom';
import EventItem from '../components/EventItem';
import EventsList from '../components/EventsList';
function EventDetailPage() {
const { event, events } = useRouteLoaderData('event-detail');
return (
<>
<Suspense fallback={<p style={{ textAlign: 'center' }}>Loading...</p>}>
<Await resolve={event}>
{(loadedEvent) => <EventItem event={loadedEvent} />}
</Await>
</Suspense>
<Suspense fallback={<p style={{ textAlign: 'center' }}>Loading...</p>}>
<Await resolve={events}>
{(loadedEvents) => <EventsList events={loadedEvents} />}
</Await>
</Suspense>
</>
);
}
export default EventDetailPage;
async function loadEvent(id) {
const response = await fetch('http://localhost:8080/events/' + id);
if (!response.ok) {
throw json(
{ message: 'Could not fetch details for selected event.' },
{
status: 500,
}
);
} else {
const resData = await response.json();
return resData.event;
}
}
async function loadEvents() {
const response = await fetch('http://localhost:8080/events');
if (!response.ok) {
// return { isError: true, message: 'Could not fetch events.' };
// throw new Response(JSON.stringify({ message: 'Could not fetch events.' }), {
// status: 500,
// });
throw json(
{ message: 'Could not fetch events.' },
{
status: 500,
}
);
} else {
const resData = await response.json();
return resData.events;
}
}
export async function loader({ request, params }) {
const id = params.eventId;
return defer({
event: await loadEvent(id),
events: loadEvents(),
});
}
export async function action({ params, request }) {
const eventId = params.eventId;
const response = await fetch('http://localhost:8080/events/' + eventId, {
method: request.method,
});
if (!response.ok) {
throw json(
{ message: 'Could not delete event.' },
{
status: 500,
}
);
}
await new Promise((res) => setTimeout(res, 1000));
return redirect('/events');
}