Skip to content

Make feed conversation threads visually obvious - #276

Open
Olorbaba wants to merge 6 commits into
QuilibriumNetwork:masterfrom
Olorbaba:feat/obvious-conversation-threads
Open

Make feed conversation threads visually obvious#276
Olorbaba wants to merge 6 commits into
QuilibriumNetwork:masterfrom
Olorbaba:feat/obvious-conversation-threads

Conversation

@Olorbaba

Copy link
Copy Markdown

Summary

  • render compact feed thread units from the real parent chain returned by the existing thread-history lookup
  • cap every unit to three casts and collapse omitted intermediate replies behind an accessible “Show N hidden replies” control
  • add avatar-aligned accent connectors so parent → reply relationships are obvious across single-level, nested, deep, and collapsed states
  • preserve existing post navigation, quote-card behavior, ranking/reply-bumping behavior, and quoted-reply isolation

UX behavior

  • Original posts remain unchanged.
  • Replies show a continuous visual connection between the relevant parent avatar and the replying author’s avatar.
  • Deep cross-author threads now resolve their ancestry and display at most three relevant casts with collapsed middle context.
  • Quote casts continue to render only the quoted post; quoted replies do not inherit Alice/Bob/thread ancestry.
  • The hidden-context indicator opens the original thread without changing any card’s existing tap destination.

Platform support

The treatment is implemented in shared React Native feed components using existing theme tokens, spacing helpers, avatars, and touch primitives, so iOS and Android receive the same hierarchy while retaining platform-native touch/accessibility behavior.

Testing

  • npm test -- __tests__/compactThreadContext.test.ts — 3/3 passed
  • npm run lint -- components/SocialFeedModal.tsx components/SocialFeed/threadContext.ts __tests__/compactThreadContext.test.ts — passed
  • npx tsc --noEmit — changed files clean (repository has pre-existing unrelated errors)
  • git diff --check — passed

Manually reviewed representative states for original posts, direct replies, deep nested replies, collapsed context, quote casts of originals, quote casts of replies, and multiple bumped conversations.

@Olorbaba

Copy link
Copy Markdown
Author

Final audit update pushed (9e0c5b4):\n\n- Thread-history quoted casts now preserve the quoted author PFP instead of relying only on lazy stub resolution.\n- Reply connectors are aligned exactly to the 44px avatar column for continuous parent-to-child rails.\n\nFinal checklist:\n- Original/reply/nested/deep/collapsed states: covered by real ancestry + three-post cap.\n- Quote originals and quote replies: unchanged quote-card model; quoted replies contain no ancestry.\n- Post navigation, ranking, and reply-bumping behavior preserved.\n- Shared React Native implementation applies consistently to iOS and Android.\n\nValidation: focused Jest suite passed (3/3), ESLint passed, changed-file TypeScript checks clean, git diff --check passed.

@Olorbaba

Copy link
Copy Markdown
Author

Critical-criteria refinement pushed (148bcc1):\n\n- Scoped thread-history ancestry lookup to actual resolvable replies, so original posts never trigger an unnecessary fetch.\n- Recalculated connector alignment against the shared feed row padding and 44px avatar column for a continuous parent-to-reply rail across nested and collapsed states.\n\nAll acceptance states remain covered: original posts; single-level replies; third/fourth/fifth-plus-level replies through real ancestry; collapsed deep context with a strict three-post cap; quote casts of originals and replies without inherited ancestry; and multiple bumped conversations as independent feed units. Chrono/reply-bumping behavior remains unchanged.

@Olorbaba

Copy link
Copy Markdown
Author

Production-risk audit complete. Final hardening pushed (3a72c39):\n\n- Added a duplicate-unit guard: if a reply is already represented in resolved thread ancestry, it cannot also render as its own separate feed row.\n- Confirmed cached thread history is bounded by the existing 50-thread / 25-cast cache ring, so the new compact-context lookup does not introduce unbounded storage.\n- Confirmed FlashList item identity and interaction-state maps continue to use each rendered cast hash/FID rather than the outer feed-row identity.\n\nFinal risk checks:\n- Ranking/reply-bumping data flow untouched; changes are render-only after existing feed assembly.\n- Existing post/thread navigation paths unchanged.\n- Quote cards remain ancestry-free and preserve quoted-author PFPs.\n- Strict three-cast cap remains enforced per feed unit.\n- Shared React Native/theme implementation applies consistently to iOS and Android.\n\nValidation rerun passed: focused Jest suite 3/3, ESLint clean, changed-file TypeScript checks clean, and git diff --check clean.

@Olorbaba

Copy link
Copy Markdown
Author

Senior production self-review hardening pushed (0e6c1e8):\n\n- Preserve quoted media immediately from thread-history data instead of relying on a second lazy lookup.\n- Carry quoted-cast recast state so existing interaction controls remain accurate for thread-derived rows.\n- Raise the collapsed-context target to a 44px minimum touch height on both platforms.\n- Skip synchronous MMKV cache reads when ancestry lookup is disabled, avoiding repeated disk reads while recycled feed rows initialize.\n- Reverted the previous parent-based duplicate suppression because it could incorrectly absorb distinct sibling branches; retained exact-hash deduplication only.\n\nValidation: focused Jest 3/3, ESLint clean across all touched files, changed-file TypeScript clean, and git diff --check clean.

@Olorbaba
Olorbaba force-pushed the feat/obvious-conversation-threads branch from 0e6c1e8 to af0a973 Compare August 24, 2026 22:54
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