11 KiB
11 KiB
PASSENGER_JOURNEY.md — Complete Passenger Lifecycle
Stage 1: App Launch
Screen
- Route:
/→ SplashScreen - File:
siro_rider/lib/splash_screen_page.dart - Controller:
SplashScreenController(insiro_rider/lib/controller/home/splash_screen_controlle.dart)
State Flow
- Type: GetX Controller (Custom Animation)
- Events:
controller.init()→ animations play →controller.checkInitialStatus() - States: Splash animation → Progress bar → Navigate based on auth status
Variables
| Variable | Storage | Key |
|---|---|---|
| jwt | GetStorage | box.read(BoxName.jwt) |
| passengerID | GetStorage | box.read(BoxName.passengerID) |
| driverID | GetStorage | box.read(BoxName.driverID) |
| language | GetStorage | box.read(BoxName.lang) |
| themeMode | GetStorage | theme preference |
| packageInfo | GetStorage | BoxName.packagInfo |
APIs
| Endpoint | Method | Input | Output |
|---|---|---|---|
$server/auth/packageInfo.php |
POST | platform, appName | version info |
Database Tables
packageInfo— app version tracking
Stage 2: Authentication Check
State Flow: SplashScreenController
- Check
box.read(BoxName.jwt)existence - If JWT exists → check ride status (
_checkInitialRideStatus()) → navigate to MapScreen or Login - If no JWT → navigate to Onboarding/Login
Navigation Decision
SplashScreen
→ JWT exists?
→ Yes → MapPagePassenger
→ No → OnboardingPage (first time) or LoginPage
Screens
| Screen | Route | File |
|---|---|---|
| Onboarding | /onboarding |
siro_rider/lib/onbording_page.dart |
| Login | /login |
siro_rider/lib/views/auth/login_page.dart |
| Register | /register |
siro_rider/lib/views/auth/register_page.dart |
| OTP | /otp |
siro_rider/lib/views/auth/otp_page.dart |
APIs
| Endpoint | Method | Input | Output |
|---|---|---|---|
$server/auth/login.php |
POST | phone, password, fingerprint | JWT, passenger data |
$server/auth/signup.php |
POST | phone, email, password, name, ... | user created |
$server/auth/loginFromGooglePassenger.php |
POST | google token | JWT, passenger data |
$server/auth/checkPhoneNumberISVerfiedPassenger.php |
POST | phone | verification status |
$auth/otpmessage.php |
POST | phone | OTP sent |
$auth/verifyOtpMessage.php |
POST | phone, otp | verified status |
Models
- UserModel →
passengerstable - TokenModel →
tokenstable
Stage 3: Map Screen — Ride Request
Screen
- File:
siro_rider/lib/views/home/map_page_passenger.dart - Controllers (all permanent in AppBindings):
MapEngineController— map renderingMapSocketController— WebSocket managementLocationSearchController— place searchNearbyDriversController— nearby driver listRideLifecycleController— ride state machineUiInteractionsController— UI bottom sheets
State Flow: RideLifecycleController
- RideState enum:
noRide → searching → driverApplied → driverArrived → inProgress → finished → preCheckReview → cancelled
Search Flow
- Passenger enters destination →
LocationSearchController.searchPlaces() - Price estimate fetched via fare calculation
- Passenger selects car type → confirms ride
- Ride request sent → status =
waiting→ transitions tosearching
APIs (Ride Request)
| Endpoint | Method | Input | Output |
|---|---|---|---|
$rideServerSide/ride/rides/add.php |
POST | passenger_id, start_lat, start_lng, end_lat, end_lng, carType, price, ... | ride_id |
$rideServerSide/cancelRide/add.php |
POST | ride_id, passenger_id, note | cancellation |
$server/ride/promo/getPromoBytody.php |
POST | passenger_id | promo code |
Database Tables
waitingRides— active ride requestsride— completed ridespromos— promo codes
GIS Operations
- Reverse Geocoding: Map SaaS (
/api/geocoding/reverse) - Search Geocoding: Map SaaS (
/api/geocoding/search) - Routing: Map SaaS (
/api/maps/route) or OSRM (routesy.intaleq.xyz) - ETA Calculation: Local algorithm in
RideLifecycleController.updateRemainingRoute() - Map Rendering:
IntaleqMaps(custom Flutter map plugin)
Stage 4: Searching for Driver
Screen
- Widget:
searching_captain_window.dart - Timer:
timer_for_cancell_trip_from_passenger.dart
State Flow
RideState.searching- Polling loop checks
_totalSearchTimeoutSeconds - On timeout →
_showIncreaseFeeDialog()
Real-time Operations
| Channel | Event | Direction |
|---|---|---|
| WebSocket | driver_location_update |
Server → Passenger |
| WebSocket | ride_accepted |
Server → Passenger |
| Polling | getRideStatus |
Passenger → Server (fallback) |
Notifications
- Local: Timer tick notifications
- Push: When driver accepts via FCM
Failure Scenarios
| Scenario | Handling |
|---|---|
| No drivers found | Show increase fee dialog |
| Network failure | Fallback to polling, show error snackbar |
| Timeout | Auto-cancel, prompt retry |
Stage 5: Driver Accepted
Screen
- Widget:
driver_card_from_passenger.dart,driver_time_arrive_passenger.dart - Function:
processRideAcceptance()
State Flow
RideState.driverApplied- Events:
processRideAcceptance(driverData) - Transitions:
applied → arrived(when driver reaches pickup)
Variables Stored
| Variable | Description |
|---|---|
dInfo |
Driver info (name, car, rating, phone) |
currentRideId |
Active ride ID |
rideData |
Full ride details (price, locations, timestamps) |
datadriverCarsLocationToPassengerAfterApplied |
Driver GPS route |
APIs
| Endpoint | Method | Input | Output |
|---|---|---|---|
$rideServerSide/ride/rides/getRideStatus.php |
POST | ride_id | current status |
$location/getDriverCarsLocationToPassengerAfterApplied.php |
POST | driver_id | GPS location |
GIS Operations
- Route Drawing: Yellow polyline from driver → passenger
- Driver Marker: Real-time car icon following WebSocket updates
- Deviation Detection:
checkAndRecalculateIfDeviated()with 50m threshold
Real-time Operations
- WebSocket Connect: Join ride room
- Subscribe:
driver_location_updateevents - Driver Tracking:
handleDriverLocationUpdate()→ stop polling after 3 reliable updates
Notifications
- Push: FCM when driver accepts
- In-App:
RideLiveNotification.showDriverOnWay() - iOS Live Activity:
IosLiveActivityService.startRideActivity()
Stage 6: Driver Arrived
Screen
- Widget:
driver_time_arrive_passenger.dart,ride_begin_passenger.dart - Function:
processDriverArrival()
State Flow
RideState.driverArrived- Events:
processDriverArrival("polling")or via socket - Timer: 5-minute waiting timer starts
- Pre-drawing: Blue route from pickup → destination pre-calculated
Notifications
- In-App Dialog:
uiInteractions.driverArrivePassengerDialoge() - Push: Driver arrived notification
Stage 7: Ride In Progress
Screen
- Widget:
ride_begin_passenger.dart,passengerRideLoctionWidget.dart
State Flow
RideState.inProgress- Events:
processRideBegin() - Timer:
rideIsBeginPassengerTimer()— live ride counter
GIS Operations
- Blue Route: Final path from driver → destination
- Live ETA: Updated via
updateRemainingRoute()(local calculation) - Camera Tracking: Follows driver, zoom adjusts by speed
- Deviation Guard: Continuous deviation checking, re-route if >50m off path
Real-time Operations
- WebSocket: Continuous
driver_location_updatestreaming - Polling Fallback: If socket disconnected, poll
getRideStatus
iOS Live Activity
IosLiveActivityService— Dynamic Island / Lock Screen widgetRideWidgetin ios/RideWidget — SwiftUI widget
Stage 8: Ride Finished — Payment & Rating
Screen
- Rating:
siro_rider/lib/views/Rate/rate_captain.dart,rating_driver_bottom.dart - Payment:
payment_method.page.dart,cash_confirm_bottom_page.dart
State Flow
RideState.finished→processRideFinished()- Disposes ride socket, stops all timers
- Navigates to RateDriverFromPassenger with driver_id, ride_id, bill
APIs
| Endpoint | Method | Input | Output |
|---|---|---|---|
$server/ride/rate/addRateToDriver.php |
POST | passenger_id, driver_id, ride_id, rating, comment | success |
$paymentServer/ride/payment/add.php |
POST | amount, payment_method, passengerID, rideId, driverID | payment record |
$paymentServer/ride/passengerWallet/addPaymentTokenPassenger.php |
POST | passengerId, amount, token | wallet deduction |
$wallet/getAllPassengerTransaction.php |
POST | passenger_id | transaction history |
$server/ride/tips/add.php |
POST | driverID, passengerID, rideID, tipAmount | tip saved |
Payment Methods Flow
- Cash: Show confirmation dialog, driver marks received
- Wallet: Deduct from
passengerWalletbalance - Visa (PayMob):
payWithPayMobCardPassenger→paymetVerifyPassenger - MTN:
payWithMTNStart→payWithMTNConfirm - Syriatel:
payWithSyriatelStart→payWithSyriatelConfirm
Database Tables
payments— ride payment recordsratingDriver— driver ratingsratingPassenger— passenger ratingstips— tips givenpassengerWallet— wallet balance
Notifications
- Push: Receipt notification
- In-App: Rating prompt
Stage 9: Post-Ride
Screen
- Profile:
passenger_profile_page.dart - Wallet:
passenger_wallet.dart - History:
order_history.dart - Promos:
promos_passenger_page.dart
APIs
| Endpoint | Method | Input | Output |
|---|---|---|---|
$wallet/getWalletByPassenger.php |
GET | passenger_id | wallet balance |
$profile/get.php |
POST | passenger_id | profile data |
$rideServerSide/ride/rides/get.php |
POST | passenger_id | ride history |
$promo/get.php |
POST | passenger_id | available promos |
$server/ride/invitor/get_passenger_referrals.php |
POST | passenger_id | referral data |
Navigation Route Map
SplashScreen (/)
→ [JWT exists?]
→ Yes → MapPagePassenger (/home/map_page_passenger)
→ No → OnboardingPage → LoginPage → OTPPage → MapPagePassenger
MapPagePassenger
→ [Ride states trigger widgets]
→ [Menu] → Profile (/profile), Wallet (/wallet), Settings, Promos
→ [Rating] → RateCaptain page
→ [Contact] → ContactUsPage (/contactSupport)
→ [Share] → ShareAppPage (/shareApp)