Skip to content

Commit 9b4b09c

Browse files
committed
✨ 그룹 가입 기능 추가
1 parent 6d95a75 commit 9b4b09c

File tree

5 files changed

+58
-12
lines changed

5 files changed

+58
-12
lines changed

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

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import androidx.core.view.isVisible
66
import androidx.fragment.app.activityViewModels
77
import androidx.lifecycle.lifecycleScope
88
import androidx.navigation.fragment.findNavController
9+
import com.google.android.material.snackbar.Snackbar
910
import com.whyranoid.presentation.R
1011
import com.whyranoid.presentation.base.BaseFragment
1112
import com.whyranoid.presentation.databinding.FragmentCommunityItemBinding
@@ -61,14 +62,31 @@ internal class CommunityItemFragment :
6162
CommunityFragmentDirections.actionCommunityFragmentToGroupDetailFragment(event.groupInfo)
6263
findNavController().navigate(action)
6364
}
65+
is Event.GroupJoin -> {
66+
if (event.isSuccess) {
67+
Snackbar.make(
68+
binding.root,
69+
getString(R.string.text_join_group_success),
70+
Snackbar.LENGTH_SHORT
71+
).show()
72+
} else {
73+
Snackbar.make(
74+
binding.root,
75+
getString(R.string.text_join_group_fail),
76+
Snackbar.LENGTH_SHORT
77+
).show()
78+
}
79+
}
6480
}
6581
}
6682

6783
private fun setPostAdapter() {
6884
viewLifecycleOwner.lifecycleScope.launch {
6985
val uid = viewModel.getMyUseCase()
7086

71-
val postAdapter = PostAdapter(uid)
87+
val postAdapter = PostAdapter(uid) {
88+
viewModel.onGroupJoinButtonClicked(it)
89+
}
7290
binding.rvCommunity.adapter = postAdapter
7391

7492
viewLifecycleOwner.repeatWhenUiStarted {
@@ -82,7 +100,7 @@ internal class CommunityItemFragment :
82100

83101
private fun setMyGroupAdapter() {
84102
val myGroupAdapter = MyGroupAdapter { groupInfo ->
85-
viewModel.onCategoryItemClicked(groupInfo)
103+
viewModel.onGroupItemClicked(groupInfo)
86104
}
87105
binding.rvCommunity.adapter = myGroupAdapter
88106

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

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import com.whyranoid.domain.model.Post
66
import com.whyranoid.domain.usecase.GetMyGroupListUseCase
77
import com.whyranoid.domain.usecase.GetPostsUseCase
88
import com.whyranoid.domain.usecase.GetUidUseCase
9+
import com.whyranoid.domain.usecase.JoinGroupUseCase
910
import com.whyranoid.presentation.model.GroupInfoUiModel
1011
import com.whyranoid.presentation.model.toGroupInfoUiModel
1112
import dagger.hilt.android.lifecycle.HiltViewModel
@@ -24,6 +25,7 @@ import javax.inject.Inject
2425
class CommunityViewModel @Inject constructor(
2526
getMyGroupListUseCase: GetMyGroupListUseCase,
2627
getPostsUseCase: GetPostsUseCase,
28+
private val joinGroupUseCase: JoinGroupUseCase,
2729
val getMyUseCase: GetUidUseCase
2830
) : ViewModel() {
2931

@@ -39,13 +41,30 @@ class CommunityViewModel @Inject constructor(
3941
val eventFlow: SharedFlow<Event>
4042
get() = _eventFlow.asSharedFlow()
4143

42-
fun onCategoryItemClicked(groupInfo: GroupInfoUiModel) {
44+
fun onGroupItemClicked(groupInfo: GroupInfoUiModel) {
4345
emitEvent(Event.GroupItemClick(groupInfo))
4446
}
4547

4648
private fun emitEvent(event: Event) {
4749
viewModelScope.launch {
48-
_eventFlow.emit(event)
50+
when (event) {
51+
is Event.GroupItemClick -> {
52+
_eventFlow.emit(event)
53+
}
54+
is Event.GroupJoin -> {
55+
if (event.isSuccess) {
56+
_eventFlow.emit(event)
57+
} else {
58+
_eventFlow.emit(event.copy(isSuccess = false))
59+
}
60+
}
61+
}
62+
}
63+
}
64+
65+
fun onGroupJoinButtonClicked(groupId: String) {
66+
viewModelScope.launch {
67+
emitEvent(Event.GroupJoin(joinGroupUseCase(groupId)))
4968
}
5069
}
5170

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@ import com.whyranoid.presentation.model.GroupInfoUiModel
44

55
sealed class Event {
66
data class GroupItemClick(val groupInfo: GroupInfoUiModel) : Event()
7-
// data class CategoryItemClick(val groupInfo: GroupInfoUiModel) : Event()
7+
data class GroupJoin(val isSuccess: Boolean = true) : Event()
88
}

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

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,10 @@ import com.whyranoid.domain.model.RunningPost
1313
import com.whyranoid.presentation.databinding.ItemRecruitPostBinding
1414
import com.whyranoid.presentation.databinding.ItemRunningPostBinding
1515

16-
class PostAdapter(private val myUid: String) :
17-
ListAdapter<Post, PostAdapter.PostViewHolder>(diffUtil) {
16+
class PostAdapter(
17+
private val myUid: String,
18+
private val buttonClickListener: (String) -> Unit
19+
) : ListAdapter<Post, PostAdapter.PostViewHolder>(diffUtil) {
1820

1921
companion object {
2022
val diffUtil = object : DiffUtil.ItemCallback<Post>() {
@@ -44,11 +46,16 @@ class PostAdapter(private val myUid: String) :
4446
) : PostViewHolder(binding) {
4547
override fun bind(post: Post) {
4648
if (post is RecruitPost) {
47-
binding.recruitPost = post
48-
if (myUid == post.author.uid) {
49-
binding.btnJoinGroup.visibility = View.GONE
50-
} else {
51-
binding.btnJoinGroup.visibility = View.VISIBLE
49+
with(binding) {
50+
recruitPost = post
51+
if (myUid == post.author.uid) {
52+
btnJoinGroup.visibility = View.GONE
53+
} else {
54+
btnJoinGroup.visibility = View.VISIBLE
55+
btnJoinGroup.setOnClickListener {
56+
buttonClickListener(post.groupInfo.groupId)
57+
}
58+
}
5259
}
5360
}
5461
}

presentation/src/main/res/values/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929
<string name="community_select_running_history_snack_bar">운동을 하나 선택해주세요!</string>
3030
<string name="community_go_to_create_running_post">인증글 생성하러 가기</string>
3131
<string name="community_warning_running_post">내용을 1글자 이상 입력하세요</string>
32+
<string name="text_join_group_success">그룹 가입에 성공하였습니다!</string>
33+
<string name="text_join_group_fail">그룹 가입에 실패하였습니다!</string>
3234
<string name="community_fail_create_running_post">인증글 작성에 실패했습니다</string>
3335
<string name="community_success_create_running_post">인증글이 등록되었습니다!</string>
3436
<string name="community_create_running_post_hint">인증글 내용을 입력하세요!</string>

0 commit comments

Comments
 (0)