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.GET
|
||||||
import retrofit2.http.POST
|
import retrofit2.http.POST
|
||||||
import retrofit2.http.Path
|
import retrofit2.http.Path
|
||||||
|
import retrofit2.http.Query
|
||||||
|
|
||||||
interface ProfileApi {
|
interface ProfileApi {
|
||||||
|
|
||||||
@GET("Fetch/UserProfile/{userId}")
|
@GET("Fetch/UserProfile/{userId}")
|
||||||
fun userProfile(@Path("userId") userId: Int): Call<UserProfileDto>
|
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
|
package com.isolaatti.profile.data.repository
|
||||||
|
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
|
import com.isolaatti.images.common.domain.entity.Image
|
||||||
import com.isolaatti.profile.data.remote.ProfileApi
|
import com.isolaatti.profile.data.remote.ProfileApi
|
||||||
import com.isolaatti.profile.domain.ProfileRepository
|
import com.isolaatti.profile.domain.ProfileRepository
|
||||||
import com.isolaatti.profile.domain.entity.UserProfile
|
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))
|
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
|
package com.isolaatti.profile.domain
|
||||||
|
|
||||||
|
import com.isolaatti.images.common.domain.entity.Image
|
||||||
import com.isolaatti.profile.domain.entity.UserProfile
|
import com.isolaatti.profile.domain.entity.UserProfile
|
||||||
import com.isolaatti.utils.Resource
|
import com.isolaatti.utils.Resource
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
|
|
||||||
interface ProfileRepository {
|
interface ProfileRepository {
|
||||||
fun getProfile(userId: Int): Flow<Resource<UserProfile>>
|
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.LiveData
|
||||||
import androidx.lifecycle.MutableLiveData
|
import androidx.lifecycle.MutableLiveData
|
||||||
import androidx.lifecycle.ViewModel
|
|
||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
import com.isolaatti.followers.domain.FollowingState
|
import com.isolaatti.followers.domain.FollowingState
|
||||||
import com.isolaatti.posting.posts.data.remote.FeedDto
|
import com.isolaatti.images.common.domain.entity.Image
|
||||||
import com.isolaatti.posting.posts.data.remote.FeedFilterDto
|
|
||||||
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.data.remote.UserProfileDto
|
|
||||||
import com.isolaatti.profile.domain.ProfileRepository
|
|
||||||
import com.isolaatti.profile.domain.entity.UserProfile
|
import com.isolaatti.profile.domain.entity.UserProfile
|
||||||
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.utils.Resource
|
import com.isolaatti.utils.Resource
|
||||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
@ -21,14 +18,14 @@ import kotlinx.coroutines.flow.flowOn
|
|||||||
import kotlinx.coroutines.flow.launchIn
|
import kotlinx.coroutines.flow.launchIn
|
||||||
import kotlinx.coroutines.flow.onEach
|
import kotlinx.coroutines.flow.onEach
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import java.time.LocalDate
|
|
||||||
import java.time.LocalDateTime
|
|
||||||
import java.time.LocalTime
|
|
||||||
import java.time.Month
|
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@HiltViewModel
|
@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>()
|
private val _profile = MutableLiveData<UserProfile>()
|
||||||
val profile: LiveData<UserProfile> get() = _profile
|
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) {
|
override fun getFeed(refresh: Boolean) {
|
||||||
viewModelScope.launch {
|
viewModelScope.launch {
|
||||||
if(refresh) {
|
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.common.options_bottom_sheet.ui.BottomSheetPostOptionsFragment
|
||||||
import com.isolaatti.databinding.FragmentDiscussionsBinding
|
import com.isolaatti.databinding.FragmentDiscussionsBinding
|
||||||
import com.isolaatti.followers.domain.FollowingState
|
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_chooser.ui.ImageChooserContract
|
||||||
import com.isolaatti.images.image_list.ui.ImagesFragment
|
import com.isolaatti.images.image_list.ui.ImagesFragment
|
||||||
import com.isolaatti.posting.comments.ui.BottomSheetPostComments
|
import com.isolaatti.posting.comments.ui.BottomSheetPostComments
|
||||||
@ -84,8 +83,11 @@ class ProfileMainFragment : Fragment() {
|
|||||||
viewModel.onPostAddedAtTheBeginning(it)
|
viewModel.onPostAddedAtTheBeginning(it)
|
||||||
}
|
}
|
||||||
|
|
||||||
private val chooseImageLauncher = registerForActivityResult(ImageChooserContract()) {
|
private val chooseImageLauncher = registerForActivityResult(ImageChooserContract()) { image ->
|
||||||
// here change profile picture
|
// here change profile picture
|
||||||
|
if(image != null) {
|
||||||
|
viewModel.setProfileImage(image)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private val editDiscussion = registerForActivityResult(EditPostContract()) {
|
private val editDiscussion = registerForActivityResult(EditPostContract()) {
|
||||||
@ -116,7 +118,7 @@ class ProfileMainFragment : Fragment() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private val profileObserver = Observer<UserProfile> { profile ->
|
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
|
title = profile.name
|
||||||
viewBinding.textViewUsername.text = profile.name
|
viewBinding.textViewUsername.text = profile.name
|
||||||
|
|||||||
@ -6,7 +6,16 @@ object UrlGen {
|
|||||||
const val IMAGE_MODE_SMALL = "small"
|
const val IMAGE_MODE_SMALL = "small"
|
||||||
const val IMAGE_MODE_REDUCED = "reduced"
|
const val IMAGE_MODE_REDUCED = "reduced"
|
||||||
const val IMAGE_MODE_ORIGINAL = "original"
|
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 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}"
|
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