The vendor detail page and layout called api.vendors.getById without a try/catch. The API client throws ApiError on any non-2xx, so a 404 (missing vendor), 401, or 5xx during SSR threw out of the server component and white-screened the whole route with a generic "server-side exception" — the existing `if (!vendor)` fallback was never reached. Guard both fetches: log the error and degrade gracefully (page shows "Vendor not found", layout renders chrome with a fallback title). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
25 lines
1017 B
TypeScript
25 lines
1017 B
TypeScript
import { getServerApi } from "@garage/api/server"
|
|
import { VendorGeneralInfo } from "@/modules/vendors/vendor-general-info"
|
|
|
|
export default async function VendorDetailPage(props: { params: Promise<{ id: string }> }) {
|
|
const { id } = await props.params
|
|
const api = await getServerApi()
|
|
// The OpenAPI schema doesn't yet describe GET /api/vendors/{id} (only PUT/DELETE),
|
|
// so cast through `any` here until the schema is regenerated.
|
|
// Guard the fetch: a failed request (404/401/5xx) must degrade gracefully
|
|
// instead of throwing and white-screening the whole route.
|
|
let vendor: Record<string, any> | undefined
|
|
try {
|
|
const response = (await api.vendors.getById(id)) as { data?: Record<string, any> }
|
|
vendor = response?.data
|
|
} catch (err) {
|
|
console.error(`Failed to load vendor ${id}:`, err)
|
|
}
|
|
|
|
if (!vendor) {
|
|
return <div className="text-muted-foreground p-6">Vendor not found.</div>
|
|
}
|
|
|
|
return <VendorGeneralInfo vendor={vendor} />
|
|
}
|