Skip to content

Commit 85d2487

Browse files
committed
♻️ groupListFlow를 ViewModel에서 관측하고 상태를 저장할 수 있도록 변경
1 parent 152fa2a commit 85d2487

File tree

5 files changed

+43
-24
lines changed

5 files changed

+43
-24
lines changed

presentation/src/main/java/com/whyranoid/presentation/community/CommunityItemFragment.kt

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,12 @@ import android.os.Bundle
55
import android.view.View
66
import androidx.core.view.isVisible
77
import androidx.fragment.app.viewModels
8-
import androidx.lifecycle.lifecycleScope
98
import androidx.navigation.fragment.findNavController
109
import com.whyranoid.presentation.R
1110
import com.whyranoid.presentation.base.BaseFragment
1211
import com.whyranoid.presentation.databinding.FragmentCommunityItemBinding
13-
import com.whyranoid.presentation.model.toGroupInfoUiModel
1412
import com.whyranoid.presentation.util.repeatWhenUiStarted
1513
import dagger.hilt.android.AndroidEntryPoint
16-
import kotlinx.coroutines.launch
1714

1815
@AndroidEntryPoint
1916
internal class CommunityItemFragment :
@@ -54,7 +51,7 @@ internal class CommunityItemFragment :
5451
}
5552

5653
private fun observeState() {
57-
repeatWhenUiStarted {
54+
viewLifecycleOwner.repeatWhenUiStarted {
5855
viewModel.eventFlow.collect { event ->
5956
handleEvent(event)
6057
}
@@ -65,7 +62,7 @@ internal class CommunityItemFragment :
6562
when (event) {
6663
is Event.CategoryItemClick -> {
6764
val action =
68-
CommunityFragmentDirections.actionCommunityFragmentToGroupDetailFragment(event.groupInfo.toGroupInfoUiModel())
65+
CommunityFragmentDirections.actionCommunityFragmentToGroupDetailFragment(event.groupInfo)
6966
findNavController().navigate(action)
7067
}
7168
}
@@ -78,8 +75,8 @@ internal class CommunityItemFragment :
7875
}
7976
binding.rvCommunity.adapter = myGroupAdapter
8077

81-
viewLifecycleOwner.lifecycleScope.launch {
82-
viewModel.getMyGroupListUseCase().collect { groupList ->
78+
viewLifecycleOwner.repeatWhenUiStarted {
79+
viewModel.myGroupList.collect { groupList ->
8380
removeShimmer()
8481
myGroupAdapter.submitList(groupList.sortedBy { it.name })
8582
}
@@ -88,10 +85,8 @@ internal class CommunityItemFragment :
8885

8986
private fun removeShimmer() {
9087
binding.shimmerCommunity.apply {
91-
if (isShimmerStarted) {
92-
stopShimmer()
93-
isVisible = false
94-
}
88+
stopShimmer()
89+
isVisible = false
9590
}
9691
}
9792

presentation/src/main/java/com/whyranoid/presentation/community/CommunityViewModel.kt

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,35 @@ package com.whyranoid.presentation.community
22

33
import androidx.lifecycle.ViewModel
44
import androidx.lifecycle.viewModelScope
5-
import com.whyranoid.domain.model.GroupInfo
65
import com.whyranoid.domain.usecase.GetMyGroupListUseCase
6+
import com.whyranoid.presentation.model.GroupInfoUiModel
7+
import com.whyranoid.presentation.model.toGroupInfoUiModel
78
import dagger.hilt.android.lifecycle.HiltViewModel
89
import kotlinx.coroutines.flow.MutableSharedFlow
10+
import kotlinx.coroutines.flow.MutableStateFlow
911
import kotlinx.coroutines.flow.SharedFlow
12+
import kotlinx.coroutines.flow.StateFlow
1013
import kotlinx.coroutines.flow.asSharedFlow
14+
import kotlinx.coroutines.flow.asStateFlow
15+
import kotlinx.coroutines.flow.launchIn
16+
import kotlinx.coroutines.flow.onEach
1117
import kotlinx.coroutines.launch
1218
import javax.inject.Inject
1319

1420
@HiltViewModel
1521
class CommunityViewModel @Inject constructor(
16-
val getMyGroupListUseCase: GetMyGroupListUseCase
22+
getMyGroupListUseCase: GetMyGroupListUseCase
1723
) : ViewModel() {
1824

25+
private val _myGroupList = MutableStateFlow<List<GroupInfoUiModel>>(emptyList())
26+
val myGroupList: StateFlow<List<GroupInfoUiModel>>
27+
get() = _myGroupList.asStateFlow()
28+
1929
private val _eventFlow = MutableSharedFlow<Event>()
2030
val eventFlow: SharedFlow<Event>
2131
get() = _eventFlow.asSharedFlow()
2232

23-
fun onCategoryItemClicked(groupInfo: GroupInfo) {
33+
fun onCategoryItemClicked(groupInfo: GroupInfoUiModel) {
2434
emitEvent(Event.CategoryItemClick(groupInfo))
2535
}
2636

@@ -29,4 +39,12 @@ class CommunityViewModel @Inject constructor(
2939
_eventFlow.emit(event)
3040
}
3141
}
42+
43+
init {
44+
getMyGroupListUseCase().onEach { groupInfoList ->
45+
_myGroupList.value = groupInfoList.map { groupInfo ->
46+
groupInfo.toGroupInfoUiModel()
47+
}
48+
}.launchIn(viewModelScope)
49+
}
3250
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.whyranoid.presentation.community
22

3-
import com.whyranoid.domain.model.GroupInfo
3+
import com.whyranoid.presentation.model.GroupInfoUiModel
44

55
sealed class Event {
6-
data class CategoryItemClick(val groupInfo: GroupInfo) : Event()
6+
data class CategoryItemClick(val groupInfo: GroupInfoUiModel) : Event()
77
}

presentation/src/main/java/com/whyranoid/presentation/community/MyGroupAdapter.kt

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,25 +5,31 @@ import android.view.ViewGroup
55
import androidx.recyclerview.widget.DiffUtil
66
import androidx.recyclerview.widget.ListAdapter
77
import androidx.recyclerview.widget.RecyclerView
8-
import com.whyranoid.domain.model.GroupInfo
98
import com.whyranoid.presentation.databinding.MyGroupItemBinding
9+
import com.whyranoid.presentation.model.GroupInfoUiModel
1010

11-
class MyGroupAdapter(private val onClickListener: (GroupInfo) -> Unit) :
12-
ListAdapter<GroupInfo, MyGroupAdapter.MyGroupViewHolder>(diffUtil) {
11+
class MyGroupAdapter(private val onClickListener: (GroupInfoUiModel) -> Unit) :
12+
ListAdapter<GroupInfoUiModel, MyGroupAdapter.MyGroupViewHolder>(diffUtil) {
1313

1414
companion object {
15-
val diffUtil = object : DiffUtil.ItemCallback<GroupInfo>() {
16-
override fun areItemsTheSame(oldItem: GroupInfo, newItem: GroupInfo): Boolean =
15+
val diffUtil = object : DiffUtil.ItemCallback<GroupInfoUiModel>() {
16+
override fun areItemsTheSame(
17+
oldItem: GroupInfoUiModel,
18+
newItem: GroupInfoUiModel
19+
): Boolean =
1720
oldItem.groupId == newItem.groupId
1821

19-
override fun areContentsTheSame(oldItem: GroupInfo, newItem: GroupInfo): Boolean =
22+
override fun areContentsTheSame(
23+
oldItem: GroupInfoUiModel,
24+
newItem: GroupInfoUiModel
25+
): Boolean =
2026
oldItem == newItem
2127
}
2228
}
2329

2430
class MyGroupViewHolder(private val binding: MyGroupItemBinding) :
2531
RecyclerView.ViewHolder(binding.root) {
26-
fun bind(groupInfo: GroupInfo) {
32+
fun bind(groupInfo: GroupInfoUiModel) {
2733
binding.groupInfo = groupInfo
2834
}
2935
}

presentation/src/main/res/layout/my_group_item.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
<variable
99
name="groupInfo"
10-
type="com.whyranoid.domain.model.GroupInfo" />
10+
type="com.whyranoid.presentation.model.GroupInfoUiModel" />
1111
</data>
1212

1313
<androidx.constraintlayout.widget.ConstraintLayout

0 commit comments

Comments
 (0)