Repository navigation
fix(feed): kill /feed blink + parallel loading (was: CLA + feed perf) - #786
Merged
Merged
Conversation
Up to standards ✅🟢 Issues
|
| Metric | Results |
|---|---|
| Complexity | 97 |
| Duplication | 8 |
NEW Get contextual insights on your PRs based on Codacy's metrics, along with PR and Jira context, without leaving GitHub. Enable AI reviewer
TIP This summary will be updated as you push new changes.
There was a problem hiding this comment.
🟡 Changes recommended
Perceptual hashing is silently disabled, and the pagination E2E probe uses a mismatched page size.
2 open findings
What changed in this PR
Fixes /feed navigation flashes and loading waterfalls, while also carrying CLA setup and ImageSharp removal.
Changes:
- Routes feed links directly to
/feedand adds loading/pagination regressions tests. - Parallelizes feed data and streams notifications via Suspense.
- Adds CLA configuration and removes local perceptual hashing.
| File | Description |
|---|---|
e2e/feed.spec.ts |
Adds feed navigation and pagination E2E tests. |
CLA.md |
Adds contributor license agreement. |
apps/web/src/components/feed/social-shell.tsx |
Adds Suspense and parallel loading. |
apps/web/src/components/feed/social-shell.test.tsx |
Tests streaming, parallelism, and failures. |
apps/web/src/components/feed/social-rail.tsx |
Routes tags directly to /feed. |
apps/web/src/components/feed/social-rail.test.tsx |
Verifies tag destinations. |
apps/web/src/components/feed/social-navigation.test.tsx |
Updates expected feed links. |
apps/web/src/components/feed/social-feed-tabs.tsx |
Routes tabs directly to /feed. |
apps/web/src/components/feed/social-app-shell.tsx |
Accepts streamed notification menu. |
apps/web/src/components/feed/post-card.tsx |
Updates tag-chip destinations. |
apps/web/src/components/feed/post-card.test.tsx |
Tests tag-chip links. |
apps/web/src/components/feed/infinite-post-feed.test.tsx |
Tests identity reset and deduplication. |
apps/web/src/components/feed/feed-skeleton.tsx |
Adds feed loading skeleton. |
apps/web/src/components/feed/feed-skeleton.test.tsx |
Tests skeleton structure. |
apps/web/src/app/[locale]/(social)/notifications-slot.tsx |
Streams notification summary safely. |
apps/web/src/app/[locale]/(social)/notifications-slot.test.tsx |
Tests notification fallback behavior. |
apps/web/src/app/[locale]/(social)/layout.tsx |
Removes notifications from critical path. |
apps/web/src/app/[locale]/(social)/layout.test.tsx |
Tests layout streaming and authentication. |
apps/api/Source/Modules/GameGuild.Assets/Services/AssetUploadService.cs |
Updates image-parser guidance. |
apps/api/Source/Modules/GameGuild.Assets/GameGuild.Assets.csproj |
Removes ImageSharp dependency. |
apps/api/Source/Modules/GameGuild.Assets/Deduplication/DeduplicationService.cs |
Removes local perceptual hashing. |
apps/api/Directory.Packages.props |
Removes centralized ImageSharp version. |
apps/api/Directory.Build.props |
Removes ImageSharp warning suppressions. |
.omo/evidence/task-6-feed-blink-perf.md |
Records performance measurements. |
.clabot |
Configures CLA enforcement. |
🧠 Review effort: Balanced
💡 Configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Comment on lines
+103
to
+105
| _logger.LogDebug("Perceptual hashing is delegated to the Openinary media pipeline; skipping local computation"); | ||
| await Task.CompletedTask; | ||
| return null; |
| const probePage = await context.newPage(); | ||
| let paginates = false; | ||
| try { | ||
| const first = await probePage.request.get(`${WEB_ORIGIN}/api/social/feed?scope=for-you&take=10`); |
…d instead of the redirecting root
…d loads
Shipped the nested-Suspense option, not a route loading.tsx: per
node_modules/next/dist/docs (loading.js + linking-and-navigating), a
route-level loading.tsx is prefetched and shown on every dynamic
navigation to the segment, and /feed tab links are searchParams-only
soft navs to the same segment — the skeleton would flash on every tab
switch. Instead SocialShell now wraps the async feed body in
<Suspense fallback={<FeedSkeleton />}> so cold loads stream the
skeleton while layout chrome stays mounted; tab switches keep the
shell.
…ritical path with a failure fallback
…te-scroll pagination
- social-shell.tsx: replace post-render primaryError reassignment with
promise-chained result object ({failed, feed}) read after await
- feed-skeleton.test.tsx: drop unused cleanup import
tolstenko
force-pushed
the
fix/feed-blink-perf
branch
from
October 11, 2026 03:36
af2a1f3 to
37fbd64
Compare
mathrmartins
pushed a commit
that referenced
this pull request
Oct 11, 2026
…#786) * fix(feed): point feed tabs, post tag chips, and trending tags at /feed instead of the redirecting root * feat(feed): add /feed loading skeleton to kill the blank flash on cold loads Shipped the nested-Suspense option, not a route loading.tsx: per node_modules/next/dist/docs (loading.js + linking-and-navigating), a route-level loading.tsx is prefetched and shown on every dynamic navigation to the segment, and /feed tab links are searchParams-only soft navs to the same segment — the skeleton would flash on every tab switch. Instead SocialShell now wraps the async feed body in <Suspense fallback={<FeedSkeleton />}> so cold loads stream the skeleton while layout chrome stays mounted; tab switches keep the shell. * test(feed): pin tab and trending-tag hrefs to /feed contract * perf(feed): run all SocialFeed feed and rail queries in one parallel round * perf(feed): stream dashboard notifications out of the social layout critical path with a failure fallback * test(feed): pin /feed soft-nav no-remount, identity reset, and infinite-scroll pagination * fix(feed): resolve react-hooks/immutability + unused import lint errors - social-shell.tsx: replace post-render primaryError reassignment with promise-chained result object ({failed, feed}) read after await - feed-skeleton.test.tsx: drop unused cleanup import
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

What
Fixes the /feed blink and slow first load:
/?tab=…, which redirects signed-in users to/feed?…— every click was 2 full page loads. All link surfaces now soft-navigate/feeddirectly.[locale]/loading.tsxblank.Promise.all; story-author profiles chain off stories inside the batch. Measured: full-render time median 1.71s → 0.54s (−68%) (evidence in.omo/evidence/task-6-feed-blink-perf.md).(social)/layout.tsxawaited the notifications summary before children — now streamed via Suspense slot with a failure fallback (a throw could 500 every social page).Infinite scroll already existed — now pinned by tests (identity reset, e2e no-remount + scroll pagination).
Verification
E2E_RUN=1Playwright: tab-switch no-remount, infinite scroll, smoke).omo/evidence/f3-manual-qa.txt)Known trade-offs