11 return c.json(messages);
12 } catch (error) {
13 console.error("Error fetching chat messages:", error);
14 return c.json({ error: "Failed to fetch messages" }, 500);
15 }
16});
11 return c.json(jobPostings);
12 } catch (error) {
13 console.error("Error fetching jobs:", error);
14 return c.json({ error: "Failed to fetch jobs" }, 500);
15 }
16});
10 return c.json(workouts);
11 } catch (error) {
12 console.error("Error fetching workouts:", error);
13 return c.json({ error: "Failed to fetch workouts" }, 500);
14 }
15});
27 return c.json(workout);
28 } catch (error) {
29 console.error("Error fetching workout:", error);
30 return c.json({ error: "Failed to fetch workout" }, 500);
31 }
32});
10 return c.json(members);
11 } catch (error) {
12 console.error("Error fetching members:", error);
13 return c.json({ error: "Failed to fetch members" }, 500);
14 }
15});
27 return c.json(member);
28 } catch (error) {
29 console.error("Error fetching member:", error);
30 return c.json({ error: "Failed to fetch member" }, 500);
31 }
32});
68 return c.json(bookings);
69 } catch (error) {
70 console.error("Error fetching member bookings:", error);
71 return c.json({ error: "Failed to fetch bookings" }, 500);
72 }
73});
22 useEffect(() => {
23 if (selectedMember) {
24 fetchMemberBookings(selectedMember.id);
25 }
26 }, [selectedMember]);
27
28 const fetchMemberBookings = async (memberId: number) => {
29 try {
30 setLoading(true);
31 const response = await fetch(`/api/members/${memberId}/bookings`);
32 const bookings = await response.json();
33 setMemberBookings(bookings);
34 } catch (error) {
35 console.error('Error fetching member bookings:', error);
36 } finally {
37 setLoading(false);
43 try {
44 setLoading(true);
45 const response = await fetch('/api/members', {
46 method: 'POST',
47 headers: { 'Content-Type': 'application/json' },
33 // Inject initial data to avoid extra round-trips
34 const [classes, members, workouts] = await Promise.all([
35 fetch(new Request("http://localhost/api/classes")).then(r => r.json()).catch(() => []),
36 fetch(new Request("http://localhost/api/members")).then(r => r.json()).catch(() => []),
37 fetch(new Request("http://localhost/api/workouts")).then(r => r.json()).catch(() => [])
38 ]);
39
21 setBookingLoading(classId);
22 try {
23 const response = await fetch(`/api/classes/${classId}/book`, {
24 method: 'POST',
25 headers: { 'Content-Type': 'application/json' },
10 return c.json(classes);
11 } catch (error) {
12 console.error("Error fetching classes:", error);
13 return c.json({ error: "Failed to fetch classes" }, 500);
14 }
15});
27 return c.json(classData);
28 } catch (error) {
29 console.error("Error fetching class:", error);
30 return c.json({ error: "Failed to fetch class" }, 500);
31 }
32});
19
20 useEffect(() => {
21 // Load initial data from window or fetch from API
22 const initialData = (window as any).__INITIAL_DATA__;
23 if (initialData) {
25 setLoading(false);
26 } else {
27 fetchData();
28 }
29 }, []);
30
31 const fetchData = async () => {
32 try {
33 setLoading(true);
34 const [classesRes, membersRes, workoutsRes] = await Promise.all([
35 fetch('/api/classes'),
36 fetch('/api/members'),
37 fetch('/api/workouts')
38 ]);
39
46 setData({ classes, members, workouts });
47 } catch (error) {
48 console.error('Error fetching data:', error);
49 } finally {
50 setLoading(false);
54 const refreshClasses = async () => {
55 try {
56 const response = await fetch('/api/classes');
57 const classes = await response.json();
58 setData(prev => ({ ...prev, classes }));
64 const refreshMembers = async () => {
65 try {
66 const response = await fetch('/api/members');
67 const members = await response.json();
68 setData(prev => ({ ...prev, members }));
29 let html = await readFile("/frontend/index.html", import.meta.url);
30
31 // Fetch initial data to avoid extra round-trips
32 const [moodStats, recentMoods, recentJournals] = await Promise.all([
33 getMoodStats().catch(() => null),
58});
59
60export default app.fetch;