Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ class FeedDetailActivity : BaseActivity<ActivityFeedDetailBinding>(activity_feed
private enum class MenuType { COMMENT, FEED }

private val feedId: Long by lazy { intent.getLongExtra(FEED_ID, DEFAULT_FEED_ID) }
private val isLiked: Boolean by lazy { intent.getBooleanExtra(FEED_LIKE_STATUS, false) }
private val feedDetailViewModel: FeedDetailViewModel by viewModels()
private val feedDetailAdapter: FeedDetailAdapter by lazy {
FeedDetailAdapter(
Expand Down Expand Up @@ -119,7 +120,7 @@ class FeedDetailActivity : BaseActivity<ActivityFeedDetailBinding>(activity_feed
updatedLikeCount.toString()
view.isSelected = !view.isSelected

singleEventHandler.debounce(coroutineScope = lifecycleScope) {
singleEventHandler.debounce(timeMillis = 100L, coroutineScope = lifecycleScope) {
tracker.trackEvent("feed_detail_like")
feedDetailViewModel.updateLike(view.isSelected, updatedLikeCount)
}
Expand Down Expand Up @@ -408,7 +409,24 @@ class FeedDetailActivity : BaseActivity<ActivityFeedDetailBinding>(activity_feed
binding.root.setOnClickListener { it.hideKeyboard() }

binding.ivFeedDetailBackButton.setOnClickListener {
setResult(FeedDetailBack.RESULT_OK)
val intent = Intent().apply {
putExtra(FEED_ID, feedId)
putExtra(
FEED_DETAIL_LIKE_STATUS,
feedDetailViewModel.feedDetailUiState.value
?.feedDetail
?.feed
?.isLiked,
)
putExtra(
FEED_LIKE_COUNT,
feedDetailViewModel.feedDetailUiState.value
?.feedDetail
?.feed
?.likeCount,
)
}
setResult(FeedDetailBack.RESULT_OK, intent)
if (!isFinishing) finish()
}

Expand Down Expand Up @@ -444,7 +462,7 @@ class FeedDetailActivity : BaseActivity<ActivityFeedDetailBinding>(activity_feed

private fun setupView() {
setupRefreshView()
feedDetailViewModel.updateFeedDetail(feedId, Feed)
feedDetailViewModel.updateFeedDetail(feedId, Feed, isLiked)
binding.rvFeedDetail.apply {
adapter = feedDetailAdapter
itemAnimator = null
Expand Down Expand Up @@ -551,18 +569,23 @@ class FeedDetailActivity : BaseActivity<ActivityFeedDetailBinding>(activity_feed

companion object {
const val FEED_ID: String = "FEED_ID"
const val FEED_DETAIL_LIKE_STATUS: String = "FEED_DETAIL_LIKE_STATUS"
const val FEED_LIKE_COUNT: String = "FEED_LIKE_COUNT"
private const val DEFAULT_FEED_ID: Long = -1
private const val NOTIFICATION_ID: String = "NOTIFICATION_ID"
private const val FEED_LIKE_STATUS: String = "FEED_LIKE_STATUS"
private const val LOTTIE_IMAGE = "lottie_websoso_loading.json"

fun getIntent(
context: Context,
feedId: Long,
notificationId: Long? = null,
isLiked: Boolean = false,
): Intent =
Intent(context, FeedDetailActivity::class.java).apply {
putExtra(FEED_ID, feedId)
putExtra(NOTIFICATION_ID, notificationId)
putExtra(FEED_LIKE_STATUS, isLiked)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ class FeedDetailViewModel
fun updateFeedDetail(
feedId: Long,
from: ResultFrom,
isLiked: Boolean = false,
) {
this.feedId = feedId
feedDetailUiState.value?.let { feedDetailUiState ->
Expand All @@ -64,11 +65,26 @@ class FeedDetailViewModel
val feed = (result[1] as FeedEntity)
val comments = result[2] as CommentsEntity

val uiFeed = feed.toUi()
val updatedFeed = if (feed.isLiked == isLiked) {
uiFeed
} else if (!isLiked && feed.isLiked) {
uiFeed.copy(
isLiked = false,
likeCount = feed.likeCount - 1,
)
} else {
uiFeed.copy(
isLiked = true,
likeCount = feed.likeCount + 1,
)
}

_feedDetailUiState.value = feedDetailUiState.copy(
loading = false,
isRefreshed = true,
feedDetail = FeedDetailModel(
feed = feed.toUi(),
feed = updatedFeed,
comments = comments.comments.map { it.toUi() },
user = FeedDetailModel.UserModel(
avatarImage = myProfile.avatarImage,
Expand Down
48 changes: 38 additions & 10 deletions app/src/main/java/com/into/websoso/ui/main/feed/FeedFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import com.into.websoso.core.common.ui.base.BaseFragment
import com.into.websoso.core.common.ui.custom.WebsosoChip
import com.into.websoso.core.common.ui.model.ResultFrom.BlockUser
import com.into.websoso.core.common.ui.model.ResultFrom.CreateFeed
import com.into.websoso.core.common.ui.model.ResultFrom.FeedDetailBack
import com.into.websoso.core.common.ui.model.ResultFrom.FeedDetailError
import com.into.websoso.core.common.ui.model.ResultFrom.FeedDetailRefreshed
import com.into.websoso.core.common.ui.model.ResultFrom.FeedDetailRemoved
Expand All @@ -51,7 +52,9 @@ import com.into.websoso.databinding.FragmentFeedBinding
import com.into.websoso.databinding.MenuFeedPopupBinding
import com.into.websoso.ui.createFeed.CreateFeedActivity
import com.into.websoso.ui.feedDetail.FeedDetailActivity
import com.into.websoso.ui.feedDetail.FeedDetailActivity.Companion.FEED_DETAIL_LIKE_STATUS
import com.into.websoso.ui.feedDetail.FeedDetailActivity.Companion.FEED_ID
import com.into.websoso.ui.feedDetail.FeedDetailActivity.Companion.FEED_LIKE_COUNT
import com.into.websoso.ui.feedDetail.model.EditFeedModel
import com.into.websoso.ui.main.feed.adapter.FeedAdapter
import com.into.websoso.ui.main.feed.adapter.FeedType.Feed
Expand Down Expand Up @@ -148,6 +151,18 @@ class FeedFragment : BaseFragment<FragmentFeedBinding>(fragment_feed) {
icon = ic_blocked_user_snack_bar,
)
}

FeedDetailBack.RESULT_OK -> {
val updatedFeedId: Long = result.data?.getLongExtra(FEED_ID, -1) ?: -1
val updatedLikeStatus: Boolean =
result.data?.getBooleanExtra(FEED_DETAIL_LIKE_STATUS, false) ?: false
val updatedLikeCount: Int = result.data?.getIntExtra(FEED_LIKE_COUNT, 0) ?: 0
feedViewModel.updateLikedSync(
selectedFeedId = updatedFeedId,
isLiked = updatedLikeStatus,
updatedLikeCount = updatedLikeCount,
)
}
}
}

Expand Down Expand Up @@ -178,8 +193,11 @@ class FeedFragment : BaseFragment<FragmentFeedBinding>(fragment_feed) {
singleEventHandler.throttleFirst { showMenu(view, feedId, isMyFeed) }
}

override fun onContentClick(feedId: Long) {
singleEventHandler.throttleFirst(300) { navigateToFeedDetail(feedId) }
override fun onContentClick(
feedId: Long,
isLiked: Boolean,
) {
singleEventHandler.throttleFirst(300) { navigateToFeedDetail(feedId, isLiked) }
}

override fun onNovelInfoClick(novelId: Long) {
Expand All @@ -192,11 +210,12 @@ class FeedFragment : BaseFragment<FragmentFeedBinding>(fragment_feed) {
id: Long,
) {
tracker.trackEvent("feed_like")
val likeCount: Int = view
.findViewById<TextView>(tv_feed_thumb_up_count)
.text
.toString()
.toInt()
val likeCount: Int =
view
.findViewById<TextView>(tv_feed_thumb_up_count)
.text
.toString()
.toInt()
val updatedLikeCount: Int = when (view.isSelected) {
true -> if (likeCount > 0) likeCount - 1 else 0
false -> likeCount + 1
Expand All @@ -206,7 +225,7 @@ class FeedFragment : BaseFragment<FragmentFeedBinding>(fragment_feed) {
updatedLikeCount.toString()
view.isSelected = !view.isSelected

singleEventHandler.debounce(coroutineScope = lifecycleScope) {
singleEventHandler.debounce(timeMillis = 100L, coroutineScope = lifecycleScope) {
feedViewModel.updateLike(id, view.isSelected, updatedLikeCount)
}
}
Expand Down Expand Up @@ -351,8 +370,17 @@ class FeedFragment : BaseFragment<FragmentFeedBinding>(fragment_feed) {
activityResultCallback.launch(CreateFeedActivity.getIntent(requireContext(), feedContent))
}

private fun navigateToFeedDetail(feedId: Long) {
activityResultCallback.launch(FeedDetailActivity.getIntent(requireContext(), feedId))
private fun navigateToFeedDetail(
feedId: Long,
isLiked: Boolean,
) {
activityResultCallback.launch(
FeedDetailActivity.getIntent(
context = requireContext(),
feedId = feedId,
isLiked = isLiked,
),
)
}

private fun navigateToNovelDetail(novelId: Long) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,10 @@ interface FeedItemClickListener {
isMyFeed: Boolean,
)

fun onContentClick(feedId: Long)
fun onContentClick(
feedId: Long,
isLiked: Boolean,
)

fun onNovelInfoClick(novelId: Long)

Expand Down
20 changes: 20 additions & 0 deletions app/src/main/java/com/into/websoso/ui/main/feed/FeedViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,26 @@ class FeedViewModel
}
}

fun updateLikedSync(
selectedFeedId: Long,
isLiked: Boolean,
updatedLikeCount: Int,
) {
_feedUiState.value = feedUiState.value?.copy(
feeds = feedUiState.value?.feeds?.map { feedModel ->
when (feedModel.id == selectedFeedId) {
true -> feedModel.copy(
isLiked = isLiked,
likeCount = updatedLikeCount,
)

false -> feedModel
}
} ?: emptyList(),
isRefreshed = false,
)
}

fun updateReportedSpoilerFeed(feedId: Long) {
feedUiState.value?.let { feedUiState ->
viewModelScope.launch {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,8 +102,11 @@ class NovelFeedFragment : BaseFragment<FragmentNovelFeedBinding>(R.layout.fragme
showMenu(view, feedId, isMyFeed)
}

override fun onContentClick(feedId: Long) {
navigateToFeedDetail(feedId)
override fun onContentClick(
feedId: Long,
isLiked: Boolean,
) {
navigateToFeedDetail(feedId, isLiked)
}

override fun onNovelInfoClick(novelId: Long) {
Expand Down Expand Up @@ -252,12 +255,21 @@ class NovelFeedFragment : BaseFragment<FragmentNovelFeedBinding>(R.layout.fragme
activityResultCallback.launch(CreateFeedActivity.getIntent(requireContext(), feedContent))
}

private fun navigateToFeedDetail(feedId: Long) {
private fun navigateToFeedDetail(
feedId: Long,
isLiked: Boolean,
) {
if (novelFeedViewModel.isLogin.value == false) {
showLoginRequestDialog()
return
}
startActivity(FeedDetailActivity.getIntent(requireContext(), feedId))
startActivity(
FeedDetailActivity.getIntent(
context = requireContext(),
feedId = feedId,
isLiked = isLiked,
),
)
}

override fun onViewCreated(
Expand Down
4 changes: 2 additions & 2 deletions app/src/main/res/layout/item_feed.xml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="@{() -> onClick.onContentClick(feed.id)}">
android:onClick="@{() -> onClick.onContentClick(feed.id, feed.isLiked)}">

<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_feed_profile"
Expand Down Expand Up @@ -98,7 +98,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:onClick="@{() -> onClick.onContentClick(feed.id)}"
android:onClick="@{() -> onClick.onContentClick(feed.id, feed.isLiked)}"
android:text="@string/feed_spoiler_warning"
android:textAppearance="@style/body2"
android:textColor="@color/secondary_100_FF675D"
Expand Down
Loading