Skip to content

Commit

Permalink
[RBP-26] 화면 초기화 방식 개선 연습
Browse files Browse the repository at this point in the history
  • Loading branch information
cgpathos committed May 2, 2024
1 parent ed7138d commit 41012ed
Show file tree
Hide file tree
Showing 6 changed files with 39 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package today.pathos.android.portfolio.data.repository

import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.withContext
import today.pathos.android.portfolio.data.datasource.remote.NetworkDataSource
import today.pathos.android.portfolio.data.datasource.remote.dto.res.ResCharacter
Expand All @@ -13,6 +14,10 @@ class NetworkFameRepository @Inject constructor(
private val dataSource: NetworkDataSource,
@IoDispatcher private val dispatcher: CoroutineDispatcher,
) : FameRepository {
override fun getFameCharacterListFlow(): Flow<List<Character>> {
TODO("Not yet implemented")
}

override suspend fun getFameCharacterList(): List<Character> = withContext(dispatcher) {
dataSource.getCharacterFame().rows.toEntity()
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package today.pathos.android.portfolio.data.repository

import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.withContext
import today.pathos.android.portfolio.data.datasource.local.LocalDataSource
import today.pathos.android.portfolio.data.datasource.local.db.table.FameTbl
Expand All @@ -15,6 +18,10 @@ class OfflineFirstFameRepository @Inject constructor(
private val networkDataSource: NetworkDataSource,
@IoDispatcher private val dispatcher: CoroutineDispatcher,
) : FameRepository {
override fun getFameCharacterListFlow(): Flow<List<Character>> = flow {
emit(localDataSource.getFameList().toEntity())
}.flowOn(dispatcher)

override suspend fun getFameCharacterList(): List<Character> = withContext(dispatcher) {
if (localDataSource.isFameListEmpty()) {
val result = networkDataSource.getCharacterFame().rows
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package today.pathos.android.portfolio.domain.repository

import kotlinx.coroutines.flow.Flow
import today.pathos.android.portfolio.entity.Character

interface FameRepository {
fun getFameCharacterListFlow(): Flow<List<Character>>
suspend fun getFameCharacterList(): List<Character>
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ fun MainRoute(
modifier: Modifier = Modifier,
viewModel: MainViewModel = hiltViewModel(),
) {
val state by viewModel.state.collectAsState()
val state by viewModel.newStyleState.collectAsState()

MainScreen(
state = state,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ fun SplashScreen(
}
}

@Preview
@Preview(showBackground = true)
@Composable
fun SplashScreenPreview() {
SplashScreen()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,22 @@
package today.pathos.android.portfolio.presentation.viewmodel

import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.flow.update
import today.pathos.android.portfolio.domain.repository.FameRepository
import today.pathos.android.portfolio.entity.Character
import today.pathos.android.portfolio.presentation.viewmodel.state.MainEffectProvider
import javax.inject.Inject

@OptIn(ExperimentalCoroutinesApi::class)
@HiltViewModel
class MainViewModel @Inject constructor(
mainEffectProvider: MainEffectProvider,
Expand All @@ -18,6 +26,21 @@ class MainViewModel @Inject constructor(
private val _state = MutableStateFlow(MainUiState.EMPTY_STATE)
val state = _state.asStateFlow()

val newStyleState: StateFlow<MainUiState> =
repository.getFameCharacterListFlow()
.flatMapLatest {
flowOf(
MainUiState(
fameTop5List = it.take(5),
fameList = it.drop(5)
)
)
}.stateIn(
scope = viewModelScope,
started = SharingStarted.Eagerly,
initialValue = MainUiState.EMPTY_STATE
)

init {
launchWithMainState {
val fameList = repository.getFameCharacterList()
Expand Down

0 comments on commit 41012ed

Please sign in to comment.