Using Suspense with useEffect-based fetching
Suspense works with data sources that throw Promises during render (like React Server Components, use(), or libraries such as Relay and SWR with Suspense mode). Plain useEffect fetch calls never throw during render, so Suspense cannot catch them.
Fix: Use a Suspense-compatible data fetching approach: the use() hook with a Promise, a framework integration (Next.js Server Components), or a library that supports Suspense (Relay, SWR with suspense: true).