Implement dynamic log screen in setting

This commit is contained in:
2026-07-10 15:48:50 +07:00
parent 8e7b5d7569
commit 245330d37a
3 changed files with 39 additions and 31 deletions
@@ -8,6 +8,8 @@ import com.digitoolsolutions.app.torquevaultkmp.data.storage.AppStorage
import com.digitoolsolutions.app.torquevaultkmp.data.storage.ReferKeys import com.digitoolsolutions.app.torquevaultkmp.data.storage.ReferKeys
import com.digitoolsolutions.app.torquevaultkmp.data.storage.TokenManager import com.digitoolsolutions.app.torquevaultkmp.data.storage.TokenManager
import com.digitoolsolutions.app.torquevaultkmp.data.storage.load import com.digitoolsolutions.app.torquevaultkmp.data.storage.load
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@@ -22,6 +24,9 @@ class AppViewModel(
private val _sessionExpired = mutableStateOf(false) private val _sessionExpired = mutableStateOf(false)
val sessionExpired: State<Boolean> = _sessionExpired val sessionExpired: State<Boolean> = _sessionExpired
private val _showLogs = MutableStateFlow(false)
val showLogs: StateFlow<Boolean> = _showLogs
init { init {
viewModelScope.launch { viewModelScope.launch {
tokenManager.sessionExpired.collectLatest { tokenManager.sessionExpired.collectLatest {
@@ -42,4 +47,8 @@ class AppViewModel(
_isDarkTheme.value = isDark _isDarkTheme.value = isDark
storage.save(ReferKeys.THEME, isDark) storage.save(ReferKeys.THEME, isDark)
} }
fun setShowLogs(enabled: Boolean) {
_showLogs.value = enabled
}
} }
@@ -12,7 +12,7 @@ import androidx.compose.material3.NavigationBarItemDefaults
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@@ -36,13 +36,11 @@ import com.digitoolsolutions.app.torquevaultkmp.screens.logs.LogDestination
import com.digitoolsolutions.app.torquevaultkmp.screens.logs.LogScreen import com.digitoolsolutions.app.torquevaultkmp.screens.logs.LogScreen
import com.digitoolsolutions.app.torquevaultkmp.screens.scanner.ScannerDestination import com.digitoolsolutions.app.torquevaultkmp.screens.scanner.ScannerDestination
import com.digitoolsolutions.app.torquevaultkmp.screens.scanner.ScannerScreen import com.digitoolsolutions.app.torquevaultkmp.screens.scanner.ScannerScreen
import com.digitoolsolutions.app.torquevaultkmp.screens.scanner.ScannerViewModel
import com.digitoolsolutions.app.torquevaultkmp.screens.settings.SettingDestination import com.digitoolsolutions.app.torquevaultkmp.screens.settings.SettingDestination
import com.digitoolsolutions.app.torquevaultkmp.screens.settings.SettingScreen import com.digitoolsolutions.app.torquevaultkmp.screens.settings.SettingScreen
import org.jetbrains.compose.resources.painterResource import org.jetbrains.compose.resources.painterResource
import org.jetbrains.compose.resources.stringResource import org.jetbrains.compose.resources.stringResource
import org.koin.compose.koinInject import org.koin.compose.koinInject
import org.koin.compose.viewmodel.koinViewModel
import torquevaultkmp.composeapp.generated.resources.Res import torquevaultkmp.composeapp.generated.resources.Res
import torquevaultkmp.composeapp.generated.resources.btn_login import torquevaultkmp.composeapp.generated.resources.btn_login
import kotlin.uuid.ExperimentalUuidApi import kotlin.uuid.ExperimentalUuidApi
@@ -55,13 +53,14 @@ fun MainScreen(
isLoggedIn: Boolean, isLoggedIn: Boolean,
viewModel: AppViewModel = koinInject() viewModel: AppViewModel = koinInject()
) { ) {
val destinations = listOf( val showLogs by viewModel.showLogs.collectAsState()
HomeDestination, val destinations = buildList {
ScannerDestination, add(HomeDestination)
BondedDestination, add(ScannerDestination)
LogDestination, add(BondedDestination)
SettingDestination, if (showLogs) add(LogDestination)
) add(SettingDestination)
}
val navController = rememberNavController() val navController = rememberNavController()
val navBackStackEntry by navController.currentBackStackEntryAsState() val navBackStackEntry by navController.currentBackStackEntryAsState()
val currentDestination = navBackStackEntry?.destination val currentDestination = navBackStackEntry?.destination
@@ -33,11 +33,10 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.text.input.PasswordVisualTransformation
import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.navigation.NavController import androidx.navigation.NavController
import com.digitoolsolutions.app.torquevaultkmp.AppViewModel
import com.digitoolsolutions.app.torquevaultkmp.components.AppBar import com.digitoolsolutions.app.torquevaultkmp.components.AppBar
import com.digitoolsolutions.app.torquevaultkmp.screens.auth.AuthDestination import com.digitoolsolutions.app.torquevaultkmp.screens.auth.AuthDestination
import com.digitoolsolutions.app.torquevaultkmp.utils.AppInfo import com.digitoolsolutions.app.torquevaultkmp.utils.AppInfo
@@ -63,16 +62,20 @@ import torquevaultkmp.composeapp.generated.resources.token
fun SettingScreen( fun SettingScreen(
navController: NavController, navController: NavController,
isDarkTheme: Boolean, isDarkTheme: Boolean,
onThemeToggle: (Boolean) -> Unit, onThemeToggle: (Boolean) -> Unit
) { ) {
val viewModel = koinViewModel<SettingViewModel>() val viewModel = koinViewModel<SettingViewModel>()
val appViewModel = koinInject<AppViewModel>()
val serverUrl by viewModel.serverUrl.collectAsState() val serverUrl by viewModel.serverUrl.collectAsState()
val token by viewModel.refreshToken.collectAsState() val token by viewModel.refreshToken.collectAsState()
val autoConnect by viewModel.autoConnect.collectAsState() val autoConnect by viewModel.autoConnect.collectAsState()
val showLogs by appViewModel.showLogs.collectAsState()
SettingContent( SettingContent(
isDarkTheme = isDarkTheme, isDarkTheme = isDarkTheme,
onThemeToggle = onThemeToggle, onThemeToggle = onThemeToggle,
isShowLogs = showLogs,
onToggleLogs = { appViewModel.setShowLogs(it) },
serverUrl = serverUrl, serverUrl = serverUrl,
onServerUrlChange = { viewModel.updateServerUrl(it) }, onServerUrlChange = { viewModel.updateServerUrl(it) },
token = token, token = token,
@@ -94,6 +97,8 @@ fun SettingScreen(
fun SettingContent( fun SettingContent(
isDarkTheme: Boolean, isDarkTheme: Boolean,
onThemeToggle: (Boolean) -> Unit, onThemeToggle: (Boolean) -> Unit,
isShowLogs: Boolean,
onToggleLogs: (Boolean) -> Unit,
serverUrl: String, serverUrl: String,
onServerUrlChange: (String) -> Unit, onServerUrlChange: (String) -> Unit,
token: String, token: String,
@@ -170,6 +175,18 @@ fun SettingContent(
) )
} }
Spacer(modifier = Modifier.height(8.dp)) Spacer(modifier = Modifier.height(8.dp))
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier.fillMaxWidth()
) {
Text("Show logs")
Spacer(modifier = Modifier.weight(1f))
Switch(
checked = isShowLogs,
onCheckedChange = { onToggleLogs(it) }
)
}
Spacer(modifier = Modifier.height(8.dp))
OutlinedTextField( OutlinedTextField(
value = serverUrl, value = serverUrl,
onValueChange = { onServerUrlChange(it) }, onValueChange = { onServerUrlChange(it) },
@@ -226,20 +243,3 @@ fun SettingContent(
} }
} }
} }
@Preview(showBackground = true)
@Composable
private fun SettingScreenPreview() {
SettingContent(
isDarkTheme = true,
onThemeToggle = {},
serverUrl = "https://example.com",
onServerUrlChange = {},
token = "dummy_token",
onTokenChange = {},
onSaveSettings = {},
onLogout = {},
autoConnect = false,
onChangeAutoConnect = {},
)
}