Feat/release mobile 1.1.0#54
Conversation
📝 WalkthroughWalkthroughMobile app version 1.1.0 release across all platforms with transcript rendering enhancement and improved retry modal interaction. Version fields updated in Android Gradle, iOS Xcode configurations, and npm package. React Native Markdown library added. Retry modal opens after popover close to prevent UI conflicts. ChangesMobile App v1.1.0 Release
Estimated code review effort🎯 2 (Simple) | ⏱️ ~10 minutes Possibly related PRs
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/mobile/src/screens/RecordingDetailsScreen.tsx`:
- Around line 235-247: The markdown string built for EnrichedMarkdownText uses
raw transcriptSegments values (segment.speaker and segment.text); escape these
fields before joining so markdown characters are treated as literal text. Add or
reuse a helper like escapeMarkdown and call it on
formatTimestamp(segment.start), segment.speaker and segment.text (preserving
trim for text) when constructing the template passed to the markdown prop;
update the interpolation in the transcriptSegments.map used by
EnrichedMarkdownText to use the escaped values instead of the raw fields.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro
Run ID: 744b0fe7-a225-4899-9367-fe9f664aadd1
⛔ Files ignored due to path filters (2)
src/mobile/ios/Podfile.lockis excluded by!**/*.locksrc/mobile/yarn.lockis excluded by!**/yarn.lock,!**/*.lock
📒 Files selected for processing (6)
src/mobile/android/app/build.gradlesrc/mobile/ios/AssistantTranscripts.xcodeproj/project.pbxprojsrc/mobile/package.jsonsrc/mobile/src/components/AppText.tsxsrc/mobile/src/components/RecordingMenu.tsxsrc/mobile/src/screens/RecordingDetailsScreen.tsx
| <EnrichedMarkdownText | ||
| selectable={true} | ||
| markdownStyle={{ | ||
| strong: typography.bodyBold, | ||
| paragraph: typography.body, | ||
| }} | ||
| markdown={transcriptSegments | ||
| .map( | ||
| (segment) => | ||
| `**${formatTimestamp(segment.start ?? -1)} · ${t('transcript.speaker')} ${segment.speaker}** ${segment.text.trim()}` | ||
| ) | ||
| .join('\n\n')} | ||
| /> |
There was a problem hiding this comment.
Escape dynamic transcript content before markdown rendering.
At lines 244-245, segment.speaker and segment.text are injected raw into the markdown string. If either field contains markdown syntax characters (e.g., *, _, [, ], >), they will be interpreted as formatting directives rather than literal text, potentially causing unintended display changes or, in cases where the markdown renderer supports embedded URLs/links, enabling injection attacks. Escape both fields before concatenation.
Proposed fix
+const escapeMarkdown = (value: string) =>
+ value.replace(/([\\`*_{}\[\]()#+\-.!|>~])/g, '\\$1')
<EnrichedMarkdownText
selectable={true}
markdownStyle={{
strong: typography.bodyBold,
paragraph: typography.body,
}}
markdown={transcriptSegments
.map(
(segment) =>
- `**${formatTimestamp(segment.start ?? -1)} · ${t('transcript.speaker')} ${segment.speaker}** ${segment.text.trim()}`
+ `**${formatTimestamp(segment.start ?? -1)} · ${t('transcript.speaker')} ${escapeMarkdown(String(segment.speaker ?? ''))}** ${escapeMarkdown(segment.text.trim())}`
)
.join('\n\n')}
/>🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/mobile/src/screens/RecordingDetailsScreen.tsx` around lines 235 - 247,
The markdown string built for EnrichedMarkdownText uses raw transcriptSegments
values (segment.speaker and segment.text); escape these fields before joining so
markdown characters are treated as literal text. Add or reuse a helper like
escapeMarkdown and call it on formatTimestamp(segment.start), segment.speaker
and segment.text (preserving trim for text) when constructing the template
passed to the markdown prop; update the interpolation in the
transcriptSegments.map used by EnrichedMarkdownText to use the escaped values
instead of the raw fields.
Summary by CodeRabbit
New Features
Bug Fixes
Chores