chahinebrini ac1d33afb8 fix(native): phantom/zombie incoming calls (iOS) + DM online dot
Calls: an incoming call that ended without the in-app /call screen ever
mounting (iOS shows the native CallKit banner, not our screen) left the
call store stuck in 'ended' forever — the ended→idle reset only lived in
the /call screen. A stuck 'ended' then blocked every subsequent incoming
call (RING + VoIP push were received but dropped by the status!=='idle'
guard), so accepting from the banner produced a phantom CallKit call that
ticked as active with no connection, and the caller saw a missed call.
- store self-heals back to 'idle' after a call ends (teardown fallback)
- receiveIncoming + ring handler tolerate a stale 'ended' state
- onAnswer ends the native CallKit call when store has no incoming call
- RNCallKeep.endAllCalls() on launch clears leftover CallKit zombies

DM online dot: the green avatar dot used follow-gated presence while the
"online" text used raw presence → dot hidden for non-followed partners
even when online. DM header avatar now uses raw presence (rawPresence
prop) → consistent with the text on both platforms.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-06 10:03:27 +02:00

1.6 KiB

Next Release

Fixes

  • Calls: fixed phantom/zombie incoming calls (iOS). After an incoming call ended without the in-app call screen ever mounting (iOS shows the native CallKit banner, not our /call screen), the call store stayed stuck in the ended state forever. The ended → idle reset only lived in the /call screen, which never mounts for banner-only incoming calls. A stuck ended state then silently blocked every subsequent incoming call (RING + VoIP push were received but ignored by the status !== 'idle' guard), so accepting from the banner produced a phantom CallKit call that ticked as "active" with no real connection, and the caller saw a missed call.
    • Store now self-heals back to idle after a call ends, decoupled from the call screen (fallback timer in teardown).
    • receiveIncoming and the realtime ring handler now treat a stale ended state as acceptable (clear + proceed) instead of dropping the new call.
    • onAnswer now ends the native CallKit call when the store has no incoming call, preventing a phantom "active" call.
    • RNCallKeep.endAllCalls() on app launch clears leftover CallKit zombies from a previous session.
  • DM header: online dot now matches the online text. The green online dot on the partner avatar used the follow-gated presence (isOnline = online AND you follow them), while the "online" text next to it used raw presence. In a DM the dot now uses raw presence too, so it shows whenever the partner is online — consistent with the text, regardless of follow relationship. (Looked like an Android-only bug but was the follow gate + asymmetric follow between the test accounts.)