mirror of
https://github.com/vitorpamplona/amethyst.git
synced 2026-08-09 08:04:45 +00:00
Warms the next/previous few feed notes off the main thread so media and link previews are ready before the user scrolls to them, and pre-parses rich-text bodies into the shared cache so scroll-time composition is a cache hit instead of a UI-thread parse. Per upcoming note (off Dispatchers.Default, deduped via a per-feed set, cancelled on a new visible range): - Pre-parses TextNote/Comment bodies through CachedRichTextParser using the renderer's exact key, so the composition reads a cached parse. Other kinds still get their media/links discovered, just without the render-cache warm. - Prefetches images into Coil — inline content images, NIP-92 imeta blobs, NIP-94 file-header url tags, and video poster frames — and records each decoded aspect ratio in MediaAspectRatioCache so the box is reserved on first layout (no jump). Video poster ratios seed the video URL's box too. - Warms OpenGraph/link previews via UrlCachedPreviewer. Gated on showImages()/showUrlPreview() so it honors data-saver/Wi-Fi-only. Video bytes are deliberately not prefetched (large, HLS, player pool already starts fast). Wired centrally at the two feed dispatchers (RenderFeedContentState, RenderFeedState) so every list feed routed through them is covered without per-screen wiring, plus direct hooks for the custom-render feeds (hashtag, profile notes) and a LazyGridState variant for the grid feeds (gallery, products, discover). CachedRichTextParser is now content-addressed (memoized contentHash on ImmutableListOfLists) so an off-thread pre-parse maps to the same entry the renderer looks up, and its cache grows 50 -> 500 to hold the prefetch + multi-feed working set. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>