Repository navigation
fix(mobile): never show emoji shortcodes in reaction pills - #9411
Conversation
A reaction slot (timeline pill, combined tray, reaction sheet, native iOS sheet) now never renders a `:shortcode:` as text. A tagless shortcode reaction, as agents send today, resolves against the community custom-emoji palette and shows that image. A shortcode with no palette entry, or whose image fails to load, shows the neutral sparkles placeholder; the shortcode stays only as the semantics label. Co-Authored-By: Claude Opus 5.5 <[email protected]> Co-authored-by: studio <dc2fc481343672df31a689840c09299972e704dac592e0da6f18486646a7ee3e@buzz.block.builderlab.xyz> Signed-off-by: Tom Brow <[email protected]>
|
@codex review |
Codex Review Summary: ✅ CompletedThis 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. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 0b1af910a8
ℹ️ 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".
| /// The neutral glyph that stands in for a custom emoji with no image: a muted | ||
| /// sparkles icon, because a truncated `:shortcode:` is illegible at glyph size. | ||
| /// The shortcode survives only as the semantics label. | ||
| class CustomEmojiPlaceholder extends StatelessWidget { |
There was a problem hiding this comment.
Move the public placeholder widget into its own file
Adding CustomEmojiPlaceholder here puts two public widgets in the same file alongside the existing CustomEmojiImage, violating the mobile rule in AGENTS.md: “One public widget per file.” Move the placeholder into a separate shared custom-emoji file and import it from both consumers.
AGENTS.md reference: AGENTS.md:L780-L782
Useful? React with 👍 / 👎.
🔐 Codex Security Review
Review SummaryOverall Risk: NONE
FindingsNo concrete security, correctness, or reliability findings were identified. Notes
Generated by Codex Security Review | |
kazemek21
left a comment
There was a problem hiding this comment.
Kyle reviewed this PR and the Nexus review-tracker notes and approved with no comments.
Posted by Codex (gpt-6.1-sol) on behalf of kylez.
…small * origin/main: perf(acp): reduce observer CPU and lock overhead (#9381) ci: fix main — stale RunCause call sites and Playwright on ubuntu-26.04 (#9418) fix(mobile): keep shortcut taps and the member picker from wedging (#9388) fix(mobile/ios): close notification code blocks only at line-ending fences (#9349) fix(media): run thumbnail regeneration tests in CI and cap rebuild pixels (#9198) fix(mobile): never show emoji shortcodes in reaction pills (#9411) fix(mobile): isolate channel header scroll rebuilds (#9400) Signed-off-by: Ravneet Arora <[email protected]>
Context
A reaction slot should never show an emoji shortcode as text. Today it does in two cases:
:shortcode:and no NIP-30emojitag, so the pill printed:approve:in tiny text instead of the community emoji.Behavior
:shortcode:reaction resolves against the community custom-emoji palette and renders that image. Anemojitag on the event still wins.NativeMessageGlyphdraws the placeholder). System-message rows reuse the same reaction row.The icon is the existing
BuzzIcons.sparkles. Pareto note: the palette lookup is the sharedreactionEmojiUrlhelper, so there is no new resolver, and the pill only watches the palette when the reaction has no tag.Validation
just mobile-check mobile-test: format and analyze clean; full suite passes (4773 passed, 74 skipped).reaction_row_test/shortcode_tests.dart): a tagless known shortcode renders its image; an unknown shortcode and a failed image render the placeholder and never the text; unicode is unchanged; the native sheet payload marks image-less shortcodes. Reverting the fix makes both new journeys fail.NativeMessageImageLoaderTests); not run locally, the app run below exercises the same code.Before / after
Captures use synthetic shortcodes and a synthetic palette.
Reaction sheet after:
🤖 Generated with Claude Code