Skip to content

Implement Trips feature (behind feature flag)#1912

Merged
andrew-bierman merged 10 commits into
developmentfrom
copilot/implement-trips-feature
Apr 11, 2026
Merged

Implement Trips feature (behind feature flag)#1912
andrew-bierman merged 10 commits into
developmentfrom
copilot/implement-trips-feature

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented Mar 9, 2026

  • Review CodeRabbit feedback on PR Implement Trips feature (behind feature flag) #1912
  • Fix formatTripDate to use toLocaleDateString() with invalid-date guard (TripCard.tsx)
  • Differentiate "no trips" vs "no search results" empty state (TripListScreen.tsx)
  • Add trips.noSearchResults translation key (en.json)
  • Fix timezone off-by-one: parse YYYY-MM-DD strings as local dates in TripCard.tsx and UpcomingTripsTile.tsx
  • Fix null-safety in trip search filter: use ?? '' for optional description/location.name before .includes() (TripListScreen.tsx)
  • Validate date components in parseLocalDate: reject dates that normalize (e.g. 2024-02-31 → March) by comparing constructed date fields back to original year/month/day (dateUtils.ts)
Original prompt

This section details on the original issue you should resolve

<issue_title>Implement Trips Feature (Behind Feature Flag)</issue_title>
<issue_description></issue_description>

Comments on the Issue (you are @copilot in this section)


💡 You can make Copilot smarter by setting up custom instructions, customizing its development environment and configuring Model Context Protocol (MCP) servers. Learn more Copilot coding agent tips in the docs.

Summary by CodeRabbit

  • New Features

    • Added search to filter trips by name, description, or location in the trip list.
    • Show date range with calendar icon on trip cards when a start or end date exists.
    • Added localized "No trips match your search." message.
    • Improved upcoming-trips detection and local date parsing/formatting for more accurate date displays.
  • Bug Fixes

    • Corrected modal title label when editing trips.

Copilot AI changed the title [WIP] Add trips feature behind feature flag Implement Trips feature (behind feature flag) Mar 9, 2026
@andrew-bierman
Copy link
Copy Markdown
Collaborator

@copilot

Copy link
Copy Markdown
Contributor Author

Copilot AI commented Mar 9, 2026

@copilot

It looks like your comment got cut off — could you share what you'd like me to look at or change? Happy to address any feedback!

@andrew-bierman
Copy link
Copy Markdown
Collaborator

@copilot

Copy link
Copy Markdown
Contributor Author

Copilot AI commented Mar 9, 2026

@copilot

It looks like your comment may have been submitted without any text. Could you share what you'd like me to look at or change?

@andrew-bierman
Copy link
Copy Markdown
Collaborator

@coderabbitai Please review this PR for code quality, best practices, and potential issues.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Mar 9, 2026

@andrew-bierman Sure! I'll perform a full review of this PR for code quality, best practices, and potential issues right away.

✅ Actions performed

Full review triggered.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Mar 9, 2026

Important

Review skipped

Bot user detected.

To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 4fb465f7-5bb3-428a-b44f-cccd3ac7075d

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds local search/filtering to TripListScreen, shows formatted trip date ranges in TripCard, tightens upcoming-trip date parsing with parseLocalDate, re-exports trips hooks/types, updates a modal translation key to trips.editTrip, and adds trips.noSearchResults i18n key.

Changes

Cohort / File(s) Summary
Layout / Translation
apps/expo/app/(app)/_layout.tsx
Changed trip edit modal translation key from packs.editPack to trips.editTrip.
Trip UI / Date Formatting
apps/expo/features/trips/components/TripCard.tsx, apps/expo/lib/utils/dateUtils.ts
Added parseLocalDate/formatLocalDate utilities and a conditional Dates block in TripCard showing calendar icon and formatted start/end dates.
Trip List / Search
apps/expo/features/trips/screens/TripListScreen.tsx
Added searchValue state and useMemo-based filteredTrips; wired header search input; FlatList now uses filteredTrips; empty-state shows no-results message when searching.
Upcoming Trips / Date Parsing
apps/expo/features/trips/components/UpcomingTripsTile.tsx
Now uses parseLocalDate(t.startDate) to filter upcoming trips (skips missing/invalid dates).
Feature Exports
apps/expo/features/trips/index.ts
Re-exported feature APIs: export * from './hooks', export * from './types'.
Types / i18n
apps/expo/features/trips/types.ts, apps/expo/lib/i18n/types.ts, apps/expo/lib/i18n/locales/en.json
Changed TripInStore alias to Trip; extended TranslationKeys with many trips.* literals; added trips.noSearchResults = "No trips match your search.".

Sequence Diagram

sequenceDiagram
    participant User
    participant TripListScreen
    participant useMemo
    participant FlatList
    participant TripCard

    User->>TripListScreen: type in search bar (onChangeText)
    TripListScreen->>TripListScreen: set searchValue
    TripListScreen->>useMemo: compute filteredTrips(trips, searchValue)
    useMemo-->>TripListScreen: return filteredTrips
    TripListScreen->>FlatList: update data = filteredTrips
    FlatList->>TripCard: render trip item
    TripCard->>TripCard: formatLocalDate(startDate / endDate)
    TripCard-->>User: display trip with formatted dates
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

🐰 I hop through lines with tiny cheer,
Dates aligned and searches near,
Trips display from start to end,
Parsers steady, types extend,
A joyful rabbit’s code-tap here! 🥕

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 40.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'Implement Trips feature (behind feature flag)' accurately reflects the main objective of the PR, which is to implement a new Trips feature behind a feature flag.
Linked Issues check ✅ Passed The PR addresses the linked issue #1729 to implement the Trips feature. Changes include trip search, filtering, date handling, type definitions, and localization—all core requirements for the feature.
Out of Scope Changes check ✅ Passed All changes are scoped to the Trips feature implementation: layout updates, trip card UI enhancements, search/filter logic, date utilities, type definitions, and localization strings.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch copilot/implement-trips-feature

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.

Copy link
Copy Markdown
Contributor

@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.

🧹 Nitpick comments (2)
apps/expo/features/trips/components/TripCard.tsx (1)

12-16: Consider locale-aware date formatting for better UX.

The current implementation extracts the raw YYYY-MM-DD date portion, which works but may not be ideal for all users. Consider using toLocaleDateString() for locale-aware formatting:

♻️ Optional: Locale-aware date formatting
 function formatTripDate(dateString?: string): string {
   if (!dateString) return '—';
-  const datePart = dateString.split('T')[0];
-  return datePart ?? '—';
+  try {
+    return new Date(dateString).toLocaleDateString();
+  } catch {
+    return '—';
+  }
 }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/expo/features/trips/components/TripCard.tsx` around lines 12 - 16, The
current formatTripDate function returns the raw YYYY-MM-DD chunk; update it to
parse the input into a Date and use Date.prototype.toLocaleDateString
(optionally with a locale or Intl.DateTimeFormat options) to produce a
locale-aware string, ensure you handle undefined/invalid inputs by returning
'—', and guard against timezone/parsing issues (e.g., use new Date(dateString)
and check isNaN(date.getTime()) before calling toLocaleDateString) so
formatTripDate always returns a safe, localized string.
apps/expo/features/trips/screens/TripListScreen.tsx (1)

53-66: Empty state may confuse users when search yields no results.

The ListEmptyComponent always shows "No trips yet" with a create button, but this same message appears when a search returns no matches. Consider differentiating between "no trips exist" vs "no search results":

♻️ Suggested differentiation for empty states
   const renderEmptyState = () => {
+    // Differentiate between no trips and no search results
+    if (searchValue.trim() && trips.length > 0) {
+      return (
+        <View className="flex-1 items-center justify-center p-8">
+          <Text className="text-muted-foreground">{t('trips.noSearchResults')}</Text>
+        </View>
+      );
+    }
     return (
       <View className="flex-1 items-center justify-center p-8">
         <View className="mb-4 rounded-full bg-muted p-4">

This requires adding a trips.noSearchResults translation key.

Also applies to: 91-91, 98-98

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/expo/features/trips/screens/TripListScreen.tsx` around lines 53 - 66,
The empty-state UI in renderEmptyState (used as ListEmptyComponent) always shows
the "no trips yet" message and create button, which is misleading when a search
yields zero matches; update renderEmptyState to accept a parameter or read the
current search/filter state (e.g., a prop or local state like searchQuery) and
conditionally render two variants: one for "no trips exist" using
t('trips.noTripsYet') and create button that calls handleCreateTrip, and another
for "no search results" that shows t('trips.noSearchResults') without suggesting
creation; add the new translation key trips.noSearchResults and ensure the
component locations referenced in the diff use the updated renderEmptyState
signature or conditional logic.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@apps/expo/features/trips/components/TripCard.tsx`:
- Around line 12-16: The current formatTripDate function returns the raw
YYYY-MM-DD chunk; update it to parse the input into a Date and use
Date.prototype.toLocaleDateString (optionally with a locale or
Intl.DateTimeFormat options) to produce a locale-aware string, ensure you handle
undefined/invalid inputs by returning '—', and guard against timezone/parsing
issues (e.g., use new Date(dateString) and check isNaN(date.getTime()) before
calling toLocaleDateString) so formatTripDate always returns a safe, localized
string.

In `@apps/expo/features/trips/screens/TripListScreen.tsx`:
- Around line 53-66: The empty-state UI in renderEmptyState (used as
ListEmptyComponent) always shows the "no trips yet" message and create button,
which is misleading when a search yields zero matches; update renderEmptyState
to accept a parameter or read the current search/filter state (e.g., a prop or
local state like searchQuery) and conditionally render two variants: one for "no
trips exist" using t('trips.noTripsYet') and create button that calls
handleCreateTrip, and another for "no search results" that shows
t('trips.noSearchResults') without suggesting creation; add the new translation
key trips.noSearchResults and ensure the component locations referenced in the
diff use the updated renderEmptyState signature or conditional logic.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 6dbab0a4-5422-4a3d-955f-237824e48805

📥 Commits

Reviewing files that changed from the base of the PR and between 3f94763 and e19976b.

📒 Files selected for processing (4)
  • apps/expo/app/(app)/_layout.tsx
  • apps/expo/features/trips/components/TripCard.tsx
  • apps/expo/features/trips/index.ts
  • apps/expo/features/trips/screens/TripListScreen.tsx

@andrew-bierman
Copy link
Copy Markdown
Collaborator

@copilot CodeRabbit has provided review feedback on this PR. Please address the comments and suggestions. Once you've made the necessary changes, I'll ask CodeRabbit to re-review.

Copy link
Copy Markdown
Contributor Author

Copilot AI commented Mar 9, 2026

@copilot CodeRabbit has provided review feedback on this PR. Please address the comments and suggestions. Once you've made the necessary changes, I'll ask CodeRabbit to re-review.

Addressed both CodeRabbit suggestions in commit 058daa6:

  1. formatTripDate now uses toLocaleDateString() with a Number.isNaN(date.getTime()) guard for invalid inputs, instead of the raw YYYY-MM-DD slice.
  2. Empty state differentiationrenderEmptyState now shows a simple "No trips match your search." message (without the create button) when there are trips but the search yields no results, and the original "no trips yet" create prompt only when no trips exist at all.
  3. Added trips.noSearchResults translation key to en.json.

@andrew-bierman
Copy link
Copy Markdown
Collaborator

@copilot CodeRabbit has reviewed this PR and provided feedback. Please address the review comments and push updates. Once you've made the changes, the monitor will ask CodeRabbit to re-review.

@andrew-bierman
Copy link
Copy Markdown
Collaborator

@copilot

@andrew-bierman
Copy link
Copy Markdown
Collaborator

@coderabbitai review

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Mar 9, 2026

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Copy link
Copy Markdown
Contributor

@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 the current code and only fix it if needed.

Inline comments:
In `@apps/expo/features/trips/components/TripCard.tsx`:
- Around line 12-17: formatTripDate currently uses new Date(dateString) which
treats 'YYYY-MM-DD' as UTC and causes off-by-one-day for users west of UTC;
update formatTripDate to detect pure date-only strings (e.g.
/^\d{4}-\d{2}-\d{2}$/) and construct a local Date via new Date(year, monthIndex,
day) (parsing year/month/day from the string) before calling
toLocaleDateString(); apply the same fix to the analogous function in
UpcomingTripsTile.tsx so both parse date-only values as local dates instead of
relying on Date's UTC parsing.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: e65851f0-98c4-433e-9f7f-e4b7e3b3892b

📥 Commits

Reviewing files that changed from the base of the PR and between e19976b and 058daa6.

📒 Files selected for processing (3)
  • apps/expo/features/trips/components/TripCard.tsx
  • apps/expo/features/trips/screens/TripListScreen.tsx
  • apps/expo/lib/i18n/locales/en.json
🚧 Files skipped from review as they are similar to previous changes (1)
  • apps/expo/features/trips/screens/TripListScreen.tsx

Comment on lines +12 to +17
function formatTripDate(dateString?: string): string {
if (!dateString) return '—';
const date = new Date(dateString);
if (Number.isNaN(date.getTime())) return '—';
return date.toLocaleDateString();
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "=== Trip type definitions under apps/expo/features/trips ==="
fd 'types\.ts$' apps/expo/features/trips -x sh -c 'echo "--- $1 ---"; sed -n "1,220p" "$1"' sh {}

echo
echo "=== startDate/endDate definitions and transformations ==="
rg -n -C3 '\b(startDate|endDate)\b' apps/expo/features/trips

Repository: PackRat-AI/PackRat

Length of output: 9006


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "=== Searching for formatDate function definition ==="
rg -n -B2 -A8 'function formatDate|const formatDate|export.*formatDate' apps/expo/features/trips

echo
echo "=== Checking date picker date value handling ==="
rg -n -B3 -A3 'setShowStartPicker|setShowEndPicker|onDateChange|getSelectedDate' apps/expo/features/trips/components/TripForm.tsx

echo
echo "=== Full TripForm.tsx date picker section ==="
sed -n '213,280p' apps/expo/features/trips/components/TripForm.tsx

echo
echo "=== Searching for date utilities/helpers ==="
fd -e ts -e tsx -name '*date*' -o -name '*time*' apps/expo/features/trips

Repository: PackRat-AI/PackRat

Length of output: 7228


Fix timezone handling for date-only strings in formatTripDate.

Line 14 parses YYYY-MM-DD date strings directly with new Date(), which treats them as UTC midnight. For users west of UTC, toLocaleDateString() on line 16 will then display the previous day. The form stores dates as YYYY-MM-DD (confirmed in TripForm.tsx lines 235, 270), so this timezone shift is a real issue.

Replace with local-date parsing:

Corrected formatTripDate implementation
 function formatTripDate(dateString?: string): string {
   if (!dateString) return '—';
-  const date = new Date(dateString);
+  const dateOnlyMatch = /^(\d{4})-(\d{2})-(\d{2})$/.exec(dateString);
+  const date = dateOnlyMatch
+    ? new Date(
+        Number(dateOnlyMatch[1]),
+        Number(dateOnlyMatch[2]) - 1,
+        Number(dateOnlyMatch[3]),
+      )
+    : new Date(dateString);
   if (Number.isNaN(date.getTime())) return '—';
   return date.toLocaleDateString();
 }

Note: UpcomingTripsTile.tsx line 21 has the same pattern and should be updated as well.

📝 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.

Suggested change
function formatTripDate(dateString?: string): string {
if (!dateString) return '—';
const date = new Date(dateString);
if (Number.isNaN(date.getTime())) return '—';
return date.toLocaleDateString();
}
function formatTripDate(dateString?: string): string {
if (!dateString) return '—';
const dateOnlyMatch = /^(\d{4})-(\d{2})-(\d{2})$/.exec(dateString);
const date = dateOnlyMatch
? new Date(
Number(dateOnlyMatch[1]),
Number(dateOnlyMatch[2]) - 1,
Number(dateOnlyMatch[3]),
)
: new Date(dateString);
if (Number.isNaN(date.getTime())) return '—';
return date.toLocaleDateString();
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/expo/features/trips/components/TripCard.tsx` around lines 12 - 17,
formatTripDate currently uses new Date(dateString) which treats 'YYYY-MM-DD' as
UTC and causes off-by-one-day for users west of UTC; update formatTripDate to
detect pure date-only strings (e.g. /^\d{4}-\d{2}-\d{2}$/) and construct a local
Date via new Date(year, monthIndex, day) (parsing year/month/day from the
string) before calling toLocaleDateString(); apply the same fix to the analogous
function in UpcomingTripsTile.tsx so both parse date-only values as local dates
instead of relying on Date's UTC parsing.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Mar 10, 2026

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@andrew-bierman
Copy link
Copy Markdown
Collaborator

@copilot

@andrew-bierman andrew-bierman changed the base branch from main to development March 12, 2026 05:23
Copilot AI and others added 9 commits April 10, 2026 22:37
…display, and search filtering

Co-authored-by: andrew-bierman <94939237+andrew-bierman@users.noreply.github.com>
…ated empty states

Co-authored-by: andrew-bierman <94939237+andrew-bierman@users.noreply.github.com>
… bug

Co-authored-by: andrew-bierman <94939237+andrew-bierman@users.noreply.github.com>
…ition

- Extract duplicated local-date parsing logic from TripCard.tsx and
  UpcomingTripsTile.tsx into a shared dateUtils.ts utility (parseLocalDate
  and formatLocalDate), addressing CodeRabbit review feedback
- Fix TripInStore type that was using Omit<Trip, 'trips'> where Trip has
  no 'trips' property, making the Omit a no-op
…ocalDate

Co-authored-by: andrew-bierman <94939237+andrew-bierman@users.noreply.github.com>
- TripCard: Handle optional startDate/endDate with proper null checks,
  only show arrow separator when both dates exist
- UpcomingTripsTile: Compare against start-of-today instead of current
  time so same-day trips are included in upcoming filter
- TripListScreen: Trim search query before lowercasing to avoid missed
  matches from trailing whitespace
The trips feature should ship disabled by default until it's
ready for release. Consumers can opt-in by toggling this flag.
@andrew-bierman andrew-bierman force-pushed the copilot/implement-trips-feature branch from dc409f3 to 9861f13 Compare April 11, 2026 04:40
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 11, 2026

Coverage Report for Expo Unit Tests Coverage (./apps/expo)

Status Category Percentage Covered / Total
🔵 Lines 75.92% 495 / 652
🔵 Statements 75.92% (🎯 75%) 495 / 652
🔵 Functions 92.72% 51 / 55
🔵 Branches 91.82% 191 / 208
File Coverage
File Stmts Branches Functions Lines Uncovered Lines
Changed Files
apps/expo/lib/utils/dateUtils.ts 0% 100% 100% 0% 7-32
Generated in workflow #42 for commit 98aa5ca by the Vitest Coverage Report Action

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 11, 2026

Coverage Report for API Unit Tests Coverage (./packages/api)

Status Category Percentage Covered / Total
🔵 Lines 96.57% 902 / 934
🔵 Statements 96.57% (🎯 80%) 902 / 934
🔵 Functions 100% 48 / 48
🔵 Branches 90.03% 280 / 311
File CoverageNo changed files found.
Generated in workflow #42 for commit 98aa5ca by the Vitest Coverage Report Action

@cloudflare-workers-and-pages
Copy link
Copy Markdown
Contributor

Deploying packrat-landing with  Cloudflare Pages  Cloudflare Pages

Latest commit: 98aa5ca
Status:⚡️  Build in progress...

View logs

@andrew-bierman andrew-bierman merged commit f6caca5 into development Apr 11, 2026
7 of 10 checks passed
@andrew-bierman andrew-bierman deleted the copilot/implement-trips-feature branch April 11, 2026 04:45
andrew-bierman added a commit that referenced this pull request Apr 11, 2026
#1912 added featureFlags.enableTrips and wired the tab trigger and home
tiles to hide when the flag is off, but the underlying route files still
rendered their screens. That meant deep links such as packrat://trip/new
or packrat://trip/:id rendered trip UI even with the kill switch off.

Adds a Redirect fallback to each app-router entry point:
- app/(app)/trip/[id]/index.tsx
- app/(app)/trip/new.tsx
- app/(app)/upcoming-trips.tsx
- app/(app)/(tabs)/trips/index.tsx

Feature components under features/trips/* are intentionally left alone —
the gating happens at the route level.
andrew-bierman added a commit that referenced this pull request Apr 11, 2026
@coderabbitai coderabbitai Bot mentioned this pull request Apr 20, 2026
andrew-bierman added a commit that referenced this pull request May 14, 2026
Implement Trips feature (behind feature flag)
andrew-bierman added a commit that referenced this pull request May 14, 2026
#1912 added featureFlags.enableTrips and wired the tab trigger and home
tiles to hide when the flag is off, but the underlying route files still
rendered their screens. That meant deep links such as packrat://trip/new
or packrat://trip/:id rendered trip UI even with the kill switch off.

Adds a Redirect fallback to each app-router entry point:
- app/(app)/trip/[id]/index.tsx
- app/(app)/trip/new.tsx
- app/(app)/upcoming-trips.tsx
- app/(app)/(tabs)/trips/index.tsx

Feature components under features/trips/* are intentionally left alone —
the gating happens at the route level.
andrew-bierman added a commit that referenced this pull request May 14, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Implement Trips Feature (Behind Feature Flag)

3 participants