From 184610fa2053488e8727634e9be2ddfec51d3006 Mon Sep 17 00:00:00 2001 From: Antoine Jaury Date: Fri, 26 Jun 2026 14:31:04 +0200 Subject: [PATCH] refactor: simplify PlayerViewModel initialization by loading record via DI --- .../ajaury/gwenedeg/player/ui/PlayerScreen.kt | 6 ++--- .../player/ui/viewmodel/PlayerViewModel.kt | 26 ++++++++++++++----- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/shared/src/commonMain/kotlin/fr/ajaury/gwenedeg/player/ui/PlayerScreen.kt b/shared/src/commonMain/kotlin/fr/ajaury/gwenedeg/player/ui/PlayerScreen.kt index d17a8ab..328f97d 100644 --- a/shared/src/commonMain/kotlin/fr/ajaury/gwenedeg/player/ui/PlayerScreen.kt +++ b/shared/src/commonMain/kotlin/fr/ajaury/gwenedeg/player/ui/PlayerScreen.kt @@ -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() } diff --git a/shared/src/commonMain/kotlin/fr/ajaury/gwenedeg/player/ui/viewmodel/PlayerViewModel.kt b/shared/src/commonMain/kotlin/fr/ajaury/gwenedeg/player/ui/viewmodel/PlayerViewModel.kt index f58b4b9..2203902 100644 --- a/shared/src/commonMain/kotlin/fr/ajaury/gwenedeg/player/ui/viewmodel/PlayerViewModel.kt +++ b/shared/src/commonMain/kotlin/fr/ajaury/gwenedeg/player/ui/viewmodel/PlayerViewModel.kt @@ -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 = 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) {