3.4 KiB
3.4 KiB
Start Route Fix - ChooseServiceScreen for Authenticated Users
Issue
User requested that authenticated users should be directed to ChooseServiceScreen instead of BuyScreen when they open the app.
Changes Made
1. Updated MAIN Graph Start Destination
File: MainNavGraph.kt
Before:
navigation(
route = Graph.MAIN,
startDestination = AppScreen.BUY_ANIMALS
)
After:
navigation(
route = Graph.MAIN,
startDestination = AppScreen.chooseService("1") // ChooseServiceScreen with default profileId
)
2. Navigation Flow
Authenticated User Flow:
- App starts →
MainViewModel.init()checks tokens - If tokens exist →
authState = Authenticated AppNavigationreadsauthStatestartDestination=Graph.MAIN(which starts atChooseServiceScreen)- User sees
ChooseServiceScreen✅
Unauthenticated User Flow:
- App starts →
MainViewModel.init()checks tokens - No tokens →
authState = Unauthenticated AppNavigationreadsauthStatestartDestination=Graph.AUTH(which starts atLandingScreen)- User sees
LandingScreen✅
Route Structure
MAIN Graph Routes:
- Start Destination:
choose_service/1(ChooseServiceScreen) - Other Routes:
buy_animals(BuyScreen)create_profile/{name}(CreateProfileScreen)- etc.
AUTH Graph Routes:
- Start Destination:
landing(LandingScreen) - Other Routes:
sign_in(SignInScreen)sign_up(SignUpScreen)otp/{phoneNumber}/{name}(OTPScreen)- etc.
JWT Verification Logic
Backend (Node.js)
- ✅ Access tokens include
token_versionin payload - ✅ Middleware validates token signature, expiry, and version
- ✅ Refresh tokens rotate on each use
- ✅ Token reuse detection active
- ✅ Device binding enforced
Frontend (Android)
- ✅ Tokens stored in EncryptedSharedPreferences
- ✅ Auto-refresh on 401 responses (Ktor Auth plugin)
- ✅ Synchronous token save (commit)
- ✅ Network errors don't clear tokens
- ✅ Fast initial auth check (synchronous token check)
User Experience
✅ Logged In User
- App opens → ChooseServiceScreen (no landing screen flash)
- Can select service type
- Navigate to BuyScreen after selection
✅ First Time User
- App opens → LandingScreen
- Can sign up or sign in
- After login → Navigate to ChooseServiceScreen
✅ Offline User (with valid tokens)
- App opens → ChooseServiceScreen
- Network error shown but user stays logged in
- When online → Works normally
Testing
-
Test Authenticated User:
- Sign in to app
- Close app completely
- Reopen app
- Should open directly to ChooseServiceScreen ✅
-
Test Unauthenticated User:
- Clear app data or sign out
- Open app
- Should open to LandingScreen ✅
-
Test JWT Verification:
- Valid tokens → ChooseServiceScreen
- Expired tokens → LandingScreen
- Invalid tokens → LandingScreen
Summary
✅ Start route correctly set:
- Authenticated users →
ChooseServiceScreen(route:choose_service/1) - Unauthenticated users →
LandingScreen(route:landing)
✅ JWT and refresh token logic verified:
- Token validation working correctly
- Auto-refresh working
- Token versioning working
- Security best practices followed
The routing now correctly directs users based on their authentication status.