[APP] Add Expo Router formSheet modal for typical dish details#353
Conversation
Reviewer's GuideImplements a new AI-powered "Typical Dishes" experience with Wikimedia-backed images and a dedicated modal flow, refactors modal infrastructure and trip food schema to support rich dish objects, and updates profile and splash UX while cleaning up obsolete modal state and avatar code. Sequence diagram for Typical Dishes modal and Wikimedia image fetchingsequenceDiagram
actor User
participant FoodCard
participant useFoodCardLogic
participant navigationService
participant TypicalDishesModalPage
participant useTypicalDishesModalPageLogic
participant useGetTripById
participant TypicalDishesList
participant DishItem
participant useDishItemLogic
participant useGetWikimediaDishImage
participant FetchWikimediaDishImageUseCase
participant WikimediaDishImageRepository
participant IHttpClient as WikimediaCommonsAPI
User->>FoodCard: press CustomButtonMedium
FoodCard->>useFoodCardLogic: useFoodCardLogic(tripId)
FoodCard->>useFoodCardLogic: handleOpenModal()
useFoodCardLogic->>navigationService: toTypicalDishesModal({ tripId })
navigationService-->>User: open TypicalDishesModalPage
TypicalDishesModalPage->>useTypicalDishesModalPageLogic: useTypicalDishesModalPageLogic()
useTypicalDishesModalPageLogic->>useGetTripById: useGetTripById(tripId)
useGetTripById-->>useTypicalDishesModalPageLogic: trip
useTypicalDishesModalPageLogic-->>TypicalDishesModalPage: { location, dishItems }
TypicalDishesModalPage->>TypicalDishesList: dishItems
TypicalDishesList->>DishItem: render DishItem(dish)
DishItem->>useDishItemLogic: useDishItemLogic(dish.searchTerm)
useDishItemLogic->>useGetWikimediaDishImage: useGetWikimediaDishImage(searchTerm)
useGetWikimediaDishImage->>FetchWikimediaDishImageUseCase: execute(dish, options)
FetchWikimediaDishImageUseCase->>WikimediaDishImageRepository: getImage(dish, options)
WikimediaDishImageRepository->>IHttpClient: get<WikimediaSearchResponseDTO>(url)
IHttpClient-->>WikimediaDishImageRepository: WikimediaSearchResponseDTO
WikimediaDishImageRepository-->>FetchWikimediaDishImageUseCase: Result<ImageResult | null>
FetchWikimediaDishImageUseCase-->>useGetWikimediaDishImage: Result<ImageResult | null>
useGetWikimediaDishImage-->>useDishItemLogic: { data, isLoading }
useDishItemLogic-->>DishItem: { image, isLoading }
DishItem-->>User: show dish image and description
File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
|
Warning Review limit reached
More reviews will be available in 50 minutes and 39 seconds. Learn how PR review limits work. Your organization has run out of usage credits. Purchase more in the billing tab. ⌛ How to resolve this issue?After more reviews become available, 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 include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available. Please see our Fair Usage Limits Policy for further information. ℹ️ Review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (1)
📝 WalkthroughWalkthroughAdds a Typical Dishes form-sheet modal (data schemas, UI, navigation, DI, and Wikimedia image fetching), refactors modal infrastructure by removing the centralized modal store and simplifying ModalTemplate, updates profile mapping to username/profileImageUrl, and adjusts app splash/docs. ChangesTypical Dishes Modal Feature
Wikimedia image fetching
Navigation & form-sheet options
Modal System Refactoring
Profile Feature Updates
Configuration & Documentation
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Possibly related PRs
🚥 Pre-merge checks | ✅ 2 | ❌ 3❌ Failed checks (3 warnings)
✅ 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.
Hey - I've found 4 issues, and left some high level feedback:
- The
ModalTemplatecomponent has been reduced to a plainViewand no longer acceptsModalProps(e.g.,isVisible, backdrop behavior) or exposes.Container; double‑check all existing usages to ensure expectations about modal behavior (animations, backdrop, dismissal) are still met or consider introducing a separate non-modal wrapper to avoid silently changing semantics. - In
ModalHeader, thechildrenprop is typed asReact.ReactElementbutReact(orReactElement) is not imported in this file; either import the type explicitly or switch the prop type to something likeReactNodefromreactto avoid type errors. - For
useGetWikimediaDishImage, consider normalizing thedishkey (e.g.,dish.trim().toLowerCase()) in thequeryKeyto avoid unnecessary cache misses when the same dish string is passed in with different casing or incidental whitespace.
Prompt for AI Agents
Please address the comments from this code review:
## Overall Comments
- The `ModalTemplate` component has been reduced to a plain `View` and no longer accepts `ModalProps` (e.g., `isVisible`, backdrop behavior) or exposes `.Container`; double‑check all existing usages to ensure expectations about modal behavior (animations, backdrop, dismissal) are still met or consider introducing a separate non-modal wrapper to avoid silently changing semantics.
- In `ModalHeader`, the `children` prop is typed as `React.ReactElement` but `React` (or `ReactElement`) is not imported in this file; either import the type explicitly or switch the prop type to something like `ReactNode` from `react` to avoid type errors.
- For `useGetWikimediaDishImage`, consider normalizing the `dish` key (e.g., `dish.trim().toLowerCase()`) in the `queryKey` to avoid unnecessary cache misses when the same dish string is passed in with different casing or incidental whitespace.
## Individual Comments
### Comment 1
<location path="features/profile/ui/pages/ProfilePage/ProfilePage.logic.ts" line_range="20" />
<code_context>
navigationService.toTripList();
};
+ const profileImage = `${profileImageUrl}?height=${components.profileImageHeight}&width=${components.profileImageHeight}&quality=100&fit=crop`;
+
return {
</code_context>
<issue_to_address>
**issue (bug_risk):** Guard against missing `profileImageUrl` to avoid constructing an invalid image URL.
If `profileImageUrl` is `undefined`, this expression produces a URL like `"undefined?height=..."`, which will cause image load failures and noisy network errors in `CustomImage`. Consider only building `profileImage` when `profileImageUrl` is truthy, or returning `null`/`undefined` here and conditionally rendering the avatar image in the consumer component.
</issue_to_address>
### Comment 2
<location path="features/trips/ui/pages/TypicalDishesModalPage/TypicalDishesModalPage.logic.ts" line_range="9-11" />
<code_context>
+ const { tripId } = useLocalSearchParams<{ tripId: string }>();
+ const { trip } = useGetTripById(tripId);
+
+ const location = trip?.tripAiResp.tripDetails.location.split(',')[0] ?? '';
+ const food = trip?.tripAiResp?.food;
+ const dishNumber = food?.typicalDishes.length ?? 0;
+
+ const handleClose = () => navigationService.back();
</code_context>
<issue_to_address>
**issue (bug_risk):** Access to `tripAiResp.tripDetails` is not fully null-safe and may throw if `tripAiResp` is missing.
The optional chaining only applies to `trip`, not `trip.tripAiResp`. If `trip` exists but `tripAiResp` is `undefined`, `trip?.tripAiResp.tripDetails` will still throw when accessing `tripDetails`. This is already handled correctly for `food` via `trip?.tripAiResp?.food`, but not for `location`.
Consider updating to something like:
```ts
const location = trip?.tripAiResp?.tripDetails.location.split(',')[0] ?? '';
```
or, more defensively:
```ts
const rawLocation = trip?.tripAiResp?.tripDetails?.location;
const location = rawLocation ? rawLocation.split(',')[0] : '';
```
</issue_to_address>
### Comment 3
<location path="features/trips/ui/components/TypicalDishesList/TypicalDishesList.tsx" line_range="16-17" />
<code_context>
+
+export const TypicalDishesList: FC<TypicalDishesListProps> = ({ dishItems }) => (
+ <>
+ {dishItems?.map((item, index) => (
+ <Fragment key={item.name}>
+ {index > 0 && <Separator />}
+ <DishItem dish={item} />
+ </Fragment>
+ ))}
+ </>
</code_context>
<issue_to_address>
**suggestion (bug_risk):** Using `item.name` as the React key may cause collisions if dish names repeat.
This assumes all dish names are unique. Since these come from an AI response, duplicates are likely and can cause unstable list rendering. Prefer a more robust key, such as combining name and index (or a stable id if available):
```tsx
<Fragment key={`${item.name}-${index}`}>
```
```suggestion
{dishItems?.map((item, index) => (
<Fragment key={`${item.name}-${index}`}>
```
</issue_to_address>
### Comment 4
<location path="features/core/images/data/repositories/WikimediaDishImageRepository.ts" line_range="65-67" />
<code_context>
+ return true;
+ }
+
+ private isAllowedImageExtension(url: string): boolean {
+ const lower = url.toLowerCase();
+ return ALLOWED_IMAGE_EXTENSIONS.some(ext => lower.includes(ext));
+ }
+
</code_context>
<issue_to_address>
**suggestion (bug_risk):** Filtering image extensions via `includes` may misclassify URLs; `endsWith` is safer.
Because the extension check isn’t anchored to the end of the string, URLs like `/file.jpg.svg` or URLs with query params containing `.jpg` could be incorrectly accepted as JPGs. To avoid this, explicitly match the file extension at the end of the URL:
```ts
return ALLOWED_IMAGE_EXTENSIONS.some(ext => lower.endsWith(ext));
```
</issue_to_address>Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.
There was a problem hiding this comment.
Code Review
This pull request introduces a feature to display typical dishes for a trip, leveraging Wikimedia Commons to fetch dish images. It defines structured schemas and validators for typical dishes, adds a dedicated typical dishes modal page, integrates a Wikimedia image search repository, cleans up unused reset password modal code, and updates the profile page to use Clerk profile images. The review feedback highlights several key improvements: using optional chaining in TypicalDishesModalPage.logic.ts to prevent runtime crashes, ensuring the fallback image is returned in useGetWikimediaDishImage.ts when data is unavailable, correcting the image dimension check logic in WikimediaDishImageRepository.ts to reject low-resolution images, and adopting unified pluralized translation keys in the typical dishes modal header to follow localization best practices.
There was a problem hiding this comment.
6 issues found across 74 files
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="README.md">
<violation number="1" location="README.md:10">
P2: The referenced image `wiki/docs/diagrams/AI_Generation_Pipeline.png` is not a valid PNG (it contains placeholder text instead). The image will appear broken in the rendered README.</violation>
</file>
<file name="features/core/images/data/repositories/WikimediaDishImageRepository.ts">
<violation number="1" location="features/core/images/data/repositories/WikimediaDishImageRepository.ts:58">
P2: The minimum-dimension check is too permissive: it allows images where one dimension is below the configured minimum.</violation>
</file>
<file name="features/core/ui/components/dialogs/ModalTemplate/ModalTemplate.tsx">
<violation number="1" location="features/core/ui/components/dialogs/ModalTemplate/ModalTemplate.tsx:11">
P1: The modal template now always renders and has no visibility prop, so dialog content can no longer be conditionally shown/hidden through this component.</violation>
</file>
<file name="app.json">
<violation number="1" location="app.json:57">
P2: The iOS splash screen `imageWidth` effectively changes from **100** to **150** because the iOS-specific override (`ios.imageWidth: 100`) was removed and a root-level `imageWidth: 150` was added. The old config intentionally used platform-specific widths (100 iOS, 150 Android). Verify this iOS width increase is intentional for the new non-round logo, or keep the `ios.imageWidth: 100` override if iOS should remain at 100.</violation>
</file>
<file name="features/profile/ui/pages/ProfilePage/ProfilePage.logic.ts">
<violation number="1" location="features/profile/ui/pages/ProfilePage/ProfilePage.logic.ts:20">
P2: Profile image URL construction is fragile: it does not handle missing URLs or existing query parameters, which can generate invalid image URIs.</violation>
</file>
<file name="features/core/images/facades/useGetWikimediaDishImage.ts">
<violation number="1" location="features/core/images/facades/useGetWikimediaDishImage.ts:18">
P2: Using infinite `gcTime` on a dynamic query key can cause unbounded React Query cache growth.</violation>
</file>
Reply with feedback, questions, or to request a fix.
Re-trigger cubic
There was a problem hiding this comment.
Actionable comments posted: 8
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
features/trips/ui/components/ListHeaderComponent/ListHeaderComponent.tsx (1)
55-57:⚠️ Potential issue | 🟠 Major | ⚡ Quick winThe custom
memocomparator now dropstripIdupdates.This comparator only checks
tripDetails, but the component also rendersfood,tripId,weather, notes, map props, and the new modal button. If any of those change whiletripDetailskeeps the same reference,FoodCardcan keep a staletripIdand open the wrong modal.💡 Safer fix
export const ListHeaderComponent: FC<ListHeaderComponentProps> = memo( ({ region, allCoordinates, budgetNotes, transportationNotes, weather, tripDetails, food, tripId }) => { return ( <View style={style.container}> <TripDetailsCard tripDetails={tripDetails} /> {allCoordinates && <MapListHeaderComponent region={region} allCoordinates={allCoordinates} />} {weather && <WeatherCard weather={weather} />} {food && <FoodCard food={food} tripId={tripId} />} {budgetNotes && ( <NotesCard title="TRIP_DETAILS.BUDGET_NOTES" icon={icons.card} notes={budgetNotes} backgroundColor={colors.secondaryBlue} /> )} {transportationNotes && ( <NotesCard title="TRIP_DETAILS.TRANSPORTATION_NOTES" icon={icons.bus} notes={transportationNotes} isTitleInverted backgroundColor={colors.secondaryPink} /> )} </View> ); - }, - (prevProps, nextProps) => { - return prevProps.tripDetails === nextProps.tripDetails; - }, + }, );🤖 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 `@features/trips/ui/components/ListHeaderComponent/ListHeaderComponent.tsx` around lines 55 - 57, The current custom memo comparator for ListHeaderComponent (the (prevProps, nextProps) => prevProps.tripDetails === nextProps.tripDetails) ignores changes to tripId, food, weather, notes, map props and the modal button, causing FoodCard to get a stale tripId; fix by replacing this custom comparator with either the default React.memo shallow compare (remove the custom function) or by expanding the comparator to explicitly compare prevProps.tripDetails, prevProps.tripId, prevProps.food, prevProps.weather, prevProps.notes, prevProps.mapProps and any modal handler/flag (e.g., onOpenModal) against nextProps so updates to tripId and other relevant props propagate to ListHeaderComponent/FoodCard.
🧹 Nitpick comments (1)
features/core/ui/components/dialogs/ModalTemplate/ModalTemplateHeader/ModalTemplateHeader.tsx (1)
16-23: ⚡ Quick winWiden the
childrenslot toReactNode.
ReactElementis narrower than what this component actually renders. It rejects common valid children such as fragments, arrays, text, and falsy conditional children, which makes the new header slot harder to consume than necessary.♻️ Proposed fix
+import type { ReactNode } from 'react'; import type { StyleProp, TextStyle } from 'react-native'; import { View } from 'react-native'; @@ - children?: React.ReactElement; + children?: ReactNode;#!/bin/bash # Inspect current ModalHeader / ModalTemplate.Header call sites to confirm whether # any consumers already pass fragments, text nodes, arrays, or conditional children. rg -n -C3 --type=tsx '<(ModalHeader|ModalTemplate\.Header)\b'🤖 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 `@features/core/ui/components/dialogs/ModalTemplate/ModalTemplateHeader/ModalTemplateHeader.tsx` around lines 16 - 23, The children prop for the ModalTemplateHeader component is overly restrictive: change its type from React.ReactElement to React.ReactNode in the ModalTemplateHeader props so the header accepts fragments, arrays, text, and conditional/falsy children; update the declaration where children is typed (the ModalTemplateHeader props object) and run a quick grep/tsc check of ModalHeader / ModalTemplate.Header call sites (e.g., search for "ModalHeader" or "ModalTemplate.Header") to ensure no consumers rely on the narrower type and adjust any typings if needed.
🤖 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 `@app/`(main)/(authenticated)/create-trip/_layout.tsx:
- Line 2: Remove the unused import "spacing" from the import list in the
_layout.tsx file; update the statement that currently imports { CustomHeader,
icons, spacing } to only import the actually used symbols (e.g., CustomHeader
and icons) so the unused "spacing" identifier is dropped and Biome's
noUnusedImports check will pass.
- Around line 75-78: Reformat the JSX <Stack.Screen> block so it passes Biome by
collapsing the current multiline element into a single-line self-closing
element: update the <Stack.Screen> instance for Modals.TypicalDishes to be
written on one line and keep the same props (name={Modals.TypicalDishes} and
options={formSheetOptions}) so the JSX is compact and correctly formatted.
In `@features/core/images/data/repositories/WikimediaDishImageRepository.ts`:
- Line 58: The image-dimension check currently rejects only when both sides are
below MIN_IMAGE_DIMENSION_PX; update the conditional in
WikimediaDishImageRepository (the check using info.width, info.height and
MIN_IMAGE_DIMENSION_PX) to reject when either dimension is below the threshold
by changing the logical operator from && to || so images with one small side
(e.g., 1200x150) are filtered out.
In `@features/profile/ui/pages/ProfilePage/ProfilePage.logic.ts`:
- Around line 20-21: The profileImage URL is built unguarded using
profileImageUrl which can be undefined, producing invalid URLs like
"undefined?..."; update the logic around profileImage (and the similar
expression at the other occurrence) to check profileImageUrl first and only
construct the query-string URL when profileImageUrl is truthy, otherwise set
profileImage to undefined (or a chosen fallback), referencing the existing
symbols profileImage, profileImageUrl, and components.profileImageHeight so
callers receive a safe value.
In `@features/trip-generation/domain/schemas/GenerateTripSchema.ts`:
- Around line 61-82: The typicalDishes item schema currently only documents
rules for searchTerm and description; update the Zod validators for those fields
in the typicalDishes object so they enforce the constraints: change searchTerm
to a z.string() with trim plus a regex or .refine that ensures lowercase ASCII
(no diacritics/special chars), contains 1–3 words (max 3 space-separated tokens)
and rejects punctuation; change description to a z.string().trim() with a
.refine that counts words and enforces between 20 and 50 words (and optionally a
min/max character sanity check); keep the existing .describe() texts but replace
the loose strings with these stricter validators so invalid generated dishes
fail schema validation.
In `@features/trips/ui/components/TypicalDishesList/TypicalDishesList.tsx`:
- Line 17: The Fragment in TypicalDishesList uses item.name as the key which can
collide; update the key on the Fragment (or the mapped element) to use a stable
unique identifier such as item.id if available, or a composite stable key like
`${item.id ?? item.name}-${index}` from the map callback (ensure you reference
the map index parameter) so each <Fragment> key is unique and stable across
renders.
In
`@features/trips/ui/components/TypicalDishesModalHeader/TypicalDishesModalHeader.tsx`:
- Around line 20-24: The header layout can overflow when `location` is long;
update the `TypicalDishesModalHeader` JSX so the location and icon remain on the
first horizontal row (keep the existing View using styles.locationRow with
`CustomIcon` and the `CustomText` for `location`), and move the dish count
(`CustomText` using `dishNumber`/`dishLabel`) into a separate row beneath it
(new View or reuse styles) so the count is on its own line and cannot be pushed
off-screen; adjust/ensure styles (e.g., styles.locationRow, styles.location,
styles.dishNumber) for spacing and alignment after this change.
In
`@features/trips/ui/pages/TypicalDishesModalPage/TypicalDishesModalPage.logic.ts`:
- Line 9: The current assignment to location uses
trip?.tripAiResp.tripDetails.location.split(',')[0] which can throw if
tripAiResp/tripDetails/location are undefined; update this to guard each nested
property before calling split (e.g., use optional chaining on tripAiResp,
tripDetails, and location and nullish-coalescing to ''), so replace the
expression for location with a fully null-safe chain that only calls split when
location is defined.
---
Outside diff comments:
In `@features/trips/ui/components/ListHeaderComponent/ListHeaderComponent.tsx`:
- Around line 55-57: The current custom memo comparator for ListHeaderComponent
(the (prevProps, nextProps) => prevProps.tripDetails === nextProps.tripDetails)
ignores changes to tripId, food, weather, notes, map props and the modal button,
causing FoodCard to get a stale tripId; fix by replacing this custom comparator
with either the default React.memo shallow compare (remove the custom function)
or by expanding the comparator to explicitly compare prevProps.tripDetails,
prevProps.tripId, prevProps.food, prevProps.weather, prevProps.notes,
prevProps.mapProps and any modal handler/flag (e.g., onOpenModal) against
nextProps so updates to tripId and other relevant props propagate to
ListHeaderComponent/FoodCard.
---
Nitpick comments:
In
`@features/core/ui/components/dialogs/ModalTemplate/ModalTemplateHeader/ModalTemplateHeader.tsx`:
- Around line 16-23: The children prop for the ModalTemplateHeader component is
overly restrictive: change its type from React.ReactElement to React.ReactNode
in the ModalTemplateHeader props so the header accepts fragments, arrays, text,
and conditional/falsy children; update the declaration where children is typed
(the ModalTemplateHeader props object) and run a quick grep/tsc check of
ModalHeader / ModalTemplate.Header call sites (e.g., search for "ModalHeader" or
"ModalTemplate.Header") to ensure no consumers rely on the narrower type and
adjust any typings if needed.
🪄 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: 86448ce8-1728-49e3-adda-752ab8e78d4d
⛔ Files ignored due to path filters (5)
features/core/ui/assets/images/android-icon.pngis excluded by!**/*.pngfeatures/core/ui/assets/images/food_placeholder.jpgis excluded by!**/*.jpgfeatures/core/ui/assets/images/logo.pngis excluded by!**/*.pngpackage-lock.jsonis excluded by!**/package-lock.jsonwiki/docs/diagrams/AI_Generation_Pipeline.pngis excluded by!**/*.png
📒 Files selected for processing (69)
README.mdapp.jsonapp/(main)/(authenticated)/create-trip/_layout.tsxapp/(main)/(authenticated)/create-trip/typical-dishes-modal.tsxconvex/validators/Trips.tsfeatures/auth/ui/components/ResetPasswordModal/ResetPasswordModal.logic.tsfeatures/auth/ui/components/ResetPasswordModal/ResetPasswordModal.tsxfeatures/core/images/data/dtos/WikimediaSearchResponseDTO.tsfeatures/core/images/data/repositories/WikimediaDishImageRepository.tsfeatures/core/images/di/config.tsfeatures/core/images/di/resolve.tsfeatures/core/images/di/types.tsfeatures/core/images/domain/entities/foodCategoryKeywords.tsfeatures/core/images/facades/useGetWikimediaDishImage.tsfeatures/core/images/index.tsfeatures/core/images/useCases/FetchWikimediaDishImageUseCase.tsfeatures/core/navigation/data/services/NavigationService.tsfeatures/core/navigation/domain/entities/Modals.tsfeatures/core/navigation/domain/entities/services/INavigationService.tsfeatures/core/navigation/index.tsfeatures/core/navigation/libraries/formSheetOptions.tsfeatures/core/state/index.tsfeatures/core/state/modal/modalStore.tsfeatures/core/state/modal/useModalState.tsfeatures/core/translations/libraries/locales/en.jsonfeatures/core/translations/libraries/locales/it.jsonfeatures/core/ui/components/dialogs/ActionModal/ActionModal.logic.tsfeatures/core/ui/components/dialogs/ActionModal/ActionModal.tsxfeatures/core/ui/components/dialogs/InfoModal/InfoModal.logic.tsfeatures/core/ui/components/dialogs/InfoModal/InfoModal.tsxfeatures/core/ui/components/dialogs/ModalTemplate/ModalTemplate.style.tsfeatures/core/ui/components/dialogs/ModalTemplate/ModalTemplate.tsxfeatures/core/ui/components/dialogs/ModalTemplate/ModalTemplateContainer/ModalTemplateContainer.logic.tsfeatures/core/ui/components/dialogs/ModalTemplate/ModalTemplateContainer/ModalTemplateContainer.style.tsfeatures/core/ui/components/dialogs/ModalTemplate/ModalTemplateContainer/ModalTemplateContainer.tsxfeatures/core/ui/components/dialogs/ModalTemplate/ModalTemplateContainer/useKeyboardEffect.tsfeatures/core/ui/components/dialogs/ModalTemplate/ModalTemplateHeader/ModalTemplateHeader.style.tsfeatures/core/ui/components/dialogs/ModalTemplate/ModalTemplateHeader/ModalTemplateHeader.tsxfeatures/core/ui/index.tsfeatures/core/ui/style/dimensions/components.tsfeatures/core/ui/style/dimensions/images.tsfeatures/profile/facades/useProfileData.tsfeatures/profile/ui/pages/ProfilePage/ProfilePage.logic.tsfeatures/profile/ui/pages/ProfilePage/ProfilePage.style.tsfeatures/profile/ui/pages/ProfilePage/ProfilePage.tsxfeatures/trip-generation/domain/schemas/GenerateTripSchema.tsfeatures/trips/domain/entities/Food.tsfeatures/trips/domain/entities/TypicalDish.tsfeatures/trips/index.tsfeatures/trips/pages.tsfeatures/trips/ui/components/FoodCard/FoodCard.logic.tsfeatures/trips/ui/components/FoodCard/FoodCard.style.tsfeatures/trips/ui/components/FoodCard/FoodCard.tsxfeatures/trips/ui/components/FoodCard/components/DishItem/DishItem.logic.tsfeatures/trips/ui/components/FoodCard/components/DishItem/DishItem.style.tsfeatures/trips/ui/components/FoodCard/components/DishItem/DishItem.tsxfeatures/trips/ui/components/ListHeaderComponent/ListHeaderComponent.tsxfeatures/trips/ui/components/TypicalDishesList/TypicalDishesList.style.tsfeatures/trips/ui/components/TypicalDishesList/TypicalDishesList.tsxfeatures/trips/ui/components/TypicalDishesModalHeader/TypicalDishesModalHeader.logic.tsfeatures/trips/ui/components/TypicalDishesModalHeader/TypicalDishesModalHeader.style.tsfeatures/trips/ui/components/TypicalDishesModalHeader/TypicalDishesModalHeader.tsxfeatures/trips/ui/pages/TripDetailsPage/TripDetailsPage.tsxfeatures/trips/ui/pages/TypicalDishesModalPage/TypicalDishesModalPage.logic.tsfeatures/trips/ui/pages/TypicalDishesModalPage/TypicalDishesModalPage.style.tsfeatures/trips/ui/pages/TypicalDishesModalPage/TypicalDishesModalPage.tsxfeatures/user/data/repositories/useUserRepository.tsfeatures/user/domain/entities/repositories/IUserRepository.tspackage.json
💤 Files with no reviewable changes (14)
- features/core/ui/index.ts
- features/core/ui/components/dialogs/ActionModal/ActionModal.tsx
- features/core/ui/components/dialogs/ActionModal/ActionModal.logic.ts
- features/core/ui/components/dialogs/InfoModal/InfoModal.tsx
- features/core/ui/components/dialogs/InfoModal/InfoModal.logic.ts
- features/core/state/modal/useModalState.ts
- features/core/ui/components/dialogs/ModalTemplate/ModalTemplateContainer/ModalTemplateContainer.style.ts
- features/core/ui/components/dialogs/ModalTemplate/ModalTemplateContainer/ModalTemplateContainer.logic.ts
- features/auth/ui/components/ResetPasswordModal/ResetPasswordModal.tsx
- features/core/ui/components/dialogs/ModalTemplate/ModalTemplateContainer/useKeyboardEffect.ts
- features/core/ui/components/dialogs/ModalTemplate/ModalTemplateContainer/ModalTemplateContainer.tsx
- features/core/state/modal/modalStore.ts
- features/core/state/index.ts
- features/auth/ui/components/ResetPasswordModal/ResetPasswordModal.logic.ts
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
1 issue found across 4 files (changes from recent commits).
Tip: Review your code locally with the cubic CLI to iterate faster.
Re-trigger cubic
…eRepository Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Fixes #310
Summary by CodeRabbit
New Features
UI Improvements
Chores