55 lines
1.8 KiB
JavaScript
55 lines
1.8 KiB
JavaScript
// Simple frontend API helper with graceful fallbacks when the backend is unavailable (useful during frontend-only development)
|
|
|
|
const DEFAULT_BIKES = [1000,2000,3000,4000,5000]
|
|
|
|
export async function getBikes() {
|
|
try {
|
|
const res = await fetch('/api/bikes')
|
|
if (!res.ok) throw new Error('Failed to fetch bikes')
|
|
return res.json()
|
|
} catch (err) {
|
|
// Fallback to defaults when backend is not reachable
|
|
console.warn('getBikes: using fallback bikes because backend is unavailable', err)
|
|
return { bikes: DEFAULT_BIKES }
|
|
}
|
|
}
|
|
|
|
export async function createBooking(payload) {
|
|
try {
|
|
const res = await fetch('/api/bookings', {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify(payload),
|
|
})
|
|
const data = await res.json()
|
|
if (!res.ok) throw new Error(data?.error || 'Failed to create booking')
|
|
return data
|
|
} catch (err) {
|
|
// Fallback: simulate a successful booking locally for frontend development
|
|
console.warn('createBooking: backend unavailable, creating a local mock booking', err)
|
|
const mock = {
|
|
booking: {
|
|
id: Math.floor(Math.random() * 100000) + 100,
|
|
bike_type: payload.bike_type,
|
|
start_date: payload.start_date,
|
|
end_date: payload.end_date,
|
|
name: payload.name,
|
|
email: payload.email,
|
|
created_at: new Date().toISOString(),
|
|
}
|
|
}
|
|
return mock
|
|
}
|
|
}
|
|
|
|
export async function listBookings() {
|
|
try {
|
|
const res = await fetch('/api/bookings')
|
|
if (!res.ok) throw new Error('Failed to list bookings')
|
|
return res.json()
|
|
} catch (err) {
|
|
// Fallback: return an empty list or a small mock so Admin page can render
|
|
console.warn('listBookings: using fallback empty list because backend is unavailable', err)
|
|
return { bookings: [] }
|
|
}
|
|
}
|