seguir y dejar de seguir en perfil

This commit is contained in:
erik-everardo 2024-01-07 23:01:26 -06:00
parent 75b93da044
commit 75b621ba0b
4 changed files with 62 additions and 10 deletions

View File

@ -14,7 +14,7 @@ data class UserProfile(
val numberOfLikes: Int, val numberOfLikes: Int,
val numberOfPosts: Int, val numberOfPosts: Int,
val isUserItself: Boolean, val isUserItself: Boolean,
val followingThisUser: Boolean, var followingThisUser: Boolean,
val thisUserIsFollowingMe: Boolean, val thisUserIsFollowingMe: Boolean,
val profileImageId: String?, val profileImageId: String?,
val descriptionText: String?, val descriptionText: String?,

View File

@ -0,0 +1,16 @@
package com.isolaatti.profile.domain.use_case
import com.isolaatti.followers.domain.FollowersRepository
import com.isolaatti.utils.Resource
import kotlinx.coroutines.flow.Flow
import javax.inject.Inject
class FollowUser @Inject constructor(private val followersRepository: FollowersRepository) {
operator fun invoke(userId: Int, follow: Boolean): Flow<Resource<Boolean>> {
return if(follow) {
followersRepository.followUser(userId)
} else {
followersRepository.unfollowUser(userId)
}
}
}

View File

@ -8,6 +8,7 @@ import com.isolaatti.images.common.domain.entity.Image
import com.isolaatti.posting.posts.presentation.PostListingViewModelBase import com.isolaatti.posting.posts.presentation.PostListingViewModelBase
import com.isolaatti.posting.posts.presentation.UpdateEvent import com.isolaatti.posting.posts.presentation.UpdateEvent
import com.isolaatti.profile.domain.entity.UserProfile import com.isolaatti.profile.domain.entity.UserProfile
import com.isolaatti.profile.domain.use_case.FollowUser
import com.isolaatti.profile.domain.use_case.GetProfile import com.isolaatti.profile.domain.use_case.GetProfile
import com.isolaatti.profile.domain.use_case.GetProfilePosts import com.isolaatti.profile.domain.use_case.GetProfilePosts
import com.isolaatti.profile.domain.use_case.SetProfileImage import com.isolaatti.profile.domain.use_case.SetProfileImage
@ -24,7 +25,8 @@ import javax.inject.Inject
class ProfileViewModel @Inject constructor( class ProfileViewModel @Inject constructor(
private val getProfileUseCase: GetProfile, private val getProfileUseCase: GetProfile,
private val getProfilePostsUseCase: GetProfilePosts, private val getProfilePostsUseCase: GetProfilePosts,
private val setProfileImageUC: SetProfileImage private val setProfileImageUC: SetProfileImage,
private val followUserUC: FollowUser
) : PostListingViewModelBase() { ) : PostListingViewModelBase() {
private val _profile = MutableLiveData<UserProfile>() private val _profile = MutableLiveData<UserProfile>()
val profile: LiveData<UserProfile> get() = _profile val profile: LiveData<UserProfile> get() = _profile
@ -35,6 +37,8 @@ class ProfileViewModel @Inject constructor(
private val toRetry: MutableList<Runnable> = mutableListOf() private val toRetry: MutableList<Runnable> = mutableListOf()
val followingLoading: MutableLiveData<Boolean> = MutableLiveData()
// runs the lists of "Runnable" one by one and clears list. After this is executed, // runs the lists of "Runnable" one by one and clears list. After this is executed,
// caller should report as handled // caller should report as handled
@ -60,14 +64,7 @@ class ProfileViewModel @Inject constructor(
is Resource.Success -> { is Resource.Success -> {
_profile.postValue(it.data!!) _profile.postValue(it.data!!)
followingState.postValue( followingState.postValue(
it.data.let {user-> it.data.let { user-> getFollowingState(user.followingThisUser, user.thisUserIsFollowingMe) }
when {
user.followingThisUser && user.thisUserIsFollowingMe -> FollowingState.MutuallyFollowing
user.followingThisUser -> FollowingState.FollowingThisUser
user.thisUserIsFollowingMe -> FollowingState.ThisUserIsFollowingMe
else -> FollowingState.NotMutuallyFollowing
}
}
) )
} }
} }
@ -75,6 +72,15 @@ class ProfileViewModel @Inject constructor(
} }
} }
private fun getFollowingState(followingThisUser: Boolean, userIsFollowingMe: Boolean): FollowingState {
return when {
followingThisUser && userIsFollowingMe -> FollowingState.MutuallyFollowing
followingThisUser -> FollowingState.FollowingThisUser
userIsFollowingMe -> FollowingState.ThisUserIsFollowingMe
else -> FollowingState.NotMutuallyFollowing
}
}
fun setProfileImage(image: Image) { fun setProfileImage(image: Image) {
viewModelScope.launch { viewModelScope.launch {
setProfileImageUC(image).onEach { setProfileImageUC(image).onEach {
@ -83,6 +89,28 @@ class ProfileViewModel @Inject constructor(
} }
} }
fun followUser() {
val currentProfile = _profile.value ?: return
val following = currentProfile.followingThisUser
viewModelScope.launch {
followUserUC(profileId, !following).onEach {
when(it) {
is Resource.Error -> {
followingLoading.postValue(false)
}
is Resource.Loading -> {
followingLoading.postValue(true)
}
is Resource.Success -> {
followingLoading.postValue(false)
_profile.postValue(currentProfile.apply { followingThisUser = !following })
followingState.postValue(getFollowingState(!following, currentProfile.thisUserIsFollowingMe))
}
}
}.flowOn(Dispatchers.IO).launchIn(this)
}
}
override fun getFeed(refresh: Boolean) { override fun getFeed(refresh: Boolean) {
viewModelScope.launch { viewModelScope.launch {
if(refresh) { if(refresh) {

View File

@ -284,6 +284,11 @@ class ProfileMainFragment : Fragment() {
audioPlayerConnector.playPauseAudio(audio) audioPlayerConnector.playPauseAudio(audio)
} }
} }
viewBinding.followButton.setOnClickListener {
it.isEnabled = false
viewModel.followUser()
}
} }
private fun setObservers() { private fun setObservers() {
@ -300,6 +305,9 @@ class ProfileMainFragment : Fragment() {
viewModel.errorLoading.observe(viewLifecycleOwner) { viewModel.errorLoading.observe(viewLifecycleOwner) {
errorViewModel.error.postValue(it) errorViewModel.error.postValue(it)
} }
viewModel.followingLoading.observe(viewLifecycleOwner) {
viewBinding.followButton.isEnabled = !it
}
} }
private fun getData() { private fun getData() {