fix(android): prevent save button from disappearing during API key editing
DataStore flow re-emissions were resetting editingApiKey via remember(apiKey), hiding the save button mid-edit. Now uses null sentinel to track edit state independently from stored value.
This commit is contained in:
@@ -57,8 +57,10 @@ fun SettingsScreen() {
|
|||||||
val apiKey by app.settingsStore.apiKey.collectAsState(initial = "")
|
val apiKey by app.settingsStore.apiKey.collectAsState(initial = "")
|
||||||
val serverUrl by app.settingsStore.serverUrl.collectAsState(initial = "wss://tunnel.droidclaw.ai")
|
val serverUrl by app.settingsStore.serverUrl.collectAsState(initial = "wss://tunnel.droidclaw.ai")
|
||||||
|
|
||||||
var editingApiKey by remember(apiKey) { mutableStateOf(apiKey) }
|
var editingApiKey by remember { mutableStateOf<String?>(null) }
|
||||||
var editingServerUrl by remember(serverUrl) { mutableStateOf(serverUrl) }
|
val displayApiKey = editingApiKey ?: apiKey
|
||||||
|
var editingServerUrl by remember { mutableStateOf<String?>(null) }
|
||||||
|
val displayServerUrl = editingServerUrl ?: serverUrl
|
||||||
|
|
||||||
val isAccessibilityEnabled by DroidClawAccessibilityService.isRunning.collectAsState()
|
val isAccessibilityEnabled by DroidClawAccessibilityService.isRunning.collectAsState()
|
||||||
val isCaptureAvailable by ScreenCaptureManager.isAvailable.collectAsState()
|
val isCaptureAvailable by ScreenCaptureManager.isAvailable.collectAsState()
|
||||||
@@ -96,31 +98,41 @@ fun SettingsScreen() {
|
|||||||
Text("Settings", style = MaterialTheme.typography.headlineMedium)
|
Text("Settings", style = MaterialTheme.typography.headlineMedium)
|
||||||
|
|
||||||
OutlinedTextField(
|
OutlinedTextField(
|
||||||
value = editingApiKey,
|
value = displayApiKey,
|
||||||
onValueChange = { editingApiKey = it },
|
onValueChange = { editingApiKey = it },
|
||||||
label = { Text("API Key") },
|
label = { Text("API Key") },
|
||||||
modifier = Modifier.fillMaxWidth(),
|
modifier = Modifier.fillMaxWidth(),
|
||||||
visualTransformation = PasswordVisualTransformation(),
|
visualTransformation = PasswordVisualTransformation(),
|
||||||
singleLine = true
|
singleLine = true
|
||||||
)
|
)
|
||||||
if (editingApiKey != apiKey) {
|
if (editingApiKey != null && editingApiKey != apiKey) {
|
||||||
OutlinedButton(
|
OutlinedButton(
|
||||||
onClick = { scope.launch { app.settingsStore.setApiKey(editingApiKey) } }
|
onClick = {
|
||||||
|
scope.launch {
|
||||||
|
app.settingsStore.setApiKey(displayApiKey)
|
||||||
|
editingApiKey = null
|
||||||
|
}
|
||||||
|
}
|
||||||
) {
|
) {
|
||||||
Text("Save API Key")
|
Text("Save API Key")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
OutlinedTextField(
|
OutlinedTextField(
|
||||||
value = editingServerUrl,
|
value = displayServerUrl,
|
||||||
onValueChange = { editingServerUrl = it },
|
onValueChange = { editingServerUrl = it },
|
||||||
label = { Text("Server URL") },
|
label = { Text("Server URL") },
|
||||||
modifier = Modifier.fillMaxWidth(),
|
modifier = Modifier.fillMaxWidth(),
|
||||||
singleLine = true
|
singleLine = true
|
||||||
)
|
)
|
||||||
if (editingServerUrl != serverUrl) {
|
if (editingServerUrl != null && editingServerUrl != serverUrl) {
|
||||||
OutlinedButton(
|
OutlinedButton(
|
||||||
onClick = { scope.launch { app.settingsStore.setServerUrl(editingServerUrl) } }
|
onClick = {
|
||||||
|
scope.launch {
|
||||||
|
app.settingsStore.setServerUrl(displayServerUrl)
|
||||||
|
editingServerUrl = null
|
||||||
|
}
|
||||||
|
}
|
||||||
) {
|
) {
|
||||||
Text("Save Server URL")
|
Text("Save Server URL")
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user