Skip to main content

Demo App User Flows

The demo app maps UI actions to SDK calls. Use it as a reference when building your own dApp.

For the full interaction between passenger and driver (including Hub API and node), see the passenger–driver flow diagram.

Role selection

UIBehavior
Role entry screenChoose passenger or driver — separate wallet scopes
Generate walletLocal key generation (wallet.js)
Import walletPaste existing public/private key pair

Keys are stored per role: clutch_passenger_*, clutch_driver_* in localStorage.

Passenger flows

UI actionSDK calls
Request CLTrequestFaucet(publicKey)
Pick pickup/dropoff on map
Submit ride requestcreateUnsignedRideRequestsignTransactionsubmitTransaction
View open offerssubscribeRideOffers(requestTxHash) or listRideOffers
Accept driver offercreateUnsignedRideAcceptance → sign → submit
Pay farecreateUnsignedRidePay → sign → submit (partial OK)
Cancel pending requestcreateUnsignedRideRequestCancel → sign → submit
Cancel active tripcreateUnsignedRideCancel → sign → submit
View balancegetAccountBalance / subscribeAccountBalance
Transaction historylocalStorage per address

Components: PassengerView.jsx, RideForm.jsx, ActiveTripCard.jsx, BalanceDisplay.jsx.

Driver flows

UI actionSDK calls
Request CLTrequestFaucet(publicKey)
View ride requestssubscribeRideRequests or listRideRequests
Submit offercreateUnsignedRideOffer → sign → submit
View active tripssubscribeActiveTrips({ driverAddress })
Cancel active tripcreateUnsignedRideCancel → sign → submit
View balancegetAccountBalance / subscribeAccountBalance

Components: DriverView.jsx, ActiveTripCard.jsx.

Real-time updates

sdkRealtime.js wraps SDK subscriptions with HTTP polling fallback:

  1. Try WebSocket subscription via subscribe*
  2. On failure, fall back to periodic list* queries

Network info

GeneralView.jsx displays configured endpoints:

  • Hub API URL (auto-detected from hostname)
  • Public node WebSocket URLs (VITE_PUBLIC_NODE_ENDPOINTS)
  • Links to GitHub repos and stage nodes

Private key prompt

Sensitive actions trigger usePrivateKeyRequest modal — user enters private key per action if not stored locally.

ExplorerTabs links to the block explorer for transaction lookup (external URL based on deployment).