11 return c.json(jobList);
12 } catch (error) {
13 console.error("Error fetching jobs:", error);
14 return c.json({ error: "Failed to fetch jobs" }, 500);
15 }
16});
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
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' },
21 setBookingLoading(classId);
22 try {
23 const response = await fetch(`/api/classes/${classId}/book`, {
24 method: 'POST',
25 headers: { 'Content-Type': 'application/json' },
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 }));
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});
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});
49app.get("/health", c => c.json({ status: "ok", timestamp: new Date().toISOString() }));
50
51export default app.fetch;
27 const [selectedDate, setSelectedDate] = useState<string>(today);
28
29 const fetchGroupData = async () => {
30 try {
31 setLoading(true);
32 const response = await fetch(
33 `/api/habits/range?start_date=${startDate}&end_date=${endDate}`
34 );
35 if (!response.ok) throw new Error('Failed to fetch group data');
36
37 const habits: HabitEntry[] = await response.json();
38
39 // Get all users
40 const usersResponse = await fetch('/api/users');
41 if (!usersResponse.ok) throw new Error('Failed to fetch users');
42 const users = await usersResponse.json();
43
90 setGroupData(dayData.reverse()); // Show most recent first
91 } catch (err) {
92 setError(err instanceof Error ? err.message : 'Failed to fetch group data');
93 } finally {
94 setLoading(false);
97
98 useEffect(() => {
99 fetchGroupData();
100 }, [startDate, endDate]);
101