Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ fun SolplyBasicDropDown(
onClickDropIcon: () -> Unit,
modifier: Modifier = Modifier,
isDropped: Boolean = false,
content: @Composable ColumnScope.() -> Unit,
content: @Composable ColumnScope.() -> Unit
) {
Column(
modifier = modifier
Expand Down Expand Up @@ -100,4 +100,4 @@ fun SolplyBasicDropDown(
}
}
}
}
}
12 changes: 12 additions & 0 deletions core/model/src/main/java/com/teamsolply/solply/model/Persona.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.teamsolply.solply.model

import kotlinx.serialization.Serializable

@Serializable
enum class Persona(val description: String) {
REST("조용한 공간에 오래 머물고 싶어요"),
EXPLORER("이곳저곳 둘러보고 싶어요"),
MOODING("취향이 담긴 곳을 찾고 싶어요"),
NATURAL("자연을 감상하며 쉬고 싶어요"),
ANYTHING("특별히 선호하는 공간은 없어요")
}
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
package com.teamsolply.solply.mypage.datasource

interface MypageRemoteDataSource
import com.teamsolply.solply.mypage.dto.response.GetPersonaListResponseDto
import com.teamsolply.solply.mypage.dto.response.GetUserInfoResponseDto
import com.teamsolply.solply.mypage.dto.response.NicknameDuplicateResponseDto
import com.teamsolply.solply.mypage.dto.response.PlaceListResponseDto

interface MypageRemoteDataSource {
suspend fun getUserInfo(): GetUserInfoResponseDto
suspend fun getPlaceList(townId: Long): PlaceListResponseDto
suspend fun getPersonaList(): GetPersonaListResponseDto
suspend fun checkNicknameDuplicate(nickname: String): NicknameDuplicateResponseDto
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.teamsolply.solply.mypage.dto.response

import com.teamsolply.solply.model.Persona
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class GetPersonaListResponseDto(
@SerialName("personaList")
val personaDtoList: List<PersonaDto>
)

@Serializable
data class PersonaDto(
@SerialName("personaType")
val personaType: Persona,
@SerialName("description")
val description: String
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package com.teamsolply.solply.mypage.dto.response

import com.teamsolply.solply.model.Persona
import com.teamsolply.solply.mypage.model.SelectedTownInfo
import com.teamsolply.solply.mypage.model.UserInfo
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class GetUserInfoResponseDto(
@SerialName("userId")
val userId: Long,
@SerialName("nickname")
val nickname: String,
@SerialName("selectedTown")
val selectedTown: SelectedTownDto,
@SerialName("persona")
val persona: Persona,
@SerialName("profileImageUrl")
val profileImageUrl: String?
)

@Serializable
data class SelectedTownDto(
@SerialName("townId")
val townId: Long,
@SerialName("townName")
val townName: String
)

fun GetUserInfoResponseDto.toDomain(): UserInfo =
UserInfo(
userId = userId,
nickname = nickname,
selectedTown = SelectedTownInfo(
townId = selectedTown.townId,
townName = selectedTown.townName
),
persona = persona,
profileImageUrl = profileImageUrl ?: "" // 서버 null → 도메인 기본값
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.teamsolply.solply.mypage.dto.response

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class NicknameDuplicateResponseDto(
@SerialName("isDuplicated")
val isDuplicated: Boolean
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.teamsolply.solply.mypage.dto.response

import com.teamsolply.solply.model.PlaceType
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class PlaceListResponseDto(

@SerialName("places")
val placeList: List<PlaceResponseDto>
)

@Serializable
data class PlaceResponseDto(
@SerialName("placeId")
val placeId: Long,

@SerialName("placeName")
val placeName: String,

@SerialName("thumbnailImageUrl")
val imageUrl: String,

@SerialName("primaryTag")
val tag: PlaceType,

@SerialName("isBookmarked")
val isSaved: Boolean
)
Original file line number Diff line number Diff line change
@@ -1,8 +1,49 @@
package com.teamsolply.solply.mypage.repository

import android.util.Log
import com.teamsolply.solply.mypage.datasource.MypageRemoteDataSource
import com.teamsolply.solply.mypage.dto.response.toDomain
import com.teamsolply.solply.mypage.model.PersonaEntity
import com.teamsolply.solply.mypage.model.PlaceInfoEntity
import com.teamsolply.solply.mypage.model.UserInfo
import javax.inject.Inject

class MypageRepositoryImpl @Inject constructor(
private val mypageRemoteDataSource: MypageRemoteDataSource
) : MypageRepository
) : MypageRepository {
override suspend fun getUserInfo(): Result<UserInfo> = runCatching {
mypageRemoteDataSource.getUserInfo()
}.mapCatching { userDto ->
userDto.toDomain()
}

override suspend fun getPlaceList(townId: Long): Result<List<PlaceInfoEntity>> = runCatching {
mypageRemoteDataSource.getPlaceList(townId).placeList
}.mapCatching { placeList ->
placeList.map { place ->
PlaceInfoEntity(
placeId = place.placeId,
placeName = place.placeName,
placeType = place.tag,
imageUrls = place.imageUrl,
isSaved = place.isSaved
)
}
}

override suspend fun getPersonaList(): Result<List<PersonaEntity>> = runCatching {
mypageRemoteDataSource.getPersonaList().personaDtoList
}.mapCatching { personaList ->
Log.d("persona: ", "repo impl start")
personaList.map { persona ->
PersonaEntity(
personaType = persona.personaType,
description = persona.description
)
}
}

override suspend fun checkNicknameDuplicate(nickname: String): Result<Boolean> = runCatching {
mypageRemoteDataSource.checkNicknameDuplicate(nickname = nickname).isDuplicated
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.teamsolply.solply.mypage.model

import com.teamsolply.solply.model.Persona

data class PersonaEntity(
val personaType: Persona,
val description: String
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.teamsolply.solply.mypage.model

import com.teamsolply.solply.model.PlaceType

data class PlaceInfoEntity(
val placeId: Long,
val placeName: String,
val placeType: PlaceType,
val imageUrls: String,
val isSaved: Boolean,
val isSelected: Boolean = false
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.teamsolply.solply.mypage.model

import com.teamsolply.solply.model.Persona

data class UserInfo(
val userId: Long,
val nickname: String,
val selectedTown: SelectedTownInfo,
val persona: Persona,
val profileImageUrl: String = ""
)

data class SelectedTownInfo(
val townId: Long,
val townName: String
)
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
package com.teamsolply.solply.mypage.repository

interface MypageRepository
import com.teamsolply.solply.mypage.model.PersonaEntity
import com.teamsolply.solply.mypage.model.PlaceInfoEntity
import com.teamsolply.solply.mypage.model.UserInfo

interface MypageRepository {
suspend fun getUserInfo(): Result<UserInfo>
suspend fun getPlaceList(townId: Long): Result<List<PlaceInfoEntity>>
suspend fun getPersonaList(): Result<List<PersonaEntity>>
suspend fun checkNicknameDuplicate(nickname: String): Result<Boolean>
}
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@ import com.teamsolply.solply.maps.navigation.mapsNavGraph
import com.teamsolply.solply.model.SnackBarType
import com.teamsolply.solply.mypage.navigation.Mypage
import com.teamsolply.solply.mypage.navigation.mypageNavGraph
import com.teamsolply.solply.mypage.profile.navigation.Profile
import com.teamsolply.solply.mypage.profile.navigation.profileNavGraph
import com.teamsolply.solply.oauth.navigation.oauthNavGraph
import com.teamsolply.solply.onboarding.navigation.onBoardingNavGraph
Expand Down
Original file line number Diff line number Diff line change
@@ -1,22 +1,38 @@
package com.teamsolply.solply.mypage

import com.teamsolply.solply.mypage.model.DropDownPersonaItem
import com.teamsolply.solply.model.Persona
import com.teamsolply.solply.mypage.model.PlaceInfoEntity
import com.teamsolply.solply.mypage.model.SelectedTownInfo
import com.teamsolply.solply.mypage.model.UserInfo
import com.teamsolply.solply.ui.base.SideEffect
import com.teamsolply.solply.ui.base.UiIntent
import com.teamsolply.solply.ui.base.UiState
import kotlinx.collections.immutable.persistentListOf

data class MypageState(
val town: String = "연희동",
val nickname: String = "",
val userInfo: UserInfo = UserInfo(
userId = 1,
nickname = "숭이숭이숭이",
selectedTown = SelectedTownInfo(0, "망원동"),
persona = Persona.REST,
profileImageUrl = ""
),
val placeList: List<PlaceInfoEntity> = emptyList(),
val dialogState: Boolean = false
) : UiState

sealed interface MypageIntent : UiIntent {
data object Init : MypageIntent

data object LogOutButtonClick : MypageIntent
data object WithdrawButtonClick : MypageIntent

data object DialogConfirmClick : MypageIntent
data object DialogDismissClick : MypageIntent

data object ProfileEditClick : MypageIntent
}

sealed interface MypageSideEffect : SideEffect {
data object NavigateToBack : MypageSideEffect
data object NavigateToProfile : MypageSideEffect
data object NavigateToMypage : MypageSideEffect
}
Loading