diff --git a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/Main.kt b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/Main.kt index e3eb004755..5b92c6c1e5 100644 --- a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/Main.kt +++ b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/Main.kt @@ -96,6 +96,7 @@ import com.vitorpamplona.amethyst.desktop.service.namecoin.LocalNamecoinService import com.vitorpamplona.amethyst.desktop.subscriptions.DesktopRelaySubscriptionsCoordinator import com.vitorpamplona.amethyst.desktop.ui.ComposeNoteDialog import com.vitorpamplona.amethyst.desktop.ui.ConnectingRelaysScreen +import com.vitorpamplona.amethyst.desktop.ui.ImportFollowListDialog import com.vitorpamplona.amethyst.desktop.ui.LoginScreen import com.vitorpamplona.amethyst.desktop.ui.ZapFeedback import com.vitorpamplona.amethyst.desktop.ui.auth.ForceLogoutDialog @@ -629,6 +630,7 @@ fun main() { onShowAppDrawer = { showAppDrawer = true }, replyToNote = replyToNote, showImportFollowListDialog = showImportFollowListDialog, + onShowImportFollowListDialog = { showImportFollowListDialog = true }, onDismissImportFollowListDialog = { showImportFollowListDialog = false }, onRestartApp = { appRestartKey++ }, torManager = torManager, @@ -659,6 +661,7 @@ fun App( onShowAppDrawer: () -> Unit, replyToNote: com.vitorpamplona.quartz.nip01Core.core.Event?, showImportFollowListDialog: Boolean = false, + onShowImportFollowListDialog: () -> Unit = {}, onDismissImportFollowListDialog: () -> Unit = {}, onRestartApp: () -> Unit = {}, torManager: com.vitorpamplona.amethyst.desktop.tor.DesktopTorManager, @@ -1013,7 +1016,21 @@ fun App( com.vitorpamplona.amethyst.desktop.ui.deck.AppDrawerTab.FEEDS onShowAppDrawer() }, + onShowImportFollowListDialog = onShowImportFollowListDialog, ) + + // Import Follow List dialog (triggered from File menu / + // Cmd+Shift+I). Rendered inside this CompositionLocalProvider + // so LocalNamecoinService is available for .bit / d/ / id/ + // identifier resolution. + if (showImportFollowListDialog) { + ImportFollowListDialog( + onDismiss = onDismissImportFollowListDialog, + relayManager = relayManager, + account = account, + localCache = localCache, + ) + } } // Compose dialog @@ -1116,6 +1133,7 @@ fun MainContent( onShowReplyDialog: (com.vitorpamplona.quartz.nip01Core.core.Event) -> Unit, onShowAppDrawer: () -> Unit, onOpenFeedsDrawer: () -> Unit = onShowAppDrawer, + onShowImportFollowListDialog: () -> Unit = {}, ) { val snackbarHostState = remember { SnackbarHostState() } val scope = rememberCoroutineScope() @@ -1333,6 +1351,7 @@ fun MainContent( onOpenFeedsDrawer = onOpenFeedsDrawer, onShowComposeDialog = onShowComposeDialog, onShowReplyDialog = onShowReplyDialog, + onShowImportFollowListDialog = onShowImportFollowListDialog, onZapFeedback = onZapFeedback, signerConnectionState = signerConnectionState, lastPingTimeSec = lastPingTimeSec, @@ -1369,6 +1388,7 @@ fun MainContent( deckState.addColumn(DeckColumnType.Settings) } }, + onShowImportFollowListDialog = onShowImportFollowListDialog, signerConnectionState = signerConnectionState, lastPingTimeSec = lastPingTimeSec, torStatus = torStatus, diff --git a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/deck/DeckSidebar.kt b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/deck/DeckSidebar.kt index bfe4b9e64c..6cea5f0013 100644 --- a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/deck/DeckSidebar.kt +++ b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/deck/DeckSidebar.kt @@ -56,6 +56,7 @@ fun DeckSidebar( onRemoveAccount: (String) -> Unit, onAddColumn: () -> Unit, onOpenSettings: () -> Unit, + onShowImportFollowListDialog: () -> Unit = {}, signerConnectionState: SignerConnectionState, lastPingTimeSec: Long?, torStatus: TorServiceStatus, @@ -90,6 +91,14 @@ fun DeckSidebar( ) } + IconButton(onClick = onShowImportFollowListDialog) { + Icon( + MaterialSymbols.PersonAdd, + contentDescription = "Import Follow List", + tint = MaterialTheme.colorScheme.onSurfaceVariant, + ) + } + Spacer(Modifier.weight(1f)) BunkerHeartbeatIndicator( diff --git a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/deck/SinglePaneLayout.kt b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/deck/SinglePaneLayout.kt index 33c8e8df27..9e7fb7d7d9 100644 --- a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/deck/SinglePaneLayout.kt +++ b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/deck/SinglePaneLayout.kt @@ -95,6 +95,7 @@ fun SinglePaneLayout( onOpenFeedsDrawer: () -> Unit = onOpenAppDrawer, onShowComposeDialog: () -> Unit, onShowReplyDialog: (com.vitorpamplona.quartz.nip01Core.core.Event) -> Unit, + onShowImportFollowListDialog: () -> Unit = {}, onZapFeedback: (ZapFeedback) -> Unit, signerConnectionState: SignerConnectionState, lastPingTimeSec: Long?, @@ -178,6 +179,26 @@ fun SinglePaneLayout( ) } + NavigationRailItem( + selected = false, + onClick = onShowImportFollowListDialog, + icon = { + Icon( + MaterialSymbols.PersonAdd, + contentDescription = "Import Follow List", + modifier = Modifier.size(22.dp), + ) + }, + label = { + Text( + "Import", + style = MaterialTheme.typography.labelSmall, + maxLines = 1, + ) + }, + colors = NavigationRailItemDefaults.colors(), + ) + NavigationRailItem( selected = false, onClick = onOpenAppDrawer,