Skip to content

Commit 5c5facc

Browse files
committed
fix: 리뷰 반영 — Init 재초기화 방지·뒤로 애니메이션·폼 프리즈·접근성·에러 분기
- savedInstanceState == null 가드로 회전 시 편집 중 닉네임 초기화 방지 - 툴바 뒤로 버튼에 overridePendingTransition 적용(시스템 뒤로와 동일) - isLoading 중 submitEnabled/NicknameTextField.enabled = false로 폼 잠금 - 뒤로 버튼 Image contentDescription 추가(스크린리더 대응) - onFailure에서 getCode() == 400일 때만 ShowDuplicateError 발행 (네트워크·서버 오류를 중복 닉네임 오류로 오표기하던 문제 수정)
1 parent 0afd0d9 commit 5c5facc

5 files changed

Lines changed: 21 additions & 8 deletions

File tree

app/src/main/java/com/runnect/runnect/presentation/mypage/editname/MyPageEditNameActivity.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,11 @@ class MyPageEditNameActivity : AppCompatActivity() {
2929
enableEdgeToEdge()
3030
Analytics.logEvent(EventName.VIEW_EDIT_PROFILE)
3131

32-
val nickname = intent.getStringExtra(EXTRA_NICK_NAME) ?: ""
33-
val profileImgResId = intent.getIntExtra(EXTRA_PROFILE, R.drawable.user_profile_basic)
34-
viewModel.intent(EditNameIntent.Init(nickname, profileImgResId))
32+
if (savedInstanceState == null) {
33+
val nickname = intent.getStringExtra(EXTRA_NICK_NAME) ?: ""
34+
val profileImgResId = intent.getIntExtra(EXTRA_PROFILE, R.drawable.user_profile_basic)
35+
viewModel.intent(EditNameIntent.Init(nickname, profileImgResId))
36+
}
3537

3638
setContent {
3739
RunnectTheme {
@@ -41,6 +43,7 @@ class MyPageEditNameActivity : AppCompatActivity() {
4143
onBackClick = {
4244
setResult(RESULT_CANCELED)
4345
finish()
46+
overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_right)
4447
},
4548
onNicknameChange = { viewModel.intent(EditNameIntent.UpdateNickname(it)) },
4649
onSubmitClick = { viewModel.intent(EditNameIntent.Submit) },

app/src/main/java/com/runnect/runnect/presentation/mypage/editname/MyPageEditNameScreen.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ fun MyPageEditNameScreen(
5252
EditNameToolbar(
5353
onBackClick = onBackClick,
5454
onSubmitClick = onSubmitClick,
55-
submitEnabled = state.nickname.isNotEmpty(),
55+
submitEnabled = state.nickname.isNotEmpty() && !state.isLoading,
5656
)
5757
Column(
5858
modifier = Modifier
@@ -71,6 +71,7 @@ fun MyPageEditNameScreen(
7171
value = state.nickname,
7272
onValueChange = onNicknameChange,
7373
onDone = { focusManager.clearFocus() },
74+
enabled = !state.isLoading,
7475
)
7576
}
7677
}
@@ -100,7 +101,7 @@ private fun EditNameToolbar(
100101
) {
101102
Image(
102103
painter = painterResource(R.drawable.all_back_arrow),
103-
contentDescription = null,
104+
contentDescription = stringResource(R.string.my_page_edit_name_back),
104105
modifier = Modifier
105106
.size(24.dp)
106107
.clickable(onClick = onBackClick),
@@ -128,6 +129,7 @@ private fun NicknameTextField(
128129
value: String,
129130
onValueChange: (String) -> Unit,
130131
onDone: () -> Unit,
132+
enabled: Boolean = true,
131133
) {
132134
val textStyle = RunnectTheme.textStyle
133135
// OutlinedTextField enforces a 56dp minimum height (M3 internal contentPadding),
@@ -139,6 +141,7 @@ private fun NicknameTextField(
139141
modifier = Modifier
140142
.fillMaxWidth()
141143
.height(44.dp),
144+
enabled = enabled,
142145
textStyle = textStyle.semiBold15.copy(textAlign = TextAlign.Center, color = G1),
143146
singleLine = true,
144147
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),

app/src/main/java/com/runnect/runnect/presentation/mypage/editname/MyPageEditNameViewModel.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package com.runnect.runnect.presentation.mypage.editname
22

33
import com.runnect.runnect.data.dto.request.RequestPatchNickName
4+
import com.runnect.runnect.domain.common.getCode
45
import com.runnect.runnect.domain.repository.UserRepository
56
import com.runnect.runnect.presentation.base.MviViewModel
67
import dagger.hilt.android.lifecycle.HiltViewModel
78
import javax.inject.Inject
89

10+
private const val HTTP_DUPLICATE_NICKNAME = 400
11+
912
@HiltViewModel
1013
class MyPageEditNameViewModel @Inject constructor(
1114
private val userRepository: UserRepository
@@ -33,9 +36,11 @@ class MyPageEditNameViewModel @Inject constructor(
3336
reduce { copy(isLoading = false) }
3437
postEffect(EditNameEffect.NavigateSuccess(currentState.nickname))
3538
},
36-
onFailure = {
39+
onFailure = { throwable ->
3740
reduce { copy(isLoading = false) }
38-
postEffect(EditNameEffect.ShowDuplicateError)
41+
if (throwable.getCode() == HTTP_DUPLICATE_NICKNAME) {
42+
postEffect(EditNameEffect.ShowDuplicateError)
43+
}
3944
}
4045
)
4146
}

app/src/main/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@
8383

8484
<string name="my_page_setting_title">설정</string>
8585
<string name="my_page_version_title">버전 정보</string>
86+
<string name="my_page_edit_name_back">뒤로 가기</string>
8687
<string name="my_page_edit_name_title">닉네임 수정</string>
8788
<string name="my_page_edit_name_finish">완료</string>
8889
<string name="my_page_edit_name_guide">닉네임을 입력하세요</string>

app/src/test/java/com/runnect/runnect/presentation/mypage/editname/MyPageEditNameViewModelTest.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.runnect.runnect.presentation.mypage.editname
22

33
import app.cash.turbine.test
44
import app.cash.turbine.turbineScope
5+
import com.runnect.runnect.domain.common.RunnectException
56
import com.runnect.runnect.domain.repository.UserRepository
67
import io.mockk.coEvery
78
import io.mockk.mockk
@@ -107,7 +108,7 @@ class MyPageEditNameViewModelTest {
107108
runTest(testDispatcher) {
108109
coEvery { userRepository.updateNickName(any()) } returns flow {
109110
delay(1)
110-
throw RuntimeException("닉네임 중복")
111+
throw RunnectException(code = 400, message = "닉네임 중복")
111112
}
112113

113114
turbineScope {

0 commit comments

Comments
 (0)