fix(web,mobile): QA followups — calendar panel overlap, cheer-row profiles - #381
Conversation
…ws open friend profile
- Calendar desktop day panel: sticky wrapper gets a fixed height instead of
max-height so the internal scroller is bounded at every page-scroll state;
"Ver este dia" can no longer overlap list rows (structural tests pin
scroller/CTA/fade relationships)
- Social Atividade tab: received-cheer ("Incentivos") rows now open the
sender's friend profile like the feed rows; cheers without a senderId stay
non-interactive (both platforms, tests added)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
There was a problem hiding this comment.
Review Complete
Scope: PR #381 in thomasluizon/orbit-ui-mobile (fix/qa-followups → main)
Recommendation: APPROVE
| Severity | Count |
|---|---|
| Critical (incl. |
0 |
| High | 0 |
| Medium | 1 |
| Low / Info | 0 |
Summary
Two independent QA fixes to the #377 release: (1) apps/web/app/(app)/calendar/page.tsx:382 — the sticky desktop day panel switches from max-h-[calc(100dvh-84px)] to h-[calc(100dvh-84px)], a correct, minimal root-cause fix (fixed height makes the flex-1 min-h-0 scroller chain determinate, so the CTA can no longer overlap list rows) — verified structurally against CalendarDayDetail's fitViewport branch and covered by three new tests. (2) Received-cheer rows on the Atividade/Feed tab (apps/web/.../social-feed.tsx, apps/mobile/.../social-feed.tsx) now open the sender's friend profile on both platforms, mirroring the existing FeedEventCard press-target pattern, with matching tests.
Medium finding
Speculative "no senderId" branch is unbacked by the actual Cheer contract (both platforms).
apps/web/app/(app)/social/_components/social-feed.tsx:37 and apps/mobile/app/social/_components/social-feed.tsx:41 add if (!cheer.senderId) { …non-interactive row… }. cheerSchema (packages/shared/src/types/social.ts:83-91) declares senderId/senderHandle/senderDisplayName as plain required z.string(), parsed strictly at the trust boundary (cheersPageSchema.parse(raw) in hooks/use-friends.ts). The sibling FeedEventCard treats actorUserId as always present with no equivalent guard, and there's no "system"/"deleted sender" cheer concept anywhere else in the codebase. As written, this branch is only reachable via the test fixture createMockCheer({ senderId: '' }), not via any real API response the current contract can produce — it reads as a defensive branch for a state the type system says can't happen (Code Standards #1/#2). Fix: either make the state explicit in the shared schema (senderId: z.string().nullable()) if it's real, verifying against the orbit-api CheerDto, or delete the branch and always render the row as clickable to match FeedEventCard's unconditional pattern. Not blocking — flagging for a fast follow-up.
Subagents
| Agent | Verdict |
|---|---|
| parity-checker | PAIRED — cheer-row fix shipped identically on both platforms with matching tests; calendar fix is legitimately web-only (mobile has no wide-desktop inline panel, confirmed no max-h/fitViewport equivalent in apps/mobile/app/(tabs)/calendar.tsx) |
| i18n-syncer | N/A — no i18n files touched; social.feed.viewProfile reused, already present in both en.json and pt-BR.json |
| contract-aligner | N/A — diff touches neither packages/shared/src/types/* nor orbit-api |
| security-reviewer | N/A — no orbit-api changes |
Validation
Lint / type-check / tests: covered by this PR's own required CI checks (Build / Unit Tests / SonarCloud) — skipped here per workflow instructions.
Deferred
Backend hard rules and the backward-compat guard are N/A (no orbit-api or packages/shared type changes in this diff). Cross-repo dimensions (contract-aligner against orbit-api) not verifiable in this CI job since the sibling repo isn't checked out — none apply here anyway, so no gap. All 6 changed files received a verdict; nothing silently skipped.
Files touched: apps/mobile/app/social/_components/social-feed.tsx, apps/mobile/__tests__/components/social/cheer-row.test.tsx, apps/web/app/(app)/calendar/page.tsx, apps/web/app/(app)/social/_components/social-feed.tsx, apps/web/__tests__/components/calendar/calendar-day-detail.test.tsx, apps/web/__tests__/components/social/cheer-row.test.tsx.
|



Pairs with thomasluizon/orbit-api#279 (notification localization — API side only, no contract coupling; merge order free).
User-reported after the #377 release:
max-h, so theflex-1 min-h-0scroller chain resolved against an indeterminate height at some scroll states and rows escaped the scroll region. Fix: fixedh-[calc(100dvh-84px)]— the flex math is now determinate everywhere; the CTA is pinned at the panel bottom and can never overlap. New structural tests assert rows-inside-scroller, CTA-outside-after, fade non-interactive (63 calendar tests green).Type-checks clean; no i18n changes needed (reused keys).
🤖 Generated with Claude Code