Coverage Summary for Class: ClickTrackListViewModelImpl (com.vsevolodganin.clicktrack.list)

Class Method, % Branch, % Line, % Instruction, %
ClickTrackListViewModelImpl 0% (0/8) 0% (0/2) 0% (0/25) 0% (0/155)
ClickTrackListViewModelImpl$1 0% (0/1) 0% (0/3) 0% (0/23)
ClickTrackListViewModelImpl$1$4 0% (0/1) 0% (0/1) 0% (0/6)
ClickTrackListViewModelImpl$1$invokeSuspend$$inlined$map$1 0% (0/2)
ClickTrackListViewModelImpl$1$invokeSuspend$$inlined$map$1$2 0% (0/1)
ClickTrackListViewModelImpl$1$invokeSuspend$$inlined$map$1$2$1
ClickTrackListViewModelImpl$onAddClick$1 0% (0/1) 0% (0/5) 0% (0/69)
ClickTrackListViewModelImpl$onAddClick$1$1 0% (0/1) 0% (0/1) 0% (0/11)
ClickTrackListViewModelImpl$onAddClick$1$suggestedNewClickTrackName$1 0% (0/1) 0% (0/1) 0% (0/14)
ClickTrackListViewModelImpl$onItemRemove$1 0% (0/1) 0% (0/1) 0% (0/6)
ClickTrackListViewModelImpl$special$$inlined$registerSaveStateFor$1 0% (0/1)
Total 0% (0/18) 0% (0/2) 0% (0/37) 0% (0/284)


 package com.vsevolodganin.clicktrack.list
 
 import com.arkivanov.decompose.ComponentContext
 import com.vsevolodganin.clicktrack.ScreenConfiguration
 import com.vsevolodganin.clicktrack.ScreenStackNavigation
 import com.vsevolodganin.clicktrack.common.NewClickTrackNameSuggester
 import com.vsevolodganin.clicktrack.drawer.DrawerNavigation
 import com.vsevolodganin.clicktrack.generated.resources.MR
 import com.vsevolodganin.clicktrack.model.ClickTrack
 import com.vsevolodganin.clicktrack.model.ClickTrackId
 import com.vsevolodganin.clicktrack.model.ClickTrackWithDatabaseId
 import com.vsevolodganin.clicktrack.model.DefaultCue
 import com.vsevolodganin.clicktrack.storage.ClickTrackRepository
 import com.vsevolodganin.clicktrack.utils.collection.immutable.move
 import com.vsevolodganin.clicktrack.utils.decompose.consumeSavedState
 import com.vsevolodganin.clicktrack.utils.decompose.coroutineScope
 import com.vsevolodganin.clicktrack.utils.decompose.pushIfUnique
 import com.vsevolodganin.clicktrack.utils.decompose.registerSaveStateFor
 import com.vsevolodganin.clicktrack.utils.resources.StringResolver
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.StateFlow
 import kotlinx.coroutines.flow.map
 import kotlinx.coroutines.flow.update
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.withContext
 import me.tatarka.inject.annotations.Assisted
 import me.tatarka.inject.annotations.Inject
 
 @Inject
 class ClickTrackListViewModelImpl(
     @Assisted componentContext: ComponentContext,
     private val stringResolver: StringResolver,
     private val navigation: ScreenStackNavigation,
     private val drawerNavigation: DrawerNavigation,
     private val clickTrackRepository: ClickTrackRepository,
     private val newClickTrackNameSuggester: NewClickTrackNameSuggester,
 ) : ClickTrackListViewModel, ComponentContext by componentContext {
     private val scope = coroutineScope()
     private val _state: MutableStateFlow<ClickTrackListState> = MutableStateFlow(consumeSavedState() ?: ClickTrackListState(emptyList()))
 
     override val state: StateFlow<ClickTrackListState> = _state
 
     init {
         registerSaveStateFor(state)
 
         scope.launch {
             clickTrackRepository.getAll()
                 .map(::ClickTrackListState)
                 .collect { _state.value = it }
         }
     }
 
     override fun onAddClick() {
         scope.launch {
             val suggestedNewClickTrackName = newClickTrackNameSuggester.suggest(
                 withContext(Dispatchers.Main) {
                     stringResolver.resolve(MR.strings.general_unnamed_click_track_template)
                 },
             )
             val newClickTrack = defaultNewClickTrack(suggestedNewClickTrackName)
             val newClickTrackId = clickTrackRepository.insert(newClickTrack)
             withContext(Dispatchers.Main) {
                 navigation.pushIfUnique(ScreenConfiguration.EditClickTrack(id = newClickTrackId, isInitialEdit = true))
             }
         }
     }
 
     override fun onItemClick(id: ClickTrackId.Database) = navigation.pushIfUnique(ScreenConfiguration.PlayClickTrack(id = id))
 
     override fun onItemRemove(id: ClickTrackId.Database) {
         scope.launch {
             clickTrackRepository.remove(id)
         }
     }
 
     override fun onMenuClick() = drawerNavigation.openDrawer()
 
     override fun onItemMove(from: Int, to: Int) {
         _state.update {
             it.copy(items = it.items.move(from, to))
         }
     }
 
     override fun onItemMoveFinished() {
         clickTrackRepository.updateOrdering(_state.value.items.map(ClickTrackWithDatabaseId::id))
     }
 
     private fun defaultNewClickTrack(suggestedNewClickTrackName: String) = ClickTrack(
         name = suggestedNewClickTrackName,
         cues = listOf(DefaultCue),
         loop = true,
     )
 }