1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package com.vauth.foxyvpn.ui.navigation
import androidx.compose.runtime.Composable
import androidx.compose.ui.platform.LocalLayoutDirection
import androidx.compose.ui.unit.LayoutDirection
import androidx.navigation.NavHostController
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import com.vauth.foxyvpn.FoxyVpnApp
import com.vauth.foxyvpn.ui.screens.AccountScreen
import com.vauth.foxyvpn.ui.screens.HomeScreen
import com.vauth.foxyvpn.ui.screens.LoginScreen
import com.vauth.foxyvpn.ui.screens.LogsScreen
import com.vauth.foxyvpn.ui.screens.ServerListScreen
import com.vauth.foxyvpn.ui.screens.SettingsScreen
import com.vauth.foxyvpn.ui.screens.SplashScreen
import com.vauth.foxyvpn.ui.screens.transitionTransform
import com.vauth.foxyvpn.ui.theme.AppearanceController
object FoxyRoutes {
const val SPLASH = "splash"
const val LOGIN = "login"
const val HOME = "home"
const val SERVERS = "servers"
const val SETTINGS = "settings"
const val ACCOUNT = "account"
const val LOGS = "logs"
}
@Composable
fun FoxyNavGraph(
navController: NavHostController = rememberNavController(),
app: FoxyVpnApp,
appearance: AppearanceController,
onRequestConnect: () -> Unit,
onDisconnect: () -> Unit,
) {
val rtl = LocalLayoutDirection.current == LayoutDirection.Rtl
val forward = transitionTransform(
appearance.screenTransition, appearance.reduceMotion, forward = true, rtl = rtl,
)
val backward = transitionTransform(
appearance.screenTransition, appearance.reduceMotion, forward = false, rtl = rtl,
)
NavHost(
navController = navController,
startDestination = FoxyRoutes.SPLASH,
enterTransition = { forward.targetContentEnter },
exitTransition = { forward.initialContentExit },
popEnterTransition = { backward.targetContentEnter },
popExitTransition = { backward.initialContentExit },
) {
composable(FoxyRoutes.SPLASH) {
SplashScreen(
authRepository = app.authRepository,
onSignedIn = {
navController.navigate(FoxyRoutes.HOME) { popUpTo(FoxyRoutes.SPLASH) { inclusive = true } }
},
onNeedsLogin = {
navController.navigate(FoxyRoutes.LOGIN) { popUpTo(FoxyRoutes.SPLASH) { inclusive = true } }
},
)
}
composable(FoxyRoutes.LOGIN) {
LoginScreen(
authRepository = app.authRepository,
onSignedIn = {
navController.navigate(FoxyRoutes.HOME) { popUpTo(FoxyRoutes.LOGIN) { inclusive = true } }
},
)
}
composable(FoxyRoutes.HOME) {
HomeScreen(
app = app,
appearance = appearance,
onRequestConnect = onRequestConnect,
onDisconnect = onDisconnect,
onOpenServers = { navController.navigate(FoxyRoutes.SERVERS) },
onOpenSettings = { navController.navigate(FoxyRoutes.SETTINGS) },
onOpenAccounts = { navController.navigate(FoxyRoutes.ACCOUNT) },
)
}
composable(FoxyRoutes.SERVERS) {
ServerListScreen(
serverListClient = app.serverListClient,
proxyStateStore = app.proxyStateStore,
settingsStore = app.settingsStore,
appearance = appearance,
onServerSelected = {
if (appearance.homeAfterSelect) {
navController.navigate(FoxyRoutes.HOME) {
popUpTo(FoxyRoutes.HOME) { inclusive = true }
}
} else {
navController.popBackStack()
}
},
onBack = { navController.popBackStack() },
)
}
composable(FoxyRoutes.SETTINGS) {
SettingsScreen(
settingsStore = app.settingsStore,
appearance = appearance,
onOpenLogs = { navController.navigate(FoxyRoutes.LOGS) },
onOpenAccount = { navController.navigate(FoxyRoutes.ACCOUNT) },
onSignOut = {
onDisconnect()
app.tokenStore.clear()
navController.navigate(FoxyRoutes.LOGIN) { popUpTo(0) { inclusive = true } }
},
onBack = { navController.popBackStack() },
)
}
composable(FoxyRoutes.ACCOUNT) {
AccountScreen(
authRepository = app.authRepository,
tokenStore = app.tokenStore,
appearance = appearance,
onBack = { navController.popBackStack() },
)
}
composable(FoxyRoutes.LOGS) {
LogsScreen(onBack = { navController.popBackStack() })
}
}
}