refactor: simplify PlayerViewModel initialization by loading record via DI

This commit is contained in:
2026-06-26 14:31:04 +02:00
parent a9d3402d79
commit 184610fa20
2 changed files with 22 additions and 10 deletions
@@ -29,18 +29,18 @@ import fr.ajaury.gwenedeg.player.ui.viewmodel.PlayerViewModel
import fr.ajaury.gwenedeg.subtitle.domain.SubtitleLine
import fr.ajaury.gwenedeg.theme.GwenedegTheme
import org.koin.compose.viewmodel.koinViewModel
import org.koin.core.parameter.parametersOf
import kotlin.time.Duration.Companion.milliseconds
@Composable
fun PlayerScreen(
recordId: Int,
onBackClicked: () -> Unit = {},
viewModel: PlayerViewModel = koinViewModel(),
viewModel: PlayerViewModel = koinViewModel(key = "$recordId") { parametersOf(recordId) },
) {
val uiState by viewModel.uiState.collectAsStateWithLifecycle()
DisposableEffect(recordId) {
viewModel.loadRecord(recordId = recordId)
DisposableEffect(Unit) {
onDispose {
viewModel.stop()
}
@@ -13,13 +13,14 @@ import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.WhileSubscribed
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.onStart
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.launch
import kotlin.time.Duration.Companion.milliseconds
import kotlin.time.Duration.Companion.seconds
class PlayerViewModel(
private val recordId: Int,
private val recordRepository: RecordRepository,
private val playbackRepository: PlaybackRepository,
private val audioSessionManager: AudioSessionManager,
@@ -27,6 +28,8 @@ class PlayerViewModel(
) : ViewModel() {
private val recordTitle = MutableStateFlow("")
private var recordLoaded = false
val uiState: StateFlow<PlayerUiState> = combine(
recordTitle,
playbackRepository.playbackState,
@@ -41,17 +44,26 @@ class PlayerViewModel(
subtitleLines = subtitle.lines,
currentSubtitleIndex = currentSubtitleIndex,
)
}.stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(5.seconds),
initialValue = PlayerUiState(),
)
}
.onStart { loadRecord() }
.stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(5.seconds),
initialValue = PlayerUiState(),
)
init {
audioSessionManager.activate()
}
fun loadRecord(recordId: Int) {
private fun loadRecord() {
logger.debug("Loading record $recordId")
if (recordLoaded) {
logger.debug("Record $recordId already loaded")
return
}
recordLoaded = true
viewModelScope.launch {
val record = recordRepository.getRecord(id = recordId)
if (record == null) {