Skip to content

Commit

Permalink
#242 [fix] suspend fuc 수정
Browse files Browse the repository at this point in the history
  • Loading branch information
KWY0218 committed Jun 25, 2023
1 parent 308d73e commit dc64ab3
Show file tree
Hide file tree
Showing 4 changed files with 80 additions and 37 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

package hous.release.feature.todo.detail

import androidx.activity.compose.BackHandler
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
Expand All @@ -13,12 +14,14 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.ModalBottomSheetLayout
import androidx.compose.material.ModalBottomSheetValue
import androidx.compose.material.Text
import androidx.compose.material.rememberModalBottomSheetState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
Expand All @@ -30,6 +33,8 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.compose.ExperimentalLifecycleComposeApi
import androidx.lifecycle.compose.collectAsStateWithLifecycle
Expand Down Expand Up @@ -105,6 +110,12 @@ fun TodoDetailScreen(
)
}

BackHandler(enabled = bottomSheetState.isVisible) {
coroutineScope.launch {
bottomSheetState.hide()
}
}

LaunchedEffect(true) {
todoDetailViewModel.todoEvent
.flowWithLifecycle(lifecycleOwner.lifecycle)
Expand All @@ -114,8 +125,23 @@ fun TodoDetailScreen(
.launchIn(lifecycleOwner.lifecycleScope)
}

DisposableEffect(lifecycleOwner) {
val observer = LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_RESUME) {
todoDetailViewModel.rollbackUiData()
}
}

lifecycleOwner.lifecycle.addObserver(observer)

onDispose {
lifecycleOwner.lifecycle.removeObserver(observer)
}
}

ModalBottomSheetLayout(
sheetState = bottomSheetState,
sheetShape = RoundedCornerShape(topStart = 10.dp, topEnd = 10.dp),
sheetContent = {
BottomSheetContent(
selected = selected,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,10 +66,12 @@ class TodoDetailViewModel @Inject constructor(
val selectedHomies: StateFlow<String> =
_selectedHomiesString.asStateFlow()

init {
setHomies()
setSelectableWeek()
fetchFilteredTodo()
fun rollbackUiData() {
viewModelScope.launch {
setSelectableWeek()
fetchHomies()
getFilteredTodo(null, null)
}
}

private fun transformSelectedDaysToString() {
Expand Down Expand Up @@ -100,44 +102,45 @@ class TodoDetailViewModel @Inject constructor(
.filter { homy -> homy.isSelected }
.map { homy -> homy.id }
.nullIfEmpty()

getFilteredTodoUseCase(dayOfWeeks, onboardingIds)
.onSuccess { filteredTodo ->
transformSelectedHomiesToString()
transformSelectedDaysToString()
originalTodos.value = filteredTodo.todos
_filteredTodo.value = if (searchText.value.isNotEmpty()) filteredTodo.copy(
todos = searchRuleUseCase(
searchText.value,
filteredTodo.todos
)
) else filteredTodo
}
.onFailure {
Timber.e(it.message)
}
getFilteredTodo(dayOfWeeks, onboardingIds)
}
}

private suspend fun getFilteredTodo(dayOfWeeks: List<String>?, onboardingIds: List<Int>?) {
getFilteredTodoUseCase(dayOfWeeks, onboardingIds)
.onSuccess { filteredTodo ->
transformSelectedHomiesToString()
transformSelectedDaysToString()
originalTodos.value = filteredTodo.todos
_filteredTodo.value = if (searchText.value.isNotEmpty()) filteredTodo.copy(
todos = searchRuleUseCase(
searchText.value,
filteredTodo.todos
)
) else filteredTodo
}
.onFailure {
Timber.e(it.message)
}
}

private fun setSelectableWeek() {
_selectedDayOfWeeks.value =
WEEK.map { dayOfWeek -> SelectableDayOfWeek(dayOfWeek = dayOfWeek) }
}

private fun setHomies() {
viewModelScope.launch {
getToDoUsersUseCase().collect { apiResult ->
when (apiResult) {
is ApiResult.Success -> _homies.value = apiResult.data.map { homy ->
SelectableHomy(
id = homy.onBoardingId,
name = homy.nickname,
homyType = homy.homyType
)
}
is ApiResult.Error -> Timber.e(apiResult.msg)
is ApiResult.Empty -> Timber.i("empty View")
private suspend fun fetchHomies() {
getToDoUsersUseCase().collect { apiResult ->
when (apiResult) {
is ApiResult.Success -> _homies.value = apiResult.data.map { homy ->
SelectableHomy(
id = homy.onBoardingId,
name = homy.nickname,
homyType = homy.homyType
)
}
is ApiResult.Error -> Timber.e(apiResult.msg)
is ApiResult.Empty -> Timber.i("empty View")
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import hous.release.domain.usecase.todo.GetToDoUsersUseCase
import hous.release.domain.usecase.todo.GetTodoDetailUseCase
import hous.release.testing.CoroutinesTestExtension
import hous.release.testing.callPrivateFunc
import hous.release.testing.callSuspendPrivateFunc
import io.mockk.coEvery
import io.mockk.mockk
import kotlinx.coroutines.ExperimentalCoroutinesApi
Expand Down Expand Up @@ -179,7 +180,7 @@ class TodoDetailViewModelTest {
}

// when
todoDetailViewModel.callPrivateFunc("setHomies")
todoDetailViewModel.callSuspendPrivateFunc("fetchHomies")

// then
assertThat(todoDetailViewModel.homies.value).isEqualTo(
Expand Down Expand Up @@ -224,7 +225,7 @@ class TodoDetailViewModelTest {
)
)
}
todoDetailViewModel.callPrivateFunc("setHomies")
todoDetailViewModel.callSuspendPrivateFunc("fetchHomies")

// when
todoDetailViewModel.selectHomy(0)
Expand Down Expand Up @@ -272,7 +273,7 @@ class TodoDetailViewModelTest {
)
)
}
todoDetailViewModel.callPrivateFunc("setHomies")
todoDetailViewModel.callSuspendPrivateFunc("fetchHomies")
todoDetailViewModel.selectHomy(0)

// when
Expand Down Expand Up @@ -314,7 +315,7 @@ class TodoDetailViewModelTest {
)
)
}
todoDetailViewModel.callPrivateFunc("setHomies")
todoDetailViewModel.callSuspendPrivateFunc("fetchHomies")
todoDetailViewModel.selectHomy(0)
todoDetailViewModel.selectHomy(1)
todoDetailViewModel.selectHomy(2)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,22 @@
package hous.release.testing

import kotlin.reflect.full.callSuspend
import kotlin.reflect.full.declaredMemberFunctions
import kotlin.reflect.full.memberFunctions
import kotlin.reflect.full.memberProperties
import kotlin.reflect.jvm.isAccessible

/*
* [Class].callSuspendFunc(`private 메서드명`)
* ex ) userInputViewModel.callSuspendFunc("selectedHashtags")
*
* */
suspend fun Any.callSuspendPrivateFunc(methodName: String, vararg args: Any?): Any? =
this::class.memberFunctions.find { it.name == methodName }?.also {
it.isAccessible = true
return it.callSuspend(this, *args)
}

/*
* [Class].callPrivateFunc(`private 메서드명`)
* ex ) userInputViewModel.callPrivateFunc("selectedHashtags")
Expand Down

0 comments on commit dc64ab3

Please sign in to comment.