Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
3387d9e
[CHORE]: 내 정보 조회, 수정 관련 dto 작성
casper-jr Oct 4, 2025
f3bffc7
[CHORE]: 내 정보 조회, 수정 관련 datasource 함수 작성
casper-jr Oct 4, 2025
8215b4c
[CHORE]: 내 정보 조회, 수정 관련 repository 함수 작성
casper-jr Oct 4, 2025
ffdc5de
[FEAT]: 내 정보 조회 함수 작성
casper-jr Oct 4, 2025
481862f
[FIX]: dto 속성명 수정
casper-jr Oct 4, 2025
83673ec
[REFACTOR]: EditMyInfoScreen 제거(MyPageScreen에서 상태 기반 관리를 위함)
casper-jr Oct 4, 2025
8f4ae66
[REFACTOR]: MyPageScreen에서 uiState 기준으로 수정 모드로 진입하도록 리팩토링
casper-jr Oct 4, 2025
145f273
[REFACTOR]: 동아리 목록 컴포넌트에 상태에 따른 처리 추가
casper-jr Oct 4, 2025
2eb4fbb
[REFACTOR]: 수정 모드 함수명 수정, backhandler 로직 추가
casper-jr Oct 4, 2025
12cf31e
[FEAT]: 삭제 버튼 클릭시 ui 반영 로직 추가
casper-jr Oct 4, 2025
9d53b1a
[FIX]: 응답 타입 수정
casper-jr Oct 4, 2025
d5df7fb
[FIX]: 요청시 setBody 함수 수정
casper-jr Oct 4, 2025
17978ed
[FEAT]: 내 정보 수정 기능 구현
casper-jr Oct 4, 2025
42257b3
[FEAT]: MyPage 화면으로 진입하면 수정 모드 해제 및 데이터 새로고침 구현
casper-jr Oct 4, 2025
c8d9394
[REFACTOR]: MyPage 화면 진입 지점에 따른 네비게이션 분기 처리
casper-jr Oct 4, 2025
796d54c
[FIX]: MyPage 화면 padding 수정
casper-jr Oct 4, 2025
eaf42c3
[FIX]: 텍스트필드에 singleLine 속성 추가, 실제 요청시에는 trim 적용
casper-jr Oct 4, 2025
9028f91
[FEAT]: 내 정보 수정 성공시에 상태 변경 반영
casper-jr Oct 4, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ sealed interface Route {
data object NicknameInput: Route

@Serializable
data object ClubCodeInput: Route
data class ClubCodeInput(val returnToMyPage: Boolean = false): Route

/* 메인 화면 */
@Serializable
Expand All @@ -38,8 +38,4 @@ sealed interface Route {
/* 마이 페이지 */
@Serializable
data object MyPage: Route

/* 내 정보 수정하기 */
@Serializable
data object UpdateMyInfo: Route
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import androidx.navigation.NavHostController
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.navigation
import androidx.navigation.toRoute
import org.whosin.client.presentation.auth.clubcode.ClubCodeInputScreen
import org.whosin.client.presentation.auth.login.EmailVerificationScreen
import org.whosin.client.presentation.auth.login.LoginScreen
Expand All @@ -15,7 +16,6 @@ import org.whosin.client.presentation.auth.login.PasswordInputScreen
import org.whosin.client.presentation.auth.login.SignupScreen
import org.whosin.client.presentation.auth.login.SplashScreen
import org.whosin.client.presentation.home.HomeScreen
import org.whosin.client.presentation.mypage.EditMyInfoScreen
import org.whosin.client.presentation.mypage.MyPageScreen

@Composable
Expand Down Expand Up @@ -105,18 +105,25 @@ fun WhosInNavGraph(
modifier = modifier,
onNavigateBack = { navController.navigateUp() },
onNavigateToClubCode = {
navController.navigate(Route.ClubCodeInput)
navController.navigate(Route.ClubCodeInput(returnToMyPage = false))
}
)
}

composable<Route.ClubCodeInput> {
composable<Route.ClubCodeInput> { backStackEntry ->
val route = backStackEntry.toRoute<Route.ClubCodeInput>()
ClubCodeInputScreen(
modifier = modifier,
onNavigateBack = { navController.navigateUp() },
onNavigateToHome = {
navController.navigate(Route.Home) {
popUpTo(Route.AuthGraph) { inclusive = true }
if (route.returnToMyPage) {
// MyPage에서 온 경우 단순히 뒤로가기
navController.navigateUp()
} else {
// 회원가입 플로우에서 온 경우 Home으로 이동
navController.navigate(Route.Home) {
popUpTo(Route.AuthGraph) { inclusive = true }
}
}
}
)
Expand All @@ -139,23 +146,7 @@ fun WhosInNavGraph(
modifier = modifier,
onNavigateBack = { navController.navigateUp() },
onNavigateToAddClub = {

},
onNavigateToEdit = {
navController.navigate(Route.UpdateMyInfo)
},
)
}

composable<Route.UpdateMyInfo> {
EditMyInfoScreen(
modifier = modifier,
onNavigateBack = { navController.navigateUp() },
onNavigateToMyPage = {
navController.navigate(Route.MyPage) {
popUpTo(Route.UpdateMyInfo) { inclusive = true }
launchSingleTop = true
}
navController.navigate(Route.ClubCodeInput(returnToMyPage = true))
}
)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package org.whosin.client.data.dto.request

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

@Serializable
data class UpdateMyInfoRequestDto(
@SerialName("nickName")
val nickName: String,
@SerialName("clubList")
val clubList: List<Int>?
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package org.whosin.client.data.dto.response

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

@Serializable
data class MyInfoResponseDto(
@SerialName("success")
val success: Boolean,
@SerialName("status")
val status: Int,
@SerialName("message")
val message: String,
@SerialName("data")
val data: MyInfoData
)

@Serializable
data class MyInfoData(
@SerialName("nickName")
val nickName: String,
@SerialName("clubList")
val clubList: List<MyClubData>
)

@Serializable
data class MyClubData(
@SerialName("id")
val id: Int,
@SerialName("name")
val name: String
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package org.whosin.client.data.dto.response

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

@Serializable
data class UpdateMyInfoResponseDto(
@SerialName("success")
val success: Boolean,
@SerialName("status")
val status: Int,
@SerialName("message")
val message: String,
@SerialName("data")
val data: MyInfoData
)
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,18 @@ package org.whosin.client.data.remote
import io.ktor.client.HttpClient
import io.ktor.client.call.body
import io.ktor.client.request.get
import io.ktor.client.request.patch
import io.ktor.client.request.post
import io.ktor.client.request.setBody
import io.ktor.client.statement.HttpResponse
import io.ktor.http.isSuccess
import org.whosin.client.core.network.ApiResult
import org.whosin.client.data.dto.request.LoginRequestDto
import org.whosin.client.data.dto.request.UpdateMyInfoRequestDto
import org.whosin.client.data.dto.response.ErrorResponseDto
import org.whosin.client.data.dto.response.LoginResponseDto
import org.whosin.client.data.dto.response.MyInfoResponseDto
import org.whosin.client.data.dto.response.UpdateMyInfoResponseDto

class RemoteMemberDataSource(
private val client: HttpClient
Expand Down Expand Up @@ -38,4 +43,73 @@ class RemoteMemberDataSource(
ApiResult.Error(message = t.message, cause = t)
}
}

// 내 정보 조회
suspend fun getMyInfo(): ApiResult<MyInfoResponseDto> {
return try {
val response: HttpResponse = client.get(urlString = "users/myPage")

if (response.status.isSuccess()) {
ApiResult.Success(
data = response.body(),
statusCode = response.status.value
)
} else {
// 에러 응답 파싱 시도
try {
val errorResponse: ErrorResponseDto = response.body()
ApiResult.Error(
code = response.status.value,
message = errorResponse.message
)
} catch (e: Exception) {
// 파싱 실패 시 기본 에러 메시지
ApiResult.Error(
code = response.status.value,
message = "HTTP Error: ${response.status.value}"
)
}
}
} catch (t: Throwable) {
ApiResult.Error(message = t.message, cause = t)
}
}

// 내 정보 수정
suspend fun updateMyInfo(
newNickName: String,
clubList: List<Int>?
): ApiResult<UpdateMyInfoResponseDto> {
return try {
val response: HttpResponse = client.patch(urlString = "users/myPage/update") {
setBody(
UpdateMyInfoRequestDto(nickName = newNickName, clubList = clubList)
)
}

if (response.status.isSuccess()) {
ApiResult.Success(
data = response.body(),
statusCode = response.status.value
)
} else {
// 에러 응답 파싱 시도
try {
val errorResponse: ErrorResponseDto = response.body()
ApiResult.Error(
code = response.status.value,
message = errorResponse.message
)
} catch (e: Exception) {
// 파싱 실패 시 기본 에러 메시지
ApiResult.Error(
code = response.status.value,
message = "HTTP Error: ${response.status.value}"
)
}
}
} catch (t: Throwable) {
ApiResult.Error(message = t.message, cause = t)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,19 @@ package org.whosin.client.data.repository
import org.whosin.client.data.remote.RemoteMemberDataSource
import org.whosin.client.core.network.ApiResult
import org.whosin.client.data.dto.response.LoginResponseDto
import org.whosin.client.data.dto.response.MyInfoResponseDto
import org.whosin.client.data.dto.response.UpdateMyInfoResponseDto

class MemberRepository(
private val dataSource: RemoteMemberDataSource
) {
suspend fun login(email: String, password: String): ApiResult<LoginResponseDto> =
dataSource.login(email, password)

suspend fun getMyInfo(): ApiResult<MyInfoResponseDto> =
dataSource.getMyInfo()

suspend fun updateMyInfo(newNickName: String, clubList: List<Int>?): ApiResult<UpdateMyInfoResponseDto> =
dataSource.updateMyInfo(newNickName = newNickName, clubList = clubList)

}

This file was deleted.

Loading