From df2827476072d0504d8a394281e28d68d678688c Mon Sep 17 00:00:00 2001 From: wjchoi96 Date: Sat, 17 Feb 2024 17:33:31 +0900 Subject: [PATCH 01/16] =?UTF-8?q?feat:TOP-94=20MyPageUserInfo=20Api=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84.=20Data,=20Domain=20Layer=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tht/tht/data/constant/THTApiConstant.kt | 4 ++ .../com/tht/tht/data/di/DataSourceModule.kt | 5 ++ .../com/tht/tht/data/di/RepositoryModule.kt | 5 ++ .../java/com/tht/tht/data/di/UseCaseModule.kt | 7 +++ .../tht/data/di/retrofit/ApiServiceModule.kt | 7 +++ .../setting/UserSettingDataSource.kt | 7 +++ .../setting/UserSettingDataSourceImpl.kt | 15 ++++++ .../remote/mapper/MyPageUserSettingMapper.kt | 43 ++++++++++++++++ .../setting/MyPageUserInfoResponse.kt | 51 +++++++++++++++++++ .../service/setting/MyPageUserInfoService.kt | 11 ++++ .../repository/UserSettingRepositoryImpl.kt | 15 ++++++ .../setting/model/MyPageUserInfoModel.kt | 31 +++++++++++ .../repository/UserSettingRepository.kt | 7 +++ .../usecase/FetchMyPageUserInfoUseCase.kt | 14 +++++ 14 files changed, 222 insertions(+) create mode 100644 data/src/main/java/com/tht/tht/data/remote/datasource/setting/UserSettingDataSource.kt create mode 100644 data/src/main/java/com/tht/tht/data/remote/datasource/setting/UserSettingDataSourceImpl.kt create mode 100644 data/src/main/java/com/tht/tht/data/remote/mapper/MyPageUserSettingMapper.kt create mode 100644 data/src/main/java/com/tht/tht/data/remote/response/setting/MyPageUserInfoResponse.kt create mode 100644 data/src/main/java/com/tht/tht/data/remote/service/setting/MyPageUserInfoService.kt create mode 100644 data/src/main/java/com/tht/tht/data/repository/UserSettingRepositoryImpl.kt create mode 100644 domain/src/main/java/com/tht/tht/domain/setting/model/MyPageUserInfoModel.kt create mode 100644 domain/src/main/java/com/tht/tht/domain/setting/repository/UserSettingRepository.kt create mode 100644 domain/src/main/java/com/tht/tht/domain/setting/usecase/FetchMyPageUserInfoUseCase.kt diff --git a/data/src/main/java/com/tht/tht/data/constant/THTApiConstant.kt b/data/src/main/java/com/tht/tht/data/constant/THTApiConstant.kt index 65c9ec19..0b3fb1aa 100644 --- a/data/src/main/java/com/tht/tht/data/constant/THTApiConstant.kt +++ b/data/src/main/java/com/tht/tht/data/constant/THTApiConstant.kt @@ -48,4 +48,8 @@ object THTApiConstant { object Chat { const val CHAT_LIST = "/chat/rooms" } + + object Setting { + const val MY_PAGE = "/user" + } } diff --git a/data/src/main/java/com/tht/tht/data/di/DataSourceModule.kt b/data/src/main/java/com/tht/tht/data/di/DataSourceModule.kt index 8aaedba1..e73a9187 100644 --- a/data/src/main/java/com/tht/tht/data/di/DataSourceModule.kt +++ b/data/src/main/java/com/tht/tht/data/di/DataSourceModule.kt @@ -14,6 +14,8 @@ import com.tht.tht.data.remote.datasource.dailyusercard.DailyUserCardDataSource import com.tht.tht.data.remote.datasource.dailyusercard.DailyUserCardDataSourceImpl import com.tht.tht.data.remote.datasource.login.LoginDataSource import com.tht.tht.data.remote.datasource.login.LoginDataSourceImpl +import com.tht.tht.data.remote.datasource.setting.UserSettingDataSource +import com.tht.tht.data.remote.datasource.setting.UserSettingDataSourceImpl import com.tht.tht.data.remote.datasource.signup.EmailDataSource import com.tht.tht.data.remote.datasource.signup.EmailDataSourceImpl import com.tht.tht.data.remote.datasource.signup.ImageDataSource @@ -72,4 +74,7 @@ abstract class DataSourceModule { @Binds abstract fun bindSettingItemDataSource(impl: SettingItemDataSourceImpl): SettingItemDataSource + + @Binds + abstract fun bindUserSettingDataSource(impl: UserSettingDataSourceImpl): UserSettingDataSource } diff --git a/data/src/main/java/com/tht/tht/data/di/RepositoryModule.kt b/data/src/main/java/com/tht/tht/data/di/RepositoryModule.kt index 29e720c2..f1864217 100644 --- a/data/src/main/java/com/tht/tht/data/di/RepositoryModule.kt +++ b/data/src/main/java/com/tht/tht/data/di/RepositoryModule.kt @@ -11,12 +11,14 @@ import com.tht.tht.data.repository.RegionCodeRepositoryImpl import com.tht.tht.data.repository.SettingRepositoryImpl import com.tht.tht.data.repository.SignupRepositoryImpl import com.tht.tht.data.repository.TokenRepositoryImpl +import com.tht.tht.data.repository.UserSettingRepositoryImpl import com.tht.tht.domain.chat.repository.ChatRepository import com.tht.tht.domain.dailyusercard.DailyUserCardRepository import com.tht.tht.domain.email.repository.EmailRepository import com.tht.tht.domain.image.ImageRepository import com.tht.tht.domain.login.repository.LoginRepository import com.tht.tht.domain.setting.repository.SettingRepository +import com.tht.tht.domain.setting.repository.UserSettingRepository import com.tht.tht.domain.signup.repository.LocationRepository import com.tht.tht.domain.signup.repository.RegionCodeRepository import com.tht.tht.domain.signup.repository.SignupRepository @@ -63,4 +65,7 @@ abstract class RepositoryModule { @Binds abstract fun bindSettingRepository(impl: SettingRepositoryImpl): SettingRepository + + @Binds + abstract fun bindUserSettingRepository(impl: UserSettingRepositoryImpl): UserSettingRepository } diff --git a/data/src/main/java/com/tht/tht/data/di/UseCaseModule.kt b/data/src/main/java/com/tht/tht/data/di/UseCaseModule.kt index 5d372d16..632213a2 100644 --- a/data/src/main/java/com/tht/tht/data/di/UseCaseModule.kt +++ b/data/src/main/java/com/tht/tht/data/di/UseCaseModule.kt @@ -12,7 +12,9 @@ import com.tht.tht.domain.image.UploadImageUseCase import com.tht.tht.domain.login.repository.LoginRepository import com.tht.tht.domain.login.usecase.LoginUseCase import com.tht.tht.domain.setting.repository.SettingRepository +import com.tht.tht.domain.setting.repository.UserSettingRepository import com.tht.tht.domain.setting.usecase.FetchAccountManageItemsUseCase +import com.tht.tht.domain.setting.usecase.FetchMyPageUserInfoUseCase import com.tht.tht.domain.setting.usecase.FetchSettingManageItemsUseCase import com.tht.tht.domain.signup.repository.LocationRepository import com.tht.tht.domain.signup.repository.RegionCodeRepository @@ -326,4 +328,9 @@ object UseCaseModule { settingRepository: SettingRepository ): FetchAccountManageItemsUseCase = FetchAccountManageItemsUseCase(settingRepository) + + @Provides + fun provideFetchMyPageUserInfoUseCase( + userSettingRepository: UserSettingRepository + ): FetchMyPageUserInfoUseCase = FetchMyPageUserInfoUseCase(userSettingRepository) } diff --git a/data/src/main/java/com/tht/tht/data/di/retrofit/ApiServiceModule.kt b/data/src/main/java/com/tht/tht/data/di/retrofit/ApiServiceModule.kt index cdb8f2b1..f3d11706 100644 --- a/data/src/main/java/com/tht/tht/data/di/retrofit/ApiServiceModule.kt +++ b/data/src/main/java/com/tht/tht/data/di/retrofit/ApiServiceModule.kt @@ -7,6 +7,7 @@ import com.tht.tht.data.remote.service.dailyusercard.DailyUserCardApiService import com.tht.tht.data.remote.service.image.ImageService import com.tht.tht.data.remote.service.image.ImageServiceImpl import com.tht.tht.data.remote.service.location.RegionCodeApi +import com.tht.tht.data.remote.service.setting.MyPageUserInfoService import com.tht.tht.data.remote.service.topic.DailyTopicApiService import com.tht.tht.data.remote.service.user.AccessTokenRefreshService import com.tht.tht.data.remote.service.user.UserBlockApiService @@ -107,4 +108,10 @@ object ApiServiceModule { fun provideUserDisActiveService( @ThtAccessTokenRetrofit retrofit: Retrofit ): UserDisActiveService = retrofit.create(UserDisActiveService::class.java) + + @Provides + @Singleton + fun provideMyPageUserInfoService( + @ThtAccessTokenRetrofit retrofit: Retrofit + ): MyPageUserInfoService = retrofit.create(MyPageUserInfoService::class.java) } diff --git a/data/src/main/java/com/tht/tht/data/remote/datasource/setting/UserSettingDataSource.kt b/data/src/main/java/com/tht/tht/data/remote/datasource/setting/UserSettingDataSource.kt new file mode 100644 index 00000000..132ad428 --- /dev/null +++ b/data/src/main/java/com/tht/tht/data/remote/datasource/setting/UserSettingDataSource.kt @@ -0,0 +1,7 @@ +package com.tht.tht.data.remote.datasource.setting + +import com.tht.tht.data.remote.response.setting.MyPageUserInfoResponse + +interface UserSettingDataSource { + suspend fun fetchMyPageUserInfo(): MyPageUserInfoResponse +} diff --git a/data/src/main/java/com/tht/tht/data/remote/datasource/setting/UserSettingDataSourceImpl.kt b/data/src/main/java/com/tht/tht/data/remote/datasource/setting/UserSettingDataSourceImpl.kt new file mode 100644 index 00000000..1e15514e --- /dev/null +++ b/data/src/main/java/com/tht/tht/data/remote/datasource/setting/UserSettingDataSourceImpl.kt @@ -0,0 +1,15 @@ +package com.tht.tht.data.remote.datasource.setting + +import com.tht.tht.data.remote.mapper.toUnwrap +import com.tht.tht.data.remote.response.setting.MyPageUserInfoResponse +import com.tht.tht.data.remote.service.setting.MyPageUserInfoService +import javax.inject.Inject + +class UserSettingDataSourceImpl @Inject constructor( + private val service: MyPageUserInfoService +) : UserSettingDataSource { + + override suspend fun fetchMyPageUserInfo(): MyPageUserInfoResponse { + return service.fetchMyPageUserInfo().toUnwrap() + } +} diff --git a/data/src/main/java/com/tht/tht/data/remote/mapper/MyPageUserSettingMapper.kt b/data/src/main/java/com/tht/tht/data/remote/mapper/MyPageUserSettingMapper.kt new file mode 100644 index 00000000..17e56b32 --- /dev/null +++ b/data/src/main/java/com/tht/tht/data/remote/mapper/MyPageUserSettingMapper.kt @@ -0,0 +1,43 @@ +package com.tht.tht.data.remote.mapper + +import com.tht.tht.data.remote.response.setting.MyPageUserInfoResponse +import com.tht.tht.domain.setting.model.MyPageUserInfoModel + +fun MyPageUserInfoResponse.toModel(): MyPageUserInfoModel { + return MyPageUserInfoModel( + address = address, + age = age, + email = email, + idealTypeList = idealTypeList.map { it.toModel() }, + interestsList = interestsList.map { it.toModel() }, + introduction = introduction, + phoneNumber = phoneNumber, + userProfilePhotos = userProfilePhotos.map { it.toModel() }, + userUuid = userUuid, + username = username + ) +} + +fun MyPageUserInfoResponse.IdealType.toModel(): MyPageUserInfoModel.IdealType { + return MyPageUserInfoModel.IdealType( + emojiCode = emojiCode, + idx = idx, + name = name + ) +} + + +fun MyPageUserInfoResponse.Interests.toModel(): MyPageUserInfoModel.Interests { + return MyPageUserInfoModel.Interests( + emojiCode = emojiCode, + idx = idx, + name = name + ) +} + +fun MyPageUserInfoResponse.UserProfilePhoto.toModel(): MyPageUserInfoModel.UserProfilePhoto { + return MyPageUserInfoModel.UserProfilePhoto( + priority = priority, + url = url + ) +} diff --git a/data/src/main/java/com/tht/tht/data/remote/response/setting/MyPageUserInfoResponse.kt b/data/src/main/java/com/tht/tht/data/remote/response/setting/MyPageUserInfoResponse.kt new file mode 100644 index 00000000..4b2340c5 --- /dev/null +++ b/data/src/main/java/com/tht/tht/data/remote/response/setting/MyPageUserInfoResponse.kt @@ -0,0 +1,51 @@ +package com.tht.tht.data.remote.response.setting + +import com.google.gson.annotations.SerializedName + +data class MyPageUserInfoResponse( + @SerializedName("address") + val address: String, + @SerializedName("age") + val age: Int, + @SerializedName("email") + val email: String, + @SerializedName("idealTypeList") + val idealTypeList: List, + @SerializedName("interestsList") + val interestsList: List, + @SerializedName("introduction") + val introduction: String, + @SerializedName("phoneNumber") + val phoneNumber: String, + @SerializedName("userProfilePhotos") + val userProfilePhotos: List, + @SerializedName("userUuid") + val userUuid: String, + @SerializedName("username") + val username: String +) { + data class IdealType( + @SerializedName("emojiCode") + val emojiCode: String, + @SerializedName("idx") + val idx: Int, + @SerializedName("name") + val name: String + ) + + data class Interests( + @SerializedName("emojiCode") + val emojiCode: String, + @SerializedName("idx") + val idx: Int, + @SerializedName("name") + val name: String + ) + + data class UserProfilePhoto( + @SerializedName("priority") + val priority: Int, + @SerializedName("url") + val url: String + ) +} diff --git a/data/src/main/java/com/tht/tht/data/remote/service/setting/MyPageUserInfoService.kt b/data/src/main/java/com/tht/tht/data/remote/service/setting/MyPageUserInfoService.kt new file mode 100644 index 00000000..572dd278 --- /dev/null +++ b/data/src/main/java/com/tht/tht/data/remote/service/setting/MyPageUserInfoService.kt @@ -0,0 +1,11 @@ +package com.tht.tht.data.remote.service.setting + +import com.tht.tht.data.constant.THTApiConstant +import com.tht.tht.data.remote.response.base.ThtResponse +import com.tht.tht.data.remote.response.setting.MyPageUserInfoResponse +import retrofit2.http.GET + +interface MyPageUserInfoService { + @GET(THTApiConstant.Setting.MY_PAGE) + suspend fun fetchMyPageUserInfo(): ThtResponse +} diff --git a/data/src/main/java/com/tht/tht/data/repository/UserSettingRepositoryImpl.kt b/data/src/main/java/com/tht/tht/data/repository/UserSettingRepositoryImpl.kt new file mode 100644 index 00000000..1297af2a --- /dev/null +++ b/data/src/main/java/com/tht/tht/data/repository/UserSettingRepositoryImpl.kt @@ -0,0 +1,15 @@ +package com.tht.tht.data.repository + +import com.tht.tht.data.remote.datasource.setting.UserSettingDataSource +import com.tht.tht.data.remote.mapper.toModel +import com.tht.tht.domain.setting.model.MyPageUserInfoModel +import com.tht.tht.domain.setting.repository.UserSettingRepository +import javax.inject.Inject + +class UserSettingRepositoryImpl @Inject constructor( + private val dataSource: UserSettingDataSource +) : UserSettingRepository { + override suspend fun fetchMyPageUserInfo(): MyPageUserInfoModel { + return dataSource.fetchMyPageUserInfo().toModel() + } +} diff --git a/domain/src/main/java/com/tht/tht/domain/setting/model/MyPageUserInfoModel.kt b/domain/src/main/java/com/tht/tht/domain/setting/model/MyPageUserInfoModel.kt new file mode 100644 index 00000000..36a3f58f --- /dev/null +++ b/domain/src/main/java/com/tht/tht/domain/setting/model/MyPageUserInfoModel.kt @@ -0,0 +1,31 @@ +package com.tht.tht.domain.setting.model + +data class MyPageUserInfoModel( + val address: String, + val age: Int, + val email: String, + val idealTypeList: List, + val interestsList: List, + val introduction: String, + val phoneNumber: String, + val userProfilePhotos: List, + val userUuid: String, + val username: String +) { + data class IdealType( + val emojiCode: String, + val idx: Int, + val name: String + ) + + data class Interests( + val emojiCode: String, + val idx: Int, + val name: String + ) + + data class UserProfilePhoto( + val priority: Int, + val url: String + ) +} diff --git a/domain/src/main/java/com/tht/tht/domain/setting/repository/UserSettingRepository.kt b/domain/src/main/java/com/tht/tht/domain/setting/repository/UserSettingRepository.kt new file mode 100644 index 00000000..ab119421 --- /dev/null +++ b/domain/src/main/java/com/tht/tht/domain/setting/repository/UserSettingRepository.kt @@ -0,0 +1,7 @@ +package com.tht.tht.domain.setting.repository + +import com.tht.tht.domain.setting.model.MyPageUserInfoModel + +interface UserSettingRepository { + suspend fun fetchMyPageUserInfo(): MyPageUserInfoModel +} diff --git a/domain/src/main/java/com/tht/tht/domain/setting/usecase/FetchMyPageUserInfoUseCase.kt b/domain/src/main/java/com/tht/tht/domain/setting/usecase/FetchMyPageUserInfoUseCase.kt new file mode 100644 index 00000000..1b8e09b4 --- /dev/null +++ b/domain/src/main/java/com/tht/tht/domain/setting/usecase/FetchMyPageUserInfoUseCase.kt @@ -0,0 +1,14 @@ +package com.tht.tht.domain.setting.usecase + +import com.tht.tht.domain.setting.model.MyPageUserInfoModel +import com.tht.tht.domain.setting.repository.UserSettingRepository + +class FetchMyPageUserInfoUseCase( + private val repository: UserSettingRepository +) { + suspend operator fun invoke(): Result { + return kotlin.runCatching { + repository.fetchMyPageUserInfo() + } + } +} From f3d62f552ce42930edbcb65f95200005b14de97b Mon Sep 17 00:00:00 2001 From: wjchoi96 Date: Sat, 17 Feb 2024 17:33:39 +0900 Subject: [PATCH 02/16] =?UTF-8?q?feat:TOP-94=20MyPage=20=EC=9D=BC=EB=B6=80?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../res/drawable/ic_profile_image_edit.xml | 13 ++ .../composable/mypage/MyPageNicknameRow.kt | 56 +++++++ .../mypage/MyPageProfileImageItem.kt | 149 ++++++++++++++++++ .../mypage/MyPageProfileImageRow.kt | 77 +++++++++ .../tht/feature/setting/route/MyPageRoute.kt | 28 +++- .../feature/setting/screen/MyPageScreen.kt | 29 +++- .../setting/uimodel/MyPageUserInfoUiModel.kt | 56 +++++++ .../uimodel/mapper/MyPageUserInfoMapper.kt | 44 ++++++ .../setting/viewmodel/MyPageViewModel.kt | 77 +++++++-- .../main/res/drawable/ic_nickname_edit.xml | 20 +++ .../res/drawable/ic_profile_image_add.xml | 13 ++ .../res/drawable/ic_profile_image_delete.xml | 13 ++ 12 files changed, 557 insertions(+), 18 deletions(-) create mode 100644 feature/setting/src/debug/res/drawable/ic_profile_image_edit.xml create mode 100644 feature/setting/src/main/java/tht/feature/setting/composable/mypage/MyPageNicknameRow.kt create mode 100644 feature/setting/src/main/java/tht/feature/setting/composable/mypage/MyPageProfileImageItem.kt create mode 100644 feature/setting/src/main/java/tht/feature/setting/composable/mypage/MyPageProfileImageRow.kt create mode 100644 feature/setting/src/main/java/tht/feature/setting/uimodel/MyPageUserInfoUiModel.kt create mode 100644 feature/setting/src/main/java/tht/feature/setting/uimodel/mapper/MyPageUserInfoMapper.kt create mode 100644 feature/setting/src/main/res/drawable/ic_nickname_edit.xml create mode 100644 feature/setting/src/main/res/drawable/ic_profile_image_add.xml create mode 100644 feature/setting/src/main/res/drawable/ic_profile_image_delete.xml diff --git a/feature/setting/src/debug/res/drawable/ic_profile_image_edit.xml b/feature/setting/src/debug/res/drawable/ic_profile_image_edit.xml new file mode 100644 index 00000000..807d13c0 --- /dev/null +++ b/feature/setting/src/debug/res/drawable/ic_profile_image_edit.xml @@ -0,0 +1,13 @@ + + + + diff --git a/feature/setting/src/main/java/tht/feature/setting/composable/mypage/MyPageNicknameRow.kt b/feature/setting/src/main/java/tht/feature/setting/composable/mypage/MyPageNicknameRow.kt new file mode 100644 index 00000000..403291ef --- /dev/null +++ b/feature/setting/src/main/java/tht/feature/setting/composable/mypage/MyPageNicknameRow.kt @@ -0,0 +1,56 @@ +package tht.feature.setting.composable.mypage + +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.material.Icon +import androidx.compose.material.IconButton +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.colorResource +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.example.compose_ui.component.text.headline.ThtHeadline5 +import tht.feature.setting.R + +@Composable +fun MyPageNicknameRow( + nickname: String, + onEditClick: () -> Unit, + modifier: Modifier = Modifier +) { + Row( + modifier = modifier + ) { + ThtHeadline5( + text = nickname, + fontWeight = FontWeight.SemiBold, + color = colorResource(id = tht.core.ui.R.color.white_f9fafa) + ) + Spacer(modifier = Modifier.width(10.dp)) + IconButton( + onClick = onEditClick + ) { + Icon( + painter = painterResource(id = R.drawable.ic_nickname_edit), + contentDescription = "ic_nickname_edit", + tint = colorResource(id = tht.core.ui.R.color.white_ffffff) + ) + } + } +} + +@Composable +@Preview +private fun MyPageNicknameRowPreview() { + MyPageNicknameRow( + modifier = Modifier.fillMaxWidth() + .padding(horizontal = 16.dp, vertical = 12.dp), + nickname = "nickname", + onEditClick = {} + ) +} diff --git a/feature/setting/src/main/java/tht/feature/setting/composable/mypage/MyPageProfileImageItem.kt b/feature/setting/src/main/java/tht/feature/setting/composable/mypage/MyPageProfileImageItem.kt new file mode 100644 index 00000000..ad75c6eb --- /dev/null +++ b/feature/setting/src/main/java/tht/feature/setting/composable/mypage/MyPageProfileImageItem.kt @@ -0,0 +1,149 @@ +package tht.feature.setting.composable.mypage + +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.Icon +import androidx.compose.material.IconButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.SolidColor +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.colorResource +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import coil.compose.AsyncImage +import coil.request.ImageRequest +import coil.size.Size +import tht.feature.setting.R + +@Composable +fun MyPageProfileImageItem( + imageUrl: String?, + isPrimary: Boolean, + onPrimaryEditClick: () -> Unit, + onNonePrimaryAddClick: () -> Unit, + onNonePrimaryRemoveClick: () -> Unit, + modifier: Modifier = Modifier +) { + //TODO: PlaceHolder, Error 처리 + val context = LocalContext.current + Box( + modifier = modifier + .clip(RoundedCornerShape(12.dp)) + .then( + if (isPrimary) { + Modifier.border( + width = 1.dp, + brush = SolidColor(colorResource(id = tht.core.ui.R.color.yellow_f9cc2e)), + shape = RoundedCornerShape(12.dp) + ) + } else { + Modifier + } + ) + .background(color = colorResource(id = tht.core.ui.R.color.black_222222)) + ) { + val model = remember(imageUrl) { + ImageRequest.Builder(context) + .data(imageUrl) + .size(Size.ORIGINAL) + .crossfade(true) + .build() + } + AsyncImage( + modifier = modifier + .fillMaxSize() + .clip(RoundedCornerShape(12.dp)), + model = model, + contentDescription = "profile_image", + contentScale = ContentScale.Crop, + ) + if (isPrimary) { + IconButton( + modifier = Modifier.align(Alignment.BottomEnd) + .padding(end = 6.dp, bottom = 6.dp), + onClick = onPrimaryEditClick + ) { + Icon( + painter = painterResource(id = R.drawable.ic_profile_image_edit), + contentDescription = "ic_profile_image_edit", + tint = Color.Unspecified + ) + } + } else { + if (imageUrl.isNullOrBlank()) { + IconButton( + modifier = Modifier.align(Alignment.Center), + onClick = onNonePrimaryAddClick + ) { + Icon( + painter = painterResource(id = R.drawable.ic_profile_image_add), + contentDescription = "ic_profile_image_edit", + tint = Color.Unspecified + ) + } + } else { + IconButton( + modifier = Modifier.align(Alignment.BottomEnd) + .padding(end = 6.dp, bottom = 6.dp), + onClick = onNonePrimaryRemoveClick + ) { + Icon( + painter = painterResource(id = R.drawable.ic_profile_image_delete), + contentDescription = "ic_profile_image_edit", + tint = Color.Unspecified + ) + } + } + } + } +} + +@Composable +@Preview +private fun MyPageProfileImageItemPreview() { + MyPageProfileImageItem( + modifier = Modifier, + imageUrl = "https://adasd", + isPrimary = true, + onPrimaryEditClick = {}, + onNonePrimaryAddClick = {}, + onNonePrimaryRemoveClick = {} + ) +} + +@Composable +@Preview +private fun MyPageNonePrimaryProfileImageItemPreview() { + MyPageProfileImageItem( + modifier = Modifier, + imageUrl = "https://asdasdsa", + isPrimary = false, + onPrimaryEditClick = {}, + onNonePrimaryAddClick = {}, + onNonePrimaryRemoveClick = {} + ) +} + +@Composable +@Preview +private fun MyPageNonePrimaryNoneProfileImageItemPreview() { + MyPageProfileImageItem( + modifier = Modifier, + imageUrl = null, + isPrimary = false, + onPrimaryEditClick = {}, + onNonePrimaryAddClick = {}, + onNonePrimaryRemoveClick = {} + ) +} diff --git a/feature/setting/src/main/java/tht/feature/setting/composable/mypage/MyPageProfileImageRow.kt b/feature/setting/src/main/java/tht/feature/setting/composable/mypage/MyPageProfileImageRow.kt new file mode 100644 index 00000000..8370a9dc --- /dev/null +++ b/feature/setting/src/main/java/tht/feature/setting/composable/mypage/MyPageProfileImageRow.kt @@ -0,0 +1,77 @@ +package tht.feature.setting.composable.mypage + +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.persistentListOf +import kotlinx.collections.immutable.toImmutableList +import tht.feature.setting.uimodel.MyPageUserInfoUiModel + +@Composable +fun MyPageProfileImageRow( + userProfileImages: ImmutableList, + onPrimaryEditClick: (Int) -> Unit, + onNonePrimaryAddClick: () -> Unit, + onNonePrimaryRemoveClick: () -> Unit, + modifier: Modifier = Modifier +) { + val imageUrls = remember(userProfileImages) { + userProfileImages.sortedBy { it.priority } + } + Row( + modifier = modifier + ) { + imageUrls.forEachIndexed { idx, profileImage -> + MyPageProfileImageItem( + modifier = Modifier.weight(1f), + imageUrl = profileImage.url, + isPrimary = profileImage.isPrimaryImage(), + onPrimaryEditClick = remember(profileImage.url) { + { onPrimaryEditClick(profileImage.priority) } + }, + onNonePrimaryAddClick = onNonePrimaryAddClick, + onNonePrimaryRemoveClick = onNonePrimaryRemoveClick + ) + if (idx != imageUrls.size - 1) { + Spacer(modifier = Modifier.width(20.dp)) + } + } + } +} + +@Composable +@Preview +private fun MyPageProfileImageRowPreview() { + MyPageProfileImageRow( + modifier = Modifier + .fillMaxWidth() + .height(140.dp) + .padding(horizontal = 16.dp), + userProfileImages = persistentListOf( + MyPageUserInfoUiModel.UserProfilePhoto( + priority = 0, + url = "https://asdasd" + ), + MyPageUserInfoUiModel.UserProfilePhoto( + priority = 1, + url = "https://asd" + ), + MyPageUserInfoUiModel.UserProfilePhoto( + priority = 2, + url = "" + ) + ).toImmutableList(), + onPrimaryEditClick = {}, + onNonePrimaryRemoveClick = {}, + onNonePrimaryAddClick = {} + ) +} diff --git a/feature/setting/src/main/java/tht/feature/setting/route/MyPageRoute.kt b/feature/setting/src/main/java/tht/feature/setting/route/MyPageRoute.kt index 50771197..f55cc8cf 100644 --- a/feature/setting/src/main/java/tht/feature/setting/route/MyPageRoute.kt +++ b/feature/setting/src/main/java/tht/feature/setting/route/MyPageRoute.kt @@ -3,6 +3,8 @@ package tht.feature.setting.route import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.hilt.navigation.compose.hiltViewModel import tht.feature.setting.screen.MyPageScreen @@ -14,14 +16,28 @@ fun MyPageRoute( viewModel: MyPageViewModel = hiltViewModel() ) { LaunchedEffect(key1 = Unit) { - viewModel.sideEffect.collect { + viewModel.store.sideEffect.collect { when (it) { - is MyPageViewModel.SideEffect.NavigateSetting -> navigateSetting() + is MyPageViewModel.MyPageSideEffect.NavigateSetting -> navigateSetting() } } } - MyPageScreen( - modifier = Modifier.fillMaxSize(), - onSettingClick = viewModel::onSettingClick - ) + val state by viewModel.store.state.collectAsState() + when (state.showSkeletonView || state.myPageUserInfo == null) { + true -> {} + else -> { + MyPageScreen( + modifier = Modifier.fillMaxSize(), + userInfo = requireNotNull(state.myPageUserInfo), + introduceEditMode = false, + onSettingClick = viewModel::onSettingClick, + onNicknameEditClick = viewModel::onNicknameEditClick, + onIntroduceClick = viewModel::onIntroduceClick, + onPrimaryProfileEditClick = viewModel::onPrimaryProfileEditClick, + onOptionalProfileEditClick = viewModel::onOptionalProfileEditClick, + onIdealTypeEditClick = viewModel::onIdealTypeEditClick, + onInterestEditClick = viewModel::onInterestEditClick + ) + } + } } diff --git a/feature/setting/src/main/java/tht/feature/setting/screen/MyPageScreen.kt b/feature/setting/src/main/java/tht/feature/setting/screen/MyPageScreen.kt index 4100fa43..d5cd0e38 100644 --- a/feature/setting/src/main/java/tht/feature/setting/screen/MyPageScreen.kt +++ b/feature/setting/src/main/java/tht/feature/setting/screen/MyPageScreen.kt @@ -4,6 +4,7 @@ import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.Button @@ -20,11 +21,20 @@ import com.example.compose_ui.component.text.headline.ThtHeadline4 import com.example.compose_ui.component.toolbar.ThtToolbar import com.example.compose_ui.extensions.dpTextUnit import tht.core.ui.R +import tht.feature.setting.uimodel.MyPageUserInfoUiModel @Composable fun MyPageScreen( - modifier: Modifier = Modifier, - onSettingClick: () -> Unit = { } + userInfo: MyPageUserInfoUiModel, + introduceEditMode: Boolean, + onSettingClick: () -> Unit, + onNicknameEditClick: () -> Unit, + onIntroduceClick: () -> Unit, + onPrimaryProfileEditClick: (Int) -> Unit, + onOptionalProfileEditClick: () -> Unit, + onIdealTypeEditClick: () -> Unit, + onInterestEditClick: () -> Unit, + modifier: Modifier = Modifier ) { Column( modifier = modifier @@ -62,11 +72,24 @@ fun MyPageScreen( } } ) + + } } @Composable @Preview private fun MyPageScreenPreview() { - MyPageScreen() + MyPageScreen( + modifier = Modifier.fillMaxSize(), + userInfo = MyPageUserInfoUiModel.EMPTY, + introduceEditMode = false, + onSettingClick = {}, + onNicknameEditClick = {}, + onIntroduceClick = {}, + onPrimaryProfileEditClick = {}, + onOptionalProfileEditClick = {}, + onIdealTypeEditClick = {}, + onInterestEditClick = {}, + ) } diff --git a/feature/setting/src/main/java/tht/feature/setting/uimodel/MyPageUserInfoUiModel.kt b/feature/setting/src/main/java/tht/feature/setting/uimodel/MyPageUserInfoUiModel.kt new file mode 100644 index 00000000..05eed7f9 --- /dev/null +++ b/feature/setting/src/main/java/tht/feature/setting/uimodel/MyPageUserInfoUiModel.kt @@ -0,0 +1,56 @@ +package tht.feature.setting.uimodel + +import androidx.compose.runtime.Immutable +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.persistentListOf + +@Immutable +data class MyPageUserInfoUiModel( + val address: String, + val age: Int, + val email: String, + val idealTypeList: ImmutableList, + val interestsList: ImmutableList, + val introduction: String, + val phoneNumber: String, + val userProfilePhotos: ImmutableList, + val userUuid: String, + val username: String +) { + @Immutable + data class IdealType( + val emojiCode: String, + val idx: Int, + val name: String + ) + @Immutable + data class Interests( + val emojiCode: String, + val idx: Int, + val name: String + ) + @Immutable + data class UserProfilePhoto( + val priority: Int, + val url: String + ) { + fun isPrimaryImage(): Boolean = priority < 2 + } + + companion object { + val EMPTY: MyPageUserInfoUiModel + get() = MyPageUserInfoUiModel( + address = "", + age = -1, + email = "", + idealTypeList = persistentListOf(), + interestsList = persistentListOf(), + introduction = "", + phoneNumber = "", + userProfilePhotos = persistentListOf(), + userUuid = "", + username = "", + ) + } +} + diff --git a/feature/setting/src/main/java/tht/feature/setting/uimodel/mapper/MyPageUserInfoMapper.kt b/feature/setting/src/main/java/tht/feature/setting/uimodel/mapper/MyPageUserInfoMapper.kt new file mode 100644 index 00000000..82061636 --- /dev/null +++ b/feature/setting/src/main/java/tht/feature/setting/uimodel/mapper/MyPageUserInfoMapper.kt @@ -0,0 +1,44 @@ +package tht.feature.setting.uimodel.mapper + +import com.tht.tht.domain.setting.model.MyPageUserInfoModel +import kotlinx.collections.immutable.toPersistentList +import tht.feature.setting.uimodel.MyPageUserInfoUiModel + +fun MyPageUserInfoModel.toUiModel(): MyPageUserInfoUiModel { + return MyPageUserInfoUiModel( + address = address, + age = age, + email = email, + idealTypeList = idealTypeList.map { it.toUiModel() }.toPersistentList(), + interestsList = interestsList.map { it.toUiModel() }.toPersistentList(), + introduction = introduction, + phoneNumber = phoneNumber, + userProfilePhotos = userProfilePhotos.map { it.toUiModel() }.toPersistentList(), + userUuid = userUuid, + username = username + ) +} + +fun MyPageUserInfoModel.IdealType.toUiModel(): MyPageUserInfoUiModel.IdealType { + return MyPageUserInfoUiModel.IdealType( + emojiCode = emojiCode, + idx = idx, + name = name + ) +} + + +fun MyPageUserInfoModel.Interests.toUiModel(): MyPageUserInfoUiModel.Interests { + return MyPageUserInfoUiModel.Interests( + emojiCode = emojiCode, + idx = idx, + name = name + ) +} + +fun MyPageUserInfoModel.UserProfilePhoto.toUiModel(): MyPageUserInfoUiModel.UserProfilePhoto { + return MyPageUserInfoUiModel.UserProfilePhoto( + priority = priority, + url = url + ) +} diff --git a/feature/setting/src/main/java/tht/feature/setting/viewmodel/MyPageViewModel.kt b/feature/setting/src/main/java/tht/feature/setting/viewmodel/MyPageViewModel.kt index b658d0ee..52c09977 100644 --- a/feature/setting/src/main/java/tht/feature/setting/viewmodel/MyPageViewModel.kt +++ b/feature/setting/src/main/java/tht/feature/setting/viewmodel/MyPageViewModel.kt @@ -1,26 +1,85 @@ package tht.feature.setting.viewmodel +import androidx.compose.runtime.Immutable import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.example.compose_ui.common.viewmodel.Container +import com.example.compose_ui.common.viewmodel.Store +import com.example.compose_ui.common.viewmodel.intent +import com.example.compose_ui.common.viewmodel.store +import com.tht.tht.domain.setting.usecase.FetchMyPageUserInfoUseCase import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.flow.MutableSharedFlow -import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.launch +import tht.feature.setting.uimodel.MyPageUserInfoUiModel +import tht.feature.setting.uimodel.mapper.toUiModel import javax.inject.Inject @HiltViewModel -class MyPageViewModel @Inject constructor() : ViewModel() { +class MyPageViewModel @Inject constructor( + private val fetchMyPageUserInfoUseCase: FetchMyPageUserInfoUseCase +) : ViewModel(), Container { - sealed interface SideEffect { - object NavigateSetting : SideEffect + sealed interface MyPageSideEffect { + object NavigateSetting : MyPageSideEffect } - private val _sideEffect = MutableSharedFlow() - val sideEffect = _sideEffect.asSharedFlow() + @Immutable + data class MyPageUiState( + val myPageUserInfo: MyPageUserInfoUiModel?, + val loading: Boolean, + ) { + val showSkeletonView: Boolean + get() = myPageUserInfo == null && loading + companion object { + val DEFAULT: MyPageUiState get() = MyPageUiState( + myPageUserInfo = null, + loading = false + ) + } + } - fun onSettingClick() { + override val store: Store = store(initialState = MyPageUiState.DEFAULT) + + init { viewModelScope.launch { - _sideEffect.emit(SideEffect.NavigateSetting) + intent { reduce { it.copy(loading = true) } } + fetchMyPageUserInfoUseCase() + .onSuccess { info -> + intent { reduce { it.copy(myPageUserInfo = info.toUiModel()) } } + }.onFailure { + it.printStackTrace() + } + intent { reduce { it.copy(loading = true) } } } } + + fun onSettingClick() { + intent { postSideEffect(MyPageSideEffect.NavigateSetting) } + } + + fun onNicknameEditClick() { + + } + + fun onIntroduceClick() { + + } + + fun onPrimaryProfileEditClick(priority: Int) { + + } + + fun onOptionalProfileEditClick() { + + } + + fun onIdealTypeEditClick() { + + } + + fun onInterestEditClick() { + + } + + } diff --git a/feature/setting/src/main/res/drawable/ic_nickname_edit.xml b/feature/setting/src/main/res/drawable/ic_nickname_edit.xml new file mode 100644 index 00000000..5584305e --- /dev/null +++ b/feature/setting/src/main/res/drawable/ic_nickname_edit.xml @@ -0,0 +1,20 @@ + + + + diff --git a/feature/setting/src/main/res/drawable/ic_profile_image_add.xml b/feature/setting/src/main/res/drawable/ic_profile_image_add.xml new file mode 100644 index 00000000..1cbb343d --- /dev/null +++ b/feature/setting/src/main/res/drawable/ic_profile_image_add.xml @@ -0,0 +1,13 @@ + + + + diff --git a/feature/setting/src/main/res/drawable/ic_profile_image_delete.xml b/feature/setting/src/main/res/drawable/ic_profile_image_delete.xml new file mode 100644 index 00000000..ba88e11d --- /dev/null +++ b/feature/setting/src/main/res/drawable/ic_profile_image_delete.xml @@ -0,0 +1,13 @@ + + + + From 43651d6805937c56c820cba241b5a1b458c0c521 Mon Sep 17 00:00:00 2001 From: wjchoi96 Date: Sat, 20 Apr 2024 15:23:38 +0900 Subject: [PATCH 03/16] =?UTF-8?q?feat:TOP-94=20MyPage=20Setting=20ImageBan?= =?UTF-8?q?ner=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../setting/composable/SettingImageBanner.kt | 18 ++++++++++++++++++ .../res/drawable/ic_setting_tht_banner.xml | 10 ++++++++++ 2 files changed, 28 insertions(+) create mode 100644 feature/setting/src/main/res/drawable/ic_setting_tht_banner.xml diff --git a/feature/setting/src/main/java/tht/feature/setting/composable/SettingImageBanner.kt b/feature/setting/src/main/java/tht/feature/setting/composable/SettingImageBanner.kt index ce794dcc..de258b13 100644 --- a/feature/setting/src/main/java/tht/feature/setting/composable/SettingImageBanner.kt +++ b/feature/setting/src/main/java/tht/feature/setting/composable/SettingImageBanner.kt @@ -4,6 +4,7 @@ import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.Icon import androidx.compose.runtime.Composable @@ -15,6 +16,7 @@ import androidx.compose.ui.res.colorResource import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.example.compose_ui.component.spacer.Spacer import com.example.compose_ui.component.text.p.ThtP1 @@ -59,7 +61,23 @@ fun SettingImageBanner( tint = colorResource(id = R.color.white_f9fafa) ) } + Spacer(space = 21.dp) + Icon( + painter = painterResource(id = tht.feature.setting.R.drawable.ic_setting_tht_banner), + contentDescription = "ic_falling_banner", + tint = colorResource(id = R.color.white_f9fafa) + ) } } } } + +@Composable +@Preview +private fun SettingImageBannerPreview() { + SettingImageBanner( + imageBanner = SettingImageBannerItemUiModel( + banner = SettingImageBannerItemUiModel.ImageBanner.Falling + ) + ) +} diff --git a/feature/setting/src/main/res/drawable/ic_setting_tht_banner.xml b/feature/setting/src/main/res/drawable/ic_setting_tht_banner.xml new file mode 100644 index 00000000..bc6aa67e --- /dev/null +++ b/feature/setting/src/main/res/drawable/ic_setting_tht_banner.xml @@ -0,0 +1,10 @@ + + + From 999d5ca5f9b9fcdc52b0ee4d38fb5feb9d19462d Mon Sep 17 00:00:00 2001 From: wjchoi96 Date: Sat, 20 Apr 2024 15:29:14 +0900 Subject: [PATCH 04/16] =?UTF-8?q?feat:TOP-94=20SettingImageBanner=20?= =?UTF-8?q?=EC=9D=B4=EB=AF=B8=EC=A7=80=20weight=20=EC=A1=B0=EC=A0=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tht/feature/setting/composable/SettingImageBanner.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/feature/setting/src/main/java/tht/feature/setting/composable/SettingImageBanner.kt b/feature/setting/src/main/java/tht/feature/setting/composable/SettingImageBanner.kt index de258b13..94a7fe8a 100644 --- a/feature/setting/src/main/java/tht/feature/setting/composable/SettingImageBanner.kt +++ b/feature/setting/src/main/java/tht/feature/setting/composable/SettingImageBanner.kt @@ -3,6 +3,7 @@ package tht.feature.setting.composable import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.RoundedCornerShape @@ -61,10 +62,10 @@ fun SettingImageBanner( tint = colorResource(id = R.color.white_f9fafa) ) } - Spacer(space = 21.dp) + androidx.compose.foundation.layout.Spacer(modifier = Modifier.weight(1f)) Icon( painter = painterResource(id = tht.feature.setting.R.drawable.ic_setting_tht_banner), - contentDescription = "ic_falling_banner", + contentDescription = "ic_setting_tht_banner", tint = colorResource(id = R.color.white_f9fafa) ) } From 467142db037c19b3fcda08e8adcb757dc017303c Mon Sep 17 00:00:00 2001 From: wjchoi96 Date: Sat, 20 Apr 2024 16:01:41 +0900 Subject: [PATCH 05/16] =?UTF-8?q?feat:TOP-94=20MyPage=20UserInfo=20Api=20R?= =?UTF-8?q?esponse=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../remote/mapper/MyPageUserSettingMapper.kt | 19 +++++---- .../setting/MyPageUserInfoResponse.kt | 13 ++++++ .../setting/model/MyPageUserInfoModel.kt | 21 +++++----- .../setting/uimodel/MyPageUserInfoUiModel.kt | 40 +++++++++++-------- .../uimodel/mapper/MyPageUserInfoMapper.kt | 19 +++++---- 5 files changed, 70 insertions(+), 42 deletions(-) diff --git a/data/src/main/java/com/tht/tht/data/remote/mapper/MyPageUserSettingMapper.kt b/data/src/main/java/com/tht/tht/data/remote/mapper/MyPageUserSettingMapper.kt index 17e56b32..76ab8eaf 100644 --- a/data/src/main/java/com/tht/tht/data/remote/mapper/MyPageUserSettingMapper.kt +++ b/data/src/main/java/com/tht/tht/data/remote/mapper/MyPageUserSettingMapper.kt @@ -5,16 +5,19 @@ import com.tht.tht.domain.setting.model.MyPageUserInfoModel fun MyPageUserInfoResponse.toModel(): MyPageUserInfoModel { return MyPageUserInfoModel( - address = address, - age = age, - email = email, - idealTypeList = idealTypeList.map { it.toModel() }, - interestsList = interestsList.map { it.toModel() }, + userUuid = userUuid, + username = username, + birth = "UnKnown", + gender = gender, introduction = introduction, - phoneNumber = phoneNumber, + preferredGender = preferGender, + height = tall, + smoke = smoking, + drink = drinking, + religion = religion, userProfilePhotos = userProfilePhotos.map { it.toModel() }, - userUuid = userUuid, - username = username + idealTypeList = idealTypeList.map { it.toModel() }, + interestsList = interestsList.map { it.toModel() } ) } diff --git a/data/src/main/java/com/tht/tht/data/remote/response/setting/MyPageUserInfoResponse.kt b/data/src/main/java/com/tht/tht/data/remote/response/setting/MyPageUserInfoResponse.kt index 4b2340c5..e9d35383 100644 --- a/data/src/main/java/com/tht/tht/data/remote/response/setting/MyPageUserInfoResponse.kt +++ b/data/src/main/java/com/tht/tht/data/remote/response/setting/MyPageUserInfoResponse.kt @@ -1,5 +1,6 @@ package com.tht.tht.data.remote.response.setting + import com.google.gson.annotations.SerializedName data class MyPageUserInfoResponse( @@ -7,8 +8,12 @@ data class MyPageUserInfoResponse( val address: String, @SerializedName("age") val age: Int, + @SerializedName("drinking") + val drinking: String, @SerializedName("email") val email: String, + @SerializedName("gender") + val gender: String, @SerializedName("idealTypeList") val idealTypeList: List, @SerializedName("interestsList") @@ -17,6 +22,14 @@ data class MyPageUserInfoResponse( val introduction: String, @SerializedName("phoneNumber") val phoneNumber: String, + @SerializedName("prefer_gender") + val preferGender: String, + @SerializedName("religion") + val religion: String, + @SerializedName("smoking") + val smoking: String, + @SerializedName("tall") + val tall: Int, @SerializedName("userProfilePhotos") val userProfilePhotos: List, @SerializedName("userUuid") diff --git a/domain/src/main/java/com/tht/tht/domain/setting/model/MyPageUserInfoModel.kt b/domain/src/main/java/com/tht/tht/domain/setting/model/MyPageUserInfoModel.kt index 36a3f58f..588d4308 100644 --- a/domain/src/main/java/com/tht/tht/domain/setting/model/MyPageUserInfoModel.kt +++ b/domain/src/main/java/com/tht/tht/domain/setting/model/MyPageUserInfoModel.kt @@ -1,16 +1,19 @@ package com.tht.tht.domain.setting.model data class MyPageUserInfoModel( - val address: String, - val age: Int, - val email: String, - val idealTypeList: List, - val interestsList: List, - val introduction: String, - val phoneNumber: String, - val userProfilePhotos: List, val userUuid: String, - val username: String + val username: String, + val userProfilePhotos: List, + val birth: String, + val gender: String, + val introduction: String, + val preferredGender: String, + val height: Int, + val smoke: String, + val drink: String, + val religion: String, + val idealTypeList: List, + val interestsList: List ) { data class IdealType( val emojiCode: String, diff --git a/feature/setting/src/main/java/tht/feature/setting/uimodel/MyPageUserInfoUiModel.kt b/feature/setting/src/main/java/tht/feature/setting/uimodel/MyPageUserInfoUiModel.kt index 05eed7f9..9fdb5b3f 100644 --- a/feature/setting/src/main/java/tht/feature/setting/uimodel/MyPageUserInfoUiModel.kt +++ b/feature/setting/src/main/java/tht/feature/setting/uimodel/MyPageUserInfoUiModel.kt @@ -6,16 +6,19 @@ import kotlinx.collections.immutable.persistentListOf @Immutable data class MyPageUserInfoUiModel( - val address: String, - val age: Int, - val email: String, + val userUuid: String, + val username: String, + val userProfilePhotos: ImmutableList, + val birth: String, + val gender: String, + val introduction: String, + val preferredGender: String, + val height: Int, + val smoke: String, + val drink: String, + val religion: String, val idealTypeList: ImmutableList, val interestsList: ImmutableList, - val introduction: String, - val phoneNumber: String, - val userProfilePhotos: ImmutableList, - val userUuid: String, - val username: String ) { @Immutable data class IdealType( @@ -34,22 +37,25 @@ data class MyPageUserInfoUiModel( val priority: Int, val url: String ) { - fun isPrimaryImage(): Boolean = priority < 2 + fun isPrimaryImage(): Boolean = priority <= 2 } companion object { val EMPTY: MyPageUserInfoUiModel get() = MyPageUserInfoUiModel( - address = "", - age = -1, - email = "", - idealTypeList = persistentListOf(), - interestsList = persistentListOf(), - introduction = "", - phoneNumber = "", - userProfilePhotos = persistentListOf(), userUuid = "", username = "", + introduction = "", + userProfilePhotos = persistentListOf(), + birth = "", + gender = "", + preferredGender = "", + height = 0, + smoke = "", + drink = "", + religion = "", + idealTypeList = persistentListOf(), + interestsList = persistentListOf() ) } } diff --git a/feature/setting/src/main/java/tht/feature/setting/uimodel/mapper/MyPageUserInfoMapper.kt b/feature/setting/src/main/java/tht/feature/setting/uimodel/mapper/MyPageUserInfoMapper.kt index 82061636..1d2393bb 100644 --- a/feature/setting/src/main/java/tht/feature/setting/uimodel/mapper/MyPageUserInfoMapper.kt +++ b/feature/setting/src/main/java/tht/feature/setting/uimodel/mapper/MyPageUserInfoMapper.kt @@ -6,16 +6,19 @@ import tht.feature.setting.uimodel.MyPageUserInfoUiModel fun MyPageUserInfoModel.toUiModel(): MyPageUserInfoUiModel { return MyPageUserInfoUiModel( - address = address, - age = age, - email = email, + userUuid = userUuid, + username = username, + userProfilePhotos = userProfilePhotos.map { it.toUiModel() }.toPersistentList(), + birth = birth, + gender = gender, + preferredGender = preferredGender, + introduction = introduction, + smoke = smoke, + drink = drink, + height = height, + religion = religion, idealTypeList = idealTypeList.map { it.toUiModel() }.toPersistentList(), interestsList = interestsList.map { it.toUiModel() }.toPersistentList(), - introduction = introduction, - phoneNumber = phoneNumber, - userProfilePhotos = userProfilePhotos.map { it.toUiModel() }.toPersistentList(), - userUuid = userUuid, - username = username ) } From 5ed1a9c9ca3e93381753131e97c30f52824ac822 Mon Sep 17 00:00:00 2001 From: wjchoi96 Date: Sat, 20 Apr 2024 16:02:02 +0900 Subject: [PATCH 06/16] =?UTF-8?q?feat:TOP-94=20MaPageProfileImageItem?= =?UTF-8?q?=EC=9D=98=20=EC=88=98=EC=A0=95,=20=EC=82=AD=EC=A0=9C=20?= =?UTF-8?q?=EB=B2=84=ED=8A=BC=20Icon=EC=9D=98=20default=20padding=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mypage/MyPageProfileImageItem.kt | 63 +++++++++++-------- 1 file changed, 36 insertions(+), 27 deletions(-) diff --git a/feature/setting/src/main/java/tht/feature/setting/composable/mypage/MyPageProfileImageItem.kt b/feature/setting/src/main/java/tht/feature/setting/composable/mypage/MyPageProfileImageItem.kt index ad75c6eb..10905a97 100644 --- a/feature/setting/src/main/java/tht/feature/setting/composable/mypage/MyPageProfileImageItem.kt +++ b/feature/setting/src/main/java/tht/feature/setting/composable/mypage/MyPageProfileImageItem.kt @@ -6,9 +6,12 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.material.Icon import androidx.compose.material.IconButton +import androidx.compose.material.LocalMinimumInteractiveComponentEnforcement import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -26,6 +29,7 @@ import coil.request.ImageRequest import coil.size.Size import tht.feature.setting.R +@OptIn(ExperimentalMaterialApi::class) @Composable fun MyPageProfileImageItem( imageUrl: String?, @@ -68,42 +72,47 @@ fun MyPageProfileImageItem( contentDescription = "profile_image", contentScale = ContentScale.Crop, ) - if (isPrimary) { - IconButton( - modifier = Modifier.align(Alignment.BottomEnd) - .padding(end = 6.dp, bottom = 6.dp), - onClick = onPrimaryEditClick - ) { - Icon( - painter = painterResource(id = R.drawable.ic_profile_image_edit), - contentDescription = "ic_profile_image_edit", - tint = Color.Unspecified - ) - } - } else { - if (imageUrl.isNullOrBlank()) { - IconButton( - modifier = Modifier.align(Alignment.Center), - onClick = onNonePrimaryAddClick - ) { - Icon( - painter = painterResource(id = R.drawable.ic_profile_image_add), - contentDescription = "ic_profile_image_edit", - tint = Color.Unspecified - ) - } - } else { + // remove default icon padding + CompositionLocalProvider( + LocalMinimumInteractiveComponentEnforcement provides false, + ) { + if (isPrimary) { IconButton( modifier = Modifier.align(Alignment.BottomEnd) .padding(end = 6.dp, bottom = 6.dp), - onClick = onNonePrimaryRemoveClick + onClick = onPrimaryEditClick ) { Icon( - painter = painterResource(id = R.drawable.ic_profile_image_delete), + painter = painterResource(id = R.drawable.ic_profile_image_edit), contentDescription = "ic_profile_image_edit", tint = Color.Unspecified ) } + } else { + if (imageUrl.isNullOrBlank()) { + IconButton( + modifier = Modifier.align(Alignment.Center), + onClick = onNonePrimaryAddClick + ) { + Icon( + painter = painterResource(id = R.drawable.ic_profile_image_add), + contentDescription = "ic_profile_image_edit", + tint = Color.Unspecified + ) + } + } else { + IconButton( + modifier = Modifier.align(Alignment.BottomEnd) + .padding(end = 6.dp, bottom = 6.dp), + onClick = onNonePrimaryRemoveClick + ) { + Icon( + painter = painterResource(id = R.drawable.ic_profile_image_delete), + contentDescription = "ic_profile_image_edit", + tint = Color.Unspecified + ) + } + } } } } From 0bfcd3f6258e9c05f8153654be28facb801c9f48 Mon Sep 17 00:00:00 2001 From: wjchoi96 Date: Sat, 20 Apr 2024 16:02:33 +0900 Subject: [PATCH 07/16] =?UTF-8?q?feat:TOP-94=20MaPageProfileImageRow=20Pre?= =?UTF-8?q?view=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mypage/MyPageProfileImageRow.kt | 34 +++++++++++++++++-- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/feature/setting/src/main/java/tht/feature/setting/composable/mypage/MyPageProfileImageRow.kt b/feature/setting/src/main/java/tht/feature/setting/composable/mypage/MyPageProfileImageRow.kt index 8370a9dc..05af62be 100644 --- a/feature/setting/src/main/java/tht/feature/setting/composable/mypage/MyPageProfileImageRow.kt +++ b/feature/setting/src/main/java/tht/feature/setting/composable/mypage/MyPageProfileImageRow.kt @@ -58,15 +58,15 @@ private fun MyPageProfileImageRowPreview() { .padding(horizontal = 16.dp), userProfileImages = persistentListOf( MyPageUserInfoUiModel.UserProfilePhoto( - priority = 0, + priority = 1, url = "https://asdasd" ), MyPageUserInfoUiModel.UserProfilePhoto( - priority = 1, + priority = 2, url = "https://asd" ), MyPageUserInfoUiModel.UserProfilePhoto( - priority = 2, + priority = 3, url = "" ) ).toImmutableList(), @@ -75,3 +75,31 @@ private fun MyPageProfileImageRowPreview() { onNonePrimaryAddClick = {} ) } + +@Composable +@Preview +private fun MyPageProfileImageRowPreview2() { + MyPageProfileImageRow( + modifier = Modifier + .fillMaxWidth() + .height(140.dp) + .padding(horizontal = 16.dp), + userProfileImages = persistentListOf( + MyPageUserInfoUiModel.UserProfilePhoto( + priority = 1, + url = "https://asdasd" + ), + MyPageUserInfoUiModel.UserProfilePhoto( + priority = 2, + url = "https://asd" + ), + MyPageUserInfoUiModel.UserProfilePhoto( + priority = 3, + url = "https://asd" + ) + ).toImmutableList(), + onPrimaryEditClick = {}, + onNonePrimaryRemoveClick = {}, + onNonePrimaryAddClick = {} + ) +} From 553c7ee67949eb5c736a2c40a00565090c9d3f8b Mon Sep 17 00:00:00 2001 From: wjchoi96 Date: Sat, 20 Apr 2024 16:02:49 +0900 Subject: [PATCH 08/16] =?UTF-8?q?feat:TOP-94=20MaPageNicknameRow=20TextAli?= =?UTF-8?q?gn=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tht/feature/setting/composable/mypage/MyPageNicknameRow.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/feature/setting/src/main/java/tht/feature/setting/composable/mypage/MyPageNicknameRow.kt b/feature/setting/src/main/java/tht/feature/setting/composable/mypage/MyPageNicknameRow.kt index 403291ef..b0024430 100644 --- a/feature/setting/src/main/java/tht/feature/setting/composable/mypage/MyPageNicknameRow.kt +++ b/feature/setting/src/main/java/tht/feature/setting/composable/mypage/MyPageNicknameRow.kt @@ -8,6 +8,7 @@ import androidx.compose.foundation.layout.width import androidx.compose.material.Icon import androidx.compose.material.IconButton import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.colorResource import androidx.compose.ui.res.painterResource @@ -27,6 +28,7 @@ fun MyPageNicknameRow( modifier = modifier ) { ThtHeadline5( + modifier = Modifier.align(Alignment.CenterVertically), text = nickname, fontWeight = FontWeight.SemiBold, color = colorResource(id = tht.core.ui.R.color.white_f9fafa) From 591bc3d92e555429c5c75c2d812511f10ba207b2 Mon Sep 17 00:00:00 2001 From: wjchoi96 Date: Sat, 20 Apr 2024 16:03:09 +0900 Subject: [PATCH 09/16] =?UTF-8?q?feat:TOP-94=20MaPage=EC=97=90=20NicknameR?= =?UTF-8?q?ow,=20ProfileImageRow=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tht/feature/setting/route/MyPageRoute.kt | 2 + .../feature/setting/screen/MyPageScreen.kt | 42 +++++++++++++++++++ .../setting/viewmodel/MyPageViewModel.kt | 8 ++++ .../setting/src/main/res/values/strings.xml | 2 + 4 files changed, 54 insertions(+) diff --git a/feature/setting/src/main/java/tht/feature/setting/route/MyPageRoute.kt b/feature/setting/src/main/java/tht/feature/setting/route/MyPageRoute.kt index f55cc8cf..e1d24f0b 100644 --- a/feature/setting/src/main/java/tht/feature/setting/route/MyPageRoute.kt +++ b/feature/setting/src/main/java/tht/feature/setting/route/MyPageRoute.kt @@ -34,6 +34,8 @@ fun MyPageRoute( onNicknameEditClick = viewModel::onNicknameEditClick, onIntroduceClick = viewModel::onIntroduceClick, onPrimaryProfileEditClick = viewModel::onPrimaryProfileEditClick, + onNonePrimaryProfileAddClick = viewModel::onNonePrimaryProfileAddClick, + onNonePrimaryProfileRemoveClick = viewModel::onNonePrimaryProfileRemoveClick, onOptionalProfileEditClick = viewModel::onOptionalProfileEditClick, onIdealTypeEditClick = viewModel::onIdealTypeEditClick, onInterestEditClick = viewModel::onInterestEditClick diff --git a/feature/setting/src/main/java/tht/feature/setting/screen/MyPageScreen.kt b/feature/setting/src/main/java/tht/feature/setting/screen/MyPageScreen.kt index d5cd0e38..2ba2ac78 100644 --- a/feature/setting/src/main/java/tht/feature/setting/screen/MyPageScreen.kt +++ b/feature/setting/src/main/java/tht/feature/setting/screen/MyPageScreen.kt @@ -5,6 +5,8 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.Button @@ -12,15 +14,19 @@ import androidx.compose.material.ButtonDefaults import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.colorResource +import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.example.compose_ui.component.text.ThtText +import com.example.compose_ui.component.text.caption.ThtCaption1 import com.example.compose_ui.component.text.headline.ThtHeadline4 import com.example.compose_ui.component.toolbar.ThtToolbar import com.example.compose_ui.extensions.dpTextUnit import tht.core.ui.R +import tht.feature.setting.composable.mypage.MyPageNicknameRow +import tht.feature.setting.composable.mypage.MyPageProfileImageRow import tht.feature.setting.uimodel.MyPageUserInfoUiModel @Composable @@ -31,6 +37,8 @@ fun MyPageScreen( onNicknameEditClick: () -> Unit, onIntroduceClick: () -> Unit, onPrimaryProfileEditClick: (Int) -> Unit, + onNonePrimaryProfileAddClick: () -> Unit, + onNonePrimaryProfileRemoveClick: () -> Unit, onOptionalProfileEditClick: () -> Unit, onIdealTypeEditClick: () -> Unit, onInterestEditClick: () -> Unit, @@ -73,6 +81,38 @@ fun MyPageScreen( } ) + Spacer(modifier = Modifier.height(12.dp)) + MyPageNicknameRow( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp), + nickname = userInfo.username, + onEditClick = onNicknameEditClick + ) + + Spacer(modifier = Modifier.height(12.dp)) + MyPageProfileImageRow( + modifier = Modifier + .fillMaxWidth() + .height(174.dp) + .padding(horizontal = 16.dp), + userProfileImages = userInfo.userProfilePhotos, + onPrimaryEditClick = onPrimaryProfileEditClick, + onNonePrimaryAddClick = onNonePrimaryProfileAddClick, + onNonePrimaryRemoveClick = onNonePrimaryProfileRemoveClick + ) + + Spacer(modifier = Modifier.height(8.dp)) + ThtCaption1( + modifier = Modifier.fillMaxWidth() + .padding(horizontal = 16.dp), + textAlign = TextAlign.Start, + text = stringResource(id = tht.feature.setting.R.string.my_page_profile_description), + fontWeight = FontWeight.Normal, + color = colorResource(id = R.color.gray_8d8d8d) + ) + + } } @@ -88,6 +128,8 @@ private fun MyPageScreenPreview() { onNicknameEditClick = {}, onIntroduceClick = {}, onPrimaryProfileEditClick = {}, + onNonePrimaryProfileAddClick = {}, + onNonePrimaryProfileRemoveClick = {}, onOptionalProfileEditClick = {}, onIdealTypeEditClick = {}, onInterestEditClick = {}, diff --git a/feature/setting/src/main/java/tht/feature/setting/viewmodel/MyPageViewModel.kt b/feature/setting/src/main/java/tht/feature/setting/viewmodel/MyPageViewModel.kt index 52c09977..cb74cf5d 100644 --- a/feature/setting/src/main/java/tht/feature/setting/viewmodel/MyPageViewModel.kt +++ b/feature/setting/src/main/java/tht/feature/setting/viewmodel/MyPageViewModel.kt @@ -69,6 +69,14 @@ class MyPageViewModel @Inject constructor( } + fun onNonePrimaryProfileAddClick() { + + } + + fun onNonePrimaryProfileRemoveClick() { + + } + fun onOptionalProfileEditClick() { } diff --git a/feature/setting/src/main/res/values/strings.xml b/feature/setting/src/main/res/values/strings.xml index 402d93f0..72b1c1b3 100644 --- a/feature/setting/src/main/res/values/strings.xml +++ b/feature/setting/src/main/res/values/strings.xml @@ -1,4 +1,6 @@ Hello blank fragment + + 매력적인 사진으로 무디들에게 나를 어필해보세요.\n프로필 완성도가 높아지면 상대방에게 좋아요를 더 많이 받을 수 있어요 🔥 From 3bdfd9c0fc9a090ef0d70ddf4d8fc59b017d31a9 Mon Sep 17 00:00:00 2001 From: wjchoi96 Date: Sat, 20 Apr 2024 17:32:51 +0900 Subject: [PATCH 10/16] =?UTF-8?q?refactor:TOP-94=20ToHotChip.=20StringUtil?= =?UTF-8?q?=20=EC=9D=84=20core=20=EB=AA=A8=EB=93=88=EB=A1=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../compose_ui}/component/chip/ToHotChip.kt | 28 ++++++++++++++----- .../example/compose_ui/component/text/p/p.kt | 13 +++++++-- .../component/text/subtitle/Subtitle.kt | 4 ++- .../main/java/tht/core/ui}/util/StringUtil.kt | 6 ++-- .../signup/birthday/BirthdayFragment.kt | 2 +- .../signup/idealtype/IdealTypeFragment.kt | 6 ++-- .../signup/interest/InterestFragment.kt | 6 ++-- .../signup/location/LocationFragment.kt | 2 +- .../PreferredGenderFragment.kt | 2 +- .../profileimage/ProfileImageFragment.kt | 2 +- .../userinfo/ToHotUserInfoFullCard.kt | 2 +- 11 files changed, 48 insertions(+), 25 deletions(-) rename {feature/tohot/src/main/java/tht/feature/tohot => core/compose-ui/src/main/java/com/example/compose_ui}/component/chip/ToHotChip.kt (70%) rename {feature/signin/src/main/java/tht/feature/signin => core/ui/src/main/java/tht/core/ui}/util/StringUtil.kt (90%) diff --git a/feature/tohot/src/main/java/tht/feature/tohot/component/chip/ToHotChip.kt b/core/compose-ui/src/main/java/com/example/compose_ui/component/chip/ToHotChip.kt similarity index 70% rename from feature/tohot/src/main/java/tht/feature/tohot/component/chip/ToHotChip.kt rename to core/compose-ui/src/main/java/com/example/compose_ui/component/chip/ToHotChip.kt index 575d4cc8..78ce43d1 100644 --- a/feature/tohot/src/main/java/tht/feature/tohot/component/chip/ToHotChip.kt +++ b/core/compose-ui/src/main/java/com/example/compose_ui/component/chip/ToHotChip.kt @@ -1,4 +1,4 @@ -package tht.feature.tohot.component.chip +package com.example.compose_ui.component.chip import androidx.compose.foundation.background import androidx.compose.foundation.layout.Row @@ -9,19 +9,31 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.example.compose_ui.component.text.p.ThtP2 -import tht.feature.tohot.userData +/** + * decode 를 해서 전달주는 곳이 있고, 아닌곳이 있음 + * decode 를 해서 전달주는 곳 + * - MyPageInfoRows + * + * 모르는곳 + * - ToHotUserInfoFullCard + * + * TODO: 모두 decode 해서 전달주도록? + */ @Composable fun ToHotEmojiChip( modifier: Modifier = Modifier, content: String, emojiCode: String ) { - val code = Integer.decode("0x$emojiCode") - val emoji = String(Character.toChars(code)) + val emoji = runCatching { + val code = Integer.decode("0x$emojiCode") + String(Character.toChars(code)) + }.getOrNull() ?: emojiCode ToHotChip( modifier = modifier, item = "$emoji $content" @@ -45,7 +57,9 @@ fun ToHotChip( .padding(vertical = 4.dp, horizontal = 8.dp), text = item, fontWeight = FontWeight.Medium, - color = Color(0xFFF9FAFA) + color = Color(0xFFF9FAFA), + overflow = TextOverflow.Ellipsis, + maxLines = 1 ) } } @@ -54,8 +68,8 @@ fun ToHotChip( @Preview(showBackground = true, backgroundColor = 0xFFFFFFFF, name = "emojiChip") private fun ToHotEmojiChipPreview() { ToHotEmojiChip( - content = userData.interests.list.last().title, - emojiCode = userData.interests.list.last().emojiCode + content = "content", + emojiCode = "1F3E0" ) } diff --git a/core/compose-ui/src/main/java/com/example/compose_ui/component/text/p/p.kt b/core/compose-ui/src/main/java/com/example/compose_ui/component/text/p/p.kt index 2aba10f0..3c987d69 100644 --- a/core/compose-ui/src/main/java/com/example/compose_ui/component/text/p/p.kt +++ b/core/compose-ui/src/main/java/com/example/compose_ui/component/text/p/p.kt @@ -7,6 +7,7 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Shadow import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.style.TextOverflow import com.example.compose_ui.component.font.rememberPretendardFontStyle import com.example.compose_ui.extensions.dpTextUnit @@ -17,7 +18,9 @@ fun ThtP1( fontWeight: FontWeight, color: Color, textAlign: TextAlign = TextAlign.Center, - shadow: Shadow? = null + shadow: Shadow? = null, + overflow: TextOverflow = TextOverflow.Clip, + maxLines: Int = Int.MAX_VALUE ) { Text( modifier = modifier, @@ -29,6 +32,8 @@ fun ThtP1( shadow = shadow ), color = color, + overflow = overflow, + maxLines = maxLines ) } @@ -39,7 +44,9 @@ fun ThtP2( fontWeight: FontWeight, color: Color, textAlign: TextAlign = TextAlign.Center, - includeFontPadding: Boolean = false + includeFontPadding: Boolean = false, + overflow: TextOverflow = TextOverflow.Clip, + maxLines: Int = Int.MAX_VALUE ) { Text( modifier = modifier, @@ -51,5 +58,7 @@ fun ThtP2( includeFontPadding = includeFontPadding ), color = color, + overflow = overflow, + maxLines = maxLines ) } diff --git a/core/compose-ui/src/main/java/com/example/compose_ui/component/text/subtitle/Subtitle.kt b/core/compose-ui/src/main/java/com/example/compose_ui/component/text/subtitle/Subtitle.kt index c4ea3ba7..4fb53981 100644 --- a/core/compose-ui/src/main/java/com/example/compose_ui/component/text/subtitle/Subtitle.kt +++ b/core/compose-ui/src/main/java/com/example/compose_ui/component/text/subtitle/Subtitle.kt @@ -17,7 +17,8 @@ fun ThtSubtitle1( fontWeight: FontWeight, color: Color, textAlign: TextAlign = TextAlign.Center, - shadow: Shadow? = null + shadow: Shadow? = null, + maxLines: Int = Int.MAX_VALUE, ) { Text( modifier = modifier, @@ -29,6 +30,7 @@ fun ThtSubtitle1( shadow = shadow ), color = color, + maxLines = maxLines ) } diff --git a/feature/signin/src/main/java/tht/feature/signin/util/StringUtil.kt b/core/ui/src/main/java/tht/core/ui/util/StringUtil.kt similarity index 90% rename from feature/signin/src/main/java/tht/feature/signin/util/StringUtil.kt rename to core/ui/src/main/java/tht/core/ui/util/StringUtil.kt index c0a70cb1..d984e29f 100644 --- a/feature/signin/src/main/java/tht/feature/signin/util/StringUtil.kt +++ b/core/ui/src/main/java/tht/core/ui/util/StringUtil.kt @@ -1,4 +1,4 @@ -package tht.feature.signin.util +package tht.core.ui.util import android.text.SpannableStringBuilder import android.text.Spanned @@ -12,13 +12,15 @@ import android.widget.TextView * 기존 Api에서 U+를 제거하고 보내줬으니, 앞에 0x만 붙이면 됨 */ object StringUtil { - fun parseEmoji(emojiCode: String): String? { + fun parseEmoji(emojiCode: String): String { return try { val code = Integer.decode("0x${emojiCode.removePrefix("U+")}") String(Character.toChars(code)) } catch (e: Exception) { e.printStackTrace() null + }.let { + if (it.isNullOrBlank()) "" else it } } diff --git a/feature/signin/src/main/java/tht/feature/signin/signup/birthday/BirthdayFragment.kt b/feature/signin/src/main/java/tht/feature/signin/signup/birthday/BirthdayFragment.kt index baec2a77..582403cb 100644 --- a/feature/signin/src/main/java/tht/feature/signin/signup/birthday/BirthdayFragment.kt +++ b/feature/signin/src/main/java/tht/feature/signin/signup/birthday/BirthdayFragment.kt @@ -11,11 +11,11 @@ import kotlinx.coroutines.launch import tht.core.ui.delegate.viewBinding import tht.core.ui.extension.repeatOnStarted import tht.core.ui.extension.showToast +import tht.core.ui.util.StringUtil import tht.feature.signin.R import tht.feature.signin.databinding.FragmentBirthdayBinding import tht.feature.signin.signup.SignupRootBaseFragment import tht.feature.signin.signup.SignupRootViewModel -import tht.feature.signin.util.StringUtil @AndroidEntryPoint class BirthdayFragment : SignupRootBaseFragment() { diff --git a/feature/signin/src/main/java/tht/feature/signin/signup/idealtype/IdealTypeFragment.kt b/feature/signin/src/main/java/tht/feature/signin/signup/idealtype/IdealTypeFragment.kt index f7236589..f000a6da 100644 --- a/feature/signin/src/main/java/tht/feature/signin/signup/idealtype/IdealTypeFragment.kt +++ b/feature/signin/src/main/java/tht/feature/signin/signup/idealtype/IdealTypeFragment.kt @@ -14,11 +14,11 @@ import tht.core.ui.delegate.viewBinding import tht.core.ui.extension.getPxFromDp import tht.core.ui.extension.repeatOnStarted import tht.core.ui.extension.showToast +import tht.core.ui.util.StringUtil import tht.feature.signin.R import tht.feature.signin.databinding.FragmentIdealTypeBinding import tht.feature.signin.signup.SignupRootBaseFragment import tht.feature.signin.signup.SignupRootViewModel -import tht.feature.signin.util.StringUtil @AndroidEntryPoint class IdealTypeFragment : SignupRootBaseFragment() { @@ -116,9 +116,7 @@ class IdealTypeFragment : SignupRootBaseFragment() { @@ -117,9 +117,7 @@ class InterestFragment : SignupRootBaseFragment() { diff --git a/feature/signin/src/main/java/tht/feature/signin/signup/preferredgender/PreferredGenderFragment.kt b/feature/signin/src/main/java/tht/feature/signin/signup/preferredgender/PreferredGenderFragment.kt index 9e326a04..71f0cff5 100644 --- a/feature/signin/src/main/java/tht/feature/signin/signup/preferredgender/PreferredGenderFragment.kt +++ b/feature/signin/src/main/java/tht/feature/signin/signup/preferredgender/PreferredGenderFragment.kt @@ -9,10 +9,10 @@ import kotlinx.coroutines.launch import tht.core.ui.delegate.viewBinding import tht.core.ui.extension.repeatOnStarted import tht.core.ui.extension.showToast +import tht.core.ui.util.StringUtil import tht.feature.signin.databinding.FragmentPreferredGenderBinding import tht.feature.signin.signup.SignupRootBaseFragment import tht.feature.signin.signup.SignupRootViewModel -import tht.feature.signin.util.StringUtil @AndroidEntryPoint class PreferredGenderFragment : SignupRootBaseFragment() { diff --git a/feature/signin/src/main/java/tht/feature/signin/signup/profileimage/ProfileImageFragment.kt b/feature/signin/src/main/java/tht/feature/signin/signup/profileimage/ProfileImageFragment.kt index 38218e04..45ca5120 100644 --- a/feature/signin/src/main/java/tht/feature/signin/signup/profileimage/ProfileImageFragment.kt +++ b/feature/signin/src/main/java/tht/feature/signin/signup/profileimage/ProfileImageFragment.kt @@ -18,11 +18,11 @@ import tht.core.ui.delegate.viewBinding import tht.core.ui.dialog.showCustomAlertDialog import tht.core.ui.extension.repeatOnStarted import tht.core.ui.extension.showToast +import tht.core.ui.util.StringUtil import tht.feature.signin.R import tht.feature.signin.databinding.FragmentProfileImageBinding import tht.feature.signin.signup.SignupRootBaseFragment import tht.feature.signin.signup.SignupRootViewModel -import tht.feature.signin.util.StringUtil @AndroidEntryPoint class ProfileImageFragment : SignupRootBaseFragment() { diff --git a/feature/tohot/src/main/java/tht/feature/tohot/component/userinfo/ToHotUserInfoFullCard.kt b/feature/tohot/src/main/java/tht/feature/tohot/component/userinfo/ToHotUserInfoFullCard.kt index f39c00a3..95105b33 100644 --- a/feature/tohot/src/main/java/tht/feature/tohot/component/userinfo/ToHotUserInfoFullCard.kt +++ b/feature/tohot/src/main/java/tht/feature/tohot/component/userinfo/ToHotUserInfoFullCard.kt @@ -27,11 +27,11 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import com.example.compose_ui.component.chip.ToHotEmojiChip import com.example.compose_ui.component.text.p.ThtP2 import com.tht.tht.domain.signup.model.IdealTypeModel import com.tht.tht.domain.signup.model.InterestModel import tht.feature.tohot.R -import tht.feature.tohot.component.chip.ToHotEmojiChip import tht.feature.tohot.model.ImmutableListWrapper import tht.feature.tohot.userData From 8ebd01fdbdcb8bb92227620729bcadce4f6b3819 Mon Sep 17 00:00:00 2001 From: wjchoi96 Date: Sat, 20 Apr 2024 17:33:28 +0900 Subject: [PATCH 11/16] =?UTF-8?q?feat:TOP-94=20MyPageScreen=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EC=99=84=EB=A3=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../composable/mypage/MyPageInfoRows.kt | 231 ++++++++++++++++++ .../composable/mypage/MyPageItemInfoRow.kt | 81 ++++++ .../tht/feature/setting/route/MyPageRoute.kt | 9 +- .../feature/setting/screen/MyPageScreen.kt | 42 +++- .../setting/uimodel/MyPageUserInfoUiModel.kt | 13 +- .../uimodel/mapper/MyPageUserInfoMapper.kt | 17 +- .../setting/viewmodel/MyPageViewModel.kt | 18 +- .../setting/src/main/res/values/strings.xml | 15 ++ 8 files changed, 405 insertions(+), 21 deletions(-) create mode 100644 feature/setting/src/main/java/tht/feature/setting/composable/mypage/MyPageInfoRows.kt create mode 100644 feature/setting/src/main/java/tht/feature/setting/composable/mypage/MyPageItemInfoRow.kt diff --git a/feature/setting/src/main/java/tht/feature/setting/composable/mypage/MyPageInfoRows.kt b/feature/setting/src/main/java/tht/feature/setting/composable/mypage/MyPageInfoRows.kt new file mode 100644 index 00000000..9db68738 --- /dev/null +++ b/feature/setting/src/main/java/tht/feature/setting/composable/mypage/MyPageInfoRows.kt @@ -0,0 +1,231 @@ +package tht.feature.setting.composable.mypage + +import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.colorResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import com.example.compose_ui.component.chip.ToHotEmojiChip +import com.example.compose_ui.component.text.p.ThtP1 +import com.example.compose_ui.component.text.subtitle.ThtSubtitle1 +import tht.feature.setting.R +import tht.feature.setting.uimodel.MyPageUserInfoUiModel + +@Composable +fun ColumnScope.MyPageInfoRows( + userInfo: MyPageUserInfoUiModel, + onIntroduceClick: () -> Unit, + onPreferredGenderClick: () -> Unit, + onHeightClick: () -> Unit, + onSmokeClick: () -> Unit, + onDrinkClick: () -> Unit, + onReligionClick: () -> Unit, + onIdealTypeEditClick: () -> Unit, + onInterestEditClick: () -> Unit, +) { + Spacer(modifier = Modifier.height(32.dp)) + MyPageItemInfoRow( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp), + title = stringResource(id = R.string.my_page_birth_title), + info = { + ThtSubtitle1( + text = userInfo.birth, + fontWeight = FontWeight.Normal, + color = colorResource(id = tht.core.ui.R.color.gray_8d8d8d), + maxLines = 1 + ) + } + ) + + Spacer(modifier = Modifier.height(12.dp)) + MyPageItemInfoRow( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp), + title = stringResource(id = R.string.my_page_gender_title), + info = { + ThtSubtitle1( + text = when (userInfo.gender) { + MyPageUserInfoUiModel.Gender.Male -> + stringResource(id = R.string.gender_male) + MyPageUserInfoUiModel.Gender.FeMale -> + stringResource(id = R.string.gender_female) + MyPageUserInfoUiModel.Gender.UnKnown -> + stringResource(id = R.string.gender_unknown) + }, + fontWeight = FontWeight.Normal, + color = colorResource(id = tht.core.ui.R.color.gray_8d8d8d), + maxLines = 1 + ) + } + ) + + Spacer(modifier = Modifier.height(12.dp)) + MyPageItemInfoRow( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp), + title = stringResource(id = R.string.my_page_introduce_title), + info = { + ThtP1( + text = userInfo.introduction, + fontWeight = FontWeight.Normal, + color = colorResource(id = tht.core.ui.R.color.yellow_f9cc2e), + overflow = TextOverflow.Ellipsis, + maxLines = 1 + ) + }, + onClick = onIntroduceClick + ) + + Spacer(modifier = Modifier.height(12.dp)) + MyPageItemInfoRow( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp), + title = stringResource(id = R.string.my_page_preferred_gender_title), + info = { + ThtP1( + text = when (userInfo.preferredGender) { + MyPageUserInfoUiModel.Gender.Male -> + stringResource(id = R.string.gender_male) + MyPageUserInfoUiModel.Gender.FeMale -> + stringResource(id = R.string.gender_female) + MyPageUserInfoUiModel.Gender.UnKnown -> + stringResource(id = R.string.gender_unknown) + }, + fontWeight = FontWeight.Normal, + color = colorResource(id = tht.core.ui.R.color.yellow_f9cc2e), + maxLines = 1 + ) + }, + onClick = onPreferredGenderClick + ) + + Spacer(modifier = Modifier.height(12.dp)) + MyPageItemInfoRow( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp), + title = stringResource(id = R.string.my_page_height_title), + info = { + ThtP1( + text = "${userInfo.height}cm", + fontWeight = FontWeight.Normal, + color = colorResource(id = tht.core.ui.R.color.yellow_f9cc2e), + maxLines = 1 + ) + }, + onClick = onHeightClick + ) + + Spacer(modifier = Modifier.height(12.dp)) + MyPageItemInfoRow( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp), + title = stringResource(id = R.string.my_page_smoke_title), + info = { + ThtP1( + text = userInfo.smoke, + fontWeight = FontWeight.Normal, + color = colorResource(id = tht.core.ui.R.color.yellow_f9cc2e), + maxLines = 1 + ) + }, + onClick = onSmokeClick + ) + + Spacer(modifier = Modifier.height(12.dp)) + MyPageItemInfoRow( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp), + title = stringResource(id = R.string.my_page_drink_title), + info = { + ThtP1( + text = userInfo.drink, + fontWeight = FontWeight.Normal, + color = colorResource(id = tht.core.ui.R.color.yellow_f9cc2e), + maxLines = 1 + ) + }, + onClick = onDrinkClick + ) + + Spacer(modifier = Modifier.height(12.dp)) + MyPageItemInfoRow( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp), + title = stringResource(id = R.string.my_page_religion_title), + info = { + ThtP1( + text = userInfo.religion, + fontWeight = FontWeight.Normal, + color = colorResource(id = tht.core.ui.R.color.yellow_f9cc2e), + maxLines = 1 + ) + }, + onClick = onReligionClick + ) + + Spacer(modifier = Modifier.height(12.dp)) + MyPageItemInfoRow( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp), + title = stringResource(id = R.string.my_page_interest_title), + titleMinWidth = 0.dp, + info = { + Row { + userInfo.interestsList.forEachIndexed { i, it -> + ToHotEmojiChip( + content = it.name, + emojiCode = it.emojiCode + ) + if (i != userInfo.interestsList.size - 1) { + Spacer(modifier = Modifier.width(6.dp)) + } + } + } + }, + onClick = onInterestEditClick + ) + + Spacer(modifier = Modifier.height(12.dp)) + MyPageItemInfoRow( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp), + title = stringResource(id = R.string.my_page_ideal_type_title), + titleMinWidth = 0.dp, + info = { + Row { + userInfo.idealTypeList.forEachIndexed { i, it -> + ToHotEmojiChip( + content = it.name, + emojiCode = it.emojiCode + ) + if (i != userInfo.idealTypeList.size - 1) { + Spacer(modifier = Modifier.width(6.dp)) + } + } + } + }, + onClick = onIdealTypeEditClick + ) + + Spacer(modifier = Modifier.height(42.dp)) +} diff --git a/feature/setting/src/main/java/tht/feature/setting/composable/mypage/MyPageItemInfoRow.kt b/feature/setting/src/main/java/tht/feature/setting/composable/mypage/MyPageItemInfoRow.kt new file mode 100644 index 00000000..c6bea193 --- /dev/null +++ b/feature/setting/src/main/java/tht/feature/setting/composable/mypage/MyPageItemInfoRow.kt @@ -0,0 +1,81 @@ +package tht.feature.setting.composable.mypage + +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.RowScope +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.widthIn +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.res.colorResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp +import com.example.compose_ui.component.text.subtitle.ThtSubtitle1 +import tht.core.ui.R + +@Composable +internal fun MyPageItemInfoRow( + title: String, + info: @Composable RowScope.() -> Unit, + modifier: Modifier = Modifier, + titleMinWidth: Dp? = null, + onClick: (() -> Unit)? = null, +) { + Row( + modifier = modifier + .clip(RoundedCornerShape(10.dp)) + .then( + if (onClick != null) { + Modifier.clickable( + enabled = true, + onClick = onClick + ) + } else { + Modifier + } + ) + .background( + color = colorResource(id = R.color.black_222222), + shape = RoundedCornerShape(10.dp) + ) + .padding(horizontal = 16.dp, vertical = 14.dp) + ) { + Row( + Modifier.widthIn(min = titleMinWidth ?: 89.dp) + ) { + ThtSubtitle1( + textAlign = TextAlign.Start, + text = title, + fontWeight = FontWeight.Normal, + color = colorResource(id = R.color.white_f9fafa) + ) + Spacer(modifier = Modifier.width(10.dp)) + } + Spacer(modifier = Modifier.weight(1f)) + info() + } +} + +@Composable +@Preview +private fun MyPageItemInfoRowPreview() { + MyPageItemInfoRow( + title = "title", + info = { + ThtSubtitle1( + text = "info", + fontWeight = FontWeight.Normal , + color = colorResource(id = R.color.yellow_f9cc2e) + ) + }, + onClick = {} + ) +} diff --git a/feature/setting/src/main/java/tht/feature/setting/route/MyPageRoute.kt b/feature/setting/src/main/java/tht/feature/setting/route/MyPageRoute.kt index e1d24f0b..45dd2170 100644 --- a/feature/setting/src/main/java/tht/feature/setting/route/MyPageRoute.kt +++ b/feature/setting/src/main/java/tht/feature/setting/route/MyPageRoute.kt @@ -29,14 +29,17 @@ fun MyPageRoute( MyPageScreen( modifier = Modifier.fillMaxSize(), userInfo = requireNotNull(state.myPageUserInfo), - introduceEditMode = false, onSettingClick = viewModel::onSettingClick, onNicknameEditClick = viewModel::onNicknameEditClick, - onIntroduceClick = viewModel::onIntroduceClick, onPrimaryProfileEditClick = viewModel::onPrimaryProfileEditClick, onNonePrimaryProfileAddClick = viewModel::onNonePrimaryProfileAddClick, onNonePrimaryProfileRemoveClick = viewModel::onNonePrimaryProfileRemoveClick, - onOptionalProfileEditClick = viewModel::onOptionalProfileEditClick, + onIntroduceClick = viewModel::onIntroduceClick, + onPreferredGenderClick = viewModel::onPreferredGenderClick, + onHeightClick = viewModel::onHeightClick, + onDrinkClick = viewModel::onDrinkClick, + onReligionClick = viewModel::onReligionClick, + onSmokeClick = viewModel::onSmokeClick, onIdealTypeEditClick = viewModel::onIdealTypeEditClick, onInterestEditClick = viewModel::onInterestEditClick ) diff --git a/feature/setting/src/main/java/tht/feature/setting/screen/MyPageScreen.kt b/feature/setting/src/main/java/tht/feature/setting/screen/MyPageScreen.kt index 2ba2ac78..4f8393e3 100644 --- a/feature/setting/src/main/java/tht/feature/setting/screen/MyPageScreen.kt +++ b/feature/setting/src/main/java/tht/feature/setting/screen/MyPageScreen.kt @@ -1,5 +1,6 @@ package tht.feature.setting.screen +import androidx.compose.foundation.ScrollState import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues @@ -8,7 +9,9 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.verticalScroll import androidx.compose.material.Button import androidx.compose.material.ButtonDefaults import androidx.compose.runtime.Composable @@ -22,9 +25,12 @@ import androidx.compose.ui.unit.dp import com.example.compose_ui.component.text.ThtText import com.example.compose_ui.component.text.caption.ThtCaption1 import com.example.compose_ui.component.text.headline.ThtHeadline4 +import com.example.compose_ui.component.text.subtitle.ThtSubtitle1 import com.example.compose_ui.component.toolbar.ThtToolbar import com.example.compose_ui.extensions.dpTextUnit import tht.core.ui.R +import tht.feature.setting.composable.mypage.MyPageInfoRows +import tht.feature.setting.composable.mypage.MyPageItemInfoRow import tht.feature.setting.composable.mypage.MyPageNicknameRow import tht.feature.setting.composable.mypage.MyPageProfileImageRow import tht.feature.setting.uimodel.MyPageUserInfoUiModel @@ -32,21 +38,26 @@ import tht.feature.setting.uimodel.MyPageUserInfoUiModel @Composable fun MyPageScreen( userInfo: MyPageUserInfoUiModel, - introduceEditMode: Boolean, onSettingClick: () -> Unit, onNicknameEditClick: () -> Unit, - onIntroduceClick: () -> Unit, onPrimaryProfileEditClick: (Int) -> Unit, onNonePrimaryProfileAddClick: () -> Unit, onNonePrimaryProfileRemoveClick: () -> Unit, - onOptionalProfileEditClick: () -> Unit, + onIntroduceClick: () -> Unit, + onPreferredGenderClick: () -> Unit, + onHeightClick: () -> Unit, + onSmokeClick: () -> Unit, + onDrinkClick: () -> Unit, + onReligionClick: () -> Unit, onIdealTypeEditClick: () -> Unit, onInterestEditClick: () -> Unit, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, + scrollState: ScrollState = rememberScrollState() ) { Column( modifier = modifier .background(color = colorResource(id = R.color.black_161616)) + .verticalScroll(scrollState) ) { ThtToolbar( modifier = Modifier @@ -104,7 +115,8 @@ fun MyPageScreen( Spacer(modifier = Modifier.height(8.dp)) ThtCaption1( - modifier = Modifier.fillMaxWidth() + modifier = Modifier + .fillMaxWidth() .padding(horizontal = 16.dp), textAlign = TextAlign.Start, text = stringResource(id = tht.feature.setting.R.string.my_page_profile_description), @@ -112,8 +124,17 @@ fun MyPageScreen( color = colorResource(id = R.color.gray_8d8d8d) ) - - + MyPageInfoRows( + userInfo = userInfo, + onIntroduceClick = onIntroduceClick, + onPreferredGenderClick = onPreferredGenderClick, + onHeightClick = onHeightClick, + onSmokeClick = onSmokeClick, + onDrinkClick = onDrinkClick, + onReligionClick = onReligionClick, + onIdealTypeEditClick = onIdealTypeEditClick, + onInterestEditClick = onInterestEditClick + ) } } @@ -123,14 +144,17 @@ private fun MyPageScreenPreview() { MyPageScreen( modifier = Modifier.fillMaxSize(), userInfo = MyPageUserInfoUiModel.EMPTY, - introduceEditMode = false, onSettingClick = {}, onNicknameEditClick = {}, onIntroduceClick = {}, onPrimaryProfileEditClick = {}, onNonePrimaryProfileAddClick = {}, onNonePrimaryProfileRemoveClick = {}, - onOptionalProfileEditClick = {}, + onPreferredGenderClick = {}, + onHeightClick = {}, + onDrinkClick = {}, + onReligionClick = {}, + onSmokeClick = {}, onIdealTypeEditClick = {}, onInterestEditClick = {}, ) diff --git a/feature/setting/src/main/java/tht/feature/setting/uimodel/MyPageUserInfoUiModel.kt b/feature/setting/src/main/java/tht/feature/setting/uimodel/MyPageUserInfoUiModel.kt index 9fdb5b3f..dee391a0 100644 --- a/feature/setting/src/main/java/tht/feature/setting/uimodel/MyPageUserInfoUiModel.kt +++ b/feature/setting/src/main/java/tht/feature/setting/uimodel/MyPageUserInfoUiModel.kt @@ -10,9 +10,9 @@ data class MyPageUserInfoUiModel( val username: String, val userProfilePhotos: ImmutableList, val birth: String, - val gender: String, + val gender: Gender, val introduction: String, - val preferredGender: String, + val preferredGender: Gender, val height: Int, val smoke: String, val drink: String, @@ -20,6 +20,11 @@ data class MyPageUserInfoUiModel( val idealTypeList: ImmutableList, val interestsList: ImmutableList, ) { + enum class Gender { + Male, + FeMale, + UnKnown + } @Immutable data class IdealType( val emojiCode: String, @@ -48,8 +53,8 @@ data class MyPageUserInfoUiModel( introduction = "", userProfilePhotos = persistentListOf(), birth = "", - gender = "", - preferredGender = "", + gender = Gender.Male, + preferredGender = Gender.Male, height = 0, smoke = "", drink = "", diff --git a/feature/setting/src/main/java/tht/feature/setting/uimodel/mapper/MyPageUserInfoMapper.kt b/feature/setting/src/main/java/tht/feature/setting/uimodel/mapper/MyPageUserInfoMapper.kt index 1d2393bb..61104c72 100644 --- a/feature/setting/src/main/java/tht/feature/setting/uimodel/mapper/MyPageUserInfoMapper.kt +++ b/feature/setting/src/main/java/tht/feature/setting/uimodel/mapper/MyPageUserInfoMapper.kt @@ -2,6 +2,7 @@ package tht.feature.setting.uimodel.mapper import com.tht.tht.domain.setting.model.MyPageUserInfoModel import kotlinx.collections.immutable.toPersistentList +import tht.core.ui.util.StringUtil import tht.feature.setting.uimodel.MyPageUserInfoUiModel fun MyPageUserInfoModel.toUiModel(): MyPageUserInfoUiModel { @@ -10,8 +11,16 @@ fun MyPageUserInfoModel.toUiModel(): MyPageUserInfoUiModel { username = username, userProfilePhotos = userProfilePhotos.map { it.toUiModel() }.toPersistentList(), birth = birth, - gender = gender, - preferredGender = preferredGender, + gender = when (gender) { + "MALE" -> MyPageUserInfoUiModel.Gender.Male + "FEMALE" -> MyPageUserInfoUiModel.Gender.FeMale + else -> MyPageUserInfoUiModel.Gender.UnKnown + }, + preferredGender = when (preferredGender) { + "MALE" -> MyPageUserInfoUiModel.Gender.Male + "FEMALE" -> MyPageUserInfoUiModel.Gender.FeMale + else -> MyPageUserInfoUiModel.Gender.UnKnown + }, introduction = introduction, smoke = smoke, drink = drink, @@ -24,7 +33,7 @@ fun MyPageUserInfoModel.toUiModel(): MyPageUserInfoUiModel { fun MyPageUserInfoModel.IdealType.toUiModel(): MyPageUserInfoUiModel.IdealType { return MyPageUserInfoUiModel.IdealType( - emojiCode = emojiCode, + emojiCode = StringUtil.parseEmoji(emojiCode), idx = idx, name = name ) @@ -33,7 +42,7 @@ fun MyPageUserInfoModel.IdealType.toUiModel(): MyPageUserInfoUiModel.IdealType { fun MyPageUserInfoModel.Interests.toUiModel(): MyPageUserInfoUiModel.Interests { return MyPageUserInfoUiModel.Interests( - emojiCode = emojiCode, + emojiCode = StringUtil.parseEmoji(emojiCode), idx = idx, name = name ) diff --git a/feature/setting/src/main/java/tht/feature/setting/viewmodel/MyPageViewModel.kt b/feature/setting/src/main/java/tht/feature/setting/viewmodel/MyPageViewModel.kt index cb74cf5d..2228e1b8 100644 --- a/feature/setting/src/main/java/tht/feature/setting/viewmodel/MyPageViewModel.kt +++ b/feature/setting/src/main/java/tht/feature/setting/viewmodel/MyPageViewModel.kt @@ -77,7 +77,23 @@ class MyPageViewModel @Inject constructor( } - fun onOptionalProfileEditClick() { + fun onPreferredGenderClick() { + + } + + fun onHeightClick() { + + } + + fun onDrinkClick() { + + } + + fun onReligionClick() { + + } + + fun onSmokeClick() { } diff --git a/feature/setting/src/main/res/values/strings.xml b/feature/setting/src/main/res/values/strings.xml index 72b1c1b3..a89f3bf6 100644 --- a/feature/setting/src/main/res/values/strings.xml +++ b/feature/setting/src/main/res/values/strings.xml @@ -3,4 +3,19 @@ Hello blank fragment 매력적인 사진으로 무디들에게 나를 어필해보세요.\n프로필 완성도가 높아지면 상대방에게 좋아요를 더 많이 받을 수 있어요 🔥 + + 생년월일 + 성별 + 자기소개 + 선호성별 + + 흡연 여부 + + 종교 + 관심사 + 이상형 + + 남성 + 여성 + 알수없음 From 9d3e14253a0e4c07fd0633804006e78cbb736438 Mon Sep 17 00:00:00 2001 From: wjchoi96 Date: Sat, 20 Apr 2024 17:35:44 +0900 Subject: [PATCH 12/16] =?UTF-8?q?feat:TOP-94=20ThtToolbar=EC=9D=98=20?= =?UTF-8?q?=EB=B6=88=ED=95=84=EC=9A=94=ED=95=9C=20start=20Spacer=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/compose_ui/component/toolbar/ThtToolbar.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/core/compose-ui/src/main/java/com/example/compose_ui/component/toolbar/ThtToolbar.kt b/core/compose-ui/src/main/java/com/example/compose_ui/component/toolbar/ThtToolbar.kt index 16da5c7d..43e87a50 100644 --- a/core/compose-ui/src/main/java/com/example/compose_ui/component/toolbar/ThtToolbar.kt +++ b/core/compose-ui/src/main/java/com/example/compose_ui/component/toolbar/ThtToolbar.kt @@ -45,7 +45,6 @@ fun ThtToolbar( ) } } - Spacer(modifier = Modifier.width(16.dp)) content() } } From ad9741254095478cc9d32548d084d3bacb179a04 Mon Sep 17 00:00:00 2001 From: wjchoi96 Date: Sat, 20 Apr 2024 17:47:58 +0900 Subject: [PATCH 13/16] =?UTF-8?q?[TOP-94]=20MyPageSideEffect=20=EB=93=A4?= =?UTF-8?q?=20=EC=9E=84=EC=8B=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tht/feature/setting/route/MyPageRoute.kt | 19 +++++++++- .../setting/viewmodel/MyPageViewModel.kt | 36 ++++++++++++------- .../setting/src/main/res/values/strings.xml | 2 ++ 3 files changed, 43 insertions(+), 14 deletions(-) diff --git a/feature/setting/src/main/java/tht/feature/setting/route/MyPageRoute.kt b/feature/setting/src/main/java/tht/feature/setting/route/MyPageRoute.kt index 45dd2170..0094523e 100644 --- a/feature/setting/src/main/java/tht/feature/setting/route/MyPageRoute.kt +++ b/feature/setting/src/main/java/tht/feature/setting/route/MyPageRoute.kt @@ -1,24 +1,41 @@ package tht.feature.setting.route +import android.content.Context import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import androidx.hilt.navigation.compose.hiltViewModel +import tht.core.ui.extension.showToast +import tht.feature.setting.R import tht.feature.setting.screen.MyPageScreen import tht.feature.setting.viewmodel.MyPageViewModel @Composable fun MyPageRoute( navigateSetting: () -> Unit, - viewModel: MyPageViewModel = hiltViewModel() + viewModel: MyPageViewModel = hiltViewModel(), + context: Context = LocalContext.current ) { LaunchedEffect(key1 = Unit) { viewModel.store.sideEffect.collect { when (it) { is MyPageViewModel.MyPageSideEffect.NavigateSetting -> navigateSetting() + + is MyPageViewModel.MyPageSideEffect.ShowProfileImageModifyToast -> { + context.showToast( + context.getString( + R.string.message_modify_profile_image_complete + ) + ) + } + + else -> { + // TODO: Navigate 구현 + } } } } diff --git a/feature/setting/src/main/java/tht/feature/setting/viewmodel/MyPageViewModel.kt b/feature/setting/src/main/java/tht/feature/setting/viewmodel/MyPageViewModel.kt index 2228e1b8..f5d590cd 100644 --- a/feature/setting/src/main/java/tht/feature/setting/viewmodel/MyPageViewModel.kt +++ b/feature/setting/src/main/java/tht/feature/setting/viewmodel/MyPageViewModel.kt @@ -20,13 +20,23 @@ class MyPageViewModel @Inject constructor( ) : ViewModel(), Container { sealed interface MyPageSideEffect { + object ShowProfileImageModifyToast : MyPageSideEffect object NavigateSetting : MyPageSideEffect + object NavigateModifyNickName : MyPageSideEffect + object NavigateModifyIntroduce : MyPageSideEffect + object NavigateModifyPreferredGender : MyPageSideEffect + object NavigateModifyHeight : MyPageSideEffect + object NavigateModifySmoke : MyPageSideEffect + object NavigateModifyNickDrink : MyPageSideEffect + object NavigateModifyNickReligion : MyPageSideEffect + object NavigateModifyNickInterest : MyPageSideEffect + object NavigateModifyNickIdealType : MyPageSideEffect } @Immutable data class MyPageUiState( val myPageUserInfo: MyPageUserInfoUiModel?, - val loading: Boolean, + val loading: Boolean ) { val showSkeletonView: Boolean get() = myPageUserInfo == null && loading @@ -58,51 +68,51 @@ class MyPageViewModel @Inject constructor( } fun onNicknameEditClick() { - + intent { postSideEffect(MyPageSideEffect.NavigateModifyNickName) } } fun onIntroduceClick() { - + intent { postSideEffect(MyPageSideEffect.NavigateModifyIntroduce) } } fun onPrimaryProfileEditClick(priority: Int) { - + intent { postSideEffect(MyPageSideEffect.ShowProfileImageModifyToast) } } fun onNonePrimaryProfileAddClick() { - + intent { postSideEffect(MyPageSideEffect.ShowProfileImageModifyToast) } } fun onNonePrimaryProfileRemoveClick() { - + intent { postSideEffect(MyPageSideEffect.ShowProfileImageModifyToast) } } fun onPreferredGenderClick() { - + intent { postSideEffect(MyPageSideEffect.NavigateModifyPreferredGender) } } fun onHeightClick() { - + intent { postSideEffect(MyPageSideEffect.NavigateModifyHeight) } } fun onDrinkClick() { - + intent { postSideEffect(MyPageSideEffect.NavigateModifyNickDrink) } } fun onReligionClick() { - + intent { postSideEffect(MyPageSideEffect.NavigateModifyNickReligion) } } fun onSmokeClick() { - + intent { postSideEffect(MyPageSideEffect.NavigateModifySmoke) } } fun onIdealTypeEditClick() { - + intent { postSideEffect(MyPageSideEffect.NavigateModifyNickIdealType) } } fun onInterestEditClick() { - + intent { postSideEffect(MyPageSideEffect.NavigateModifyNickInterest) } } diff --git a/feature/setting/src/main/res/values/strings.xml b/feature/setting/src/main/res/values/strings.xml index a89f3bf6..9f153cf8 100644 --- a/feature/setting/src/main/res/values/strings.xml +++ b/feature/setting/src/main/res/values/strings.xml @@ -18,4 +18,6 @@ 남성 여성 알수없음 + + 프로필 사진 변경이 완료되었습니다 From 568297f98f4b36ce818ceadead65e42457c2b963 Mon Sep 17 00:00:00 2001 From: wjchoi96 Date: Sat, 20 Apr 2024 17:49:08 +0900 Subject: [PATCH 14/16] chore:TOP-94 lint check --- .../remote/mapper/MyPageUserSettingMapper.kt | 1 - .../setting/MyPageUserInfoResponse.kt | 1 - .../setting/composable/SettingImageBanner.kt | 2 - .../feature/setting/screen/MyPageScreen.kt | 4 +- .../setting/uimodel/MyPageUserInfoUiModel.kt | 42 ++++++++++--------- .../setting/viewmodel/MyPageViewModel.kt | 2 - 6 files changed, 23 insertions(+), 29 deletions(-) diff --git a/data/src/main/java/com/tht/tht/data/remote/mapper/MyPageUserSettingMapper.kt b/data/src/main/java/com/tht/tht/data/remote/mapper/MyPageUserSettingMapper.kt index 76ab8eaf..af19222a 100644 --- a/data/src/main/java/com/tht/tht/data/remote/mapper/MyPageUserSettingMapper.kt +++ b/data/src/main/java/com/tht/tht/data/remote/mapper/MyPageUserSettingMapper.kt @@ -29,7 +29,6 @@ fun MyPageUserInfoResponse.IdealType.toModel(): MyPageUserInfoModel.IdealType { ) } - fun MyPageUserInfoResponse.Interests.toModel(): MyPageUserInfoModel.Interests { return MyPageUserInfoModel.Interests( emojiCode = emojiCode, diff --git a/data/src/main/java/com/tht/tht/data/remote/response/setting/MyPageUserInfoResponse.kt b/data/src/main/java/com/tht/tht/data/remote/response/setting/MyPageUserInfoResponse.kt index e9d35383..64ae6421 100644 --- a/data/src/main/java/com/tht/tht/data/remote/response/setting/MyPageUserInfoResponse.kt +++ b/data/src/main/java/com/tht/tht/data/remote/response/setting/MyPageUserInfoResponse.kt @@ -1,6 +1,5 @@ package com.tht.tht.data.remote.response.setting - import com.google.gson.annotations.SerializedName data class MyPageUserInfoResponse( diff --git a/feature/setting/src/main/java/tht/feature/setting/composable/SettingImageBanner.kt b/feature/setting/src/main/java/tht/feature/setting/composable/SettingImageBanner.kt index 94a7fe8a..6b63d976 100644 --- a/feature/setting/src/main/java/tht/feature/setting/composable/SettingImageBanner.kt +++ b/feature/setting/src/main/java/tht/feature/setting/composable/SettingImageBanner.kt @@ -3,9 +3,7 @@ package tht.feature.setting.composable import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.Icon import androidx.compose.runtime.Composable diff --git a/feature/setting/src/main/java/tht/feature/setting/screen/MyPageScreen.kt b/feature/setting/src/main/java/tht/feature/setting/screen/MyPageScreen.kt index 4f8393e3..eb177e87 100644 --- a/feature/setting/src/main/java/tht/feature/setting/screen/MyPageScreen.kt +++ b/feature/setting/src/main/java/tht/feature/setting/screen/MyPageScreen.kt @@ -25,12 +25,10 @@ import androidx.compose.ui.unit.dp import com.example.compose_ui.component.text.ThtText import com.example.compose_ui.component.text.caption.ThtCaption1 import com.example.compose_ui.component.text.headline.ThtHeadline4 -import com.example.compose_ui.component.text.subtitle.ThtSubtitle1 import com.example.compose_ui.component.toolbar.ThtToolbar import com.example.compose_ui.extensions.dpTextUnit import tht.core.ui.R import tht.feature.setting.composable.mypage.MyPageInfoRows -import tht.feature.setting.composable.mypage.MyPageItemInfoRow import tht.feature.setting.composable.mypage.MyPageNicknameRow import tht.feature.setting.composable.mypage.MyPageProfileImageRow import tht.feature.setting.uimodel.MyPageUserInfoUiModel @@ -156,6 +154,6 @@ private fun MyPageScreenPreview() { onReligionClick = {}, onSmokeClick = {}, onIdealTypeEditClick = {}, - onInterestEditClick = {}, + onInterestEditClick = {} ) } diff --git a/feature/setting/src/main/java/tht/feature/setting/uimodel/MyPageUserInfoUiModel.kt b/feature/setting/src/main/java/tht/feature/setting/uimodel/MyPageUserInfoUiModel.kt index dee391a0..312fd747 100644 --- a/feature/setting/src/main/java/tht/feature/setting/uimodel/MyPageUserInfoUiModel.kt +++ b/feature/setting/src/main/java/tht/feature/setting/uimodel/MyPageUserInfoUiModel.kt @@ -18,25 +18,28 @@ data class MyPageUserInfoUiModel( val drink: String, val religion: String, val idealTypeList: ImmutableList, - val interestsList: ImmutableList, + val interestsList: ImmutableList ) { enum class Gender { Male, FeMale, UnKnown } + @Immutable data class IdealType( val emojiCode: String, val idx: Int, val name: String ) + @Immutable data class Interests( val emojiCode: String, val idx: Int, val name: String ) + @Immutable data class UserProfilePhoto( val priority: Int, @@ -45,23 +48,22 @@ data class MyPageUserInfoUiModel( fun isPrimaryImage(): Boolean = priority <= 2 } - companion object { - val EMPTY: MyPageUserInfoUiModel - get() = MyPageUserInfoUiModel( - userUuid = "", - username = "", - introduction = "", - userProfilePhotos = persistentListOf(), - birth = "", - gender = Gender.Male, - preferredGender = Gender.Male, - height = 0, - smoke = "", - drink = "", - religion = "", - idealTypeList = persistentListOf(), - interestsList = persistentListOf() - ) - } + companion object { + val EMPTY: MyPageUserInfoUiModel + get() = MyPageUserInfoUiModel( + userUuid = "", + username = "", + introduction = "", + userProfilePhotos = persistentListOf(), + birth = "", + gender = Gender.Male, + preferredGender = Gender.Male, + height = 0, + smoke = "", + drink = "", + religion = "", + idealTypeList = persistentListOf(), + interestsList = persistentListOf() + ) + } } - diff --git a/feature/setting/src/main/java/tht/feature/setting/viewmodel/MyPageViewModel.kt b/feature/setting/src/main/java/tht/feature/setting/viewmodel/MyPageViewModel.kt index f5d590cd..0e0f8ef5 100644 --- a/feature/setting/src/main/java/tht/feature/setting/viewmodel/MyPageViewModel.kt +++ b/feature/setting/src/main/java/tht/feature/setting/viewmodel/MyPageViewModel.kt @@ -114,6 +114,4 @@ class MyPageViewModel @Inject constructor( fun onInterestEditClick() { intent { postSideEffect(MyPageSideEffect.NavigateModifyNickInterest) } } - - } From 541f051df65b32518476a52c190d28ac9d9c8e87 Mon Sep 17 00:00:00 2001 From: wjchoi96 Date: Sat, 20 Apr 2024 17:56:36 +0900 Subject: [PATCH 15/16] =?UTF-8?q?chore:TOP-94=20drawable=20resource=20?= =?UTF-8?q?=ED=95=98=EB=82=98=EA=B0=80=20debug=20=EB=94=94=EB=A0=89?= =?UTF-8?q?=ED=86=A0=EB=A6=AC=EC=97=90=20=EB=93=A4=EC=96=B4=EA=B0=80=20?= =?UTF-8?q?=EC=9E=88=EB=8D=98=20=EB=AC=B8=EC=A0=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/{debug => main}/res/drawable/ic_profile_image_edit.xml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename feature/setting/src/{debug => main}/res/drawable/ic_profile_image_edit.xml (100%) diff --git a/feature/setting/src/debug/res/drawable/ic_profile_image_edit.xml b/feature/setting/src/main/res/drawable/ic_profile_image_edit.xml similarity index 100% rename from feature/setting/src/debug/res/drawable/ic_profile_image_edit.xml rename to feature/setting/src/main/res/drawable/ic_profile_image_edit.xml From 5825f7493549c1cba2427a74cb48f1ac54bc95fe Mon Sep 17 00:00:00 2001 From: wjchoi96 Date: Sat, 20 Apr 2024 17:58:29 +0900 Subject: [PATCH 16/16] chore:TOP-94 lint check --- .../tht/feature/setting/composable/mypage/MyPageInfoRows.kt | 2 +- .../feature/setting/composable/mypage/MyPageItemInfoRow.kt | 4 ++-- .../setting/composable/mypage/MyPageProfileImageItem.kt | 4 ++-- .../feature/setting/uimodel/mapper/MyPageUserInfoMapper.kt | 3 +-- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/feature/setting/src/main/java/tht/feature/setting/composable/mypage/MyPageInfoRows.kt b/feature/setting/src/main/java/tht/feature/setting/composable/mypage/MyPageInfoRows.kt index 9db68738..0f4e79f1 100644 --- a/feature/setting/src/main/java/tht/feature/setting/composable/mypage/MyPageInfoRows.kt +++ b/feature/setting/src/main/java/tht/feature/setting/composable/mypage/MyPageInfoRows.kt @@ -30,7 +30,7 @@ fun ColumnScope.MyPageInfoRows( onDrinkClick: () -> Unit, onReligionClick: () -> Unit, onIdealTypeEditClick: () -> Unit, - onInterestEditClick: () -> Unit, + onInterestEditClick: () -> Unit ) { Spacer(modifier = Modifier.height(32.dp)) MyPageItemInfoRow( diff --git a/feature/setting/src/main/java/tht/feature/setting/composable/mypage/MyPageItemInfoRow.kt b/feature/setting/src/main/java/tht/feature/setting/composable/mypage/MyPageItemInfoRow.kt index c6bea193..525f3550 100644 --- a/feature/setting/src/main/java/tht/feature/setting/composable/mypage/MyPageItemInfoRow.kt +++ b/feature/setting/src/main/java/tht/feature/setting/composable/mypage/MyPageItemInfoRow.kt @@ -27,7 +27,7 @@ internal fun MyPageItemInfoRow( info: @Composable RowScope.() -> Unit, modifier: Modifier = Modifier, titleMinWidth: Dp? = null, - onClick: (() -> Unit)? = null, + onClick: (() -> Unit)? = null ) { Row( modifier = modifier @@ -72,7 +72,7 @@ private fun MyPageItemInfoRowPreview() { info = { ThtSubtitle1( text = "info", - fontWeight = FontWeight.Normal , + fontWeight = FontWeight.Normal, color = colorResource(id = R.color.yellow_f9cc2e) ) }, diff --git a/feature/setting/src/main/java/tht/feature/setting/composable/mypage/MyPageProfileImageItem.kt b/feature/setting/src/main/java/tht/feature/setting/composable/mypage/MyPageProfileImageItem.kt index 10905a97..cb910386 100644 --- a/feature/setting/src/main/java/tht/feature/setting/composable/mypage/MyPageProfileImageItem.kt +++ b/feature/setting/src/main/java/tht/feature/setting/composable/mypage/MyPageProfileImageItem.kt @@ -70,11 +70,11 @@ fun MyPageProfileImageItem( .clip(RoundedCornerShape(12.dp)), model = model, contentDescription = "profile_image", - contentScale = ContentScale.Crop, + contentScale = ContentScale.Crop ) // remove default icon padding CompositionLocalProvider( - LocalMinimumInteractiveComponentEnforcement provides false, + LocalMinimumInteractiveComponentEnforcement provides false ) { if (isPrimary) { IconButton( diff --git a/feature/setting/src/main/java/tht/feature/setting/uimodel/mapper/MyPageUserInfoMapper.kt b/feature/setting/src/main/java/tht/feature/setting/uimodel/mapper/MyPageUserInfoMapper.kt index 61104c72..62f3adaf 100644 --- a/feature/setting/src/main/java/tht/feature/setting/uimodel/mapper/MyPageUserInfoMapper.kt +++ b/feature/setting/src/main/java/tht/feature/setting/uimodel/mapper/MyPageUserInfoMapper.kt @@ -27,7 +27,7 @@ fun MyPageUserInfoModel.toUiModel(): MyPageUserInfoUiModel { height = height, religion = religion, idealTypeList = idealTypeList.map { it.toUiModel() }.toPersistentList(), - interestsList = interestsList.map { it.toUiModel() }.toPersistentList(), + interestsList = interestsList.map { it.toUiModel() }.toPersistentList() ) } @@ -39,7 +39,6 @@ fun MyPageUserInfoModel.IdealType.toUiModel(): MyPageUserInfoUiModel.IdealType { ) } - fun MyPageUserInfoModel.Interests.toUiModel(): MyPageUserInfoUiModel.Interests { return MyPageUserInfoUiModel.Interests( emojiCode = StringUtil.parseEmoji(emojiCode),