Skip to content

Commit d34e8cd

Browse files
authored
🔀 #61 from boostcampwm-2022/feat/dynamicUid
본인 기기에 저장된 Uid를 기반으로 데이터를 불러오도록 수정
2 parents 69b2a2c + efddf47 commit d34e8cd

File tree

8 files changed

+92
-71
lines changed

8 files changed

+92
-71
lines changed
Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
package com.whyranoid.domain.usecase
22

3+
import com.whyranoid.domain.repository.AccountRepository
34
import com.whyranoid.domain.repository.GroupRepository
45
import javax.inject.Inject
56

67
class CreateGroupUseCase @Inject constructor(
8+
private val accountRepository: AccountRepository,
79
private val groupRepository: GroupRepository
810
) {
9-
// TODO AccountRepository에서 uid를 가져와야함.
1011
suspend operator fun invoke(groupName: String, introduce: String, rules: List<String>): Boolean {
11-
return groupRepository.createGroup(groupName, introduce, rules = rules, uid = "hsjeon")
12+
val uid = accountRepository.getUid()
13+
return groupRepository.createGroup(groupName, introduce, rules = rules, uid = uid)
1214
}
1315
}

domain/src/main/java/com/whyranoid/domain/usecase/CreateRecruitPostUseCase.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,10 @@ class CreateRecruitPostUseCase @Inject constructor(
88
private val postRepository: PostRepository,
99
private val accountRepository: AccountRepository
1010
) {
11-
// TODO : accountRepository에서 User를 가져오도록 수정
1211
suspend operator fun invoke(
13-
authorUid: String,
1412
groupUid: String
1513
): Boolean {
16-
return postRepository.createRecruitPost(authorUid, groupUid)
14+
val uid = accountRepository.getUid()
15+
return postRepository.createRecruitPost(uid, groupUid)
1716
}
1817
}

domain/src/main/java/com/whyranoid/domain/usecase/GetMyGroupListUseCase.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ class GetMyGroupListUseCase @Inject constructor(
1010
private val groupRepository: GroupRepository,
1111
private val accountRepository: AccountRepository
1212
) {
13-
// TODO accountRepository에서 uid를 받아온 후 동작하도록 수정
14-
operator fun invoke(): Flow<List<GroupInfo>> {
15-
return groupRepository.getMyGroupListFlow("hsjeon")
13+
suspend operator fun invoke(): Flow<List<GroupInfo>> {
14+
val uid = accountRepository.getUid()
15+
return groupRepository.getMyGroupListFlow(uid)
1616
}
1717
}

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

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@ 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
89
import androidx.navigation.fragment.findNavController
910
import com.whyranoid.presentation.R
1011
import com.whyranoid.presentation.base.BaseFragment
1112
import com.whyranoid.presentation.databinding.FragmentCommunityItemBinding
1213
import com.whyranoid.presentation.util.repeatWhenUiStarted
1314
import dagger.hilt.android.AndroidEntryPoint
15+
import kotlinx.coroutines.launch
1416

1517
@AndroidEntryPoint
1618
internal class CommunityItemFragment :
@@ -39,7 +41,6 @@ internal class CommunityItemFragment :
3941
// TODO : 카테고리 별 다른 Shimmer Layout 생성
4042
when (category) {
4143
CommunityCategory.BOARD -> {
42-
// TODO: Adapter 설정
4344
setPostAdapter()
4445
}
4546
CommunityCategory.MY_GROUP -> {
@@ -70,14 +71,17 @@ internal class CommunityItemFragment :
7071
}
7172

7273
private fun setPostAdapter() {
73-
// TODO uid를 데이터 소스에서 가져오도록 수정
74-
val postAdapter = PostAdapter("hsjeon")
75-
binding.rvCommunity.adapter = postAdapter
74+
viewLifecycleOwner.lifecycleScope.launch {
75+
val uid = viewModel.getMyUseCase()
7676

77-
viewLifecycleOwner.repeatWhenUiStarted {
78-
viewModel.postList.collect { postList ->
79-
removeShimmer()
80-
postAdapter.submitList(postList)
77+
val postAdapter = PostAdapter(uid)
78+
binding.rvCommunity.adapter = postAdapter
79+
80+
viewLifecycleOwner.repeatWhenUiStarted {
81+
viewModel.postList.collect { postList ->
82+
removeShimmer()
83+
postAdapter.submitList(postList)
84+
}
8185
}
8286
}
8387
}

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

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import androidx.lifecycle.viewModelScope
55
import com.whyranoid.domain.model.Post
66
import com.whyranoid.domain.usecase.GetMyGroupListUseCase
77
import com.whyranoid.domain.usecase.GetPostsUseCase
8+
import com.whyranoid.domain.usecase.GetUidUseCase
89
import com.whyranoid.presentation.model.GroupInfoUiModel
910
import com.whyranoid.presentation.model.toGroupInfoUiModel
1011
import dagger.hilt.android.lifecycle.HiltViewModel
@@ -22,7 +23,8 @@ import javax.inject.Inject
2223
@HiltViewModel
2324
class CommunityViewModel @Inject constructor(
2425
getMyGroupListUseCase: GetMyGroupListUseCase,
25-
getPostsUseCase: GetPostsUseCase
26+
getPostsUseCase: GetPostsUseCase,
27+
val getMyUseCase: GetUidUseCase
2628
) : ViewModel() {
2729

2830
private val _postList = MutableStateFlow<List<Post>>(emptyList())
@@ -48,11 +50,13 @@ class CommunityViewModel @Inject constructor(
4850
}
4951

5052
init {
51-
getMyGroupListUseCase().onEach { groupInfoList ->
52-
_myGroupList.value = groupInfoList.map { groupInfo ->
53-
groupInfo.toGroupInfoUiModel()
54-
}
55-
}.launchIn(viewModelScope)
53+
viewModelScope.launch {
54+
getMyGroupListUseCase().onEach { groupInfoList ->
55+
_myGroupList.value = groupInfoList.map { groupInfo ->
56+
groupInfo.toGroupInfoUiModel()
57+
}
58+
}.launchIn(this)
59+
}
5660

5761
getPostsUseCase().onEach { postList ->
5862
_postList.value = postList

presentation/src/main/java/com/whyranoid/presentation/community/group/detail/GroupDetailFragment.kt

Lines changed: 47 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import android.os.Bundle
44
import android.view.View
55
import android.widget.Toast
66
import androidx.fragment.app.viewModels
7+
import androidx.lifecycle.lifecycleScope
78
import androidx.navigation.fragment.findNavController
89
import androidx.navigation.fragment.navArgs
910
import com.google.android.material.snackbar.Snackbar
@@ -12,6 +13,7 @@ import com.whyranoid.presentation.base.BaseFragment
1213
import com.whyranoid.presentation.databinding.FragmentGroupDetailBinding
1314
import com.whyranoid.presentation.util.repeatWhenUiStarted
1415
import dagger.hilt.android.AndroidEntryPoint
16+
import kotlinx.coroutines.launch
1517

1618
@AndroidEntryPoint
1719
internal class GroupDetailFragment :
@@ -30,38 +32,46 @@ internal class GroupDetailFragment :
3032
}
3133

3234
private fun setupMenu() {
33-
with(binding.topAppBar) {
34-
// TODO : uid를 DataStore에서 가져올 수 있도록 변경
35-
if (viewModel.isLeader) inflateMenu(R.menu.group_detail_menu)
35+
viewLifecycleOwner.lifecycleScope.launch {
36+
with(binding.topAppBar) {
37+
val myUid = viewModel.getUidUseCase()
3638

37-
setOnMenuItemClickListener { menuItem ->
38-
when (menuItem.itemId) {
39-
R.id.setting_group -> {
40-
// TODO : BottomSheetDialog Material Theme 적용
41-
val dialog = GroupSettingDialog(
42-
// TODO : 그룹 수정으로 이동
43-
onEditButtonClickListener = {
44-
val action =
45-
GroupDetailFragmentDirections.actionGroupDetailFragmentToEditGroupFragment(
46-
groupDetailArgs.groupInfo
47-
)
48-
findNavController().navigate(action)
49-
},
50-
// TODO : 그룹 삭제
51-
onDeleteButtonClickListener = {
52-
Toast.makeText(context, "그룹 삭제하기", Toast.LENGTH_SHORT).show()
53-
}
54-
)
39+
if (viewModel.leaderId == myUid) {
40+
inflateMenu(R.menu.group_detail_menu)
41+
binding.btnRecruit.visibility = View.VISIBLE
42+
} else {
43+
binding.btnExitGroup.visibility = View.VISIBLE
44+
}
5545

56-
dialog.show(
57-
requireActivity().supportFragmentManager,
58-
GroupSettingDialog.TAG
59-
)
46+
setOnMenuItemClickListener { menuItem ->
47+
when (menuItem.itemId) {
48+
R.id.setting_group -> {
49+
// TODO : BottomSheetDialog Material Theme 적용
50+
val dialog = GroupSettingDialog(
51+
// TODO : 그룹 수정으로 이동
52+
onEditButtonClickListener = {
53+
val action =
54+
GroupDetailFragmentDirections.actionGroupDetailFragmentToEditGroupFragment(
55+
groupDetailArgs.groupInfo
56+
)
57+
findNavController().navigate(action)
58+
},
59+
// TODO : 그룹 삭제
60+
onDeleteButtonClickListener = {
61+
Toast.makeText(context, "그룹 삭제하기", Toast.LENGTH_SHORT).show()
62+
}
63+
)
6064

61-
true
62-
}
63-
else -> {
64-
false
65+
dialog.show(
66+
requireActivity().supportFragmentManager,
67+
GroupSettingDialog.TAG
68+
)
69+
70+
true
71+
}
72+
else -> {
73+
false
74+
}
6575
}
6676
}
6777
}
@@ -114,14 +124,16 @@ internal class GroupDetailFragment :
114124
binding.viewModel = viewModel
115125
}
116126

117-
// TODO : uid를 DataStore에서 가져올 수 있도록 변경
118127
private fun setNotificationAdapter() {
119-
val notificationAdapter = GroupNotificationAdapter("hsjeon")
128+
viewLifecycleOwner.lifecycleScope.launch {
129+
val uid = viewModel.getUidUseCase()
130+
val notificationAdapter = GroupNotificationAdapter(uid)
120131

121-
binding.notificationRecyclerView.adapter = notificationAdapter
122-
viewLifecycleOwner.repeatWhenUiStarted {
123-
viewModel.mergedNotifications.collect { notifications ->
124-
notificationAdapter.submitList(notifications)
132+
binding.notificationRecyclerView.adapter = notificationAdapter
133+
viewLifecycleOwner.repeatWhenUiStarted {
134+
viewModel.mergedNotifications.collect { notifications ->
135+
notificationAdapter.submitList(notifications)
136+
}
125137
}
126138
}
127139
}

presentation/src/main/java/com/whyranoid/presentation/community/group/detail/GroupDetailViewModel.kt

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import com.whyranoid.domain.model.StartNotification
99
import com.whyranoid.domain.usecase.CreateRecruitPostUseCase
1010
import com.whyranoid.domain.usecase.GetGroupInfoUseCase
1111
import com.whyranoid.domain.usecase.GetGroupNotificationsUseCase
12+
import com.whyranoid.domain.usecase.GetUidUseCase
1213
import com.whyranoid.presentation.model.GroupInfoUiModel
1314
import com.whyranoid.presentation.model.toGroupInfoUiModel
1415
import dagger.hilt.android.lifecycle.HiltViewModel
@@ -28,20 +29,19 @@ class GroupDetailViewModel @Inject constructor(
2829
getGroupInfoUseCase: GetGroupInfoUseCase,
2930
getGroupNotificationsUseCase: GetGroupNotificationsUseCase,
3031
private val createRecruitPostUseCase: CreateRecruitPostUseCase,
32+
val getUidUseCase: GetUidUseCase,
3133
stateHandle: SavedStateHandle
3234
) : ViewModel() {
3335

3436
private val groupId = requireNotNull(stateHandle.get<GroupInfoUiModel>("groupInfo")).groupId
35-
private val userId = requireNotNull(stateHandle.get<GroupInfoUiModel>("groupInfo")).leader.name
37+
val leaderId =
38+
requireNotNull(stateHandle.get<GroupInfoUiModel>("groupInfo")?.leader?.uid)
3639

3740
private var _groupInfo =
3841
MutableStateFlow(requireNotNull(stateHandle.get<GroupInfoUiModel>("groupInfo")))
3942
val groupInfo: StateFlow<GroupInfoUiModel>
4043
get() = _groupInfo.asStateFlow()
4144

42-
// TODO : 데이터 스토어에 저장된 Uid와 비교해야함.
43-
val isLeader = userId == "soopeach"
44-
4545
private val _eventFlow = MutableSharedFlow<Event>()
4646
val eventFlow: SharedFlow<Event>
4747
get() = _eventFlow.asSharedFlow()
@@ -52,13 +52,14 @@ class GroupDetailViewModel @Inject constructor(
5252

5353
init {
5454

55-
// TODO : uid를 DataStore에서 가져오도록 변경
56-
getGroupInfoUseCase("hsjeon", groupId).onEach { groupInfo ->
57-
_groupInfo.value = groupInfo.toGroupInfoUiModel()
58-
}.launchIn(viewModelScope)
55+
viewModelScope.launch {
56+
57+
getGroupInfoUseCase(leaderId, groupId).onEach { groupInfo ->
58+
_groupInfo.value = groupInfo.toGroupInfoUiModel()
59+
}.launchIn(this)
60+
}
5961

60-
// TODO : 그룹 아이디를 프레그먼트에서 받아오도록 변경
61-
getGroupNotificationsUseCase("수피치 그룹1").onEach { notifications ->
62+
getGroupNotificationsUseCase(groupId).onEach { notifications ->
6263

6364
if (notifications.isNotEmpty() && notifications.first() is StartNotification) {
6465
startNotification.value = notifications
@@ -85,10 +86,9 @@ class GroupDetailViewModel @Inject constructor(
8586
emitEvent(Event.ExitGroupButtonClick)
8687
}
8788

88-
// TODO : uid는 알아서 가져오도록 변경
8989
fun onRecruitSnackBarButtonClick() {
9090
viewModelScope.launch {
91-
val isCreateRecruitPostSuccess = createRecruitPostUseCase("hsjeon", groupId)
91+
val isCreateRecruitPostSuccess = createRecruitPostUseCase(groupId)
9292
if (isCreateRecruitPostSuccess) {
9393
emitEvent(Event.RecruitSnackBarButtonClick())
9494
} else {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@
116116
android:layout_margin="16dp"
117117
android:text="@string/text_recruit"
118118
android:onClick="@{() -> viewModel.onRecruitButtonClicked()}"
119-
android:visibility="@{viewModel.isLeader ? View.VISIBLE : View.INVISIBLE}"
119+
android:visibility="invisible"
120120
app:layout_constraintEnd_toEndOf="parent"
121121
app:layout_constraintTop_toBottomOf="@id/tv_head_count" />
122122

@@ -127,7 +127,7 @@
127127
android:layout_margin="16dp"
128128
android:text="@string/text_exit_group"
129129
android:onClick="@{() -> viewModel.onExitGroupButtonClicked()}"
130-
android:visibility="@{viewModel.isLeader ? View.GONE : View.VISIBLE}"
130+
android:visibility="invisible"
131131
app:layout_constraintEnd_toEndOf="parent"
132132
app:layout_constraintTop_toBottomOf="@id/tv_head_count" />
133133

0 commit comments

Comments
 (0)