Refactor navigation and UI components to use NavHostControllerWrapper

Update login and account screens to utilize `NavHostControllerWrapper` instead of passing raw `NavController` instances. This change improves consistency across the navigation flow and ensures that UI actions, such as navigation and account setup, use the appropriate coroutine scopes and dispatchers.

Changes:
- LoginScreen: Replace `NavController` and `CoroutineScope` parameters with `NavHostControllerWrapper`; update navigation calls to use `Amber.instance.applicationIOScope` with `Dispatchers.Main` for thread safety.
- AccountScreen: Update `AccountState.LoggedOff` to wrap the local `NavController` in `NavHostControllerWrapper`; remove unused `mainViewModel` parameter.
- MainScreen: Update `MainPage`, `SignUpPage`, and `LoginPage` compositions to pass the wrapped controller.
- MainActivity & SignerActivity: Remove unused `mainViewModel` argument when calling `AccountScreen`.
This commit is contained in:
greenart7c3
2026-04-13 08:12:11 -03:00
parent b57c1524e7
commit 61e1e00d2c
5 changed files with 23 additions and 36 deletions
@@ -149,7 +149,6 @@ class MainActivity : AppCompatActivity() {
intent = IntentWrapper(intent),
packageName = packageName,
appName = appName,
mainViewModel = mainViewModel,
bunkerRequests = bunkerRequests.value,
navController = NavHostControllerWrapper(navController),
)
@@ -165,7 +165,6 @@ class SignerActivity : AppCompatActivity() {
intent = IntentWrapper(intent),
packageName = packageName,
appName = appName,
mainViewModel = mainViewModel,
bunkerRequests = bunkerRequests.value,
navController = NavHostControllerWrapper(navController),
isExternalRequest = true,
@@ -33,7 +33,6 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.navigation.compose.rememberNavController
import com.greenart7c3.nostrsigner.Amber
import com.greenart7c3.nostrsigner.MainViewModel
import com.greenart7c3.nostrsigner.R
import com.greenart7c3.nostrsigner.models.AmberBunkerRequest
import com.greenart7c3.nostrsigner.models.IntentResultType
@@ -49,7 +48,6 @@ fun AccountScreen(
intent: IntentWrapper,
packageName: String?,
appName: String?,
mainViewModel: MainViewModel,
bunkerRequests: ImmutableList<AmberBunkerRequest>,
navController: NavHostControllerWrapper,
isExternalRequest: Boolean = false,
@@ -68,7 +66,7 @@ fun AccountScreen(
when (state) {
is AccountState.LoggedOff -> {
val newNavController = rememberNavController()
MainLoginPage(accountStateViewModel, newNavController)
MainLoginPage(accountStateViewModel, NavHostControllerWrapper(newNavController))
}
is AccountState.LoggedIn -> {
val intents by IntentUtils.intents.collectAsState(initial = persistentListOf())
@@ -100,8 +100,6 @@ import androidx.compose.ui.text.withStyle
import androidx.compose.ui.unit.Density
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.navigation.NavController
import androidx.navigation.NavHostController
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import com.greenart7c3.nostrsigner.Amber
@@ -121,7 +119,6 @@ import com.vitorpamplona.quartz.nip06KeyDerivation.Bip39Mnemonics
import com.vitorpamplona.quartz.nip06KeyDerivation.Nip06
import com.vitorpamplona.quartz.nip19Bech32.toNpub
import com.vitorpamplona.quartz.utils.RandomInstance
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
@@ -130,8 +127,7 @@ import kotlinx.coroutines.launch
@SuppressLint("ConfigurationScreenWidthHeight")
@Composable
fun MainPage(
scope: CoroutineScope,
navController: NavController,
navHostControllerWrapper: NavHostControllerWrapper,
accountViewModel: AccountStateViewModel,
) {
var isLoading by remember { mutableStateOf(false) }
@@ -160,7 +156,7 @@ fun MainPage(
Amber.instance.applicationIOScope.launch {
if (hasAccounts) {
Amber.instance.applicationIOScope.launch(Dispatchers.Main) {
navController.navigate(Route.Applications.route) {
navHostControllerWrapper.navController.navigate(Route.Applications.route) {
popUpTo(0)
}
}
@@ -294,8 +290,8 @@ fun MainPage(
contentColor = Color(0xFF4C4C4C),
textColor = MaterialTheme.colorScheme.primary,
onClick = {
scope.launch {
navController.navigate("loginPage")
Amber.instance.applicationIOScope.launch(Dispatchers.Main) {
navHostControllerWrapper.navController.navigate("loginPage")
}
},
text = stringResource(R.string.add_a_key),
@@ -303,8 +299,8 @@ fun MainPage(
AmberButton(
onClick = {
scope.launch {
navController.navigate("create")
Amber.instance.applicationIOScope.launch(Dispatchers.Main) {
navHostControllerWrapper.navController.navigate("create")
}
},
text = stringResource(R.string.generate_a_new_key),
@@ -358,20 +354,17 @@ fun MainPage(
@Composable
fun MainLoginPage(
accountViewModel: AccountStateViewModel,
navController: NavHostController,
navHostControllerWrapper: NavHostControllerWrapper,
) {
val scope = rememberCoroutineScope()
NavHost(
navController,
navHostControllerWrapper.navController,
startDestination = "login",
) {
composable(
"login",
content = {
MainPage(
scope = scope,
navController = navController,
navHostControllerWrapper = navHostControllerWrapper,
accountViewModel = accountViewModel,
)
},
@@ -382,8 +375,7 @@ fun MainLoginPage(
content = {
SignUpPage(
accountViewModel = accountViewModel,
scope = scope,
navController = navController,
navHostControllerWrapper = navHostControllerWrapper,
onFinish = {
Amber.instance.applicationIOScope.launch {
Amber.instance.profileSubscription.updateFilter()
@@ -399,7 +391,7 @@ fun MainLoginPage(
content = {
LoginPage(
accountViewModel = accountViewModel,
navController = navController,
navHostControllerWrapper = navHostControllerWrapper,
onFinish = {},
)
},
@@ -412,10 +404,10 @@ fun MainLoginPage(
@Composable
fun SignUpPage(
accountViewModel: AccountStateViewModel,
scope: CoroutineScope,
navController: NavController,
navHostControllerWrapper: NavHostControllerWrapper,
onFinish: () -> Unit,
) {
val scope = rememberCoroutineScope()
var loading by remember { mutableStateOf(false) }
val configuration = LocalConfiguration.current
val screenWidthDp = configuration.screenWidthDp.dp
@@ -468,8 +460,8 @@ fun SignUpPage(
state.animateScrollToPage(state.currentPage - 1)
}
} else {
scope.launch {
navController.navigateUp()
Amber.instance.applicationIOScope.launch(Dispatchers.Main) {
navHostControllerWrapper.navController.navigateUp()
}
}
},
@@ -490,6 +482,7 @@ fun SignUpPage(
state = state,
userScrollEnabled = false,
) { page ->
val scope = rememberCoroutineScope()
when (page) {
0 -> {
val scrollState = rememberScrollState()
@@ -801,7 +794,7 @@ fun SignUpPage(
@Composable
fun LoginPage(
accountViewModel: AccountStateViewModel,
navController: NavController,
navHostControllerWrapper: NavHostControllerWrapper,
onFinish: () -> Unit,
) {
var isLoading by remember { mutableStateOf(false) }
@@ -861,7 +854,7 @@ fun LoginPage(
}
} else {
scope.launch {
navController.navigateUp()
navHostControllerWrapper.navController.navigateUp()
}
}
},
@@ -1174,7 +1167,7 @@ fun LoginPage(
AmberButton(
enabled = if (isMnemonicMode) {
mnemonicWords.all { it.isNotBlank() }
mnemonicWords.all { word -> word.isNotBlank() }
} else {
key.value.text.isNotBlank() && !(needsPassword.value && password.value.text.isBlank())
},
@@ -315,8 +315,7 @@ fun MainScreen(
"login",
content = {
MainPage(
scope = scope,
navController = navController.navController,
navHostControllerWrapper = navController,
accountViewModel = accountStateViewModel,
)
},
@@ -327,8 +326,7 @@ fun MainScreen(
content = {
SignUpPage(
accountViewModel = accountStateViewModel,
scope = scope,
navController = navController.navController,
navHostControllerWrapper = navController,
onFinish = {
Amber.instance.applicationIOScope.launch {
Amber.instance.profileSubscription.updateFilter()
@@ -347,7 +345,7 @@ fun MainScreen(
content = {
LoginPage(
accountViewModel = accountStateViewModel,
navController = navController.navController,
navHostControllerWrapper = navController,
onFinish = {
navController.navController.navigate(Route.Applications.route) {
popUpTo(0)