Thinking about this in a nextjs context, let's say we have two components Video and AnimatedGif. For larger screens, we want to load the video, but for smaller screens, and perhaps slower devices, we want to show the gif. We also want to async load these, because they shouldn't block the rest of the page. They are media items so they don't need to be SSR'd, and also it would be good if this could be done with Suspense in mind. Any ideas?
Create a custom hook, something like useDeviceAndViewport()
that returns the relevant info. You need to know the network status, the viewport dimensions and whether the element is within the viewport.