Skip to content

Commit

Permalink
add fav from menu
Browse files Browse the repository at this point in the history
  • Loading branch information
Ericgacoki committed Jan 9, 2025
1 parent 831a55e commit 72c0869
Show file tree
Hide file tree
Showing 11 changed files with 339 additions and 88 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,15 @@ interface AlbumWithInfoUiEvent {

object OnRefreshAlbumInfo : AlbumWithInfoUiEvent

object ResetState: AlbumWithInfoUiEvent
object ResetState : AlbumWithInfoUiEvent

data class OnToggleAlbumFavorite(
val isFavorite: Boolean,
val albumHash: String,
) : AlbumWithInfoUiEvent

data class OnToggleAlbumTrackFavorite(
val trackHash: String,
val favorite: Boolean
) : AlbumWithInfoUiEvent
}
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ fun AlbumWithInfo(
playbackState: PlaybackState,
albumInfo: AlbumInfo,
copyright: String,
albumTracks: Map<Int, List<Track>>,
albumTracksMap: Map<Int, List<Track>>,
baseUrl: String,
onClickBack: () -> Unit,
onClickMore: () -> Unit,
Expand All @@ -140,12 +140,21 @@ fun AlbumWithInfo(
var showTrackBottomSheet by remember { mutableStateOf(false) }
var clickedTrack: Track? by remember { mutableStateOf(null) }

LaunchedEffect(albumTracksMap) {
albumTracksMap.forEach { entry ->
clickedTrack = entry.value.find { track ->
track.trackHash == clickedTrack?.trackHash
} ?: clickedTrack
}
}

Scaffold {
if (showTrackBottomSheet) {
clickedTrack?.let { track ->
CustomTrackBottomSheet(
scope = scope,
sheetState = sheetState,
isFavorite = track.isFavorite,
clickedTrack = track,
baseUrl = baseUrl,
bottomSheetItems = listOf(
Expand Down Expand Up @@ -456,7 +465,7 @@ fun AlbumWithInfo(
Spacer(modifier = Modifier.height(12.dp))
}

albumTracks.forEach { (discNumber, tracks) ->
albumTracksMap.forEach { (discNumber, tracks) ->
item {
// Disc Number Header
Text(
Expand Down Expand Up @@ -507,6 +516,7 @@ fun AlbumWithInfo(
) {
TrackItem(
track = track,
baseUrl = baseUrl,
isAlbumTrack = true,
showMenuIcon = true,
isCurrentTrack = track.trackHash == currentTrack?.trackHash,
Expand All @@ -520,8 +530,7 @@ fun AlbumWithInfo(
onClickMoreVert = {
clickedTrack = it
showTrackBottomSheet = true
},
baseUrl = baseUrl
}
)
}
}
Expand Down Expand Up @@ -775,7 +784,7 @@ fun AlbumWithInfoScreen(
playbackState = playerUiState.playbackState,
albumInfo = albumWithInfoState.infoResource.data?.albumInfo!!,
copyright = albumWithInfoState.infoResource.data?.copyright!!,
albumTracks = albumWithInfoState.infoResource.data!!.groupedTracks,
albumTracksMap = albumWithInfoState.infoResource.data!!.groupedTracks,
baseUrl = baseUrl ?: "https://default",
onClickBack = { navigator.navigateBack() },
onClickMore = {
Expand Down Expand Up @@ -899,8 +908,12 @@ fun AlbumWithInfoScreen(
onGotoArtist = { hash ->
navigator.gotoArtistInfo(artistHash = hash)
},
onToggleTrackFavorite = { isFavorite, trackHash ->
// TODO: Call Album Track fav toggle
onToggleTrackFavorite = { trackHash, isFavorite ->
albumWithInfoViewModel.onAlbumWithInfoUiEvent(
AlbumWithInfoUiEvent.OnToggleAlbumTrackFavorite(
trackHash, isFavorite,
)
)
}
)
}
Expand Down Expand Up @@ -1068,7 +1081,7 @@ fun AlbumWithInfoScreenPreview() {
playbackState = PlaybackState.PLAYING,
albumInfo = albumInfo,
copyright = "© 2018 Republic Records",
albumTracks = mapOf(
albumTracksMap = mapOf(
1 to listOf(tracks[1], tracks[5])
),
baseUrl = "",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import com.android.swingmusic.album.presentation.state.AlbumInfoWithGroupedTrack
import com.android.swingmusic.album.presentation.state.AlbumWithInfoState
import com.android.swingmusic.core.data.util.Resource
import com.android.swingmusic.core.domain.model.AlbumWithInfo
import com.android.swingmusic.player.domain.repository.PLayerRepository
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
Expand All @@ -17,7 +18,8 @@ import javax.inject.Inject

@HiltViewModel
class AlbumWithInfoViewModel @Inject constructor(
private val albumRepository: AlbumRepository
private val albumRepository: AlbumRepository,
private val pLayerRepository: PLayerRepository
) : ViewModel() {

private val _albumWithInfoState: MutableStateFlow<AlbumWithInfoState> =
Expand Down Expand Up @@ -123,6 +125,113 @@ class AlbumWithInfoViewModel @Inject constructor(
}
}

private fun toggleAlbumTrackFavorite(trackHash: String, isFavorite: Boolean) {
viewModelScope.launch {
// Optimistically update the Ui
_albumWithInfoState.value = _albumWithInfoState.value.copy(
orderedTracks = _albumWithInfoState.value.orderedTracks.map { track ->
if (track.trackHash == trackHash) {
track.copy(isFavorite = !isFavorite)
} else {
track
}
}
)

_albumWithInfoState.value = _albumWithInfoState.value.copy(
infoResource = Resource.Success(
AlbumInfoWithGroupedTracks(
albumInfo = _albumWithInfoState.value.infoResource.data?.albumInfo,
groupedTracks = _albumWithInfoState.value.infoResource.data?.groupedTracks?.mapValues { entry ->
entry.value.map { track ->
if (track.trackHash == trackHash) {
track.copy(isFavorite = !isFavorite)
} else {
track
}
}
} ?: emptyMap(),
copyright = _albumWithInfoState.value.infoResource.data?.copyright
)
)
)


val request = if (isFavorite) {
pLayerRepository.removeTrackFromFavorite(trackHash)
} else {
pLayerRepository.addTrackToFavorite(trackHash)
}

request.collectLatest {
when (it) {
is Resource.Loading -> {}

is Resource.Success -> {
_albumWithInfoState.value = _albumWithInfoState.value.copy(
orderedTracks = _albumWithInfoState.value.orderedTracks.map { track ->
if (track.trackHash == trackHash) {
track.copy(isFavorite = it.data ?: false)
} else {
track
}
}
)

_albumWithInfoState.value = _albumWithInfoState.value.copy(
infoResource = Resource.Success(
AlbumInfoWithGroupedTracks(
albumInfo = _albumWithInfoState.value.infoResource.data?.albumInfo,
groupedTracks = _albumWithInfoState.value.infoResource.data?.groupedTracks?.mapValues { entry ->
entry.value.map { track ->
if (track.trackHash == trackHash) {
track.copy(isFavorite = it.data ?: false)
} else {
track
}
}
} ?: emptyMap(),
copyright = _albumWithInfoState.value.infoResource.data?.copyright
)
)
)
}

is Resource.Error -> {
// Revert the optimistic updates in case of an error
_albumWithInfoState.value = _albumWithInfoState.value.copy(
orderedTracks = _albumWithInfoState.value.orderedTracks.map { track ->
if (track.trackHash == trackHash) {
track.copy(isFavorite = isFavorite)
} else {
track
}
}
)

_albumWithInfoState.value = _albumWithInfoState.value.copy(
infoResource = Resource.Success(
AlbumInfoWithGroupedTracks(
albumInfo = _albumWithInfoState.value.infoResource.data?.albumInfo,
groupedTracks = _albumWithInfoState.value.infoResource.data?.groupedTracks?.mapValues { entry ->
entry.value.map { track ->
if (track.trackHash == trackHash) {
track.copy(isFavorite = isFavorite)
} else {
track
}
}
} ?: emptyMap(),
copyright = _albumWithInfoState.value.infoResource.data?.copyright
)
)
)
}
}
}
}
}

fun onAlbumWithInfoUiEvent(event: AlbumWithInfoUiEvent) {
when (event) {
is AlbumWithInfoUiEvent.ResetState -> {
Expand Down Expand Up @@ -163,6 +272,10 @@ class AlbumWithInfoViewModel @Inject constructor(
toggleAlbumFavorite(event.albumHash, event.isFavorite)
}

is AlbumWithInfoUiEvent.OnToggleAlbumTrackFavorite -> {
toggleAlbumTrackFavorite(event.trackHash, event.favorite)
}

else -> {}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,9 @@ interface ArtistInfoUiEvent {
) : ArtistInfoUiEvent

data class OnRefresh(val artistHash: String) : ArtistInfoUiEvent

data class ToggleArtistTrackFavorite(
val trackHash: String,
val isFavorite: Boolean
) : ArtistInfoUiEvent
}
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ private fun ArtistInfo(
playbackState: PlaybackState,
currentTrack: Track?,
onToggleArtistFavorite: (String, Boolean) -> Unit,
onToggleTrackFavorite: (trackHash: String, isFavorite: Boolean, ) -> Unit,
onToggleTrackFavorite: (trackHash: String, isFavorite: Boolean) -> Unit,
onShuffle: () -> Unit,
onPlayAllTracks: () -> Unit,
onClickBack: () -> Unit,
Expand All @@ -121,6 +121,13 @@ private fun ArtistInfo(
var showTrackBottomSheet by remember { mutableStateOf(false) }
var clickedTrack: Track? by remember { mutableStateOf(null) }

LaunchedEffect(artistInfo.tracks) {
clickedTrack?.let { track ->
val updatedTrack = artistInfo.tracks.find { it.trackHash == track.trackHash }
clickedTrack = updatedTrack ?: track
}
}

Scaffold(
topBar = {
Row(
Expand Down Expand Up @@ -150,6 +157,7 @@ private fun ArtistInfo(
CustomTrackBottomSheet(
scope = scope,
sheetState = sheetState,
isFavorite = track.isFavorite,
clickedTrack = track,
baseUrl = baseUrl,
currentArtisthash = artistInfo.artist.artistHash,
Expand Down Expand Up @@ -199,8 +207,8 @@ private fun ArtistInfo(
onChooseArtist = { hash ->
onGotoArtist(hash)
},
onToggleTrackFavorite = { isFavorite, trackHash ->
onToggleTrackFavorite(isFavorite, trackHash)
onToggleTrackFavorite = { trackHash, isFavorite ->
onToggleTrackFavorite(trackHash, isFavorite)
}
)
}
Expand Down Expand Up @@ -1092,8 +1100,12 @@ fun ArtistInfoScreen(
ArtistInfoUiEvent.OnUpdateArtistHash(hash)
)
},
onToggleTrackFavorite = { trackHash ,isFavorite ->
// TODO: Call Artist Track fav toggle
onToggleTrackFavorite = { trackHash, isFavorite ->
artistInfoViewModel.onArtistInfoUiEvent(
ArtistInfoUiEvent.ToggleArtistTrackFavorite(
trackHash, isFavorite
)
)
}
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import androidx.compose.material3.SnackbarResult
import androidx.compose.material3.Text
import androidx.compose.material3.rememberModalBottomSheetState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
Expand All @@ -31,6 +32,7 @@ import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import com.android.swingmusic.artist.presentation.event.ArtistInfoUiEvent
import com.android.swingmusic.artist.presentation.viewmodel.ArtistInfoViewModel
import com.android.swingmusic.common.presentation.navigator.CommonNavigator
import com.android.swingmusic.core.domain.model.Album
Expand Down Expand Up @@ -72,6 +74,13 @@ private fun ViewAll(
var showTrackBottomSheet by remember { mutableStateOf(false) }
var clickedTrack: Track? by remember { mutableStateOf(null) }

LaunchedEffect(allTracks) {
clickedTrack?.let { track ->
val updatedTrack = allTracks?.find { it.trackHash == track.trackHash }
clickedTrack = updatedTrack ?: track
}
}

Scaffold { padding ->
Scaffold(
modifier = Modifier.padding(padding),
Expand Down Expand Up @@ -99,6 +108,7 @@ private fun ViewAll(
CustomTrackBottomSheet(
scope = scope,
sheetState = sheetState,
isFavorite = track.isFavorite,
clickedTrack = track,
baseUrl = baseUrl,
currentArtisthash = artistHash,
Expand Down Expand Up @@ -341,8 +351,12 @@ fun ViewAllScreen(
onGotoArtist = { hash ->
commonNavigator.gotoArtistInfo(hash)
},
onToggleTrackFavorite = { isFavorite, trackHash ->
// TODO: Call ViewAll Track fav toggle
onToggleTrackFavorite = { trackHash, isFavorite ->
artistInfoViewModel.onArtistInfoUiEvent(
ArtistInfoUiEvent.ToggleArtistTrackFavorite(
trackHash, isFavorite
)
)
}
)
}
Expand Down
Loading

0 comments on commit 72c0869

Please sign in to comment.