"use client"; // Demo of `defineAsyncLoad` + MSW. // // Without mocks (`pnpm dev`): /api/widgets returns an empty list, so the // Empty slot renders with a nudge toward `pnpm dev:mocks`. With mocks // on, MSW intercepts before the route fires and the Success slot // renders canned data. // // Delete this `/demo` subtree once you have your own pages. import { asyncSource, defineAsyncLoad } from "@raredays/core"; interface Widget { id: string; name: string; inventory: number; } interface WidgetsData { widgets: Widget[]; total: number; } const Widgets = defineAsyncLoad({ source: asyncSource(async () => { const r = await fetch("/api/widgets"); if (!r.ok) throw new Error(`/api/widgets responded ${r.status}`); return (await r.json()) as WidgetsData; }), Loading: () =>

Loading widgets…

, Empty: ({ retry }) => (

No widgets yet.

Run pnpm dev:mocks to see canned data, or add real ones via the API route at{" "} app/api/widgets/route.ts.

), Success: ({ widgets, total }) => ( ), Failure: ({ error, retry }) => (

Failed to load widgets: {error.message}

), }); export default function WidgetsDemoPage(): React.ReactElement { return (

Widgets demo

defineAsyncLoad against /api/widgets. MSW intercepts in dev when{" "} NEXT_PUBLIC_MOCKS=on.

); }