From f044a9a511bb10d783523b8618e095072109d52d Mon Sep 17 00:00:00 2001 From: Hank Date: Mon, 6 Jul 2026 11:39:19 -0700 Subject: [PATCH] Wire up start-session flow (variable-rate aware) + fix About dark mode - New StartSession screen off MeterDetail: pick vehicle -> duration (from the live multi-estimate ladder, exact cost per option) -> card; detects a free prefix and shows "Free until X, then charged"; explicit Pay $X confirmation before charging via postStartParkingSession; schedules the local expiry reminder on success - About screen themed (was black-on-dark in dark mode) Co-Authored-By: Claude Fable 5 --- app/src/navigation/RootNavigator.tsx | 7 + app/src/screens/AboutScreen.tsx | 10 +- app/src/screens/MeterDetailScreen.tsx | 13 +- app/src/screens/StartSessionScreen.tsx | 321 +++++++++++++++++++++++++ 4 files changed, 340 insertions(+), 11 deletions(-) create mode 100644 app/src/screens/StartSessionScreen.tsx diff --git a/app/src/navigation/RootNavigator.tsx b/app/src/navigation/RootNavigator.tsx index 7bce428..bc9356c 100644 --- a/app/src/navigation/RootNavigator.tsx +++ b/app/src/navigation/RootNavigator.tsx @@ -20,12 +20,14 @@ import { ProfileScreen } from '@/screens/ProfileScreen'; import { VehiclesScreen } from '@/screens/VehiclesScreen'; import { PaymentMethodsScreen } from '@/screens/PaymentMethodsScreen'; import { NotificationsScreen } from '@/screens/NotificationsScreen'; +import { StartSessionScreen } from '@/screens/StartSessionScreen'; import { useTheme } from '@/theme/ThemeContext'; import type { Zone } from 'parksmarter-client'; export type RootStackParamList = { Tabs: undefined; MeterDetail: { zone: Zone }; + StartSession: { zone: Zone }; About: undefined; Profile: undefined; Vehicles: undefined; @@ -111,6 +113,11 @@ export function RootNavigator() { component={MeterDetailScreen} options={{ title: 'Meter' }} /> + diff --git a/app/src/screens/AboutScreen.tsx b/app/src/screens/AboutScreen.tsx index f133e87..6bfc85f 100644 --- a/app/src/screens/AboutScreen.tsx +++ b/app/src/screens/AboutScreen.tsx @@ -10,10 +10,12 @@ import { View, } from 'react-native'; import { ps } from '@/api/client'; +import { useTheme } from '@/theme/ThemeContext'; const TAPS_TO_UNLOCK = 7; export function AboutScreen() { + const { colors } = useTheme(); const [about, setAbout] = useState(null); const [showJoel, setShowJoel] = useState(false); const taps = useRef(0); @@ -37,14 +39,14 @@ export function AboutScreen() { }; return ( - + - About BigBrainParking + About BigBrainParking - {about ?? 'Loading…'} + {about ?? 'Loading…'} - + Unofficial, de-Googled client for ParkSmarter. Not affiliated with IPS Group. diff --git a/app/src/screens/MeterDetailScreen.tsx b/app/src/screens/MeterDetailScreen.tsx index 2aeb02a..4fb3199 100644 --- a/app/src/screens/MeterDetailScreen.tsx +++ b/app/src/screens/MeterDetailScreen.tsx @@ -1,7 +1,8 @@ import React, { useState } from 'react'; import { Alert, ScrollView, StyleSheet, Text, TouchableOpacity, View } from 'react-native'; import type { RouteProp } from '@react-navigation/native'; -import { useRoute } from '@react-navigation/native'; +import { useNavigation, useRoute } from '@react-navigation/native'; +import type { NativeStackNavigationProp } from '@react-navigation/native-stack'; import type { RootStackParamList } from '@/navigation/RootNavigator'; import { saveKiosk, toSavedKiosk } from '@/features/favorites/favoritesStore'; import { useTheme } from '@/theme/ThemeContext'; @@ -39,8 +40,11 @@ function policyMeta(p: SpacePolicy): { title: string; rate?: string; color?: str return { title, rate, color }; } +type Nav = NativeStackNavigationProp; + export function MeterDetailScreen() { const { colors } = useTheme(); + const navigation = useNavigation