cambiar imagen de perfil
This commit is contained in:
parent
df008ea7fd
commit
1767cfb4ee
@ -4,10 +4,14 @@ import retrofit2.Call
|
||||
import retrofit2.http.GET
|
||||
import retrofit2.http.POST
|
||||
import retrofit2.http.Path
|
||||
import retrofit2.http.Query
|
||||
|
||||
interface ProfileApi {
|
||||
|
||||
@GET("Fetch/UserProfile/{userId}")
|
||||
fun userProfile(@Path("userId") userId: Int): Call<UserProfileDto>
|
||||
|
||||
@POST("EditProfile/SetProfilePhoto")
|
||||
fun setProfileImage(@Query("imageId") imageId: String): Call<Void>
|
||||
|
||||
}
|
||||
@ -1,6 +1,7 @@
|
||||
package com.isolaatti.profile.data.repository
|
||||
|
||||
import android.util.Log
|
||||
import com.isolaatti.images.common.domain.entity.Image
|
||||
import com.isolaatti.profile.data.remote.ProfileApi
|
||||
import com.isolaatti.profile.domain.ProfileRepository
|
||||
import com.isolaatti.profile.domain.entity.UserProfile
|
||||
@ -28,4 +29,20 @@ class ProfileRepositoryImpl @Inject constructor(private val profileApi: ProfileA
|
||||
emit(Resource.Error(Resource.Error.ErrorType.NetworkError))
|
||||
}
|
||||
}
|
||||
|
||||
override fun setProfileImage(image: Image): Flow<Resource<Boolean>> = flow {
|
||||
|
||||
try {
|
||||
val result = profileApi.setProfileImage(image.id).awaitResponse()
|
||||
|
||||
if(result.isSuccessful) {
|
||||
emit(Resource.Success(true))
|
||||
} else {
|
||||
emit(Resource.Error(Resource.Error.mapErrorCode(result.code())))
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
Log.e("ProfileRepositoryImpl", e.message.toString())
|
||||
emit(Resource.Error(Resource.Error.ErrorType.NetworkError))
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,9 +1,12 @@
|
||||
package com.isolaatti.profile.domain
|
||||
|
||||
import com.isolaatti.images.common.domain.entity.Image
|
||||
import com.isolaatti.profile.domain.entity.UserProfile
|
||||
import com.isolaatti.utils.Resource
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
|
||||
interface ProfileRepository {
|
||||
fun getProfile(userId: Int): Flow<Resource<UserProfile>>
|
||||
|
||||
fun setProfileImage(image: Image): Flow<Resource<Boolean>>
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
package com.isolaatti.profile.domain.use_case
|
||||
|
||||
import com.isolaatti.images.common.domain.entity.Image
|
||||
import com.isolaatti.profile.domain.ProfileRepository
|
||||
import com.isolaatti.utils.Resource
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import javax.inject.Inject
|
||||
|
||||
class SetProfileImage @Inject constructor(private val profileRepository: ProfileRepository) {
|
||||
operator fun invoke(image: Image): Flow<Resource<Boolean>> = profileRepository.setProfileImage(image)
|
||||
}
|
||||
@ -2,18 +2,15 @@ package com.isolaatti.profile.presentation
|
||||
|
||||
import androidx.lifecycle.LiveData
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import com.isolaatti.followers.domain.FollowingState
|
||||
import com.isolaatti.posting.posts.data.remote.FeedDto
|
||||
import com.isolaatti.posting.posts.data.remote.FeedFilterDto
|
||||
import com.isolaatti.images.common.domain.entity.Image
|
||||
import com.isolaatti.posting.posts.presentation.PostListingViewModelBase
|
||||
import com.isolaatti.posting.posts.presentation.UpdateEvent
|
||||
import com.isolaatti.profile.data.remote.UserProfileDto
|
||||
import com.isolaatti.profile.domain.ProfileRepository
|
||||
import com.isolaatti.profile.domain.entity.UserProfile
|
||||
import com.isolaatti.profile.domain.use_case.GetProfile
|
||||
import com.isolaatti.profile.domain.use_case.GetProfilePosts
|
||||
import com.isolaatti.profile.domain.use_case.SetProfileImage
|
||||
import com.isolaatti.utils.Resource
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
@ -21,14 +18,14 @@ import kotlinx.coroutines.flow.flowOn
|
||||
import kotlinx.coroutines.flow.launchIn
|
||||
import kotlinx.coroutines.flow.onEach
|
||||
import kotlinx.coroutines.launch
|
||||
import java.time.LocalDate
|
||||
import java.time.LocalDateTime
|
||||
import java.time.LocalTime
|
||||
import java.time.Month
|
||||
import javax.inject.Inject
|
||||
|
||||
@HiltViewModel
|
||||
class ProfileViewModel @Inject constructor(private val getProfileUseCase: GetProfile, private val getProfilePostsUseCase: GetProfilePosts) : PostListingViewModelBase() {
|
||||
class ProfileViewModel @Inject constructor(
|
||||
private val getProfileUseCase: GetProfile,
|
||||
private val getProfilePostsUseCase: GetProfilePosts,
|
||||
private val setProfileImageUC: SetProfileImage
|
||||
) : PostListingViewModelBase() {
|
||||
private val _profile = MutableLiveData<UserProfile>()
|
||||
val profile: LiveData<UserProfile> get() = _profile
|
||||
|
||||
@ -78,6 +75,14 @@ class ProfileViewModel @Inject constructor(private val getProfileUseCase: GetPro
|
||||
}
|
||||
}
|
||||
|
||||
fun setProfileImage(image: Image) {
|
||||
viewModelScope.launch {
|
||||
setProfileImageUC(image).onEach {
|
||||
_profile.postValue(_profile.value?.copy(profileImageId = image.id))
|
||||
}.flowOn(Dispatchers.IO).launchIn(this)
|
||||
}
|
||||
}
|
||||
|
||||
override fun getFeed(refresh: Boolean) {
|
||||
viewModelScope.launch {
|
||||
if(refresh) {
|
||||
|
||||
@ -33,7 +33,6 @@ import com.isolaatti.common.options_bottom_sheet.presentation.BottomSheetPostOpt
|
||||
import com.isolaatti.common.options_bottom_sheet.ui.BottomSheetPostOptionsFragment
|
||||
import com.isolaatti.databinding.FragmentDiscussionsBinding
|
||||
import com.isolaatti.followers.domain.FollowingState
|
||||
import com.isolaatti.images.image_chooser.ui.ImageChooserActivity
|
||||
import com.isolaatti.images.image_chooser.ui.ImageChooserContract
|
||||
import com.isolaatti.images.image_list.ui.ImagesFragment
|
||||
import com.isolaatti.posting.comments.ui.BottomSheetPostComments
|
||||
@ -84,8 +83,11 @@ class ProfileMainFragment : Fragment() {
|
||||
viewModel.onPostAddedAtTheBeginning(it)
|
||||
}
|
||||
|
||||
private val chooseImageLauncher = registerForActivityResult(ImageChooserContract()) {
|
||||
private val chooseImageLauncher = registerForActivityResult(ImageChooserContract()) { image ->
|
||||
// here change profile picture
|
||||
if(image != null) {
|
||||
viewModel.setProfileImage(image)
|
||||
}
|
||||
}
|
||||
|
||||
private val editDiscussion = registerForActivityResult(EditPostContract()) {
|
||||
@ -116,7 +118,7 @@ class ProfileMainFragment : Fragment() {
|
||||
}
|
||||
|
||||
private val profileObserver = Observer<UserProfile> { profile ->
|
||||
viewBinding.profileImageView.load(UrlGen.userProfileImage(profile.userId), imageLoader)
|
||||
viewBinding.profileImageView.load(UrlGen.userProfileImage(profile.userId, invalidateCache = true), imageLoader)
|
||||
|
||||
title = profile.name
|
||||
viewBinding.textViewUsername.text = profile.name
|
||||
|
||||
@ -6,7 +6,16 @@ object UrlGen {
|
||||
const val IMAGE_MODE_SMALL = "small"
|
||||
const val IMAGE_MODE_REDUCED = "reduced"
|
||||
const val IMAGE_MODE_ORIGINAL = "original"
|
||||
fun userProfileImage(userId: Int) = "${BASE_URL}images/profile_image/of_user/$userId?mode=small"
|
||||
|
||||
private var timestamp: Long = System.currentTimeMillis()
|
||||
fun userProfileImage(userId: Int, invalidateCache: Boolean = false): String {
|
||||
|
||||
if(invalidateCache) {
|
||||
timestamp = System.currentTimeMillis()
|
||||
}
|
||||
|
||||
return "${BASE_URL}images/profile_image/of_user/$userId?mode=small&ts=$timestamp"
|
||||
}
|
||||
fun userProfileImageFullQuality(userId: Int) = "${BASE_URL}images/profile_image/of_user/$userId?mode=original"
|
||||
fun imageUrl(imageId: String, mode: String? = IMAGE_MODE_ORIGINAL) = "${BASE_URL}images/image/${imageId}?mode=${mode}"
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user