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.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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+9
-10
@@ -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
|
||||||
|
|||||||
+21
-21
@@ -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) },
|
||||||
@@ -225,21 +242,4 @@ 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