Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ dependencies {
implementation(libs.hilt.android)
implementation(libs.androidx.foundation)
implementation(libs.material3)
implementation(libs.androidx.room.ktx)
ksp(libs.hilt.compiler)
implementation(libs.hilt.navigation.compose)

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package com.ssafy.tiggle.domain.entity.account

data class RegisterAccount(
val accountNum: String = "",
val owner:String="",
val code:Int=0,
val attemptsLeft: Int=3,
val bankName:String="",
val date:String="",

val accountNumError: String? = null,
val codeError:String?=null
) {
/** 숫자 외 문자를 제거한 정규화(붙여넣기 대비) */
private fun sanitize(raw: String): String = raw.filter { it.isDigit() }

/** 계좌번호 유효성 검사 */
fun validateAccountNum(input: String = accountNum): String? = when {
input.isBlank() -> "계좌번호를 입력해주세요."
!input.all { it.isDigit() } -> "숫자만 입력할 수 있습니다."
else -> null
}

/** 외부에서 raw 입력을 받아 정규화 + 검증해서 갱신 */
fun withValidation(raw: String): RegisterAccount {
val normalized = sanitize(raw)
return copy(
accountNum = normalized,
accountNumError = validateAccountNum(normalized)
)
}

/**
* 특정 필드만 유효성 검사를 수행하고 업데이트된 인스턴스 반환
*/
fun validateField(field: ValidationRegisterField): RegisterAccount {
return when (field) {
ValidationRegisterField.ACCOUNT -> copy(
accountNumError = validateAccountNum(
accountNum
)
)
ValidationRegisterField.CODE ->
copy(codeError = validateCode(code.toString()))
}
}
/**
* 코드 유효성 검사
*/
fun validateCode(input: String): String? {
return when {
input.isBlank() -> "인증 코드를 입력해주세요."
!input.matches(Regex("^[0-9]+$")) -> "숫자만 입력할 수 있습니다."
else -> null
}
}
}


enum class ValidationRegisterField {
ACCOUNT,
CODE
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import com.ssafy.tiggle.presentation.ui.auth.login.LoginScreen
import com.ssafy.tiggle.presentation.ui.auth.signup.SignUpScreen
import com.ssafy.tiggle.presentation.ui.piggybank.OpenAccountScreen
import com.ssafy.tiggle.presentation.ui.piggybank.PiggyBankScreen
import com.ssafy.tiggle.presentation.ui.piggybank.RegisterAccountScreen

/**
* 앱의 메인 네비게이션
Expand Down Expand Up @@ -78,6 +79,9 @@ fun NavigationGraph() {
onOpenAccountClick = {
navBackStack.add(Screen.OpenAccount)
},
onRegisterAccountClick = {
navBackStack.add(Screen.RegisterAccount)
},
onBackClick = {
navBackStack.removeLastOrNull()
}
Expand All @@ -88,6 +92,10 @@ fun NavigationGraph() {
OpenAccountScreen()
}

is Screen.RegisterAccount -> NavEntry(key) {
RegisterAccountScreen()
}

else -> throw IllegalArgumentException("Unknown route: $key")
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,7 @@ sealed interface Screen : NavKey {

@Serializable
object OpenAccount : Screen

@Serializable
object RegisterAccount : Screen
}
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,9 @@ import com.ssafy.tiggle.presentation.ui.theme.TiggleGrayText
@Composable
fun PiggyBankScreen(
modifier: Modifier = Modifier,
onOpenAccountClick:()-> Unit={},
onBackClick:()-> Unit={},
onOpenAccountClick: () -> Unit = {},
onRegisterAccountClick: () -> Unit = {},
onBackClick: () -> Unit = {},
viewModel: PiggyBankViewModel = viewModel()
) {
val uiState by viewModel.uiState.collectAsState()
Expand Down Expand Up @@ -113,7 +114,7 @@ fun PiggyBankScreen(
DottedActionCard(
title = "내 계좌 등록",
desc = "나의 계좌를 등록하면\n티끌 저금통에 잔돈이 자동으로 기부됩니다.",
onClick = { /* TODO: 네비게이션 */ }
onClick = onRegisterAccountClick
)
}
Spacer(Modifier.height(16.dp))
Expand Down
Loading