fix(android) detekt: extract AlbumDetailStateContent helper

Crossfade wrapper pushed AlbumDetailScreen over the 60-line cap (62).
Extracted the inner state-machine + Crossfade + success-body
composition into AlbumDetailStateContent so the main composable
keeps only Scaffold/TopAppBar/PullToRefreshScaffold wiring.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-27 14:40:36 -04:00
parent 89203fc4a1
commit 69179e0af3
@@ -95,39 +95,12 @@ fun AlbumDetailScreen(
onRefresh = { viewModel.refresh().join() },
modifier = Modifier.fillMaxSize().padding(inner),
) {
Crossfade(targetState = state, label = "album-detail") { s ->
when (s) {
is AlbumDetailUiState.Loading -> SkeletonTrackList()
is AlbumDetailUiState.Error -> EmptyState(
title = "Couldn't load album",
body = s.message,
)
is AlbumDetailUiState.Success -> {
val albumLiked by viewModel.albumLiked.collectAsStateWithLifecycle()
val likedTrackIds by viewModel.likedTrackIds
.collectAsStateWithLifecycle()
val playerState by playerViewModel.uiState
.collectAsStateWithLifecycle()
AlbumBody(
detail = s.detail,
albumLiked = albumLiked,
likedTrackIds = likedTrackIds,
playingTrackId = playerState.currentTrack?.id,
onPlayAll = { viewModel.play(startTrackId = null) },
onShuffleAll = viewModel::shuffle,
onTrackClick = { id -> viewModel.play(startTrackId = id) },
onToggleAlbumLike = viewModel::toggleLikeAlbum,
onToggleTrackLike = viewModel::toggleLikeTrack,
onNavigateToAlbum = { id ->
navController.navigate(AlbumDetail(id))
},
onNavigateToArtist = { id ->
navController.navigate(ArtistDetail(id))
},
)
}
}
}
AlbumDetailStateContent(
state = state,
viewModel = viewModel,
playerViewModel = playerViewModel,
navController = navController,
)
}
}
}
@@ -138,6 +111,48 @@ private fun titleFor(state: AlbumDetailUiState): String = when (state) {
is AlbumDetailUiState.Error -> "Album"
}
@Composable
private fun AlbumDetailStateContent(
state: AlbumDetailUiState,
viewModel: AlbumDetailViewModel,
playerViewModel: com.fabledsword.minstrel.player.ui.PlayerViewModel,
navController: NavHostController,
) {
Crossfade(targetState = state, label = "album-detail") { s ->
when (s) {
is AlbumDetailUiState.Loading -> SkeletonTrackList()
is AlbumDetailUiState.Error -> EmptyState(
title = "Couldn't load album",
body = s.message,
)
is AlbumDetailUiState.Success -> {
val albumLiked by viewModel.albumLiked.collectAsStateWithLifecycle()
val likedTrackIds by viewModel.likedTrackIds
.collectAsStateWithLifecycle()
val playerState by playerViewModel.uiState
.collectAsStateWithLifecycle()
AlbumBody(
detail = s.detail,
albumLiked = albumLiked,
likedTrackIds = likedTrackIds,
playingTrackId = playerState.currentTrack?.id,
onPlayAll = { viewModel.play(startTrackId = null) },
onShuffleAll = viewModel::shuffle,
onTrackClick = { id -> viewModel.play(startTrackId = id) },
onToggleAlbumLike = viewModel::toggleLikeAlbum,
onToggleTrackLike = viewModel::toggleLikeTrack,
onNavigateToAlbum = { id ->
navController.navigate(AlbumDetail(id))
},
onNavigateToArtist = { id ->
navController.navigate(ArtistDetail(id))
},
)
}
}
}
}
@Composable
private fun AlbumBody(
detail: AlbumDetailRef,