Implement dynamic log screen in setting
This commit is contained in:
+9
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
+9
-10
@@ -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
|
||||
|
||||
+20
-20
@@ -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 = {},
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user