From 3ed09737a93a17aaf68deb4f0033ececdec2fde1 Mon Sep 17 00:00:00 2001 From: uiel Date: Thu, 7 Nov 2024 15:19:25 +0900 Subject: [PATCH 1/3] =?UTF-8?q?refactor=20::=20=ED=94=84=EB=A1=9C=ED=95=84?= =?UTF-8?q?=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20=EC=B2=98=EB=A6=AC=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jobisdesignsystemv2/foundation/JobisIcon.kt | 1 + .../src/main/res/drawable/ic_person.png | Bin .../usecase/usecase/student/PostSignUpUseCase.kt | 2 +- .../model/request/student/PostSignUpRequest.kt | 2 +- .../main/java/team/retum/jobis/ui/MyPageScreen.kt | 2 +- .../team/retum/jobis/viewmodel/MyPageViewModel.kt | 9 +++++---- .../java/team/retum/signup/model/SignUpData.kt | 2 +- .../java/team/retum/signup/ui/SetProfileScreen.kt | 13 ++++++++----- .../retum/signup/viewmodel/SetProfileViewModel.kt | 11 +++++++++-- .../team/retum/signup/viewmodel/TermsViewModel.kt | 5 ++++- feature/signup/src/main/res/values/strings.xml | 1 + 11 files changed, 32 insertions(+), 16 deletions(-) rename core/{common => design-system}/src/main/res/drawable/ic_person.png (100%) diff --git a/core/design-system/src/main/java/team/retum/jobisdesignsystemv2/foundation/JobisIcon.kt b/core/design-system/src/main/java/team/retum/jobisdesignsystemv2/foundation/JobisIcon.kt index e9c6a7518..361a03761 100644 --- a/core/design-system/src/main/java/team/retum/jobisdesignsystemv2/foundation/JobisIcon.kt +++ b/core/design-system/src/main/java/team/retum/jobisdesignsystemv2/foundation/JobisIcon.kt @@ -36,4 +36,5 @@ object JobisIcon { val SnowMan = R.drawable.ic_snow_man val Notification = R.drawable.ic_notification val Empty = R.drawable.ic_empty + val Person = R.drawable.ic_person } diff --git a/core/common/src/main/res/drawable/ic_person.png b/core/design-system/src/main/res/drawable/ic_person.png similarity index 100% rename from core/common/src/main/res/drawable/ic_person.png rename to core/design-system/src/main/res/drawable/ic_person.png diff --git a/core/domain/src/main/java/team/retum/usecase/usecase/student/PostSignUpUseCase.kt b/core/domain/src/main/java/team/retum/usecase/usecase/student/PostSignUpUseCase.kt index 6ac9cfb66..2fda54289 100644 --- a/core/domain/src/main/java/team/retum/usecase/usecase/student/PostSignUpUseCase.kt +++ b/core/domain/src/main/java/team/retum/usecase/usecase/student/PostSignUpUseCase.kt @@ -17,7 +17,7 @@ class PostSignUpUseCase @Inject constructor( gender: Gender, classRoom: Long, number: Long, - profileImageUrl: String, + profileImageUrl: String?, deviceToken: String, ) = runCatching { studentRepository.postSignUp( diff --git a/core/network/src/main/java/team/retum/network/model/request/student/PostSignUpRequest.kt b/core/network/src/main/java/team/retum/network/model/request/student/PostSignUpRequest.kt index 8def4ed08..d937e3067 100644 --- a/core/network/src/main/java/team/retum/network/model/request/student/PostSignUpRequest.kt +++ b/core/network/src/main/java/team/retum/network/model/request/student/PostSignUpRequest.kt @@ -14,7 +14,7 @@ data class PostSignUpRequest( @Json(name = "gender") val gender: Gender, @Json(name = "class_room") val classRoom: Long, @Json(name = "number") val number: Long, - @Json(name = "profile_image_url") val profileImageUrl: String, + @Json(name = "profile_image_url") val profileImageUrl: String?, @Json(name = "platform_type") val platformType: PlatformType, @Json(name = "device_token") val deviceToken: String, ) diff --git a/feature/mypage/src/main/java/team/retum/jobis/ui/MyPageScreen.kt b/feature/mypage/src/main/java/team/retum/jobis/ui/MyPageScreen.kt index a00d9040f..244d4b235 100644 --- a/feature/mypage/src/main/java/team/retum/jobis/ui/MyPageScreen.kt +++ b/feature/mypage/src/main/java/team/retum/jobis/ui/MyPageScreen.kt @@ -186,7 +186,7 @@ private fun MyPageScreen( with(state.studentInformation) { StudentInfo( modifier = Modifier.padding(vertical = 12.dp), - profileImageUrl = state.studentInformation.profileImageUrl, + profileImageUrl = profileImageUrl, number = studentGcn, name = studentName, department = department.value, diff --git a/feature/mypage/src/main/java/team/retum/jobis/viewmodel/MyPageViewModel.kt b/feature/mypage/src/main/java/team/retum/jobis/viewmodel/MyPageViewModel.kt index 0b2caaa92..776e2785f 100644 --- a/feature/mypage/src/main/java/team/retum/jobis/viewmodel/MyPageViewModel.kt +++ b/feature/mypage/src/main/java/team/retum/jobis/viewmodel/MyPageViewModel.kt @@ -87,10 +87,11 @@ internal class MyPageViewModel @Inject constructor( private fun fetchStudentInformation() { viewModelScope.launch(Dispatchers.IO) { - fetchStudentInformationUseCase().onSuccess { - val profileImageUrl = ResourceKeys.IMAGE_URL + it.profileImageUrl - setState { state.value.copy(studentInformation = it.copy(profileImageUrl = profileImageUrl)) } - } + fetchStudentInformationUseCase() + .onSuccess { + val profileImageUrl = ResourceKeys.IMAGE_URL + it.profileImageUrl + setState { state.value.copy(studentInformation = it.copy(profileImageUrl = profileImageUrl)) } + } } } diff --git a/feature/signup/src/main/java/team/retum/signup/model/SignUpData.kt b/feature/signup/src/main/java/team/retum/signup/model/SignUpData.kt index 2715273a3..604faa766 100644 --- a/feature/signup/src/main/java/team/retum/signup/model/SignUpData.kt +++ b/feature/signup/src/main/java/team/retum/signup/model/SignUpData.kt @@ -14,7 +14,7 @@ data class SignUpData( val gender: Gender? = null, val classRoom: String = "", val number: String = "", - val profileImageUrl: String = "", + val profileImageUrl: String? = null, ) internal fun SignUpData.toJsonString() = Json.encodeToString(this) diff --git a/feature/signup/src/main/java/team/retum/signup/ui/SetProfileScreen.kt b/feature/signup/src/main/java/team/retum/signup/ui/SetProfileScreen.kt index cc4b4f6be..e8632f0db 100644 --- a/feature/signup/src/main/java/team/retum/signup/ui/SetProfileScreen.kt +++ b/feature/signup/src/main/java/team/retum/signup/ui/SetProfileScreen.kt @@ -41,6 +41,7 @@ import coil.compose.AsyncImage import team.retum.jobisdesignsystemv2.appbar.JobisLargeTopAppBar import team.retum.jobisdesignsystemv2.button.ButtonColor import team.retum.jobisdesignsystemv2.button.JobisButton +import team.retum.jobisdesignsystemv2.foundation.JobisIcon import team.retum.jobisdesignsystemv2.foundation.JobisTheme import team.retum.jobisdesignsystemv2.foundation.JobisTypography import team.retum.jobisdesignsystemv2.text.JobisText @@ -82,6 +83,7 @@ internal fun SetProfile( SetProfileScreen( onBackPressed = onBackPressed, onNextClick = setProfileViewModel::onNextClick, + onImgChangeClick = setProfileViewModel::onImgChangeClick, activityResultLauncher = activityResultLauncher, state = state, ) @@ -91,6 +93,7 @@ internal fun SetProfile( private fun SetProfileScreen( onBackPressed: () -> Unit, onNextClick: () -> Unit, + onImgChangeClick: () -> Unit, activityResultLauncher: ManagedActivityResultLauncher, state: SetProfileState, ) { @@ -104,26 +107,26 @@ private fun SetProfileScreen( onBackPressed = onBackPressed, ) SetImage( - uri = state.uri.toString(), + uri = state.uri, onClick = { val mediaType = ActivityResultContracts.PickVisualMedia.ImageOnly val request = PickVisualMediaRequest(mediaType) activityResultLauncher.launch(request) + onImgChangeClick() }, ) Spacer(modifier = Modifier.weight(1f)) JobisButton( - text = stringResource(id = R.string.next), + text = stringResource(id = if (state.uri == null) R.string.skip else R.string.next), onClick = onNextClick, color = ButtonColor.Primary, - enabled = state.buttonEnabled, ) } } @Composable private fun SetImage( - uri: String?, + uri: Uri?, onClick: () -> Unit, ) { Column( @@ -137,7 +140,7 @@ private fun SetImage( modifier = Modifier .size(80.dp) .clip(CircleShape), - model = uri ?: team.retum.common.R.drawable.ic_person, + model = uri ?: JobisIcon.Person, contentDescription = "user profile", contentScale = ContentScale.Crop, ) diff --git a/feature/signup/src/main/java/team/retum/signup/viewmodel/SetProfileViewModel.kt b/feature/signup/src/main/java/team/retum/signup/viewmodel/SetProfileViewModel.kt index d1329f21b..606688287 100644 --- a/feature/signup/src/main/java/team/retum/signup/viewmodel/SetProfileViewModel.kt +++ b/feature/signup/src/main/java/team/retum/signup/viewmodel/SetProfileViewModel.kt @@ -40,6 +40,11 @@ internal class SetProfileViewModel @Inject constructor( } internal fun onNextClick() { + val profileImageUrl = state.value.profileImageUrl + postSideEffect(SetProfileSideEffect.MoveToNext(profileImageUrl = profileImageUrl)) + } + + internal fun onImgChangeClick() { viewModelScope.launch(Dispatchers.IO) { createPresignedUrlUseCase(files = listOf(state.value.image?.name ?: "")).onSuccess { val response = it.urls.first() @@ -60,7 +65,7 @@ internal class SetProfileViewModel @Inject constructor( file = state.value.image!!, ).onSuccess { val encodedImageUrl = URLEncoder.encode(fileUrl, "UTF8") - postSideEffect(SetProfileSideEffect.MoveToNext(profileImageUrl = encodedImageUrl)) + setState { state.value.copy(profileImageUrl = encodedImageUrl) } } } } @@ -70,6 +75,7 @@ internal data class SetProfileState( val image: File?, val imageUrl: String, val uri: Uri?, + val profileImageUrl: String?, val buttonEnabled: Boolean, ) { companion object { @@ -77,11 +83,12 @@ internal data class SetProfileState( image = null, imageUrl = "", uri = null, + profileImageUrl = null, buttonEnabled = false, ) } } internal sealed interface SetProfileSideEffect { - data class MoveToNext(val profileImageUrl: String) : SetProfileSideEffect + data class MoveToNext(val profileImageUrl: String?) : SetProfileSideEffect } diff --git a/feature/signup/src/main/java/team/retum/signup/viewmodel/TermsViewModel.kt b/feature/signup/src/main/java/team/retum/signup/viewmodel/TermsViewModel.kt index f3d6dcbd9..b7310362a 100644 --- a/feature/signup/src/main/java/team/retum/signup/viewmodel/TermsViewModel.kt +++ b/feature/signup/src/main/java/team/retum/signup/viewmodel/TermsViewModel.kt @@ -40,7 +40,10 @@ internal class TermsViewModel @Inject constructor( internal fun onCompleteClick(signUpData: SignUpData) { with(signUpData) { val decodedPassword = URLDecoder.decode(password, "UTF8") - val decodedImageUrl = URLDecoder.decode(profileImageUrl, "UTF8") + val decodedImageUrl = if (profileImageUrl.isNullOrEmpty()) null else URLDecoder.decode( + profileImageUrl, + "UTF8", + ) viewModelScope.launch(Dispatchers.IO) { postSignUpUseCase( email = email, diff --git a/feature/signup/src/main/res/values/strings.xml b/feature/signup/src/main/res/values/strings.xml index 88e6cd35b..d934b9e19 100644 --- a/feature/signup/src/main/res/values/strings.xml +++ b/feature/signup/src/main/res/values/strings.xml @@ -48,6 +48,7 @@ 이름 학번 다음 + 건너뛰기 성별을 선택해주세요 From e02d0b3c134c38d14e73673bdddef3ecd19cedc0 Mon Sep 17 00:00:00 2001 From: uiel Date: Thu, 7 Nov 2024 15:19:37 +0900 Subject: [PATCH 2/3] =?UTF-8?q?refactor=20::=20=EA=B3=B5=ED=86=B5=EA=B5=90?= =?UTF-8?q?=EC=9C=A1=EA=B3=BC=EC=A0=95=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/common/src/main/java/team/retum/common/enums/Department.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/core/common/src/main/java/team/retum/common/enums/Department.kt b/core/common/src/main/java/team/retum/common/enums/Department.kt index d9be7bc3f..c642934df 100644 --- a/core/common/src/main/java/team/retum/common/enums/Department.kt +++ b/core/common/src/main/java/team/retum/common/enums/Department.kt @@ -5,4 +5,5 @@ enum class Department(val value: String) { EMBEDDED_SOFTWARE("임베디드소프트웨어과"), INFORMATION_SECURITY("정보보안과"), AI_SOFTWARE("인공지능소프트웨어과"), + COMMON("공통교육과정"), } From 3d4effac47790bf4194f9f31afef57097820d7bf Mon Sep 17 00:00:00 2001 From: uiel Date: Thu, 7 Nov 2024 15:35:25 +0900 Subject: [PATCH 3/3] refactor :: ktlint --- .../team/retum/signup/viewmodel/TermsViewModel.kt | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/feature/signup/src/main/java/team/retum/signup/viewmodel/TermsViewModel.kt b/feature/signup/src/main/java/team/retum/signup/viewmodel/TermsViewModel.kt index b7310362a..1221db45a 100644 --- a/feature/signup/src/main/java/team/retum/signup/viewmodel/TermsViewModel.kt +++ b/feature/signup/src/main/java/team/retum/signup/viewmodel/TermsViewModel.kt @@ -40,10 +40,14 @@ internal class TermsViewModel @Inject constructor( internal fun onCompleteClick(signUpData: SignUpData) { with(signUpData) { val decodedPassword = URLDecoder.decode(password, "UTF8") - val decodedImageUrl = if (profileImageUrl.isNullOrEmpty()) null else URLDecoder.decode( - profileImageUrl, - "UTF8", - ) + val decodedImageUrl = if (profileImageUrl.isNullOrEmpty()) { + null + } else { + URLDecoder.decode( + profileImageUrl, + "UTF8", + ) + } viewModelScope.launch(Dispatchers.IO) { postSignUpUseCase( email = email,