11package com.neki.android.feature.mypage.impl.main
22
3- import android.content.Context
43import androidx.lifecycle.ViewModel
54import androidx.lifecycle.viewModelScope
6- import coil3.imageLoader
7- import coil3.request.ImageRequest
85import com.neki.android.core.dataapi.repository.AuthRepository
96import com.neki.android.core.dataapi.repository.TokenRepository
107import com.neki.android.core.dataapi.repository.UserRepository
118import com.neki.android.core.domain.usecase.UploadProfileImageUseCase
129import com.neki.android.core.ui.MviIntentStore
1310import com.neki.android.core.ui.mviIntentStore
1411import com.neki.android.feature.mypage.impl.permission.const.NekiPermission
15- import com.neki.android.feature.mypage.impl.profile.model.SelectedProfileImage
12+ import com.neki.android.feature.mypage.impl.profile.model.EditProfileImageType
1613import dagger.hilt.android.lifecycle.HiltViewModel
17- import dagger.hilt.android.qualifiers.ApplicationContext
1814import kotlinx.coroutines.async
1915import kotlinx.coroutines.awaitAll
2016import kotlinx.coroutines.launch
@@ -23,7 +19,6 @@ import javax.inject.Inject
2319
2420@HiltViewModel
2521internal class MyPageViewModel @Inject constructor(
26- @ApplicationContext private val context : Context ,
2722 private val uploadProfileImageUseCase : UploadProfileImageUseCase ,
2823 private val userRepository : UserRepository ,
2924 private val authRepository : AuthRepository ,
@@ -55,18 +50,18 @@ internal class MyPageViewModel @Inject constructor(
5550
5651 // Profile
5752 MyPageIntent .ClickBackIcon -> {
58- reduce { copy(selectedProfileImage = SelectedProfileImage . NoChange ) }
53+ reduce { copy(profileImageState = EditProfileImageType . OriginalImageUrl (state.userInfo.profileImageUrl) ) }
5954 postSideEffect(MyPageEffect .NavigateBack )
6055 }
6156
6257 MyPageIntent .ClickEditIcon -> postSideEffect(MyPageEffect .NavigateToEditProfile )
6358 MyPageIntent .ClickCameraIcon -> reduce { copy(isShowImageChooseDialog = true ) }
6459 MyPageIntent .DismissImageChooseDialog -> reduce { copy(isShowImageChooseDialog = false ) }
65- is MyPageIntent .SelectProfileImage -> reduce { copy(selectedProfileImage = intent.image, isShowImageChooseDialog = false ) }
60+ is MyPageIntent .SelectProfileImage -> reduce { copy(profileImageState = intent.image, isShowImageChooseDialog = false ) }
6661 is MyPageIntent .ClickEditComplete -> {
6762 val isNicknameChanged = state.userInfo.nickname != intent.nickname
68- val isProfileImageChanged = state.selectedProfileImage != SelectedProfileImage . NoChange
69- updateProfile(intent.nickname , intent.uri , isNicknameChanged, isProfileImageChanged, reduce, postSideEffect)
63+ val isProfileImageChanged = state.profileImageState !is EditProfileImageType . OriginalImageUrl
64+ updateProfile(state , intent.nickname , isNicknameChanged, isProfileImageChanged, reduce, postSideEffect)
7065 }
7166
7267 MyPageIntent .ClickLogout -> reduce { copy(isShowLogoutDialog = true ) }
@@ -132,15 +127,14 @@ internal class MyPageViewModel @Inject constructor(
132127 }
133128
134129 private fun updateProfile (
130+ state : MyPageState ,
135131 nickname : String ,
136- uri : android.net.Uri ? ,
137132 isNicknameChanged : Boolean ,
138133 isProfileImageChanged : Boolean ,
139134 reduce : (MyPageState .() -> MyPageState ) -> Unit ,
140135 postSideEffect : (MyPageEffect ) -> Unit ,
141136 ) = viewModelScope.launch {
142137 if (! isNicknameChanged && ! isProfileImageChanged) {
143- reduce { copy(selectedProfileImage = SelectedProfileImage .NoChange ) }
144138 postSideEffect(MyPageEffect .NavigateBack )
145139 return @launch
146140 }
@@ -149,29 +143,33 @@ internal class MyPageViewModel @Inject constructor(
149143
150144 buildList {
151145 if (isNicknameChanged) add(async { userRepository.updateUserInfo(nickname = nickname) })
152- if (isProfileImageChanged) add(async { uploadProfileImageUseCase(uri = uri) })
146+ if (isProfileImageChanged) {
147+ val uri = (state.profileImageState as ? EditProfileImageType .ImageUri )?.uri
148+ add(async { uploadProfileImageUseCase(uri = uri) })
149+ }
153150 }.awaitAll()
154151
155152 userRepository.getUserInfo()
156153 .onSuccess { user ->
157154 if (isProfileImageChanged) {
158- val request = ImageRequest .Builder (context)
159- .data(user.profileImageUrl)
160- .build()
161- context.imageLoader.execute(request)
155+ postSideEffect(MyPageEffect .PreloadProfileImage (user.profileImageUrl))
162156 }
163-
164157 reduce {
165158 copy(
166159 isLoading = false ,
167- selectedProfileImage = SelectedProfileImage . NoChange ,
160+ profileImageState = EditProfileImageType . OriginalImageUrl (user.profileImageUrl) ,
168161 userInfo = user,
169162 )
170163 }
171- postSideEffect(MyPageEffect .NavigateBack )
172164 }
173165 .onFailure {
174- reduce { copy(isLoading = false , selectedProfileImage = SelectedProfileImage .NoChange ) }
166+ Timber .e(it)
167+ reduce {
168+ copy(
169+ isLoading = false ,
170+ profileImageState = EditProfileImageType .OriginalImageUrl (state.userInfo.profileImageUrl),
171+ )
172+ }
175173 postSideEffect(MyPageEffect .NavigateBack )
176174 }
177175 }
0 commit comments