feat: update UI themes and improve tab navigation#87
Conversation
- Changed userInterfaceStyle to 'light' in app.json for consistent appearance. - Refactored theme handling in _layout.tsx to use a custom navigation theme. - Updated tab navigation styles in (tabs)/_layout.tsx to utilize nativeChrome for better visual consistency. - Enhanced search and inbox screens to align with new theme settings. - Added nativeChrome configuration for improved UI elements across the app. This commit aims to standardize the UI and enhance user experience across different screens.
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
📝 WalkthroughWalkthroughThis PR transitions the frontend from automatic/dynamic theme switching to a fixed light-mode theme strategy. It introduces a new native Chrome theme module defining light-only UI constants, removes dark theme imports, and updates tab bar, search, listing card, and layout components to use theme-driven styling values instead of hardcoded configurations. Changes
Estimated Code Review Effort🎯 3 (Moderate) | ⏱️ ~20 minutes Possibly Related PRs
Suggested Reviewers
🚥 Pre-merge checks | ✅ 1 | ❌ 2❌ Failed checks (2 warnings)
✅ Passed checks (1 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 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.
🧹 Nitpick comments (2)
frontend/app/(tabs)/_layout.tsx (1)
115-132: LGTM on the rest of the native tab chrome wiring.
iconColor={{default, selected}},backgroundColor,blurEffect,shadowColor, anddisableTransparentOnScrollEdgeare valid NativeTabs props. Redundantly settingdisableTransparentOnScrollEdgeon both the container and everyTriggeris allowed (Trigger takes precedence) but unnecessary — consider removing the per-Trigger duplicates for brevity.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@frontend/app/`(tabs)/_layout.tsx around lines 115 - 132, The NativeTabs component is being passed disableTransparentOnScrollEdge both at the container level and again on each Trigger; remove the redundant per-Trigger prop to reduce duplication and rely on Trigger's precedence when necessary—update the code where Trigger components are rendered (look for Trigger instances related to NativeTabs) to delete the disableTransparentOnScrollEdge prop on each Trigger, leaving the single prop on the NativeTabs container (or keep it only on Triggers if specific overrides are required).frontend/theme/nativeChrome.ts (1)
34-46: Consider exportingsearchFieldChromeas a constant instead of a function.Since this returns the same static values on every call, making it a
const(typed asSearchFieldChrome) removes the need for callers likesearch/index.tsxto wrap it inuseMemo.♻️ Proposed refactor
-export function searchFieldChrome(): SearchFieldChrome { - return { - keyboardAppearance: nativeChrome.keyboardAppearance, - blurTint: nativeChrome.blurTint, - barTintColor: nativeChrome.tabBarBackgroundColor, - textColor: colors.textDark, - hintTextColor: colors.muted, - iconColor: colors.textDark, - searchBarWrapBackground: 'rgba(255, 255, 255, 0.45)', - searchBarWrapBorder: 'rgba(255, 255, 255, 0.6)', - clearButtonBackground: 'rgba(0, 0, 0, 0.15)', - }; -} +export const searchFieldChrome: SearchFieldChrome = { + keyboardAppearance: nativeChrome.keyboardAppearance, + blurTint: nativeChrome.blurTint, + barTintColor: nativeChrome.tabBarBackgroundColor, + textColor: colors.textDark, + hintTextColor: colors.muted, + iconColor: colors.textDark, + searchBarWrapBackground: 'rgba(255, 255, 255, 0.45)', + searchBarWrapBorder: 'rgba(255, 255, 255, 0.6)', + clearButtonBackground: 'rgba(0, 0, 0, 0.15)', +};Note: this would require a call-site update in
frontend/app/(tabs)/search/index.tsx(drop the()invocation and the enclosinguseMemo).🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@frontend/theme/nativeChrome.ts` around lines 34 - 46, Replace the exported function searchFieldChrome() with a exported constant of type SearchFieldChrome containing the same object literal (export const searchFieldChrome: SearchFieldChrome = { ... }) so callers don't have to memoize; update call-sites (notably frontend/app/(tabs)/search/index.tsx) to stop invoking it (drop the trailing ()) and remove the enclosing useMemo. Ensure the exported symbol name remains searchFieldChrome and the object properties (keyboardAppearance, blurTint, barTintColor, textColor, hintTextColor, iconColor, searchBarWrapBackground, searchBarWrapBorder, clearButtonBackground) are preserved exactly.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Nitpick comments:
In `@frontend/app/`(tabs)/_layout.tsx:
- Around line 115-132: The NativeTabs component is being passed
disableTransparentOnScrollEdge both at the container level and again on each
Trigger; remove the redundant per-Trigger prop to reduce duplication and rely on
Trigger's precedence when necessary—update the code where Trigger components are
rendered (look for Trigger instances related to NativeTabs) to delete the
disableTransparentOnScrollEdge prop on each Trigger, leaving the single prop on
the NativeTabs container (or keep it only on Triggers if specific overrides are
required).
In `@frontend/theme/nativeChrome.ts`:
- Around line 34-46: Replace the exported function searchFieldChrome() with a
exported constant of type SearchFieldChrome containing the same object literal
(export const searchFieldChrome: SearchFieldChrome = { ... }) so callers don't
have to memoize; update call-sites (notably
frontend/app/(tabs)/search/index.tsx) to stop invoking it (drop the trailing ())
and remove the enclosing useMemo. Ensure the exported symbol name remains
searchFieldChrome and the object properties (keyboardAppearance, blurTint,
barTintColor, textColor, hintTextColor, iconColor, searchBarWrapBackground,
searchBarWrapBorder, clearButtonBackground) are preserved exactly.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: b87f1d24-da71-4de6-a0d8-fec5be5863c2
📒 Files selected for processing (8)
frontend/app.jsonfrontend/app/(tabs)/_layout.tsxfrontend/app/(tabs)/inbox.tsxfrontend/app/(tabs)/index.tsxfrontend/app/(tabs)/search/index.tsxfrontend/app/_layout.tsxfrontend/components/ListingCard.tsxfrontend/theme/nativeChrome.ts
* feat: misc frontend UI fixes and improvements - Fix duplicate sign-in messages on profile tab - Redirect unauthenticated users to profile on Create Listing (web) - Fix browser tab title persisting after leaving a listing - Style placeholder text with lighter grey across profile and create listing forms - Standardize Create Listing button to brand green (#154734) - Capitalize category and condition values on listing detail page - Add profile setup check before creating listings with visible warning banner - Replace Alert.alert with cross-platform showAlert for web compatibility - Add Delete button to My Listings with confirmation dialog * fix: address PR review feedback - Extract showAlert into shared utils/showAlert.ts module - Prevent concurrent deletes in my-listings (guard + disable all buttons) - Fix year reset to empty string in settings signed-out useEffect - Remove unused Alert/Platform imports from new.tsx * fix(vercel): declare @sentry/react-native in frontend workspace 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 * fix: address team feedback — auth timeout, seller avatar, download link, image lightbox - Add 8s timeout + retry button to auth 'checking' step to prevent infinite spinner - Replace empty grey seller avatar with initials (first letter of name) on listing detail - Make seller block tappable, navigates to public profile - Change 'Open in App' to 'Download App' with placeholder App Store URL - Add download hint link to OpenInAppPrompt component - Create ImageLightbox component for full-screen uncropped image viewing - Wrap all listing hero images in Pressable to open lightbox on click - Support keyboard navigation (Escape, ←, →) in lightbox on web * fix: address PR feedback for UI components and auth flow - Fix login retry timer leak - Fix ImageLightbox filtered array index mismatch and add auto-focus on web - Improve OpenInAppPrompt link error handling and accessibility labels - Move APP_STORE_URL and APP_SCHEME to shared constants * chore: satisfy eslint any warning for lightbox web props * fixed search * feat(frontend): dedicated account settings from profile tab - Add /account-settings stack screen with message notifications, sign out, and delete account - Profile tab shows a Settings row (and account settings on incomplete profile) linking there - Web: OpenInAppPrompt for account settings deep link, consistent with profile tab - Fix typed-route pushes with as never where the generated routes lag Made-with: Cursor * red box * red box * blocked users * code rabbit fix * more fixes * feat: add Other as a report reason for listing moderation (POLY-70) * fix: keyboard overlaps input on Create/Edit Listing screens (POLY-75) * feat: ui changes to save/share buttons * fix: login redirect bug * fix: route profileless users to onboarding Co-authored-by: Evan Taylor <evan-taylor@users.noreply.github.com> * test: cover login onboarding redirect * Match UI of MyListing and Home * chore: remove ios build files from PR * feat(frontend): dismissible flash banner and safe placement - Add FlashProvider with bottom-inset positioning above tab/home area - pointerEvents box-none/auto so banner receives taps; tap or Dismiss clears - Shorter auto-dismiss when reduce motion is enabled - Wire create/edit listing, mark sold, and report success to setFlash - ReportModal optional onReportSuccess for non-blocking confirmation Made-with: Cursor * transparent * more transparent * chore(frontend): shared report copy; longer flash for reduce motion - Add feedbackMessages constants for report success (flash + Alert) - Use REPORT_SUBMITTED_MESSAGE in listing and profile screens - Increase FLASH_DURATION_REDUCED_MS to 4000 for readability Made-with: Cursor * feat: remove tags from UI and backend (POLY-77) * Remove unrelated changes from PR * fix: coderabbit errors * fix(vercel): declare @sentry/react-native in frontend workspace 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 * feat(frontend): polish listing cards (POLY-76) - Vertical stack: multi-line title (2 lines home, 3 default), condition caption, price - Clearer hierarchy: dark title, muted condition, bold accent price - More padding and md card radius; softer shadow; slightly looser grid spacing on home Made-with: Cursor * feat(frontend): short description preview on listing cards - Plain descriptions: up to 2 lines, footnote style, ellipsized - Multi-line or -/• lists: up to 2 bullet rows with trimmed markers - Include snippet in accessibility label (capped length) Made-with: Cursor * feat(frontend): smarter listing description bullets (heuristics) - Extract buildDescriptionPreview: newlines/markers, semicolons, then sentences - Use Intl.Segmenter when available with regex fallback for sentences - Up to 3 bullets; support numbered line prefixes - Tests for preview helper; exclude frontend __tests__ from tsc Made-with: Cursor * fix(frontend): omit prose after last bulleted line in card preview - When 2+ lines start with list markers, only those lines become bullets - descBlock uses overflow hidden as a layout safeguard Made-with: Cursor * fix(frontend): numbered lists without space after dot and inline 1. 2. - Scan for digit+dot boundaries (not decimals like 2.0) across lines and spaces - Relax line markers so 1.Item matches; run span scan before line-based bullets - Tests for tight 1.x/2.x lines and single-line numbered lists Made-with: Cursor * feat(frontend): one bullet per description line when user uses Enter - Drop short-line / looksLikeList gate: any 2+ non-empty lines become bullets - Keep marked-only slice when 2+ lines start with list markers (trailing prose omitted) - Cap 12 lines, 300 chars per line; strip optional -/1. prefixes per row Made-with: Cursor * fix(frontend): trim prose after last bullet (numbered + single dash) - Numbered items: drop flush lines after first line in each span; keep indented wraps - One dash bullet + following unmarked lines: show only the marked line - Tests for numbered tail and single-dash + prose Made-with: Cursor * chore(frontend): address CodeRabbit ListingCard + preview tests - Require listing.condition on ListingCard; exhaustive formatConditionLabel - Memoize accessibilityLabel from parts; spacing.smPlus for cardDetailsHome - Tests: 78-char cap and DESC_PREVIEW_BULLET_MAX Made-with: Cursor * feat: fixed a ton of stuff, standardize UI (#86) * feat: fixed a ton of stuff, standardize UI * fix block user success feedback Co-authored-by: Evan Taylor <evan-taylor@users.noreply.github.com> * style format conversation block flow Co-authored-by: Evan Taylor <evan-taylor@users.noreply.github.com> * fix listing sold state race checks Co-authored-by: Evan Taylor <evan-taylor@users.noreply.github.com> --------- Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: Evan Taylor <evan-taylor@users.noreply.github.com> * feat: update UI themes and improve tab navigation (#87) - Changed userInterfaceStyle to 'light' in app.json for consistent appearance. - Refactored theme handling in _layout.tsx to use a custom navigation theme. - Updated tab navigation styles in (tabs)/_layout.tsx to utilize nativeChrome for better visual consistency. - Enhanced search and inbox screens to align with new theme settings. - Added nativeChrome configuration for improved UI elements across the app. This commit aims to standardize the UI and enhance user experience across different screens. * feat: implement profile pictures * fix: coderabbit changes, fix top border on profile page * feat: add ci/cd for builds (#89) * feat: add ci/cd for builds * fix: don't build on backend or docs changes * fix: inbox search keyboard close (#90) * feat: fix xcode provisioning on ci/cd (#91) * fix: add app id to expo (#92) * feat: run convex deploy and add agent skill (#93) * feat: run convex deploy and add agent skill * fix: run convex deploy on manual ci too * feat: add report and delete for entire conversations * feat: fix prevent swipe actions from showing through on row press * feat: add tooltip and add tap to close swipe * feat: add report and delete for individual messaging * fix(frontend): keyboard avoidance for price range picker modal - 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 * chore(frontend): dedupe Sentry dep; dim price picker backdrop - Remove duplicate @sentry/react-native from package.json - Restore modal scrim on PriceRangePicker backdrop (rgba 0.35) Made-with: Cursor * fix: remove listings when conversation reported, clean up functionality * fix: no deleting individual messages * fix: remove tooltip * feat: redirect new users to home * feat: redirect to home after logging in * fix: add code rabbit changes * fix: onboarding copy so first-time users do not see Welcome back (POLY-86) * feat: add required field indicators and inline validation to listing creation (POLY-91) * feat: add date posted metadata to listing cards and detail page (POLY-92) * fix choppyness (#101) * feat: add zoom support to listing photos * fix: address lightbox lint warnings * chore: rerun ci for listing photo zoom * fix: address lightbox review feedback * feat: prevent functionality on web * fix: ci config setup (#109) * fix: match Dispatch<SetStateAction> signature for onImagesChange * Feat/marketing landing (#95) * fix(vercel): declare @sentry/react-native in frontend workspace 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 * feat(frontend): add marketing landing page and /home feed route - Add web-only landing at / with value props, CTAs, and App Store compliance - Desktop: QR code and mailto draft for the download link - Narrow web: official App Store badge linking to APP_STORE_URL - Rename (tabs)/index to home so / is the landing without route conflicts - Point in-app "home" navigation and post-auth default to /home - Register root index in the stack; dedupe @sentry/react-native in package.json - Refresh lockfile so workspace resolves expo-blur for typecheck/bundling Made-with: Cursor * feat(web): block auth routes and remove login CTAs from landing - Add auth/login.web.tsx so /auth/login always redirects to / on web - Remove Sign in header link and Sign up button from LandingScreen - Clarify copy: sign-in is app-only; web is browse-focused Made-with: Cursor * chore(frontend): address CodeRabbit marketing + web auth UX - index: redirect authenticated web users to /home; show boot spinner while auth loads - LandingScreen: brand Link to /home; static QR asset (no third-party API); App Store badge uses Link target=_blank on web - types/assets.d.ts: declare *.png for Metro image imports - constants: document APP_STORE_URL + QR regeneration - home: web save/create no longer hits blocked /auth/login; use app-only alerts Made-with: Cursor * feat: revamp landing page, add legal docs * fix: board and coderabbit feedback * fix: feedback --------- Co-authored-by: Evan Taylor <eltaylor1104@gmail.com> * Feature/poly 90 button visibility (#108) * feat: improve search tab and button visibility * feat: polish search, buttons, and messaging flows * fix: address ui review feedback * fix: padding and styling changes --------- Co-authored-by: Evan Taylor <eltaylor1104@gmail.com> * fixes * fix: address listing form validation review feedback * fix: align home route references with expo router * feat: add support page and links across the application (#111) - Introduced a new support page for user assistance, accessible via /support. - Updated LandingScreen to include a link to the support page and added legal links for Privacy and Terms. - Enhanced the footer to include a link to the support page. - Implemented support document retrieval with contact options for user inquiries. - Adjusted styles for legal links and contact information display. * fix: restore web browse route targets * fix: improve keyboard avoidance in chat and price picker * fix: address keyboard and safety banner review feedback * featL liquid glass app icon (#112) * feat: add support page and links across the application - Introduced a new support page for user assistance, accessible via /support. - Updated LandingScreen to include a link to the support page and added legal links for Privacy and Terms. - Enhanced the footer to include a link to the support page. - Implemented support document retrieval with contact options for user inquiries. - Adjusted styles for legal links and contact information display. * feat: add liquid glass app icon * fix: revert message keyboard avoidance changes * fix: avoid native driver conflict in price picker * fix: make profile email read-only * feat: polish login and profile flows * fix: tighten profile tab and major selection * fix: polish frontend login and profile flows * fix: standardize keyboard chrome across frontend flows * feat: polish frontend launch readiness * chore: apply final review hardening updates * chore: apply final review hardening updates * fix: address accessibility and profile review comments * fix: address frontend review findings * fix: harden native image uploads and backend validation --------- Co-authored-by: Cole <hackman@calpoly.edu> Co-authored-by: dfed25 <domfederico21@gmail.com> Co-authored-by: Jaydon Chen <79879038+jaydonkc@users.noreply.github.com> Co-authored-by: MatthewPhan <Matthewminhphan@gmail.com> Co-authored-by: SamanSP1386 <saman.sepehr86@gmail.com> Co-authored-by: Haixin <haixinhuang502@gmail.com> Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: Evan Taylor <evan-taylor@users.noreply.github.com> Co-authored-by: lheutchy <lheutchy@gmail.com> Co-authored-by: Taye-Staats <tayestaats@outlook.com> Co-authored-by: dfed25 <150391626+dfed25@users.noreply.github.com> Co-authored-by: BoB121isawesome <79879038+BoB121isawesome@users.noreply.github.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
This commit aims to standardize the UI and enhance user experience across different screens.
Linked Issues
Closes #
Linear: (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
New Features
Style
Bug Fixes