Skip to content

Commit

Permalink
[mod] #170 마이피드 아이템 일부만 삭제하도록 변경
Browse files Browse the repository at this point in the history
  • Loading branch information
leeeha committed Aug 29, 2023
1 parent e355d36 commit 5ed9cad
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 36 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package com.android.go.sopt.winey.presentation.main.mypage.myfeed
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.paging.ItemSnapshotList
import androidx.paging.PagingDataAdapter
import androidx.recyclerview.widget.RecyclerView
import com.android.go.sopt.winey.databinding.ItemMyfeedPostBinding
Expand All @@ -12,18 +11,13 @@ import com.android.go.sopt.winey.util.view.ItemDiffCallback
import com.android.go.sopt.winey.util.view.setOnSingleClickListener

class MyFeedAdapter(
private val onlikeButtonClicked: (WineyFeed: WineyFeed) -> Unit,
private val onPopupMenuClicked: (View, WineyFeed: WineyFeed) -> Unit,
private val toFeedDetail: (WineyFeed: WineyFeed) -> Unit
private val onlikeButtonClicked: (WineyFeed) -> Unit,
private val onPopupMenuClicked: (View, WineyFeed) -> Unit,
private val toFeedDetail: (WineyFeed) -> Unit
) : PagingDataAdapter<WineyFeed, MyFeedAdapter.MyFeedViewHolder>(diffUtil) {
private val currentData: ItemSnapshotList<WineyFeed>
get() = snapshot()

class MyFeedViewHolder(
private val binding: ItemMyfeedPostBinding,
private val onlikeButtonClicked: (WineyFeed: WineyFeed) -> Unit,
private val onPopupMenuClicked: (View, WineyFeed: WineyFeed) -> Unit,
private val toFeedDetail: (WineyFeed: WineyFeed) -> Unit
inner class MyFeedViewHolder(
private val binding: ItemMyfeedPostBinding
) : RecyclerView.ViewHolder(binding.root) {
fun onBind(data: WineyFeed?) {
binding.apply {
Expand All @@ -50,7 +44,7 @@ class MyFeedAdapter(
): MyFeedViewHolder {
val binding =
ItemMyfeedPostBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return MyFeedViewHolder(binding, onlikeButtonClicked, onPopupMenuClicked, toFeedDetail)
return MyFeedViewHolder(binding)
}

override fun onBindViewHolder(holder: MyFeedViewHolder, position: Int) {
Expand All @@ -67,6 +61,14 @@ class MyFeedAdapter(
}
}

fun deleteItem(feedId: Int): MutableList<WineyFeed> {
val currentList = snapshot().items
val newList = currentList.toMutableList()
val feed = currentList.find { it.feedId == feedId }
newList.remove(feed)
return newList
}

companion object {
private val diffUtil = ItemDiffCallback<WineyFeed>(
onItemsTheSame = { old, new -> old.feedId == new.feedId },
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import androidx.lifecycle.flowWithLifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import androidx.paging.LoadState
import androidx.paging.PagingData
import androidx.recyclerview.widget.SimpleItemAnimator
import com.android.go.sopt.winey.R
import com.android.go.sopt.winey.databinding.FragmentMyfeedBinding
Expand All @@ -23,8 +24,6 @@ import com.android.go.sopt.winey.presentation.main.feed.WineyFeedLoadAdapter
import com.android.go.sopt.winey.presentation.main.feed.detail.DetailActivity
import com.android.go.sopt.winey.presentation.main.mypage.MyPageFragment
import com.android.go.sopt.winey.util.binding.BindingFragment
import com.android.go.sopt.winey.util.context.stringOf
import com.android.go.sopt.winey.util.context.wineySnackbar
import com.android.go.sopt.winey.util.fragment.WineyDialogFragment
import com.android.go.sopt.winey.util.fragment.snackBar
import com.android.go.sopt.winey.util.fragment.stringOf
Expand Down Expand Up @@ -52,11 +51,14 @@ class MyFeedFragment : BindingFragment<FragmentMyfeedBinding>(R.layout.fragment_

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

removeRecyclerviewItemChangeAnimation()
initAdapter()
initBackButtonClickListener()

initGetFeedStateObserver()
initPostLikeStateObserver()
initButtonClickListener()
initDeleteFeedStateObserver()
}

override fun onStart() {
Expand Down Expand Up @@ -112,20 +114,37 @@ class MyFeedFragment : BindingFragment<FragmentMyfeedBinding>(R.layout.fragment_
showAsDropDown(anchorView, -POPUP_MENU_OFFSET, -POPUP_MENU_OFFSET, Gravity.END)
}

private fun showFeedDeleteDialog(wineyFeed: WineyFeed) {
private fun showFeedDeleteDialog(feed: WineyFeed) {
val dialog = WineyDialogFragment(
stringOf(R.string.feed_delete_dialog_title),
stringOf(R.string.feed_delete_dialog_subtitle),
stringOf(R.string.comment_delete_dialog_negative_button),
stringOf(R.string.comment_delete_dialog_positive_button),
handleNegativeButton = {},
handlePositiveButton = { viewModel.deleteFeed(wineyFeed.feedId) }
handlePositiveButton = {
viewModel.deleteFeed(feed.feedId)
deletePagingDataItem(feed.feedId)
}
)
dialog.show(parentFragmentManager, TAG_FEED_DELETE_DIALOG)
initDeleteFeedStateObserver()
}

private fun initButtonClickListener() {
private fun deletePagingDataItem(feedId: Int) {
viewLifeCycleScope.launch {
val newList = myFeedAdapter.deleteItem(feedId)
checkEmptyList(newList)
myFeedAdapter.submitData(PagingData.from(newList))
}
}

private fun checkEmptyList(newList: MutableList<WineyFeed>) {
if (newList.isEmpty()) {
binding.rvMyfeedPost.isVisible = false
binding.clMyfeedEmpty.isVisible = true
}
}

private fun initBackButtonClickListener() {
binding.imgMyfeedBack.setOnSingleClickListener {
navigateTo<MyPageFragment>()
parentFragmentManager.popBackStack()
Expand All @@ -136,7 +155,6 @@ class MyFeedFragment : BindingFragment<FragmentMyfeedBinding>(R.layout.fragment_
viewModel.deleteMyFeedState.flowWithLifecycle(viewLifeCycle).onEach { state ->
when (state) {
is UiState.Success -> {
refreshMyFeed()
wineySnackbar(requireView(), true, stringOf(R.string.snackbar_feed_delete_success))
}

Expand All @@ -150,22 +168,21 @@ class MyFeedFragment : BindingFragment<FragmentMyfeedBinding>(R.layout.fragment_
}

private fun initGetFeedStateObserver() {
viewLifecycleOwner.lifecycleScope.launch {
viewLifeCycleScope.launch {
viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
viewModel.getMyFeedListState.collectLatest { state ->
when (state) {
is UiState.Success -> {
myFeedAdapter.addLoadStateListener { loadState ->
when (loadState.refresh) {
is LoadState.Loading -> {
binding.lMyfeedEmpty.isVisible = false
binding.clMyfeedEmpty.isVisible = false
binding.rvMyfeedPost.isVisible = false
}

is LoadState.NotLoading -> {
binding.rvMyfeedPost.isVisible = myFeedAdapter.itemCount > 0
binding.lMyfeedEmpty.isVisible =
myFeedAdapter.itemCount == 0
binding.clMyfeedEmpty.isVisible = myFeedAdapter.itemCount == 0
restoreScrollPosition()
}

Expand Down Expand Up @@ -208,14 +225,6 @@ class MyFeedFragment : BindingFragment<FragmentMyfeedBinding>(R.layout.fragment_
}.launchIn(viewLifeCycleScope)
}

private fun refreshMyFeed() {
val fragmentManager = requireActivity().supportFragmentManager
fragmentManager.beginTransaction().apply {
replace(R.id.fcv_main, MyFeedFragment())
commit()
}
}

private fun navigateToDetail(wineyFeed: WineyFeed) {
selectedItemIndex = myFeedAdapter.snapshot().indexOf(wineyFeed)
selectedScrollPosition = binding.rvMyfeedPost.layoutManager?.onSaveInstanceState()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,16 +23,15 @@ import javax.inject.Inject
class MyFeedViewModel @Inject constructor(
private val feedRepository: FeedRepository
) : ViewModel() {

private val _getMyFeedListState =
MutableStateFlow<UiState<PagingData<WineyFeed>>>(UiState.Loading)
MutableStateFlow<UiState<PagingData<WineyFeed>>>(UiState.Empty)
val getMyFeedListState: StateFlow<UiState<PagingData<WineyFeed>>> =
_getMyFeedListState.asStateFlow()

private val _postMyFeedLikeState = MutableStateFlow<UiState<Like>>(UiState.Empty)
val postMyFeedLikeState: StateFlow<UiState<Like>> = _postMyFeedLikeState.asStateFlow()

val _deleteMyFeedState = MutableStateFlow<UiState<Unit>>(UiState.Loading)
private val _deleteMyFeedState = MutableStateFlow<UiState<Unit>>(UiState.Empty)
val deleteMyFeedState: StateFlow<UiState<Unit>> = _deleteMyFeedState.asStateFlow()

init {
Expand All @@ -47,6 +46,7 @@ class MyFeedViewModel @Inject constructor(
private fun postLike(feedId: Int, requestPostLikeDto: RequestPostLikeDto) {
viewModelScope.launch {
_postMyFeedLikeState.emit(UiState.Loading)

feedRepository.postFeedLike(feedId, requestPostLikeDto)
.onSuccess { response ->
_postMyFeedLikeState.emit(UiState.Success(response))
Expand All @@ -58,6 +58,7 @@ class MyFeedViewModel @Inject constructor(
fun getMyFeed() {
viewModelScope.launch {
_getMyFeedListState.emit(UiState.Loading)

feedRepository.getMyFeedList().cachedIn(viewModelScope)
.collectLatest { response ->
_getMyFeedListState.emit(UiState.Success(response))
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/res/layout/fragment_myfeed.xml
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@
app:layout_constraintTop_toBottomOf="@id/cl_detail_app_bar">

<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/l_myfeed_empty"
android:id="@+id/cl_myfeed_empty"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintBottom_toBottomOf="@+id/rv_myfeed_post"
Expand Down

0 comments on commit 5ed9cad

Please sign in to comment.