Conversation
Expo resolves @sentry/react-native/expo relative to the frontend package; it was only on the root workspace so Vercel installs did not expose the plugin and expo export failed. Made-with: Cursor
- KeyboardAvoidingView (iOS padding, Android height) above bottom sheet - ScrollView so presets, inputs, and Apply stay reachable when keyboard is open - Backdrop as sibling Pressable so sheet scrolling is not blocked - Safe-area padding on scroll content; cap sheet height for smaller screens Made-with: Cursor
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Warning Rate limit exceeded
Your organization is not enrolled in usage-based pricing. Contact your admin to enable usage-based pricing to continue reviews beyond the rate limit, or try again in 12 minutes and 54 seconds. ⌛ How to resolve this issue?After the wait time has elapsed, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout. Please see our FAQ for further information. ℹ️ Review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (2)
📝 WalkthroughWalkthroughReworks PriceRangePicker modal to a backdrop + sheet with keyboard listeners, animated sheet translation, and scrollable content; adds keyboard-aware padding/behavior to conversations composer; makes SafetyBanner dismissible with a close button and header layout. Changes
Sequence Diagram(s)sequenceDiagram
participant User
participant PriceRangePicker
participant Keyboard
participant ScrollView
User->>PriceRangePicker: open modal
PriceRangePicker->>PriceRangePicker: render backdrop + sheet, attach keyboard listeners
User->>PriceRangePicker: focus TextInput
PriceRangePicker->>Keyboard: await show event
Keyboard-->>PriceRangePicker: show(height)
PriceRangePicker->>PriceRangePicker: animate sheet translateY (Animated.Value)
PriceRangePicker->>ScrollView: scrollToEnd / ensure focused input visible
User->>PriceRangePicker: tap backdrop
PriceRangePicker->>Keyboard: dismiss
PriceRangePicker->>PriceRangePicker: reset keyboard state, close modal
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes Possibly related PRs
Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 3❌ Failed checks (2 warnings, 1 inconclusive)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
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
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
frontend/package.json (1)
17-23:⚠️ Potential issue | 🟡 MinorRemove duplicate
@sentry/react-nativeentry.
@sentry/react-nativeis now declared twice (line 17 and line 23) with the same version. Biome flags this as a duplicate object key, and strict JSON parsers /npm pkgoperations may behave inconsistently. Since the dependency already exists on line 23, the newly added line 17 is redundant and should be dropped (the PR goal of declaring it in the frontend workspace is already satisfied).🔧 Proposed fix
"dependencies": { - "@sentry/react-native": "^8.3.0", "@convex-dev/auth": "^0.0.90",🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@frontend/package.json` around lines 17 - 23, Remove the duplicate dependency entry for "@sentry/react-native" so only one declaration of that package remains in package.json; open the dependencies object, delete the redundant "@sentry/react-native" line (the earlier duplicate), ensure the JSON stays valid (commas updated) and then reinstall dependencies (npm/yarn/pnpm) to verify no package-manager warnings.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@frontend/components/PriceRangePicker.tsx`:
- Around line 202-205: The backdrop style (backdrop) currently uses
StyleSheet.absoluteFillObject with backgroundColor: 'transparent', removing the
dim modal affordance; change the dimming to the sibling backdrop element instead
of this sheet-level backdrop so the sheet can still scroll above it—update the
style for the sibling backdrop (where the overlay element is rendered) to use
the dim color (e.g., rgba(...) or theme overlay token) and keep the existing
backdrop style (backdrop) as absoluteFillObject but transparent so it doesn't
block interaction; ensure the sibling backdrop's zIndex/position places it below
the sheet so the sheet remains scrollable above it.
---
Outside diff comments:
In `@frontend/package.json`:
- Around line 17-23: Remove the duplicate dependency entry for
"@sentry/react-native" so only one declaration of that package remains in
package.json; open the dependencies object, delete the redundant
"@sentry/react-native" line (the earlier duplicate), ensure the JSON stays valid
(commas updated) and then reinstall dependencies (npm/yarn/pnpm) to verify no
package-manager warnings.
🪄 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: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 2a31b227-29a5-4080-bf2d-64d255bfa891
⛔ Files ignored due to path filters (1)
package-lock.jsonis excluded by!**/package-lock.json
📒 Files selected for processing (2)
frontend/components/PriceRangePicker.tsxfrontend/package.json
| backdrop: { | ||
| ...StyleSheet.absoluteFillObject, | ||
| backgroundColor: 'transparent', | ||
| }, |
There was a problem hiding this comment.
Restore the dimmed modal backdrop.
The overlay no longer has a background color, and the new backdrop is fully transparent, so opening the picker loses the modal/dismiss affordance. Put the dim color on the sibling backdrop instead; it won’t block sheet scrolling because the sheet renders above it.
🎨 Proposed fix
backdrop: {
...StyleSheet.absoluteFillObject,
- backgroundColor: 'transparent',
+ backgroundColor: 'rgba(0, 0, 0, 0.35)',
},📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| backdrop: { | |
| ...StyleSheet.absoluteFillObject, | |
| backgroundColor: 'transparent', | |
| }, | |
| backdrop: { | |
| ...StyleSheet.absoluteFillObject, | |
| backgroundColor: 'rgba(0, 0, 0, 0.35)', | |
| }, |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@frontend/components/PriceRangePicker.tsx` around lines 202 - 205, The
backdrop style (backdrop) currently uses StyleSheet.absoluteFillObject with
backgroundColor: 'transparent', removing the dim modal affordance; change the
dimming to the sibling backdrop element instead of this sheet-level backdrop so
the sheet can still scroll above it—update the style for the sibling backdrop
(where the overlay element is rendered) to use the dim color (e.g., rgba(...) or
theme overlay token) and keep the existing backdrop style (backdrop) as
absoluteFillObject but transparent so it doesn't block interaction; ensure the
sibling backdrop's zIndex/position places it below the sheet so the sheet
remains scrollable above it.
- Remove duplicate @sentry/react-native from package.json - Restore modal scrim on PriceRangePicker backdrop (rgba 0.35) Made-with: Cursor
|
@copilot resolve the merge conflicts in this pull request |
There was a problem hiding this comment.
Actionable comments posted: 2
🧹 Nitpick comments (2)
frontend/app/conversations/[id].tsx (2)
395-395: Avoid defining the same bottom padding twice.
styles.messagesContentalready setspaddingBottom: MESSAGES_BOTTOM_PADDING, so the inline override at Line 395 is redundant.🧹 Proposed cleanup
- contentContainerStyle={[styles.messagesContent, { paddingBottom: MESSAGES_BOTTOM_PADDING }]} + contentContainerStyle={styles.messagesContent}Also applies to: 553-557
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@frontend/app/conversations/`[id].tsx at line 395, Remove the redundant padding by keeping a single source of truth for MESSAGES_BOTTOM_PADDING: either delete the inline paddingBottom from the contentContainerStyle prop where you currently pass contentContainerStyle={[styles.messagesContent, { paddingBottom: MESSAGES_BOTTOM_PADDING }]} (so it just uses styles.messagesContent) or remove paddingBottom from styles.messagesContent and keep the inline override—apply the same change for the second occurrence around lines 553–557; reference symbols: styles.messagesContent and MESSAGES_BOTTOM_PADDING.
194-228: Consider extracting the keyboard visibility logic into the shared keyboard-aware path.This duplicates the keyboard/safe-area handling already represented by
frontend/components/ui/KeyboardAwareScreen.tsx. A small shared hook, or reusing that wrapper where practical, would keep chat and future screens from drifting in keyboard behavior.Also applies to: 334-343
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@frontend/app/conversations/`[id].tsx around lines 194 - 228, The keyboard visibility and safe-area handling in the useEffect that registers Keyboard.addListener and computes composerBottomPadding duplicates logic in frontend/components/ui/KeyboardAwareScreen.tsx; extract this into a shared hook (e.g., useKeyboardAware or useKeyboardVisibility) or wrap this page with the existing KeyboardAwareScreen component, move the show/hide listener logic (Keyboard.addListener, setIsKeyboardVisible) and bottom-padding computation (composerBottomPadding) into that shared implementation, then replace the local useEffect and composerBottomPadding usage in this file and the other occurrence (lines ~334-343) with the shared hook or wrapper to avoid duplication.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@frontend/components/PriceRangePicker.tsx`:
- Around line 182-204: The sheet is being translated up by keyboardOffset (see
keyboardOffset used in styles.sheetLift/Animated.View and entranceStyle) but its
height/ScrollView (see ScrollView, scrollViewRef, contentContainerStyle and
styles.sheet) still measures to 100% causing content to be pushed off-screen;
fix by constraining the sheet/ScrollView maxHeight when the keyboard is
open—create an animated maxHeight value (e.g., Animated.subtract(screenHeight,
keyboardOffset) or interpolate keyboardOffset into a maxHeight) and apply it to
the Animated.View with styles.sheet (or the ScrollView container) so the visible
sheet height shrinks as it is lifted, ensuring header/presets remain reachable.
In `@frontend/components/SafetyBanner.tsx`:
- Around line 10-27: The SafetyBanner component currently uses local state
(isVisible/setIsVisible) so dismissal doesn't persist across remounts and the
close Pressable may be below the 44×44pt touch target; to fix, change the
dismissal to persist (e.g., store a "safetyBannerDismissed" flag in AsyncStorage
or your global store/context and read it on mount inside SafetyBanner) and
update the close control to ensure a minimum touch target by adding hitSlop to
the Pressable or applying explicit minWidth/minHeight (or larger padding) in the
styles referenced by styles.closeButton/styles.closeButtonText; keep the
existing setIsVisible for immediate UI feedback but also write the persistent
flag when the close handler runs and read that flag to initialize visibility on
mount.
---
Nitpick comments:
In `@frontend/app/conversations/`[id].tsx:
- Line 395: Remove the redundant padding by keeping a single source of truth for
MESSAGES_BOTTOM_PADDING: either delete the inline paddingBottom from the
contentContainerStyle prop where you currently pass
contentContainerStyle={[styles.messagesContent, { paddingBottom:
MESSAGES_BOTTOM_PADDING }]} (so it just uses styles.messagesContent) or remove
paddingBottom from styles.messagesContent and keep the inline override—apply the
same change for the second occurrence around lines 553–557; reference symbols:
styles.messagesContent and MESSAGES_BOTTOM_PADDING.
- Around line 194-228: The keyboard visibility and safe-area handling in the
useEffect that registers Keyboard.addListener and computes composerBottomPadding
duplicates logic in frontend/components/ui/KeyboardAwareScreen.tsx; extract this
into a shared hook (e.g., useKeyboardAware or useKeyboardVisibility) or wrap
this page with the existing KeyboardAwareScreen component, move the show/hide
listener logic (Keyboard.addListener, setIsKeyboardVisible) and bottom-padding
computation (composerBottomPadding) into that shared implementation, then
replace the local useEffect and composerBottomPadding usage in this file and the
other occurrence (lines ~334-343) with the shared hook or wrapper to avoid
duplication.
🪄 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: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 8d21f7f7-6ba7-40eb-9a37-b09d5dd34114
📒 Files selected for processing (3)
frontend/app/conversations/[id].tsxfrontend/components/PriceRangePicker.tsxfrontend/components/SafetyBanner.tsx
…ard-avoidance # Conflicts: # frontend/app/conversations/[id].tsx Co-authored-by: jaydonkc <79879038+jaydonkc@users.noreply.github.com>
Resolved. The merge conflict in
|
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@frontend/app/conversations/`[id].tsx:
- Around line 664-667: The stylesheet contains an unused entry
composerContainer; either remove composerContainer from the styles object to
satisfy react-native/no-unused-styles, or merge its intent into the active style
used by the composer View (styles.composerWrap) by adding flexShrink: 0 and
backgroundColor: colors.surface to composerWrap so the composer isn’t
squeezed—update the styles object accordingly and remove the unused
composerContainer symbol if you merge.
- Around line 284-314: Replace all uses of the build-time constant
process.env.EXPO_OS with the runtime Platform.OS in this component: update the
useEffect that registers Keyboard listeners (the function using
Keyboard.addListener and setIsKeyboardVisible), update the KeyboardAvoidingView
props block that currently branches on EXPO_OS, and update the FlatList's
keyboardDismissMode to branch on Platform.OS instead; ensure you keep the
existing iOS-specific listeners (keyboardWillShow/WillHide) and the default
DidShow/DidHide listeners for other platforms. Also remove the unused style
named composerContainer from the component's styles object to clean up dead
code.
🪄 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: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 8c7f2f3a-69f7-474f-8509-74f035f83782
📒 Files selected for processing (1)
frontend/app/conversations/[id].tsx
Linked Issues
Closes #94
Linear: POLY-83 (e.g., POLY-123)
Summary
Briefly explain the change and why.
How to Test
Steps to verify locally:
npm run lintnpm run typechecknpm testnpm run dev:backend(in terminal A)npm run dev(in terminal B)Checklist
npm run lint)devScreenshots / Demos
(if UI or visible behavior - attach images, videos, or GIFs)
Summary by CodeRabbit
Bug Fixes
New Features
Refactor