Skip to content

Fix TestFlight attachment tap handling - #152

Merged
torlando-tech merged 6 commits into
mainfrom
fix/ios-testflight-attachment-tap
Aug 6, 2026
Merged

Fix TestFlight attachment tap handling#152
torlando-tech merged 6 commits into
mainfrom
fix/ios-testflight-attachment-tap

Conversation

@torlando-tech

Copy link
Copy Markdown
Owner

Summary

  • restore reliable attachment activation in distribution builds by returning image and file controls to native SwiftUI Button behavior
  • arbitrate attachment preview and reaction mode in the presentation owner so short tap, long hold, and callback ordering remain mutually safe
  • bind reply-preview navigation to explicit reaction state and clear all attachment interaction state when leaving the conversation
  • add regression coverage for preview cleanup, reaction ordering, production timeline callback refresh, and reply-navigation suppression

This is an additive follow-up to #150 after the merged implementation worked in a development install but failed to activate image attachments in TestFlight.

Verification

  • 280 shipping XTests passed
  • 11 focused attachment, timeline-routing, and reaction-state XTests passed
  • 244 portable/static tests passed, 1 skipped
  • attachment contract: 4 runs, 75 assertions, 0 failures
  • Sideband image to native SwiftUI Quick Look interop passed
  • signed Release build installed and launched on a physical iPhone
  • exact-head physical checks confirmed:
    • short tap over image opens Quick Look only
    • long hold over image opens reactions only
    • horizontal swipe beginning over image activates swipe-to-reply only
  • independent exact-head specification and code-quality reviews approved with no findings

Model B was intentionally excluded from this shipping-app fix.

Risk and rollback

The change is limited to attachment/reaction interaction ownership and related tests. It preserves native Quick Look, original-byte staging and cleanup, accessibility labels and identifiers, timeline behavior, and swipe-to-reply. Rollback is the four commits in this PR, though that would restore the TestFlight tap regression.

@greptile-apps

greptile-apps Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

The PR restores native SwiftUI attachment controls and moves gesture arbitration into the presentation owner so attachment previews, reactions, reply navigation, and links do not activate simultaneously.

  • Replaces custom attachment button gestures with native plain buttons and a bubble-level long press.
  • Tracks reaction mode across SwiftUI and the UIKit timeline to suppress deferred link and reply-preview actions.
  • Clears attachment interaction state when dismissing reactions or leaving a conversation.
  • Adds focused regression and static contract coverage.

Confidence Score: 5/5

The PR appears safe to merge.

No blocking failure remains.

Important Files Changed

Filename Overview
Sources/ColumbaApp/Views/Messaging/MessageBubble.swift Restores native attachment button behavior while moving long-press recognition to the enclosing bubble.
Sources/ColumbaApp/Views/Messaging/MessageTimelineView.swift Adds reaction-state-aware routing that suppresses deferred link and reply-preview activation for the long-pressed message.
Sources/ColumbaApp/Views/Messaging/MessagingView.swift Coordinates reaction, attachment-preview, link-opening, and conversation-exit interaction state.
Sources/ColumbaApp/Views/Messaging/MessageBody.swift Centralizes parsed message-link dispatch so the presentation owner can arbitrate activation.
Sources/ColumbaApp/Views/Messaging/MessageAttachmentPreviewItem.swift Prevents attachment previews from being presented while reaction mode is active and resets state on conversation exit.
Tests/ColumbaAppTests/MessageAttachmentPreviewTests.swift Covers callback ordering, preview cleanup, reaction suppression, and restored routing after dismissal.

Sequence Diagram

sequenceDiagram
    actor User
    participant Bubble as MessageBubble
    participant Timeline as Timeline Controller
    participant View as MessagingView
    participant Preview as Attachment Preview Store

    User->>Bubble: Long hold message content
    Bubble->>Timeline: onLongPress(message)
    Timeline->>Timeline: Set reactionModeMessageID
    Timeline->>View: Present reaction mode
    View->>Preview: beginReactionMode()
    opt Child link callback also arrives
        Bubble->>Timeline: routeMessageLink(messageID, target)
        Timeline->>Timeline: Defer and compare reaction message ID
        Timeline--xView: Suppress link activation
    end
    User->>View: Dismiss reactions
    View->>Preview: endReactionMode()
    View->>Timeline: Clear reactionModeMessageID
Loading

Reviews (2): Last reviewed commit: "fix: route external links through reacti..." | Re-trigger Greptile

Comment thread Sources/ColumbaApp/Views/Messaging/MessageBubble.swift
@torlando-tech
torlando-tech merged commit b011f73 into main Aug 6, 2026
1 check passed
@torlando-tech
torlando-tech deleted the fix/ios-testflight-attachment-tap branch August 6, 2026 19:18
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