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:
Sanju Sivalingam
2026-02-18 12:32:26 +05:30
parent 8ef15af97a
commit 562d4095f0

View File

@@ -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")
} }