Skip to content

feat(#754 inbox-search): unit #7 — inbox + search + conversation on TanStack#769

Merged
hellno merged 3 commits into
mainfrom
hellno/migrate-inbox-search-conversation
Jun 21, 2026
Merged

feat(#754 inbox-search): unit #7 — inbox + search + conversation on TanStack#769
hellno merged 3 commits into
mainfrom
hellno/migrate-inbox-search-conversation

Conversation

@hellno

@hellno hellno commented Jun 21, 2026

Copy link
Copy Markdown
Collaborator

Unit #7 — inbox + search + conversation (epic #754, Track B)

Second surface-tier unit of the Next.js → TanStack-Start-on-Cloudflare-Workers migration. Mounts three more herocast pages onto the TanStack route tree as children of the #5 _app shell, reusing every shared component verbatim via the unit-#2 next/* aliases and the unit-#10 /api/* worker routes. Closes #6's one dangling deep-link: /conversation/<hash> (the mobile cast-tap + legacy ?castHash= redirect target).

Spec: docs/migration/phase-2-inbox-search.md. Mirrors unit #6 (phase-2-feeds-profile.md).

Routes added (children of _app)

Route Page (ported) Source
/inbox src/web/pages/InboxPage.tsx app/(app)/inbox/page.tsx
/search src/web/pages/SearchPage.tsx app/(app)/search/page.tsx
/conversation/* (splat) src/web/pages/ConversationPage.tsx app/conversation/[...slug]/page.tsx

Surgical changes only (everything else byte-identical to the Next source)

  • C1 next/navigation@/web/lib/navigation (the unit-Configure Sweep #2 adapter, imported directly).
  • C3 drop 'use client' (+ search's vestigial Next no-img-element eslint-disable — no <img> in the file).
  • C4 (conversation only) the Next [...slug] catch-all → a TanStack $ splat route. The param arrives as _splat (a single "a/b" string), so the page rebuilds the Next-shaped slug array: ((params._splat as string | undefined) ?? '').split('/').filter(Boolean). Preserves both /conversation/<hash> and /conversation/<user>/<hash>.

next/link stays as next/link (resolved by the #2 build alias). No module-scope createClient() in any page (the #6 C2 deferral N/A). No new data path, no shared-file edits, no vite.config.mts change (CastRow→Embeds→VideoEmbed already stubbed in #6; bundle stayed under budget without a new stub entry).

Green gate

Verification (real workerd + real browser)

  • SSR 200 on wrangler dev for /inbox, /search, /conversation/0x… and /conversation/user/0x… (both splat forms) — no import-time throw. /inbox+/search SSR the "Loading herocast" hydrate gate; /conversation SSRs the page skeleton (content gated to client → CastThreadView/VideoEmbed never render server-side).
  • Browser canary (real Chromium): /conversation fully renders (shell + titlebar "Conversation" + graceful "Cast not found" on a bad hash); /inbox+/search hydrate → store-init → AuthContext client-redirect to /login (logged-out, same as Add support for user reactions to posts #6 /feeds); client-side nav works; console clean except the expected Fix web request to gRPC server #3 WalletConnect warnings.
  • Tier-1 review: dynamic multi-agent adversarial review (parity / ssr-bundle / conventions / correctness, each finding verified) — 0 findings.

Deferred (documented, shared with #6/#10)

Logged-in inbox tabs + virtual-list recycle, search input→results, real-data thread — need a session + a quota'd NEYNAR_API_KEY (dev key is over quota → 402/404 passthrough). Re-run post-web:deploy.

Do not merge — awaiting review per the migration's per-unit ship protocol.

Status board: #6 🔍→✅ (PR #768), #7 ☐→🔍.

…anStack

Port app/(app)/inbox, app/(app)/search, and app/conversation/[...slug] onto the
TanStack route tree as children of the #5 _app shell, reusing CastRow,
CastThreadView, SelectableListWithHotkeys, SearchInterface/SearchResultsView and
the provider/RQ/store data paths (-> the #10 /api/* worker routes) verbatim via
the unit-#2 next/* aliases. Closes the #6 deep-link target /conversation/<hash>.

Surgical changes only: next/navigation -> @/web/lib/navigation; drop 'use client';
conversation's [...slug] catch-all -> a TanStack $ splat route (params._splat
rebuilt into the Next-shaped slug array). No new data path; no shared-file edits.

Green: web:build 0, web:typecheck 0, live typecheck 0, test 150/150, worker bundle
2336.89 KiB gzip < 3 MB. SSR 200 on real workerd for all three routes (both splat
forms); browser canary clean. Tier-1 multi-agent adversarial review: 0 findings.
@vercel

vercel Bot commented Jun 21, 2026

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
herocast Ready Ready Preview Jun 21, 2026 5:14pm

…search-conversation

# Conflicts:
#	docs/migration/strategy.md
@hellno
hellno merged commit 3de3fed into main Jun 21, 2026
1 of 2 checks passed
@hellno
hellno deleted the hellno/migrate-inbox-search-conversation branch June 21, 2026 17:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant