Repository navigation
Swipe a message for its options, and show an org's pinned messages - #102
Merged
Merged
Conversation
A tap on a bubble no longer brings up React and Reply. A swipe away from the bubble's edge does, and a swipe back or a tap anywhere in the thread puts them away. Maintainers get Pin there too. Pinned messages show as the web shows them: a bar over the top of the thread with the latest one, a sheet listing them all, and a pin beside each one in the thread. Pin and Unpin go through the background write path, roll back with a toast when devnull says no, and polls bring pins from the others. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A press handler on every row gave Android a ripple across the row on any tap beside a bubble, and a round trip to PHP for nothing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ing itself Android's rows don't shrink one child to make room for the next, so a long bubble pushed its action slot off the screen, pin included. The bubble now keeps a margin as wide as the slot, and the slot lies in it. A swipe that ends inside the bubble also lands as a tap on Android, which put the actions straight away again. A tap within 0.75 s of the swipe that showed them is now taken as part of it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Simon asked for the swipe to move the message aside, partly off the screen, with its actions where it was: someone else's message to the left, your own to the right by the same distance. It slides by the room its actions take, or less for a short bubble so some of it stays on the screen. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…t it off Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…flex-shrink NativePHP/mobile-air#623 makes Android rows shrink a flex-shrink child to fit a fixed-width sibling, as iOS always did. That retires the margin and absolute slot this PR added to keep a long bubble's actions on screen. The lock moves nativephp/mobile to ca8382f8, which brings that fix and the other main commits since 54aae817. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 28, 2026
React with the web's quick reactions in a bubble, and the phone's own emoji picker for the rest
#118
Merged
Merged
Simon asked for the message to follow the finger rather than pop open: each action grows in over its share of the drag, nearest the bubble first, and on release the message springs open or back. Each message now keeps a SharedValue its gesture area drags (with snap points at home and fully open) and its row and buttons follow, and PHP hears where it settled through @Dragend. This needs the gesture area's snap points (mobile-air) and an iOS pan that leaves vertical scrolling alone (mobile-ui), both unreleased. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A closed message's actions are shrunk and faded, but a button keeps its whole box for taps, so a tap beside a closed message could land on an invisible Reply or React. Simon hit this on his phone. A closed message's actions are now only drawn, still growing in under the finger, and turn into buttons once it settles open. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
simonhamp
marked this pull request as ready for review
October 28, 2026 17:55
This was referenced Oct 28, 2026
Main added pinning and unpinning the whole thread from its menu, as pin() and unpin() on Conversation. The message ones here are now pinMessage() and unpinMessage(), so the menu's actions still reach the thread's. Main also added the pin and pin-off icons this branch had. The Lucide enum keeps main's entries, plus the filled pin. Both branches wrote a rendersRef() test helper. It lives in tests/Pest.php now. The lock keeps nativephp/mobile at ca8382f8. That commit already contains main's 16b1f23. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #103
Dragging a message sideways now slides it aside to show its options, and org threads show pinned messages the way the web does.
Dragging for options. A tap on a bubble no longer opens React and Reply. Dragging a message toward its own edge moves it with the finger, partly off the screen, and the options grow in one after another where it was, nearest the bubble first: someone else's message to the left, your own to the right by the same distance. Let go past halfway, or with a flick, and it springs open; short of that it springs back and the options shrink away. The distance is the width of the options, or less for a short bubble so some of it stays on screen. Dragging it back, opening another message, or tapping anywhere in the thread slides it shut. A closed message's options are only drawn, not tappable, so a tap beside it can't land on them. Double tap still hearts, and long press is left free for the message menu that's coming next. Swiping no longer replies on its own; Reply is one of the options.
This needs two unreleased framework changes before it can merge, both on branch
feat/gesture-area-snap:snap-x/snap-yonnative:gesture-area, the points a pan settles on.Once both are merged, this needs a lock bump for
nativephp/mobileandnativephp/mobile-ui. Simon tried it on his iPhone with both in through path repos.Pinning. In an org, maintainers get Pin among the options (the API only lets maintainers pin). Pinning asks first with the web's "Pin for the whole org?" warning, which you can turn off. Pin and Unpin show straight away, go through
writeInBackground, and take the pinned list the API answers with. If the API says no, the pin goes back and a toast says why: the API's own words for a 403 (the 25-pin limit, a timeout), otherwise "Could not pin. Try again." A pin that loses the race for the last place counts as a no, as on the web.Pins show the way the web shows them:
Polls bring pins from other people. A poll that lands while your own pin is still on its way is ignored, and the next poll asks again from the pins' version so nothing is missed, the same way the web handles it.
Two Android fixes this needed.
nativephp/mobilelock from 54aae817 to ca8382f8 and the bubble simply shrinks again. The bump also brings the other mobile-air main commits since then (#608, #528, #619, #617, #621, #622), sonative:install android --force(andios) is needed after pulling.Things to look at:
Lucide::Pinnow draws the web's Lucide pin fromresources/iconsinstead of the SF Symbol and Material glyph, so the commit menu's "Pin to profile" and the profile's pinned label pick up the new glyph too.Screenshots
thread
actions (before: a tap on "staging is green"; after: a swipe to the left)
Recordings: iOS light, before, iOS light, after, iOS dark, after, Android light, after, Android dark, after
pinned (new)
🤖 Generated with Claude Code