feat: global/personal feed | like posts | pagination

This commit is contained in:
rebelonion 2024-03-09 04:33:06 -06:00
parent a9b03c45c6
commit 98f4d4f30b
19 changed files with 438 additions and 144 deletions

View file

@ -6,21 +6,29 @@ import android.view.View
import androidx.core.content.ContextCompat
import ani.dantotsu.R
import ani.dantotsu.buildMarkwon
import ani.dantotsu.connections.anilist.Anilist
import ani.dantotsu.connections.anilist.api.Activity
import ani.dantotsu.databinding.ItemActivityBinding
import ani.dantotsu.loadImage
import ani.dantotsu.snackString
import com.bumptech.glide.Glide
import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.load.model.GlideUrl
import com.bumptech.glide.request.RequestOptions
import com.xwray.groupie.viewbinding.BindableItem
import jp.wasabeef.glide.transformations.BlurTransformation
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
class ActivityItem(
private val activity: Activity,
val clickCallback: (Int) -> Unit
): BindableItem<ItemActivityBinding>() {
val clickCallback: (Int, type: String) -> Unit
) : BindableItem<ItemActivityBinding>() {
private lateinit var binding: ItemActivityBinding
@SuppressLint("SetTextI18n")
override fun bind(viewBinding: ItemActivityBinding, position: Int) {
binding = viewBinding
@ -28,24 +36,48 @@ class ActivityItem(
binding.activityUserName.text = activity.user?.name
binding.activityUserAvatar.loadImage(activity.user?.avatar?.medium)
binding.activityTime.text = ActivityItemBuilder.getDateTime(activity.createdAt)
val color = if (activity.isLiked == true)
ContextCompat.getColor(binding.root.context, R.color.yt_red)
else
ContextCompat.getColor(binding.root.context, R.color.bg_opp)
binding.activityFavorite.setColorFilter(color)
binding.commentRepliesContainer.visibility = if (activity.replyCount > 0) View.VISIBLE else View.GONE
val likeColor = ContextCompat.getColor(binding.root.context, R.color.yt_red)
val notLikeColor = ContextCompat.getColor(binding.root.context, R.color.bg_opp)
binding.activityLike.setColorFilter(if (activity.isLiked == true) likeColor else notLikeColor)
binding.commentRepliesContainer.visibility =
if (activity.replyCount > 0) View.VISIBLE else View.GONE
binding.activityLikeCount.text = activity.likeCount.toString()
binding.activityLike.setOnClickListener {
val scope = CoroutineScope(Dispatchers.IO + SupervisorJob())
scope.launch {
val res = Anilist.query.toggleLike(activity.id, "ACTIVITY")
withContext(Dispatchers.Main) {
if (res != null) {
if (activity.isLiked == true) {
activity.likeCount = activity.likeCount?.minus(1)
} else {
activity.likeCount = activity.likeCount?.plus(1)
}
binding.activityLikeCount.text = activity.likeCount.toString()
activity.isLiked = !activity.isLiked!!
binding.activityLike.setColorFilter(if (activity.isLiked == true) likeColor else notLikeColor)
} else {
snackString("Failed to like activity")
}
}
}
}
val context = binding.root.context
when (activity.typename) {
"ListActivity" ->{
"ListActivity" -> {
binding.activityContent.visibility = View.GONE
binding.activityBannerContainer.visibility = View.VISIBLE
binding.activityMediaName.text = activity.media?.title?.userPreferred
binding.activityText.text = "${activity.user!!.name} ${activity.status} ${activity.media!!.title!!.userPreferred}"
binding.activityCover.loadImage(activity.media.coverImage?.medium)
val banner = activity.media.bannerImage
binding.activityText.text =
"""${activity.user!!.name} ${activity.status} ${activity.progress ?: ""}"""
binding.activityCover.loadImage(activity.media?.coverImage?.medium)
val banner = activity.media?.bannerImage
if (banner != null) {
if (!(context as android.app.Activity).isDestroyed) {
Glide.with(context as Context)
@ -58,6 +90,7 @@ class ActivityItem(
binding.activityBannerImage.setImageResource(R.drawable.linear_gradient_bg)
}
}
"TextActivity" -> {
binding.activityBannerContainer.visibility = View.GONE
binding.activityContent.visibility = View.VISIBLE