Repository navigation
fix(mobile): split escaped voice-note links into their own segment - #8940
Conversation
Bubble segmentation sees Markdown with escapes held as stand-ins, but imeta is keyed by plain URLs. A voice-note link whose destination has an escape, such as `voice\_note.mp4`, therefore missed its imeta entry and stayed inside the text bubble even though the link builder rendered it as audio. Unshield the URL before the lookup. Co-authored-by: studio <dc2fc481343672df31a689840c09299972e704dac592e0da6f18486646a7ee3e@buzz.block.builderlab.xyz> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tom Brow <tomb@squareup.com>
|
@codex review |
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
🔐 Codex Security Review
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 4996e40ee3
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
extractTrailingImageGallery used the raw destination, so an escaped URL like two\_2.png kept its backslash and missed its imeta entry once two or more trailing images formed a carousel. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tom Brow <tomb@squareup.com>
johnmatthewtennant
left a comment
There was a problem hiding this comment.
🤖 Reviewed 4996e40 with the complete teammate-review workflow (60 lenses, 120 outcomes). The escaped voice-note segmentation fix matches the rendering lookup; no correctness blockers introduced by this change. The separately reported gallery gap predates this patch and is accepted for a later push. No Flutter tests or device journey run by me.
Per review, cover escaped attachment segmentation in the existing attachments-stay-outside-bubbles journey instead of a standalone test. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tom Brow <tomb@squareup.com>
|
@codex review |
|
Codex Review: Didn't find any major issues. What shall we delve into next? Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
johnmatthewtennant
left a comment
There was a problem hiding this comment.
🤖 Reviewed e588aba with the complete teammate-review workflow (62 lenses, 124 outcomes). The escaped attachment segmentation and gallery destination fixes match their rendering paths; no correctness blockers found. The existing bubble and carousel journeys cover the changed lookups. No Flutter tests or device journey run by me.
A real-message diff against desktop's parser found three differences: - A table typed directly under a caption line showed raw pipes. GFM lets a table interrupt a paragraph; plusparse doesn't, so a blank line is inserted before such a table. - `> [!NOTE]` quotes became alerts. Desktop has no alerts, so they stay quotes. - An unclosed backtick run paired with a run in a later block, flipping later code and prose, so math-delimiter escapes leaked into code as entities. A code span now ends with its paragraph. Bubble segmentation now unescapes a link destination itself before the imeta lookup, since content no longer arrives shielded (#8940 relied on that). Also pins gpt_markdown to exactly 1.3.4. Co-authored-by: studio <dc2fc481343672df31a689840c09299972e704dac592e0da6f18486646a7ee3e@buzz.block.builderlab.xyz> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tom Brow <tomb@squareup.com>
A real-message diff against desktop's parser found three differences: - A table typed directly under a caption line showed raw pipes. GFM lets a table interrupt a paragraph; plusparse doesn't, so a blank line is inserted before such a table. - `> [!NOTE]` quotes became alerts. Desktop has no alerts, so they stay quotes. - An unclosed backtick run paired with a run in a later block, flipping later code and prose, so math-delimiter escapes leaked into code as entities. A code span now ends with its paragraph. Bubble segmentation now unescapes a link destination itself before the imeta lookup, since content no longer arrives shielded (#8940 relied on that). Also pins gpt_markdown to exactly 1.3.4. Co-authored-by: studio <dc2fc481343672df31a689840c09299972e704dac592e0da6f18486646a7ee3e@buzz.block.builderlab.xyz> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tom Brow <tomb@squareup.com>
Follow-up to #8925, from a Codex finding there.
After #8925, message Markdown arrives with backslash escapes shielded, but imeta is keyed by plain URLs. Two lookups used the raw, still-escaped destination:
bubble_segments.dart): an attachment link such as[voice.mp4](https://…/voice\_note.mp4)missed its imeta entry and stayed inside the text bubble, even though the link builder rendered it as an attachment. The fix unshields the URL before the lookup.extractTrailingImageGalleryinmessage_gallery.dart): with two or more trailing images, an escaped destination kept its backslash, so the carousel loaded the wrong URL and lost the imeta alt text. The fix unescapes the destination the same way as the label beside it. Its callers inmessage_media_avatar.dartandmessage_skeleton_body.dartget the fix too. This gap was already on main.Validation
attachments stay outside bubbles and text order is preservedjourney now uses an escaped destination with a plain imeta URL. The existing carousel journey now has one escaped image destination and taps it by its plain URL. Each fails with its fix reverted.flutter analyzeis clean and the full mobile suite passes (4151 tests).🤖 Generated with Claude Code