refactor(multi-account): in-app overlay dialog for Add Account
Replaced DialogWindow (OS native window with title bar, minimize/maximize) with Dialog composable (in-app overlay with scrim). Matches the ComposeNoteDialog pattern used elsewhere in the desktop app. - Card wrapper with 480dp width, 24dp padding - Title row with 'Add Account' + Close (✕) icon - No OS window chrome — clean in-app feel - Click outside or ✕ to dismiss Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
+21
-37
@@ -20,36 +20,31 @@
|
|||||||
*/
|
*/
|
||||||
package com.vitorpamplona.amethyst.desktop.ui.account
|
package com.vitorpamplona.amethyst.desktop.ui.account
|
||||||
|
|
||||||
import androidx.compose.foundation.layout.Arrangement
|
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
import androidx.compose.foundation.layout.fillMaxSize
|
import androidx.compose.foundation.layout.Row
|
||||||
import androidx.compose.foundation.layout.padding
|
import androidx.compose.foundation.layout.padding
|
||||||
|
import androidx.compose.foundation.layout.width
|
||||||
import androidx.compose.material.icons.Icons
|
import androidx.compose.material.icons.Icons
|
||||||
import androidx.compose.material.icons.automirrored.filled.ArrowBack
|
import androidx.compose.material.icons.filled.Close
|
||||||
import androidx.compose.material3.ExperimentalMaterial3Api
|
import androidx.compose.material3.Card
|
||||||
import androidx.compose.material3.Icon
|
import androidx.compose.material3.Icon
|
||||||
import androidx.compose.material3.IconButton
|
import androidx.compose.material3.IconButton
|
||||||
import androidx.compose.material3.MaterialTheme
|
import androidx.compose.material3.MaterialTheme
|
||||||
import androidx.compose.material3.Scaffold
|
|
||||||
import androidx.compose.material3.Text
|
import androidx.compose.material3.Text
|
||||||
import androidx.compose.material3.TopAppBar
|
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.collectAsState
|
import androidx.compose.runtime.collectAsState
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
import androidx.compose.runtime.rememberCoroutineScope
|
import androidx.compose.runtime.rememberCoroutineScope
|
||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.unit.DpSize
|
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.compose.ui.window.DialogWindow
|
import androidx.compose.ui.window.Dialog
|
||||||
import androidx.compose.ui.window.rememberDialogState
|
|
||||||
import com.vitorpamplona.amethyst.desktop.account.AccountManager
|
import com.vitorpamplona.amethyst.desktop.account.AccountManager
|
||||||
import com.vitorpamplona.amethyst.desktop.ui.auth.LoginCard
|
import com.vitorpamplona.amethyst.desktop.ui.auth.LoginCard
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
|
|
||||||
@OptIn(ExperimentalMaterial3Api::class)
|
|
||||||
@Composable
|
@Composable
|
||||||
fun AddAccountDialog(
|
fun AddAccountDialog(
|
||||||
accountManager: AccountManager,
|
accountManager: AccountManager,
|
||||||
@@ -59,36 +54,28 @@ fun AddAccountDialog(
|
|||||||
val scope = rememberCoroutineScope()
|
val scope = rememberCoroutineScope()
|
||||||
val loginProgress by accountManager.loginProgress.collectAsState()
|
val loginProgress by accountManager.loginProgress.collectAsState()
|
||||||
|
|
||||||
DialogWindow(
|
Dialog(onDismissRequest = onDismiss) {
|
||||||
onCloseRequest = onDismiss,
|
Card(modifier = Modifier.width(480.dp).padding(16.dp)) {
|
||||||
title = "Add Account",
|
Column(modifier = Modifier.padding(24.dp)) {
|
||||||
state = rememberDialogState(size = DpSize(480.dp, 600.dp)),
|
// Header with title + close button
|
||||||
resizable = false,
|
Row(verticalAlignment = Alignment.CenterVertically) {
|
||||||
) {
|
Text(
|
||||||
MaterialTheme {
|
"Add Account",
|
||||||
Scaffold(
|
style = MaterialTheme.typography.headlineSmall,
|
||||||
topBar = {
|
color = MaterialTheme.colorScheme.onSurface,
|
||||||
TopAppBar(
|
modifier = Modifier.weight(1f),
|
||||||
title = { Text("Add Account") },
|
)
|
||||||
navigationIcon = {
|
|
||||||
IconButton(onClick = onDismiss) {
|
IconButton(onClick = onDismiss) {
|
||||||
Icon(
|
Icon(
|
||||||
Icons.AutoMirrored.Filled.ArrowBack,
|
Icons.Default.Close,
|
||||||
contentDescription = "Back",
|
contentDescription = "Close",
|
||||||
|
tint = MaterialTheme.colorScheme.onSurfaceVariant,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
)
|
|
||||||
},
|
|
||||||
) { padding ->
|
|
||||||
Column(
|
|
||||||
modifier = Modifier.fillMaxSize().padding(padding).padding(24.dp),
|
|
||||||
horizontalAlignment = Alignment.CenterHorizontally,
|
|
||||||
verticalArrangement = Arrangement.Center,
|
|
||||||
) {
|
|
||||||
LoginCard(
|
LoginCard(
|
||||||
onLogin = { keyInput ->
|
onLogin = { keyInput ->
|
||||||
// All steps must be sequential — no fire-and-forget
|
|
||||||
scope.launch {
|
scope.launch {
|
||||||
withContext(Dispatchers.IO) {
|
withContext(Dispatchers.IO) {
|
||||||
accountManager.ensureCurrentAccountInStorage()
|
accountManager.ensureCurrentAccountInStorage()
|
||||||
@@ -101,7 +88,6 @@ fun AddAccountDialog(
|
|||||||
onAccountAdded()
|
onAccountAdded()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Return success to dismiss any error in LoginCard
|
|
||||||
Result.success(Unit)
|
Result.success(Unit)
|
||||||
},
|
},
|
||||||
onGenerateNew = {
|
onGenerateNew = {
|
||||||
@@ -117,7 +103,6 @@ fun AddAccountDialog(
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
onLoginBunker = { bunkerUri ->
|
onLoginBunker = { bunkerUri ->
|
||||||
// ensureCurrentAccountInStorage first, then bunker login
|
|
||||||
accountManager.ensureCurrentAccountInStorage()
|
accountManager.ensureCurrentAccountInStorage()
|
||||||
val result = accountManager.loginWithBunker(bunkerUri)
|
val result = accountManager.loginWithBunker(bunkerUri)
|
||||||
if (result.isSuccess) {
|
if (result.isSuccess) {
|
||||||
@@ -142,4 +127,3 @@ fun AddAccountDialog(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
Reference in New Issue
Block a user