From 1c05b561ba1b0664b1679eadfb1b66588f2c3edb Mon Sep 17 00:00:00 2001 From: Bryan Van Deusen Date: Wed, 27 May 2026 21:22:19 -0400 Subject: [PATCH] fix(android) detekt: extract SettingsList helper MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit SettingsScreen was still 75/60 after the dialog extraction. Extracted the Column-of-cards body into SettingsList so the main composable only holds state collection, LaunchedEffect, and the Scaffold shell. Also fixed the helper's state-param type — SettingsViewModel uses SettingsState not SettingsUiState. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../minstrel/settings/ui/SettingsScreen.kt | 94 +++++++++++-------- 1 file changed, 56 insertions(+), 38 deletions(-) diff --git a/android/app/src/main/java/com/fabledsword/minstrel/settings/ui/SettingsScreen.kt b/android/app/src/main/java/com/fabledsword/minstrel/settings/ui/SettingsScreen.kt index 9d333af0..15c3ba24 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/settings/ui/SettingsScreen.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/settings/ui/SettingsScreen.kt @@ -91,44 +91,15 @@ fun SettingsScreen( ) }, ) { inner -> - Column( - modifier = Modifier - .fillMaxSize() - .padding(inner) - .verticalScroll(rememberScrollState()) - .padding(16.dp), - verticalArrangement = Arrangement.spacedBy(16.dp), - ) { - AccountCard( - username = state.username, - isAdmin = state.isAdmin, - serverUrl = state.serverUrl, - ) - NavTile( - icon = Lucide.ListMusic, - title = "My requests", - subtitle = "Track what you've asked Minstrel to add", - onClick = { navController.navigate(Requests) }, - ) - if (state.isAdmin) { - NavTile( - icon = Lucide.Shield, - title = "Admin", - subtitle = "Manage requests, quarantine, and users", - onClick = { navController.navigate(Admin) }, - ) - } - ProfileCard() - PasswordCard() - ListenBrainzCard() - AppearanceCard(themeMode = themeMode, onPick = themeVm::setThemeMode) - StorageCard() - AboutCard() - SignOutButton( - isSigningOut = state.isSigningOut, - onSignOut = { showSignOutConfirm = true }, - ) - } + SettingsList( + inner = inner, + state = state, + themeMode = themeMode, + onPickTheme = themeVm::setThemeMode, + onNavToRequests = { navController.navigate(Requests) }, + onNavToAdmin = { navController.navigate(Admin) }, + onSignOutClick = { showSignOutConfirm = true }, + ) } if (showSignOutConfirm) { SignOutConfirmDialog( @@ -141,6 +112,53 @@ fun SettingsScreen( } } +@Composable +private fun SettingsList( + inner: androidx.compose.foundation.layout.PaddingValues, + state: SettingsState, + themeMode: ThemeMode, + onPickTheme: (ThemeMode) -> Unit, + onNavToRequests: () -> Unit, + onNavToAdmin: () -> Unit, + onSignOutClick: () -> Unit, +) { + Column( + modifier = Modifier + .fillMaxSize() + .padding(inner) + .verticalScroll(rememberScrollState()) + .padding(16.dp), + verticalArrangement = Arrangement.spacedBy(16.dp), + ) { + AccountCard( + username = state.username, + isAdmin = state.isAdmin, + serverUrl = state.serverUrl, + ) + NavTile( + icon = Lucide.ListMusic, + title = "My requests", + subtitle = "Track what you've asked Minstrel to add", + onClick = onNavToRequests, + ) + if (state.isAdmin) { + NavTile( + icon = Lucide.Shield, + title = "Admin", + subtitle = "Manage requests, quarantine, and users", + onClick = onNavToAdmin, + ) + } + ProfileCard() + PasswordCard() + ListenBrainzCard() + AppearanceCard(themeMode = themeMode, onPick = onPickTheme) + StorageCard() + AboutCard() + SignOutButton(isSigningOut = state.isSigningOut, onSignOut = onSignOutClick) + } +} + @Composable private fun SignOutConfirmDialog(onConfirm: () -> Unit, onDismiss: () -> Unit) { AlertDialog(