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.TokenManager
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.launch
@@ -22,6 +24,9 @@ class AppViewModel(
private val _sessionExpired = mutableStateOf(false)
val sessionExpired: State<Boolean> = _sessionExpired
private val _showLogs = MutableStateFlow(false)
val showLogs: StateFlow<Boolean> = _showLogs
init {
viewModelScope.launch {
tokenManager.sessionExpired.collectLatest {
@@ -42,4 +47,8 @@ class AppViewModel(
_isDarkTheme.value = 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.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.saveable.rememberSaveable
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.scanner.ScannerDestination
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.SettingScreen
import org.jetbrains.compose.resources.painterResource
import org.jetbrains.compose.resources.stringResource
import org.koin.compose.koinInject
import org.koin.compose.viewmodel.koinViewModel
import torquevaultkmp.composeapp.generated.resources.Res
import torquevaultkmp.composeapp.generated.resources.btn_login
import kotlin.uuid.ExperimentalUuidApi
@@ -55,13 +53,14 @@ fun MainScreen(
isLoggedIn: Boolean,
viewModel: AppViewModel = koinInject()
) {
val destinations = listOf(
HomeDestination,
ScannerDestination,
BondedDestination,
LogDestination,
SettingDestination,
)
val showLogs by viewModel.showLogs.collectAsState()
val destinations = buildList {
add(HomeDestination)
add(ScannerDestination)
add(BondedDestination)
if (showLogs) add(LogDestination)
add(SettingDestination)
}
val navController = rememberNavController()
val navBackStackEntry by navController.currentBackStackEntryAsState()
val currentDestination = navBackStackEntry?.destination
@@ -33,11 +33,10 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.text.input.PasswordVisualTransformation
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.navigation.NavController
import com.digitoolsolutions.app.torquevaultkmp.AppViewModel
import com.digitoolsolutions.app.torquevaultkmp.components.AppBar
import com.digitoolsolutions.app.torquevaultkmp.screens.auth.AuthDestination
import com.digitoolsolutions.app.torquevaultkmp.utils.AppInfo
@@ -63,16 +62,20 @@ import torquevaultkmp.composeapp.generated.resources.token
fun SettingScreen(
navController: NavController,
isDarkTheme: Boolean,
onThemeToggle: (Boolean) -> Unit,
onThemeToggle: (Boolean) -> Unit
) {
val viewModel = koinViewModel<SettingViewModel>()
val appViewModel = koinInject<AppViewModel>()
val serverUrl by viewModel.serverUrl.collectAsState()
val token by viewModel.refreshToken.collectAsState()
val autoConnect by viewModel.autoConnect.collectAsState()
val showLogs by appViewModel.showLogs.collectAsState()
SettingContent(
isDarkTheme = isDarkTheme,
onThemeToggle = onThemeToggle,
isShowLogs = showLogs,
onToggleLogs = { appViewModel.setShowLogs(it) },
serverUrl = serverUrl,
onServerUrlChange = { viewModel.updateServerUrl(it) },
token = token,
@@ -94,6 +97,8 @@ fun SettingScreen(
fun SettingContent(
isDarkTheme: Boolean,
onThemeToggle: (Boolean) -> Unit,
isShowLogs: Boolean,
onToggleLogs: (Boolean) -> Unit,
serverUrl: String,
onServerUrlChange: (String) -> Unit,
token: String,
@@ -170,6 +175,18 @@ fun SettingContent(
)
}
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(
value = serverUrl,
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 = {},
)
}