Skip to content

fix(messaging): #30 iOS safe-area input + Deleted-vs-Unknown user (completes all 5)#143

Merged
TortoiseWolfe merged 1 commit into
mainfrom
feat/30-messaging-fixes
Jun 6, 2026
Merged

fix(messaging): #30 iOS safe-area input + Deleted-vs-Unknown user (completes all 5)#143
TortoiseWolfe merged 1 commit into
mainfrom
feat/30-messaging-fixes

Conversation

@TortoiseWolfe

Copy link
Copy Markdown
Owner

Closes #30.

This ships the last 2 of #30's 5 fixes; the other 3 already shipped (verified on main), so #30 is now complete:

This PR

  • Fix Limp hammer #1 (iOS Safari input hidden behind the home indicator): root cause was a missing viewport-fit=cover, leaving env(safe-area-inset-*) at 0. Add viewportFit:'cover' to the root viewport, then extend the message-input padding (pb → max(1.5rem, env(safe-area-inset-bottom))) and the fixed /messages container bottom inset so the input clears the indicator.
  • Fix [Eval-Backlog] SUBSCRIPTION-MGMT: subscription management route + 4 edge functions + grace-period wiring #5 (deleted vs unknown user): ConversationView now distinguishes a genuinely missing profile row (maybeSingle → null = "Deleted User") from a transient query error (neutral "Unknown User") and a present-but-unnamed profile (display_name || username fallback). Extracted as a pure resolveParticipantName helper + unit-tested. ConversationListItem is intentionally unchanged — its participant? prop can't distinguish null (deleted) from undefined (not-loaded), so forcing "Deleted User" there would mislabel loading states.

Verification

  • type-check / lint / build green; 3 new resolveParticipantName tests (error→Unknown, null→Deleted, present→fallback) + existing ConversationView suite pass.

🤖 Generated with Claude Code

…wn user

Ships 2 of the 5 messaging fixes from #30 (the other 3 — password-manager
full-page setup, autocomplete hints, the encrypted-with-previous-keys indicator
— already shipped).

Fix #1 (iOS Safari input hidden behind the home indicator): the real root cause
was a missing viewport-fit=cover, which left env(safe-area-inset-*) at 0. Add
viewportFit:'cover' to the root viewport, then extend the message-input padding
(ChatWindow input row pb → max(1.5rem, env(safe-area-inset-bottom))) and the
fixed /messages container bottom inset (calc(7rem + env(safe-area-inset-bottom)))
so the input clears the indicator.

Fix #5 (deleted vs unknown user): ConversationView now distinguishes a genuinely
missing profile row (maybeSingle → null = "Deleted User") from a transient query
error (kept neutral as "Unknown User") and a present-but-unnamed profile
(display_name || username fallback). Extracted as a pure resolveParticipantName
helper + unit-tested (3 cases). ConversationListItem is intentionally NOT changed
— its `participant?` prop can't distinguish null (deleted) from undefined
(not-yet-loaded), so forcing "Deleted User" there would mislabel loading states.

Tests: 3 new resolveParticipantName cases (error → Unknown, null → Deleted,
present → display_name/username/fallback). type-check / lint / build green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@TortoiseWolfe TortoiseWolfe merged commit 44d30c1 into main Jun 6, 2026
18 checks passed
@TortoiseWolfe TortoiseWolfe deleted the feat/30-messaging-fixes branch June 6, 2026 14:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment