Skip to content

[APP] Dish detail page#359

Merged
timothyrusso merged 11 commits into
mainfrom
feature/356
Jun 5, 2026
Merged

[APP] Dish detail page#359
timothyrusso merged 11 commits into
mainfrom
feature/356

Conversation

@timothyrusso
Copy link
Copy Markdown
Owner

@timothyrusso timothyrusso commented Jun 4, 2026

Fixes #356

Summary by CodeRabbit

  • New Features

    • Dish Details modal: full dish view with image, ingredients, description and dietary badges; reachable from typical dishes.
  • UI/UX Improvements

    • New Badge and BottomSheetHeader components and updated dish card interactions (pressable).
    • Vegan support added (badge, label, color/icon updates) and adjusted component sizes and icons.
  • Localization

    • Added dietary and trip UI translation keys (including vegan, gluten-free, ingredients, more details).

@sourcery-ai
Copy link
Copy Markdown

sourcery-ai Bot commented Jun 4, 2026

Reviewer's Guide

Implements a new dish details modal flow and supporting UI components/styles, refines typical dishes interactions and layout, and extends domain/navigation schemas with vegan flags and dish detail navigation.

Sequence diagram for the new dish details modal flow

sequenceDiagram
  actor User
  participant FoodCard
  participant NavigationService
  participant TypicalDishesModalPage
  participant TypicalDishesList
  participant DishItem
  participant DishDetailsModalPage
  participant useDishDetailsModalPageLogic
  participant useGetTripById
  participant useGetWikimediaDishImage

  User ->> FoodCard: Pressable onPress handleOpenModal
  FoodCard ->> NavigationService: toTypicalDishesModal tripId
  NavigationService ->> TypicalDishesModalPage: push Modals.TypicalDishes with tripId

  User ->> DishItem: Pressable onPress
  DishItem ->> TypicalDishesList: onPress searchTerm
  TypicalDishesList ->> TypicalDishesModalPage: onDishPress searchTerm
  TypicalDishesModalPage ->> NavigationService: toDishDetailsModal { tripId, searchTerm }
  NavigationService ->> DishDetailsModalPage: push Modals.DishDetails with params

  DishDetailsModalPage ->> useDishDetailsModalPageLogic: useDishDetailsModalPageLogic
  useDishDetailsModalPageLogic ->> useGetTripById: useGetTripById tripId
  useDishDetailsModalPageLogic ->> useGetWikimediaDishImage: useGetWikimediaDishImage searchTerm
  useGetTripById -->> useDishDetailsModalPageLogic: trip
  useGetWikimediaDishImage -->> useDishDetailsModalPageLogic: { url, isLoading }
  useDishDetailsModalPageLogic -->> DishDetailsModalPage: dishName, dishDescription, dishIngredients, isGlutenFree, isVegetarian, isVegan, image, imageIsLoading

  User ->> DishDetailsModalPage: Tap close
  DishDetailsModalPage ->> useDishDetailsModalPageLogic: handleClose
  useDishDetailsModalPageLogic ->> NavigationService: back
Loading

File-Level Changes

Change Details Files
Revamp FoodCard and typical dishes trigger UI to use a tappable info box instead of a button.
  • Extend FoodCard styles with title container, typical dishes box, pressed state, and box text/button styles using shared opacity.
  • Replace CustomButtonMedium with a Pressable that shows an icon, title, and 'more details' text and triggers the typical dishes modal.
  • Import opacity token in FoodCard styles and Pressable in FoodCard component.
features/trips/ui/components/FoodCard/FoodCard.style.ts
features/trips/ui/components/FoodCard/FoodCard.tsx
Make typical dish items tappable and visually richer, and propagate dish press handling through the list and modal.
  • Update DishItem styles with grey background container, padding, rounded corners, image border, and pressed opacity state.
  • Wrap DishItem in a Pressable that calls an onPress prop while preserving existing skeleton/image/text layout.
  • Update TypicalDishesList to accept an onDishPress callback and pass it to each DishItem with the dish searchTerm.
  • Wire TypicalDishesModalPage logic and view to handle dish presses via navigationService.toDishDetailsModal.
  • Visually soften TypicalDishesList separators and modal header by changing separator color/margins and removing header bottom border.
features/trips/ui/components/FoodCard/components/DishItem/DishItem.style.ts
features/trips/ui/components/FoodCard/components/DishItem/DishItem.tsx
features/trips/ui/components/TypicalDishesList/TypicalDishesList.tsx
features/trips/ui/components/TypicalDishesList/TypicalDishesList.style.ts
features/trips/ui/pages/TypicalDishesModalPage/TypicalDishesModalPage.tsx
features/trips/ui/pages/TypicalDishesModalPage/TypicalDishesModalPage.logic.ts
features/trips/ui/components/TypicalDishesModalHeader/TypicalDishesModalHeader.style.ts
Add navigation, routing, and modal wiring for dish details.
  • Extend Modals enum with DishDetails and register a DishDetails screen in the create-trip stack using formSheetOptions.
  • Add toDishDetailsModal to INavigationService and implement it in NavigationService to push the new modal with tripId and searchTerm params; generalize toTypicalDishesModal param handling.
  • Export DishDetailsModalPage from trips pages and add Expo Router entrypoint dish-details-modal.tsx that renders it.
features/core/navigation/data/services/NavigationService.ts
features/core/navigation/domain/entities/Modals.ts
features/core/navigation/domain/entities/services/INavigationService.ts
app/(main)/(authenticated)/create-trip/_layout.tsx
features/trips/pages.ts
app/(main)/(authenticated)/create-trip/dish-details-modal.tsx
Introduce DishDetailsModalPage with supporting logic, ingredients chips list, and dietary badges UI.
  • Create DishDetailsModalPage component that shows a header, dish image/skeleton, ingredients list, description, and three dietary badges (gluten free, vegan, vegetarian).
  • Implement DishDetailsModalPage styles for layout, full-size dish image, description text, and badges row.
  • Add IngredientsList component and styles that render an uppercased title and a wrap layout of Cheap chips for each ingredient using a checkmark icon and no uppercasing for ingredient text.
  • Add BottomSheetHeader composite component to render a title and a close icon button for bottom-sheet modals.
  • Add Badge composite component (with dynamic active styling) showing a circular image, check/close icon overlay, and an uppercased label; wire in new badge-related dimensions and icons.
  • Implement DishDetailsModalPage.logic hook to read tripId/searchTerm from route params, fetch Wikimedia image, resolve the dish from the trip entity, and expose dish metadata, booleans, and static badge images along with a close handler.
features/trips/ui/pages/DishDetailsModalPage/DishDetailsModalPage.tsx
features/trips/ui/pages/DishDetailsModalPage/DishDetailsModalPage.style.ts
features/trips/ui/pages/DishDetailsModalPage/DishDetailsModalPage.logic.ts
features/trips/ui/components/IngredientsList/IngredientsList.tsx
features/trips/ui/components/IngredientsList/IngredientsList.style.ts
features/core/ui/components/composite/BottomSheetHeader/BottomSheetHeader.tsx
features/core/ui/components/composite/BottomSheetHeader/BottomSheetHeader.style.ts
features/core/ui/components/composite/Badge/Badge.tsx
features/core/ui/components/composite/Badge/Badge.style.ts
features/core/ui/style/dimensions/components.ts
features/core/ui/style/icons.ts
Extend domain and UI primitives to support vegan flag on dishes and reusable chip behavior.
  • Add isVegan field to TypicalDish entity, Convex validator, and generated trip schema so AI/generated data includes vegan info.
  • Extend colors with tertiaryGreen and images dimensions with dishFullImageSize for new UI elements.
  • Update Cheap component to accept an optional uppercase flag (default true) and use it in IngredientsList to keep ingredient labels case-sensitive.
  • Re-export Badge and BottomSheetHeader from the core UI barrel for app-wide usage.
  • Update translations files (en/it) to support new copy keys used in dish details and badges (content not shown in diff).
convex/validators/Trips.ts
features/trip-generation/domain/schemas/GenerateTripSchema.ts
features/trips/domain/entities/TypicalDish.ts
features/core/ui/style/colors.ts
features/core/ui/style/dimensions/images.ts
features/core/ui/components/basic/Cheap/Cheap.tsx
features/core/ui/index.ts
features/core/translations/libraries/locales/en.json
features/core/translations/libraries/locales/it.json

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Jun 4, 2026

Ready to act? Review this PR in Change Stack to turn feedback into patch suggestions you can inspect and refine.

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: a6d0c050-b68c-4189-8e65-c661f0c613dc

📥 Commits

Reviewing files that changed from the base of the PR and between 95737d8 and 77b8e97.

📒 Files selected for processing (2)
  • features/trips/ui/components/FoodCard/components/DishItem/DishItem.logic.ts
  • features/trips/ui/components/FoodCard/components/DishItem/DishItem.tsx
🚧 Files skipped from review as they are similar to previous changes (2)
  • features/trips/ui/components/FoodCard/components/DishItem/DishItem.logic.ts
  • features/trips/ui/components/FoodCard/components/DishItem/DishItem.tsx

📝 Walkthrough

Walkthrough

This PR adds a dish details modal to the create-trip flow: domain/schema updates (isVegan), navigation APIs and router registration, new UI components (Badge, BottomSheetHeader, IngredientsList), and wiring from typical dishes to open the dish details modal showing image, ingredients, description, and dietary badges.

Changes

Dish Details Modal Feature

Layer / File(s) Summary
Schema and domain model updates
features/trips/domain/entities/TypicalDish.ts, convex/validators/Trips.ts, features/trip-generation/domain/schemas/GenerateTripSchema.ts
TypicalDish is extended with isVegan: boolean across domain, validator, and generation schema layers.
Navigation infrastructure and modal routing
features/core/navigation/domain/entities/Modals.ts, features/core/navigation/domain/entities/services/INavigationService.ts, features/core/navigation/data/services/NavigationService.ts
Adds DishDetails modal id; INavigationService and NavigationService add toDishDetailsModal(params: { tripId: string; searchTerm: string }) and normalize toTypicalDishesModal params.
Design system extensions
features/core/ui/style/colors.ts, features/core/ui/style/dimensions/components.ts, features/core/ui/style/dimensions/images.ts, features/core/ui/style/icons.ts, features/core/ui/components/basic/Cheap/Cheap.tsx, features/core/ui/components/composite/Badge/*, features/core/ui/components/composite/BottomSheetHeader/*, features/core/ui/index.ts
Adds tertiaryGreen, badge/dish image dimensions, new icons, Cheap.uppercase prop, Badge and BottomSheetHeader components and styles, and re-exports from core UI index.
Ingredients list component
features/trips/ui/components/IngredientsList/*
New IngredientsList renders a titled row of Cheap chips with checkmark icons.
FoodCard typical-dishes UI
features/trips/ui/components/FoodCard/FoodCard.tsx, features/trips/ui/components/FoodCard/FoodCard.style.ts
Refactors typical-dishes control from CustomButtonMedium to Pressable with pressed-state styling and added layout/text styles.
DishItem and TypicalDishesList integration
features/trips/ui/components/FoodCard/components/DishItem/*, features/trips/ui/components/TypicalDishesList/*, features/trips/ui/pages/TypicalDishesModalPage/*
DishItem becomes pressable and renders dietary badges; TypicalDishesList accepts onDishPress and passes searchTerm. TypicalDishes modal logic exposes handleDishPress to navigate to DishDetails modal.
Dish details modal page
features/trips/ui/pages/DishDetailsModalPage/*, features/trips/pages.ts, app/(main)/(authenticated)/create-trip/dish-details-modal.tsx
New hook reads tripId and searchTerm, fetches Wikimedia image and trip, resolves the dish, and the page renders header, image (with skeleton), ingredients, description, and three Badge components. Page is re-exported from feature barrel and route wrapper added.
Router and localization
app/(main)/(authenticated)/create-trip/_layout.tsx, features/core/translations/libraries/locales/en.json, features/core/translations/libraries/locales/it.json
DishDetails modal screen registered in create-trip layout with formSheetOptions; English and Italian locales gain dietary labels (GLUTEN_FREE, VEGAN, VEGETARIAN) and MORE_DETAILS strings.

Sequence Diagram

sequenceDiagram
  participant TypicalDishesList
  participant NavigationService
  participant Router
  participant DishDetailsModalPage
  participant TripAPI
  participant WikimediaImageService

  TypicalDishesList->>NavigationService: toDishDetailsModal({tripId, searchTerm})
  NavigationService->>Router: push(Stacks.CreateTrip, Modals.DishDetails, params)
  Router->>DishDetailsModalPage: open with {tripId, searchTerm}
  DishDetailsModalPage->>TripAPI: useGetTripById(tripId)
  DishDetailsModalPage->>WikimediaImageService: useGetWikimediaDishImage(searchTerm)
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Poem

A rabbit hops through trips with glee,
Now dishes show their secrets free—
Vegan badges gleam, ingredients bright,
Modal opens, detail in sight! 🥕🐰

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Linked Issues check ❓ Inconclusive Linked issue #356 provides no detailed coding requirements; unable to validate specific objectives from the issue description. Review the linked issue #356 to confirm all coding requirements are met or provide explicit requirements in the issue.
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title '[APP] Dish detail page' directly and clearly describes the main feature addition—a new dish details modal page component with supporting infrastructure.
Out of Scope Changes check ✅ Passed All changes are cohesively related to adding a dish details modal page feature, including UI components, navigation, styling, validation, and localization.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/356

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions github-actions Bot changed the title Feature/356 [APP] Dish detail page Jun 4, 2026
Copy link
Copy Markdown

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces a new 'Dish Details' modal page to display typical dish information, including its description, ingredients, and dietary badges (Gluten-Free, Vegan, Vegetarian), along with supporting navigation, schemas, and translations. Feedback on the changes suggests avoiding dynamic StyleSheet.create calls in the Badge component to prevent performance issues, exposing and handling the trip query loading state with skeleton screens in the modal page to avoid visual flashes, and localizing the hardcoded 'Ingredients' string.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment thread features/core/ui/components/composite/Badge/Badge.style.ts
Comment thread features/core/ui/components/composite/Badge/Badge.tsx
Copy link
Copy Markdown

@sourcery-ai sourcery-ai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey - I've found 2 issues, and left some high level feedback:

  • In Badge.tsx you reference icons.success, but the icons map only declares checkmark and closeCircle, so this will resolve to undefined at runtime—either add success to the icons map or reuse an existing icon key.
  • The Badge component uppercases translation keys via label.toLocaleUpperCase() before passing them to CustomText, which likely expects the raw i18n key; this will break lookups—consider leaving the key unchanged and handling casing via styles or by uppercasing the translated text instead.
  • The new IngredientsList and DishDetailsModalPage components mix plain strings (e.g. "Ingredients") and translation keys; for consistency with the rest of the app, consider standardizing on translation keys and letting CustomText handle localization.
Prompt for AI Agents
Please address the comments from this code review:

## Overall Comments
- In `Badge.tsx` you reference `icons.success`, but the icons map only declares `checkmark` and `closeCircle`, so this will resolve to `undefined` at runtime—either add `success` to the icons map or reuse an existing icon key.
- The `Badge` component uppercases translation keys via `label.toLocaleUpperCase()` before passing them to `CustomText`, which likely expects the raw i18n key; this will break lookups—consider leaving the key unchanged and handling casing via styles or by uppercasing the translated text instead.
- The new `IngredientsList` and `DishDetailsModalPage` components mix plain strings (e.g. `"Ingredients"`) and translation keys; for consistency with the rest of the app, consider standardizing on translation keys and letting `CustomText` handle localization.

## Individual Comments

### Comment 1
<location path="features/core/ui/components/composite/Badge/Badge.tsx" line_range="29-30" />
<code_context>
+          <CustomImage source={image} style={styles.badgeImage} />
+        </View>
+        <View style={styles.checkBadge}>
+          <CustomIcon
+            name={active ? icons.success : icons.closeCircle}
+            size={spacing.TripleAndHalf}
+            color={active ? colors.tertiaryGreen : colors.primaryRed}
</code_context>
<issue_to_address>
**issue (bug_risk):** The `icons.success` key is not defined in the icons map and will likely cause a runtime error.

`icons.checkmark` is the defined success glyph in the icons map; `icons.success` does not exist. As written, this will pass `undefined` as the icon name, leading to a missing or broken icon at runtime. Please switch to `icons.checkmark` (or another existing key) so the success state renders properly.
</issue_to_address>

### Comment 2
<location path="features/trips/ui/components/IngredientsList/IngredientsList.tsx" line_range="14-24" />
<code_context>
+  <View style={styles.container}>
+    <CustomText text={title.toLocaleUpperCase()} style={styles.title} />
+    <View style={styles.chipsRow}>
+      {ingredients.map(ingredient => (
+        <Cheap
+          key={ingredient}
+          title={ingredient}
+          color={colors.secondaryGrey}
</code_context>
<issue_to_address>
**suggestion (bug_risk):** Using the ingredient value as the React key can lead to duplicate keys if the list contains repeated ingredients.

If an ingredient appears more than once, React will get duplicate keys, which can cause unstable rendering. Use a guaranteed-unique key instead, such as the map index or a combination of value and index (e.g. `key={`${ingredient}-${index}`}`).

```suggestion
    <View style={styles.chipsRow}>
      {ingredients.map((ingredient, index) => (
        <Cheap
          key={`${ingredient}-${index}`}
          title={ingredient}
          color={colors.secondaryGrey}
          icon={icons.checkmark}
          uppercase={false}
        />
      ))}
    </View>
```
</issue_to_address>

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

Comment thread features/core/ui/components/composite/Badge/Badge.tsx
Comment thread features/trips/ui/components/IngredientsList/IngredientsList.tsx
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🤖 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 `@features/trips/ui/components/FoodCard/components/DishItem/DishItem.tsx`:
- Line 14: The Pressable in the DishItem component needs accessibility
semantics: add accessibilityRole="button" to the Pressable and supply an
accessibilityLabel derived from the dish name prop (e.g., `${name}, button` or
similar) so screen readers announce it properly; also forward accessibilityState
(e.g., disabled if onPress is undefined) and keep the existing onPress and style
props (look for the Pressable using styles.container and the onPress handler in
DishItem) so behavior and visual styling are unchanged.

In `@features/trips/ui/components/IngredientsList/IngredientsList.tsx`:
- Around line 15-18: The current IngredientsList map uses key={ingredient} which
can collide for duplicate ingredients; update the map in the IngredientsList
component to use a guaranteed-unique key (e.g., include the map index or a
unique id) by changing the map callback to accept the index and pass a composite
key such as `${ingredient}-${index}` (or use an ingredient unique identifier if
one exists) to the Cheap component's key prop to avoid reconciliation issues.

In `@features/trips/ui/pages/DishDetailsModalPage/DishDetailsModalPage.tsx`:
- Around line 27-31: When imageIsLoading is false but image is missing,
CustomImage may receive an undefined source; update the rendering logic in
DishDetailsModalPage so it checks for a loaded-but-no-image case before
rendering CustomImage. Specifically, inside the JSX that currently switches on
imageIsLoading, add an explicit branch for when imageIsLoading === false &&
!image to render a fallback (e.g., BaseSkeleton or a placeholder view) using
styles.image, otherwise render CustomImage with the existing source logic;
adjust the conditional that references imageIsLoading, image, CustomImage, and
BaseSkeleton accordingly.
- Line 32: Replace the hardcoded "Ingredients" string passed to IngredientsList
in DishDetailsModalPage with a localized string lookup (e.g., use your i18n
translate function such as t('dishDetails.ingredients') or a locale prop) so the
title comes from translations; update the IngredientsList invocation to:
title={t('...')} (or equivalent) and add the corresponding translation key to
your locale files (refer to IngredientsList, dishIngredients, and
DishDetailsModalPage to locate the change).
🪄 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: CHILL

Plan: Pro

Run ID: 6abe06b9-c0a8-4400-a4b5-a51e851ab70c

📥 Commits

Reviewing files that changed from the base of the PR and between bba3281 and c1affe4.

⛔ Files ignored due to path filters (3)
  • features/core/ui/assets/images/gluten_free.png is excluded by !**/*.png
  • features/core/ui/assets/images/vegan.png is excluded by !**/*.png
  • features/core/ui/assets/images/vegetarian.png is excluded by !**/*.png
📒 Files selected for processing (35)
  • app/(main)/(authenticated)/create-trip/_layout.tsx
  • app/(main)/(authenticated)/create-trip/dish-details-modal.tsx
  • convex/validators/Trips.ts
  • features/core/navigation/data/services/NavigationService.ts
  • features/core/navigation/domain/entities/Modals.ts
  • features/core/navigation/domain/entities/services/INavigationService.ts
  • features/core/translations/libraries/locales/en.json
  • features/core/translations/libraries/locales/it.json
  • features/core/ui/components/basic/Cheap/Cheap.tsx
  • features/core/ui/components/composite/Badge/Badge.style.ts
  • features/core/ui/components/composite/Badge/Badge.tsx
  • features/core/ui/components/composite/BottomSheetHeader/BottomSheetHeader.style.ts
  • features/core/ui/components/composite/BottomSheetHeader/BottomSheetHeader.tsx
  • features/core/ui/index.ts
  • features/core/ui/style/colors.ts
  • features/core/ui/style/dimensions/components.ts
  • features/core/ui/style/dimensions/images.ts
  • features/core/ui/style/icons.ts
  • features/trip-generation/domain/schemas/GenerateTripSchema.ts
  • features/trips/domain/entities/TypicalDish.ts
  • features/trips/pages.ts
  • features/trips/ui/components/FoodCard/FoodCard.style.ts
  • features/trips/ui/components/FoodCard/FoodCard.tsx
  • features/trips/ui/components/FoodCard/components/DishItem/DishItem.style.ts
  • features/trips/ui/components/FoodCard/components/DishItem/DishItem.tsx
  • features/trips/ui/components/IngredientsList/IngredientsList.style.ts
  • features/trips/ui/components/IngredientsList/IngredientsList.tsx
  • features/trips/ui/components/TypicalDishesList/TypicalDishesList.style.ts
  • features/trips/ui/components/TypicalDishesList/TypicalDishesList.tsx
  • features/trips/ui/components/TypicalDishesModalHeader/TypicalDishesModalHeader.style.ts
  • features/trips/ui/pages/DishDetailsModalPage/DishDetailsModalPage.logic.ts
  • features/trips/ui/pages/DishDetailsModalPage/DishDetailsModalPage.style.ts
  • features/trips/ui/pages/DishDetailsModalPage/DishDetailsModalPage.tsx
  • features/trips/ui/pages/TypicalDishesModalPage/TypicalDishesModalPage.logic.ts
  • features/trips/ui/pages/TypicalDishesModalPage/TypicalDishesModalPage.tsx
💤 Files with no reviewable changes (1)
  • features/trips/ui/components/TypicalDishesModalHeader/TypicalDishesModalHeader.style.ts

Comment thread features/trips/ui/components/FoodCard/components/DishItem/DishItem.tsx Outdated
Comment thread features/trips/ui/components/IngredientsList/IngredientsList.tsx
Comment thread features/trips/ui/pages/DishDetailsModalPage/DishDetailsModalPage.tsx Outdated
Copy link
Copy Markdown

@cubic-dev-ai cubic-dev-ai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 issue found across 3 files (changes from recent commits).

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="features/trips/ui/components/FoodCard/components/DishItem/DishItem.logic.ts">

<violation number="1" location="features/trips/ui/components/FoodCard/components/DishItem/DishItem.logic.ts:4">
P2: Duplicate `require()` calls for the same dietary badge images across two logic files. The same three images (`gluten_free.png`, `vegan.png`, `vegetarian.png`) are required independently in `DishItem.logic.ts` and `DishDetailsModalPage.logic.ts`, creating a maintenance burden when adding/removing badges.</violation>
</file>

Reply with feedback, questions, or to request a fix.

Re-trigger cubic

Copy link
Copy Markdown

@cubic-dev-ai cubic-dev-ai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

3 issues found across 39 files

Reply with feedback, questions, or to request a fix.

Re-trigger cubic

Comment thread features/trips/ui/pages/DishDetailsModalPage/DishDetailsModalPage.tsx Outdated
Comment thread convex/validators/Trips.ts
timothyrusso and others added 4 commits June 5, 2026 11:45
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 `@features/trips/ui/components/FoodCard/components/DishItem/DishItem.tsx`:
- Around line 47-49: Add accessible labels to the dietary badge images by
passing an accessibilityLabel prop to each CustomImage when isGlutenFree,
isVegan, and isVegetarian are true; update the three occurrences that render
CustomImage (the ones using glutenFreeImage, veganImage, and vegetarianImage) to
include descriptive labels like "Gluten free", "Vegan", and "Vegetarian" (or
localized equivalents) so screen readers announce the badges.
🪄 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: CHILL

Plan: Pro

Run ID: 77b316f5-8280-4abf-86d0-0b3c823bb120

📥 Commits

Reviewing files that changed from the base of the PR and between c1affe4 and 95737d8.

📒 Files selected for processing (9)
  • features/core/translations/libraries/locales/en.json
  • features/core/translations/libraries/locales/it.json
  • features/core/ui/components/composite/Badge/Badge.tsx
  • features/trips/ui/components/FoodCard/components/DishItem/DishItem.logic.ts
  • features/trips/ui/components/FoodCard/components/DishItem/DishItem.style.ts
  • features/trips/ui/components/FoodCard/components/DishItem/DishItem.tsx
  • features/trips/ui/components/IngredientsList/IngredientsList.tsx
  • features/trips/ui/pages/DishDetailsModalPage/DishDetailsModalPage.logic.ts
  • features/trips/ui/pages/DishDetailsModalPage/DishDetailsModalPage.tsx
✅ Files skipped from review due to trivial changes (1)
  • features/core/translations/libraries/locales/en.json
🚧 Files skipped from review as they are similar to previous changes (3)
  • features/trips/ui/pages/DishDetailsModalPage/DishDetailsModalPage.logic.ts
  • features/trips/ui/components/FoodCard/components/DishItem/DishItem.style.ts
  • features/core/ui/components/composite/Badge/Badge.tsx

Comment thread features/trips/ui/components/FoodCard/components/DishItem/DishItem.tsx Outdated
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@timothyrusso timothyrusso merged commit 4319dc5 into main Jun 5, 2026
4 checks passed
@timothyrusso timothyrusso deleted the feature/356 branch June 5, 2026 21:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[APP] Dish detail page

1 participant