From 3a58ca918ad58e11bce59e3178afe26e903de661 Mon Sep 17 00:00:00 2001 From: syb8200 Date: Fri, 16 Feb 2024 23:16:21 +0900 Subject: [PATCH 01/18] =?UTF-8?q?fix:=20=EB=B0=9B=EC=95=84=EC=9A=94=20?= =?UTF-8?q?=EC=9E=A5=EB=B6=80=20=EC=83=9D=EC=84=B1=20=EC=9C=A0=ED=9A=A8?= =?UTF-8?q?=EC=84=B1=20=EA=B2=80=EC=82=AC=20(=EA=B2=BD=EC=A1=B0=EC=82=AC)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../received/ledgeradd/LedgerAddScreen.kt | 5 +++++ .../content/category/CategoryContent.kt | 11 ++++++++++ .../content/category/CategoryContract.kt | 1 + .../content/category/CategoryViewModel.kt | 20 ++++++++++++++----- .../received/navigation/ReceivedNavigation.kt | 1 + .../received/src/main/res/values/strings.xml | 2 ++ 6 files changed, 35 insertions(+), 5 deletions(-) diff --git a/feature/received/src/main/java/com/susu/feature/received/ledgeradd/LedgerAddScreen.kt b/feature/received/src/main/java/com/susu/feature/received/ledgeradd/LedgerAddScreen.kt index d5849a02..f6480f4e 100644 --- a/feature/received/src/main/java/com/susu/feature/received/ledgeradd/LedgerAddScreen.kt +++ b/feature/received/src/main/java/com/susu/feature/received/ledgeradd/LedgerAddScreen.kt @@ -28,6 +28,7 @@ import com.susu.core.designsystem.component.screen.LoadingScreen import com.susu.core.designsystem.theme.SusuTheme import com.susu.core.model.Category import com.susu.core.ui.R +import com.susu.core.ui.SnackbarToken import com.susu.core.ui.extension.collectWithLifecycle import com.susu.core.ui.extension.susuDefaultAnimatedContentTransitionSpec import com.susu.feature.received.ledgeradd.content.category.CategoryContentRoute @@ -40,6 +41,7 @@ fun LedgerAddRoute( viewModel: LedgerAddViewModel = hiltViewModel(), popBackStack: () -> Unit, popBackStackWithLedger: (String) -> Unit, + onShowSnackbar: (SnackbarToken) -> Unit, handleException: (Throwable, () -> Unit) -> Unit, ) { val uiState = viewModel.uiState.collectAsStateWithLifecycle().value @@ -82,6 +84,7 @@ fun LedgerAddRoute( updateParentDate = { startAt, endAt -> viewModel.updateDate(startAt, endAt) }, + onShowSnackbar = onShowSnackbar ) } @@ -95,6 +98,7 @@ fun LedgerAddScreen( dateContentCategory: Category? = Category(), dateContentName: String = "", updateParentDate: (LocalDateTime?, LocalDateTime?) -> Unit = { _, _ -> }, + onShowSnackbar: (SnackbarToken) -> Unit = {}, ) { Column( modifier = Modifier @@ -122,6 +126,7 @@ fun LedgerAddScreen( when (targetState) { LedgerAddStep.CATEGORY -> CategoryContentRoute( updateParentSelectedCategory = updateParentSelectedCategory, + onShowSnackbar = onShowSnackbar, ) LedgerAddStep.NAME -> NameContentRoute( diff --git a/feature/received/src/main/java/com/susu/feature/received/ledgeradd/content/category/CategoryContent.kt b/feature/received/src/main/java/com/susu/feature/received/ledgeradd/content/category/CategoryContent.kt index 49324d44..a0e812ab 100644 --- a/feature/received/src/main/java/com/susu/feature/received/ledgeradd/content/category/CategoryContent.kt +++ b/feature/received/src/main/java/com/susu/feature/received/ledgeradd/content/category/CategoryContent.kt @@ -17,6 +17,7 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.navigation.compose.hiltViewModel @@ -31,6 +32,7 @@ import com.susu.core.designsystem.component.textfieldbutton.TextFieldButtonColor import com.susu.core.designsystem.component.textfieldbutton.style.MediumTextFieldButtonStyle import com.susu.core.designsystem.theme.SusuTheme import com.susu.core.model.Category +import com.susu.core.ui.SnackbarToken import com.susu.core.ui.extension.collectWithLifecycle import com.susu.feature.received.R import kotlinx.coroutines.android.awaitFrame @@ -40,10 +42,13 @@ import kotlinx.coroutines.launch fun CategoryContentRoute( viewModel: CategoryViewModel = hiltViewModel(), updateParentSelectedCategory: (Category?) -> Unit = {}, + onShowSnackbar: (SnackbarToken) -> Unit, ) { val uiState = viewModel.uiState.collectAsStateWithLifecycle().value val focusRequester = remember { FocusRequester() } val scope = rememberCoroutineScope() + val context = LocalContext.current + viewModel.sideEffect.collectWithLifecycle { sideEffect -> when (sideEffect) { is CategorySideEffect.UpdateParentSelectedCategory -> { @@ -54,6 +59,12 @@ fun CategoryContentRoute( awaitFrame() focusRequester.requestFocus() } + + CategorySideEffect.ShowNotValidSnackbar -> onShowSnackbar( + SnackbarToken( + message = context.getString(R.string.ledger_snackbar_category_validation), + ) + ) } } diff --git a/feature/received/src/main/java/com/susu/feature/received/ledgeradd/content/category/CategoryContract.kt b/feature/received/src/main/java/com/susu/feature/received/ledgeradd/content/category/CategoryContract.kt index 579f1e24..ccfd4d8e 100644 --- a/feature/received/src/main/java/com/susu/feature/received/ledgeradd/content/category/CategoryContract.kt +++ b/feature/received/src/main/java/com/susu/feature/received/ledgeradd/content/category/CategoryContract.kt @@ -19,4 +19,5 @@ data class CategoryState( sealed interface CategorySideEffect : SideEffect { data object FocusCustomCategory : CategorySideEffect data class UpdateParentSelectedCategory(val category: Category?) : CategorySideEffect + data object ShowNotValidSnackbar : CategorySideEffect } diff --git a/feature/received/src/main/java/com/susu/feature/received/ledgeradd/content/category/CategoryViewModel.kt b/feature/received/src/main/java/com/susu/feature/received/ledgeradd/content/category/CategoryViewModel.kt index c4d8b580..5aac5fae 100644 --- a/feature/received/src/main/java/com/susu/feature/received/ledgeradd/content/category/CategoryViewModel.kt +++ b/feature/received/src/main/java/com/susu/feature/received/ledgeradd/content/category/CategoryViewModel.kt @@ -2,6 +2,7 @@ package com.susu.feature.received.ledgeradd.content.category import androidx.lifecycle.viewModelScope import com.susu.core.model.Category +import com.susu.core.ui.USER_INPUT_REGEX_INCLUDE_NUMBER import com.susu.core.ui.base.BaseViewModel import com.susu.domain.usecase.categoryconfig.GetCategoryConfigUseCase import dagger.hilt.android.lifecycle.HiltViewModel @@ -46,11 +47,20 @@ class CategoryViewModel @Inject constructor( copy(selectedCategory = customCategory) } - fun updateCustomCategoryText(text: String) = intent { - copy( - selectedCategory = customCategory.copy(customCategory = text), - customCategory = customCategory.copy(customCategory = text), - ) + fun updateCustomCategoryText(text: String) { + if (!USER_INPUT_REGEX_INCLUDE_NUMBER.matches(text)) { // 한글, 영문 0~10 글자 + if (text.length > 10) { // 길이 넘친 경우 + postSideEffect(CategorySideEffect.ShowNotValidSnackbar) + } + return // 특수문자는 입력 안 됨 + } + + intent { + copy( + selectedCategory = customCategory.copy(customCategory = text), + customCategory = customCategory.copy(customCategory = text), + ) + } } fun showCustomCategoryTextField() = intent { diff --git a/feature/received/src/main/java/com/susu/feature/received/navigation/ReceivedNavigation.kt b/feature/received/src/main/java/com/susu/feature/received/navigation/ReceivedNavigation.kt index 46fade6f..45860aef 100644 --- a/feature/received/src/main/java/com/susu/feature/received/navigation/ReceivedNavigation.kt +++ b/feature/received/src/main/java/com/susu/feature/received/navigation/ReceivedNavigation.kt @@ -159,6 +159,7 @@ fun NavGraphBuilder.receivedNavGraph( popBackStack = popBackStack, popBackStackWithLedger = popBackStackWithLedger, handleException = handleException, + onShowSnackbar = onShowSnackbar, ) } diff --git a/feature/received/src/main/res/values/strings.xml b/feature/received/src/main/res/values/strings.xml index 56e82ea1..2c376e06 100644 --- a/feature/received/src/main/res/values/strings.xml +++ b/feature/received/src/main/res/values/strings.xml @@ -69,4 +69,6 @@ 봉투가 삭제됐어요 종료일 추가 시작일만 지정 + + 경조사는 10글자까지만 입력 가능해요 From 90db36384d25299fbacb55287a916e4a385bf768 Mon Sep 17 00:00:00 2001 From: syb8200 Date: Fri, 16 Feb 2024 23:35:47 +0900 Subject: [PATCH 02/18] =?UTF-8?q?fix:=20=EB=B0=9B=EC=95=84=EC=9A=94=20?= =?UTF-8?q?=EC=9E=A5=EB=B6=80=20=EC=83=9D=EC=84=B1=20=EC=9C=A0=ED=9A=A8?= =?UTF-8?q?=EC=84=B1=20=EA=B2=80=EC=82=AC=20(=EA=B2=BD=EC=A1=B0=EC=82=AC?= =?UTF-8?q?=EB=AA=85)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../received/ledgeradd/LedgerAddScreen.kt | 1 + .../ledgeradd/content/name/NameContent.kt | 11 +++++++++++ .../ledgeradd/content/name/NameContract.kt | 1 + .../ledgeradd/content/name/NameViewModel.kt | 16 +++++++++++++--- feature/received/src/main/res/values/strings.xml | 1 + 5 files changed, 27 insertions(+), 3 deletions(-) diff --git a/feature/received/src/main/java/com/susu/feature/received/ledgeradd/LedgerAddScreen.kt b/feature/received/src/main/java/com/susu/feature/received/ledgeradd/LedgerAddScreen.kt index f6480f4e..c23fdd0a 100644 --- a/feature/received/src/main/java/com/susu/feature/received/ledgeradd/LedgerAddScreen.kt +++ b/feature/received/src/main/java/com/susu/feature/received/ledgeradd/LedgerAddScreen.kt @@ -131,6 +131,7 @@ fun LedgerAddScreen( LedgerAddStep.NAME -> NameContentRoute( updateParentName = updateParentName, + onShowSnackbar = onShowSnackbar, ) LedgerAddStep.DATE -> DateContentRoute( diff --git a/feature/received/src/main/java/com/susu/feature/received/ledgeradd/content/name/NameContent.kt b/feature/received/src/main/java/com/susu/feature/received/ledgeradd/content/name/NameContent.kt index 5e4f3690..41b5cc61 100644 --- a/feature/received/src/main/java/com/susu/feature/received/ledgeradd/content/name/NameContent.kt +++ b/feature/received/src/main/java/com/susu/feature/received/ledgeradd/content/name/NameContent.kt @@ -13,12 +13,14 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.susu.core.designsystem.component.textfield.SusuBasicTextField import com.susu.core.designsystem.theme.SusuTheme +import com.susu.core.ui.SnackbarToken import com.susu.core.ui.extension.collectWithLifecycle import com.susu.feature.received.R import kotlinx.coroutines.android.awaitFrame @@ -28,10 +30,13 @@ import kotlinx.coroutines.launch fun NameContentRoute( viewModel: NameViewModel = hiltViewModel(), updateParentName: (String) -> Unit = {}, + onShowSnackbar: (SnackbarToken) -> Unit, ) { val uiState = viewModel.uiState.collectAsStateWithLifecycle().value val focusRequester = remember { FocusRequester() } val scope = rememberCoroutineScope() + val context = LocalContext.current + viewModel.sideEffect.collectWithLifecycle { sideEffect -> when (sideEffect) { is NameSideEffect.UpdateParentName -> { @@ -42,6 +47,12 @@ fun NameContentRoute( awaitFrame() focusRequester.requestFocus() } + + NameSideEffect.ShowNotValidSnackbar -> onShowSnackbar( + SnackbarToken( + message = context.getString(R.string.ledger_snackbar_category_name_validation), + ) + ) } } diff --git a/feature/received/src/main/java/com/susu/feature/received/ledgeradd/content/name/NameContract.kt b/feature/received/src/main/java/com/susu/feature/received/ledgeradd/content/name/NameContract.kt index 1eb33f1f..fb48ff76 100644 --- a/feature/received/src/main/java/com/susu/feature/received/ledgeradd/content/name/NameContract.kt +++ b/feature/received/src/main/java/com/susu/feature/received/ledgeradd/content/name/NameContract.kt @@ -10,4 +10,5 @@ data class NameState( sealed interface NameSideEffect : SideEffect { data class UpdateParentName(val name: String) : NameSideEffect data object ShowKeyboard : NameSideEffect + data object ShowNotValidSnackbar : NameSideEffect } diff --git a/feature/received/src/main/java/com/susu/feature/received/ledgeradd/content/name/NameViewModel.kt b/feature/received/src/main/java/com/susu/feature/received/ledgeradd/content/name/NameViewModel.kt index 6651169c..ed3f2475 100644 --- a/feature/received/src/main/java/com/susu/feature/received/ledgeradd/content/name/NameViewModel.kt +++ b/feature/received/src/main/java/com/susu/feature/received/ledgeradd/content/name/NameViewModel.kt @@ -1,6 +1,7 @@ package com.susu.feature.received.ledgeradd.content.name import androidx.lifecycle.viewModelScope +import com.susu.core.ui.USER_INPUT_REGEX_INCLUDE_NUMBER import com.susu.core.ui.base.BaseViewModel import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.delay @@ -11,9 +12,18 @@ import javax.inject.Inject class NameViewModel @Inject constructor() : BaseViewModel( NameState(), ) { - fun updateName(name: String) = intent { - postSideEffect(NameSideEffect.UpdateParentName(name)) - copy(name = name) + fun updateName(name: String) { + if (!USER_INPUT_REGEX_INCLUDE_NUMBER.matches(name)) { // 한글, 영문 0~10 글자 + if (name.length > 10) { // 길이 넘친 경우 + postSideEffect(NameSideEffect.ShowNotValidSnackbar) + } + return // 특수문자는 입력 안 됨 + } + + intent { + postSideEffect(NameSideEffect.UpdateParentName(name)) + copy(name = name) + } } fun showKeyboardIfTextEmpty() = viewModelScope.launch { diff --git a/feature/received/src/main/res/values/strings.xml b/feature/received/src/main/res/values/strings.xml index 2c376e06..1fc83ffd 100644 --- a/feature/received/src/main/res/values/strings.xml +++ b/feature/received/src/main/res/values/strings.xml @@ -71,4 +71,5 @@ 시작일만 지정 경조사는 10글자까지만 입력 가능해요 + 경조사명은 10글자까지만 입력 가능해요 From 786fb2ec81229f716756dc8f98ab9cd29c3d152c Mon Sep 17 00:00:00 2001 From: syb8200 Date: Sat, 17 Feb 2024 00:30:43 +0900 Subject: [PATCH 03/18] =?UTF-8?q?fix:=20=EB=B0=9B=EC=95=84=EC=9A=94=20?= =?UTF-8?q?=EC=9E=A5=EB=B6=80=20=EB=B4=89=ED=88=AC=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80=EC=82=AC=20(=EA=B8=88?= =?UTF-8?q?=EC=95=A1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../envelopeadd/ReceivedEnvelopeAddScreen.kt | 3 +++ .../envelopeadd/content/money/MoneyContent.kt | 11 ++++++++++- .../envelopeadd/content/money/MoneyContract.kt | 2 ++ .../envelopeadd/content/money/MoneyViewModel.kt | 13 ++++++++++--- feature/received/src/main/res/values/strings.xml | 2 ++ 5 files changed, 27 insertions(+), 4 deletions(-) diff --git a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/ReceivedEnvelopeAddScreen.kt b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/ReceivedEnvelopeAddScreen.kt index 486833ce..b9247b3b 100644 --- a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/ReceivedEnvelopeAddScreen.kt +++ b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/ReceivedEnvelopeAddScreen.kt @@ -86,6 +86,7 @@ fun ReceivedEnvelopeAddRoute( friendName = friendName, updateParentPhoneNumber = viewModel::updatePhoneNumber, updateParentMemo = viewModel::updateMemo, + onShowSnackbar = onShowSnackbar, ) } @@ -107,6 +108,7 @@ fun ReceivedEnvelopeAddScreen( friendName: String = "", updateParentPhoneNumber: (String?) -> Unit = {}, updateParentMemo: (String?) -> Unit = {}, + onShowSnackbar: (SnackbarToken) -> Unit = {}, ) { Column( modifier = Modifier @@ -135,6 +137,7 @@ fun ReceivedEnvelopeAddScreen( when (targetState) { EnvelopeAddStep.MONEY -> MoneyContentRoute( updateParentMoney = updateParentMoney, + onShowSnackbar = onShowSnackbar, ) EnvelopeAddStep.NAME -> NameContentRoute( diff --git a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/money/MoneyContent.kt b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/money/MoneyContent.kt index 6291072b..af2b12a3 100644 --- a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/money/MoneyContent.kt +++ b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/money/MoneyContent.kt @@ -16,6 +16,7 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.navigation.compose.hiltViewModel @@ -26,6 +27,7 @@ import com.susu.core.designsystem.component.button.SusuFilledButton import com.susu.core.designsystem.component.textfield.SusuPriceTextField import com.susu.core.designsystem.theme.Gray100 import com.susu.core.designsystem.theme.SusuTheme +import com.susu.core.ui.SnackbarToken import com.susu.core.ui.extension.collectWithLifecycle import com.susu.core.ui.extension.toMoneyFormat import com.susu.core.ui.moneyList @@ -37,11 +39,12 @@ import kotlinx.coroutines.launch fun MoneyContentRoute( viewModel: MoneyViewModel = hiltViewModel(), updateParentMoney: (Long) -> Unit, + onShowSnackbar: (SnackbarToken) -> Unit, ) { val uiState = viewModel.uiState.collectAsStateWithLifecycle().value - val focusRequester = remember { FocusRequester() } val scope = rememberCoroutineScope() + val context = LocalContext.current viewModel.sideEffect.collectWithLifecycle { sideEffect -> when (sideEffect) { @@ -50,6 +53,12 @@ fun MoneyContentRoute( awaitFrame() focusRequester.requestFocus() } + + MoneySideEffect.ShowNotValidSnackbar -> onShowSnackbar( + SnackbarToken( + message = context.getString(R.string.money_content_snackbar_validation), + ) + ) } } diff --git a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/money/MoneyContract.kt b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/money/MoneyContract.kt index cbd248ec..9a3d28e4 100644 --- a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/money/MoneyContract.kt +++ b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/money/MoneyContract.kt @@ -11,4 +11,6 @@ sealed interface MoneySideEffect : SideEffect { data class UpdateParentMoney(val money: Long) : MoneySideEffect data object ShowKeyboard : MoneySideEffect + + data object ShowNotValidSnackbar : MoneySideEffect } diff --git a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/money/MoneyViewModel.kt b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/money/MoneyViewModel.kt index a82ce6aa..4a31af4d 100644 --- a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/money/MoneyViewModel.kt +++ b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/money/MoneyViewModel.kt @@ -8,9 +8,16 @@ import javax.inject.Inject class MoneyViewModel @Inject constructor() : BaseViewModel( MoneyState(), ) { - fun updateMoney(money: String) = intent { - postSideEffect(MoneySideEffect.UpdateParentMoney(money.toLongOrNull() ?: 0)) - copy(money = money) + fun updateMoney(money: String) { + if (money.length > 10) { + postSideEffect(MoneySideEffect.ShowNotValidSnackbar) + return + } + + intent { + postSideEffect(MoneySideEffect.UpdateParentMoney(money.toLongOrNull() ?: 0)) + copy(money = money) + } } fun addMoney(money: Int) = intent { diff --git a/feature/received/src/main/res/values/strings.xml b/feature/received/src/main/res/values/strings.xml index 1fc83ffd..e5adb454 100644 --- a/feature/received/src/main/res/values/strings.xml +++ b/feature/received/src/main/res/values/strings.xml @@ -72,4 +72,6 @@ 경조사는 10글자까지만 입력 가능해요 경조사명은 10글자까지만 입력 가능해요 + + 금액은 20억원까지만 입력 가능해요 From 5095806cceddb0b9b4095bd8249217bef50580ec Mon Sep 17 00:00:00 2001 From: syb8200 Date: Sat, 17 Feb 2024 00:42:32 +0900 Subject: [PATCH 04/18] =?UTF-8?q?fix:=20=EB=B0=9B=EC=95=84=EC=9A=94=20?= =?UTF-8?q?=EC=9E=A5=EB=B6=80=20=EB=B4=89=ED=88=AC=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80=EC=82=AC=20(=EC=9D=B4?= =?UTF-8?q?=EB=A6=84)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../envelopeadd/ReceivedEnvelopeAddScreen.kt | 1 + .../envelopeadd/content/name/NameContent.kt | 9 ++++++ .../envelopeadd/content/name/NameContract.kt | 1 + .../envelopeadd/content/name/NameViewModel.kt | 30 ++++++++++++------- .../received/src/main/res/values/strings.xml | 1 + 5 files changed, 32 insertions(+), 10 deletions(-) diff --git a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/ReceivedEnvelopeAddScreen.kt b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/ReceivedEnvelopeAddScreen.kt index b9247b3b..5d150718 100644 --- a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/ReceivedEnvelopeAddScreen.kt +++ b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/ReceivedEnvelopeAddScreen.kt @@ -143,6 +143,7 @@ fun ReceivedEnvelopeAddScreen( EnvelopeAddStep.NAME -> NameContentRoute( updateParentName = updateParentName, updateParentFriendId = updateParentFriendId, + onShowSnackbar = onShowSnackbar, ) EnvelopeAddStep.RELATIONSHIP -> RelationShipContentRoute( updateParentSelectedRelation = updateParentSelectedRelationShip, diff --git a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/name/NameContent.kt b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/name/NameContent.kt index c28ef3d6..7ec584e6 100644 --- a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/name/NameContent.kt +++ b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/name/NameContent.kt @@ -18,6 +18,7 @@ import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview @@ -29,6 +30,7 @@ import com.susu.core.designsystem.theme.Gray100 import com.susu.core.designsystem.theme.Gray40 import com.susu.core.designsystem.theme.SusuTheme import com.susu.core.model.FriendSearch +import com.susu.core.ui.SnackbarToken import com.susu.core.ui.extension.collectWithLifecycle import com.susu.feature.received.R import com.susu.feature.received.envelopeadd.content.component.FriendListItem @@ -43,11 +45,13 @@ fun NameContentRoute( viewModel: NameViewModel = hiltViewModel(), updateParentName: (String) -> Unit, updateParentFriendId: (Long?) -> Unit, + onShowSnackbar: (SnackbarToken) -> Unit, ) { val uiState = viewModel.uiState.collectAsStateWithLifecycle().value val focusRequester = remember { FocusRequester() } val focusManager = LocalFocusManager.current val scope = rememberCoroutineScope() + val context = LocalContext.current viewModel.sideEffect.collectWithLifecycle { sideEffect -> when (sideEffect) { @@ -58,6 +62,11 @@ fun NameContentRoute( awaitFrame() focusRequester.requestFocus() } + NameSideEffect.ShowNotValidSnackbar -> onShowSnackbar( + SnackbarToken( + message = context.getString(R.string.name_content_snackbar_validation), + ) + ) } } diff --git a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/name/NameContract.kt b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/name/NameContract.kt index 030c6abb..68d533ad 100644 --- a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/name/NameContract.kt +++ b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/name/NameContract.kt @@ -17,4 +17,5 @@ sealed interface NameSideEffect : SideEffect { data class UpdateParentFriendId(val friendId: Long?) : NameSideEffect data object FocusClear : NameSideEffect data object ShowKeyboard : NameSideEffect + data object ShowNotValidSnackbar : NameSideEffect } diff --git a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/name/NameViewModel.kt b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/name/NameViewModel.kt index 3e3b221e..b9b72901 100644 --- a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/name/NameViewModel.kt +++ b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/name/NameViewModel.kt @@ -2,6 +2,7 @@ package com.susu.feature.received.envelopeadd.content.name import androidx.lifecycle.viewModelScope import com.susu.core.model.FriendSearch +import com.susu.core.ui.USER_INPUT_REGEX import com.susu.core.ui.base.BaseViewModel import com.susu.domain.usecase.friend.SearchFriendUseCase import dagger.hilt.android.lifecycle.HiltViewModel @@ -16,16 +17,25 @@ class NameViewModel @Inject constructor( ) : BaseViewModel( NameState(), ) { - fun updateName(name: String) = intent { - postSideEffect( - NameSideEffect.UpdateParentName(name), - NameSideEffect.UpdateParentFriendId(null), - ) - copy( - name = name, - friendList = if (name.isEmpty()) persistentListOf() else friendList, - isSelectedFriend = false, - ) + fun updateName(name: String) { + if (!USER_INPUT_REGEX.matches(name)) { // 한글, 영문 0~10 글자 + if (name.length > 10) { // 길이 넘친 경우 + postSideEffect(NameSideEffect.ShowNotValidSnackbar) + } + return // 특수문자는 입력 안 됨 + } + + intent { + postSideEffect( + NameSideEffect.UpdateParentName(name), + NameSideEffect.UpdateParentFriendId(null), + ) + copy( + name = name, + friendList = if (name.isEmpty()) persistentListOf() else friendList, + isSelectedFriend = false, + ) + } } fun selectFriend(friend: FriendSearch) = intent { diff --git a/feature/received/src/main/res/values/strings.xml b/feature/received/src/main/res/values/strings.xml index e5adb454..545ce464 100644 --- a/feature/received/src/main/res/values/strings.xml +++ b/feature/received/src/main/res/values/strings.xml @@ -74,4 +74,5 @@ 경조사명은 10글자까지만 입력 가능해요 금액은 20억원까지만 입력 가능해요 + 이름은 10글자까지만 입력 가능해요 From dc0106d3ee3f409e045dc8bf56d06d3ca1dafa72 Mon Sep 17 00:00:00 2001 From: syb8200 Date: Sat, 17 Feb 2024 00:58:24 +0900 Subject: [PATCH 05/18] =?UTF-8?q?fix:=20=EB=B0=9B=EC=95=84=EC=9A=94=20?= =?UTF-8?q?=EC=9E=A5=EB=B6=80=20=EB=B4=89=ED=88=AC=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80=EC=82=AC=20(=EC=84=A0?= =?UTF-8?q?=EB=AC=BC)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../envelopeadd/ReceivedEnvelopeAddScreen.kt | 1 + .../content/present/PresentContent.kt | 12 ++++++++++++ .../content/present/PresentContract.kt | 1 + .../content/present/PresentViewModel.kt | 16 +++++++++++++--- feature/received/src/main/res/values/strings.xml | 1 + 5 files changed, 28 insertions(+), 3 deletions(-) diff --git a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/ReceivedEnvelopeAddScreen.kt b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/ReceivedEnvelopeAddScreen.kt index 5d150718..60530637 100644 --- a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/ReceivedEnvelopeAddScreen.kt +++ b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/ReceivedEnvelopeAddScreen.kt @@ -163,6 +163,7 @@ fun ReceivedEnvelopeAddScreen( EnvelopeAddStep.PRESENT -> PresentContentRoute( updateParentPresent = updateParentPresent, + onShowSnackbar = onShowSnackbar, ) EnvelopeAddStep.PHONE -> PhoneContentRoute( friendName = friendName, diff --git a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/present/PresentContent.kt b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/present/PresentContent.kt index 1e0cbb2f..5d6715ec 100644 --- a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/present/PresentContent.kt +++ b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/present/PresentContent.kt @@ -14,6 +14,7 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.navigation.compose.hiltViewModel @@ -22,6 +23,7 @@ import com.susu.core.designsystem.component.textfield.SusuBasicTextField import com.susu.core.designsystem.theme.Gray100 import com.susu.core.designsystem.theme.Gray40 import com.susu.core.designsystem.theme.SusuTheme +import com.susu.core.ui.SnackbarToken import com.susu.core.ui.extension.collectWithLifecycle import com.susu.feature.received.R import kotlinx.coroutines.android.awaitFrame @@ -31,10 +33,13 @@ import kotlinx.coroutines.launch fun PresentContentRoute( viewModel: PresentViewModel = hiltViewModel(), updateParentPresent: (String?) -> Unit, + onShowSnackbar: (SnackbarToken) -> Unit, ) { val uiState = viewModel.uiState.collectAsStateWithLifecycle().value val focusRequester = remember { FocusRequester() } val scope = rememberCoroutineScope() + val context = LocalContext.current + viewModel.sideEffect.collectWithLifecycle { sideEffect -> when (sideEffect) { is PresentSideEffect.UpdateParentPresent -> updateParentPresent(sideEffect.present) @@ -42,6 +47,12 @@ fun PresentContentRoute( awaitFrame() focusRequester.requestFocus() } + + PresentSideEffect.ShowNotValidSnackbar -> onShowSnackbar( + SnackbarToken( + message = context.getString(R.string.present_content_snackbar_validation), + ) + ) } } @@ -89,6 +100,7 @@ fun PresentContent( placeholder = stringResource(R.string.present_content_placeholder), placeholderColor = Gray40, modifier = Modifier.fillMaxWidth().focusRequester(focusRequester), + maxLines = 5, ) Spacer(modifier = Modifier.size(SusuTheme.spacing.spacing_xl)) } diff --git a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/present/PresentContract.kt b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/present/PresentContract.kt index c03b3fb6..15caba9f 100644 --- a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/present/PresentContract.kt +++ b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/present/PresentContract.kt @@ -10,4 +10,5 @@ data class PresentState( sealed interface PresentSideEffect : SideEffect { data class UpdateParentPresent(val present: String?) : PresentSideEffect data object ShowKeyboard : PresentSideEffect + data object ShowNotValidSnackbar : PresentSideEffect } diff --git a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/present/PresentViewModel.kt b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/present/PresentViewModel.kt index 2c2a9bc9..8afb8828 100644 --- a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/present/PresentViewModel.kt +++ b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/present/PresentViewModel.kt @@ -1,6 +1,7 @@ package com.susu.feature.received.envelopeadd.content.present import androidx.lifecycle.viewModelScope +import com.susu.core.ui.USER_INPUT_REGEX_LONG import com.susu.core.ui.base.BaseViewModel import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.delay @@ -11,9 +12,18 @@ import javax.inject.Inject class PresentViewModel @Inject constructor() : BaseViewModel( PresentState(), ) { - fun updatePresent(present: String?) = intent { - postSideEffect(PresentSideEffect.UpdateParentPresent(present)) - copy(present = present ?: "") + fun updatePresent(present: String?) { + if (present != null && !USER_INPUT_REGEX_LONG.matches(present)) { + if (present.length > 30) { + postSideEffect(PresentSideEffect.ShowNotValidSnackbar) + } + return + } + + intent { + postSideEffect(PresentSideEffect.UpdateParentPresent(present)) + copy(present = present ?: "") + } } fun showKeyboardIfTextEmpty() = viewModelScope.launch { diff --git a/feature/received/src/main/res/values/strings.xml b/feature/received/src/main/res/values/strings.xml index 545ce464..a6565542 100644 --- a/feature/received/src/main/res/values/strings.xml +++ b/feature/received/src/main/res/values/strings.xml @@ -75,4 +75,5 @@ 금액은 20억원까지만 입력 가능해요 이름은 10글자까지만 입력 가능해요 + 선물은 30글자까지만 입력 가능해요 From e67e909564316060f7f83aca7a5c49c9d4d6c760 Mon Sep 17 00:00:00 2001 From: syb8200 Date: Sat, 17 Feb 2024 03:10:57 +0900 Subject: [PATCH 06/18] =?UTF-8?q?fix:=20=EB=B0=9B=EC=95=84=EC=9A=94=20?= =?UTF-8?q?=EC=9E=A5=EB=B6=80=20=EB=B4=89=ED=88=AC=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80=EC=82=AC=20(=EC=A0=84?= =?UTF-8?q?=ED=99=94=EB=B2=88=ED=98=B8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../envelopeadd/ReceivedEnvelopeAddScreen.kt | 1 + .../envelopeadd/content/phone/PhoneContent.kt | 10 ++++++++++ .../envelopeadd/content/phone/PhoneContract.kt | 1 + .../envelopeadd/content/phone/PhoneViewModel.kt | 13 ++++++++++--- feature/received/src/main/res/values/strings.xml | 1 + 5 files changed, 23 insertions(+), 3 deletions(-) diff --git a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/ReceivedEnvelopeAddScreen.kt b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/ReceivedEnvelopeAddScreen.kt index 60530637..5e67d807 100644 --- a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/ReceivedEnvelopeAddScreen.kt +++ b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/ReceivedEnvelopeAddScreen.kt @@ -168,6 +168,7 @@ fun ReceivedEnvelopeAddScreen( EnvelopeAddStep.PHONE -> PhoneContentRoute( friendName = friendName, updateParentPhone = updateParentPhoneNumber, + onShowSnackbar = onShowSnackbar, ) EnvelopeAddStep.MEMO -> MemoContentRoute( updateParentMemo = updateParentMemo, diff --git a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/phone/PhoneContent.kt b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/phone/PhoneContent.kt index 997038ca..9e5ae26c 100644 --- a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/phone/PhoneContent.kt +++ b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/phone/PhoneContent.kt @@ -14,6 +14,7 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.tooling.preview.Preview @@ -23,6 +24,7 @@ import com.susu.core.designsystem.component.textfield.SusuBasicTextField import com.susu.core.designsystem.theme.Gray40 import com.susu.core.designsystem.theme.Gray60 import com.susu.core.designsystem.theme.SusuTheme +import com.susu.core.ui.SnackbarToken import com.susu.core.ui.extension.collectWithLifecycle import com.susu.core.ui.util.AnnotatedText import com.susu.feature.received.R @@ -34,10 +36,13 @@ fun PhoneContentRoute( viewModel: PhoneViewModel = hiltViewModel(), friendName: String, updateParentPhone: (String?) -> Unit, + onShowSnackbar: (SnackbarToken) -> Unit, ) { val uiState = viewModel.uiState.collectAsStateWithLifecycle().value val focusRequester = remember { FocusRequester() } val scope = rememberCoroutineScope() + val context = LocalContext.current + viewModel.sideEffect.collectWithLifecycle { sideEffect -> when (sideEffect) { is PhoneSideEffect.UpdateParentPhone -> updateParentPhone(sideEffect.phone) @@ -45,6 +50,11 @@ fun PhoneContentRoute( awaitFrame() focusRequester.requestFocus() } + PhoneSideEffect.ShowNotValidSnackbar -> onShowSnackbar( + SnackbarToken( + message = context.getString(R.string.phone_content_snackbar_validation), + ), + ) } } diff --git a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/phone/PhoneContract.kt b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/phone/PhoneContract.kt index a193c751..e438c4c9 100644 --- a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/phone/PhoneContract.kt +++ b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/phone/PhoneContract.kt @@ -11,4 +11,5 @@ data class PhoneState( sealed interface PhoneSideEffect : SideEffect { data class UpdateParentPhone(val phone: String?) : PhoneSideEffect data object ShowKeyboard : PhoneSideEffect + data object ShowNotValidSnackbar : PhoneSideEffect } diff --git a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/phone/PhoneViewModel.kt b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/phone/PhoneViewModel.kt index 13cf91b7..f434a288 100644 --- a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/phone/PhoneViewModel.kt +++ b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/phone/PhoneViewModel.kt @@ -9,9 +9,16 @@ class PhoneViewModel @Inject constructor() : BaseViewModel 11) { + postSideEffect(PhoneSideEffect.ShowNotValidSnackbar) + return + } + + intent { + postSideEffect(PhoneSideEffect.UpdateParentPhone(phone)) + copy(phone = phone ?: "") + } } fun showKeyboardIfTextEmpty() { diff --git a/feature/received/src/main/res/values/strings.xml b/feature/received/src/main/res/values/strings.xml index a6565542..298100c7 100644 --- a/feature/received/src/main/res/values/strings.xml +++ b/feature/received/src/main/res/values/strings.xml @@ -76,4 +76,5 @@ 금액은 20억원까지만 입력 가능해요 이름은 10글자까지만 입력 가능해요 선물은 30글자까지만 입력 가능해요 + 연락처는 11자리까지만 입력 가능해요 From 5fb936065a436bb0e267a2751629e8e80bc07a24 Mon Sep 17 00:00:00 2001 From: syb8200 Date: Sat, 17 Feb 2024 03:19:37 +0900 Subject: [PATCH 07/18] =?UTF-8?q?fix:=20=EB=B0=9B=EC=95=84=EC=9A=94=20?= =?UTF-8?q?=EC=9E=A5=EB=B6=80=20=EB=B4=89=ED=88=AC=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80=EC=82=AC=20(=EB=A9=94?= =?UTF-8?q?=EB=AA=A8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../envelopeadd/ReceivedEnvelopeAddScreen.kt | 1 + .../envelopeadd/content/memo/MemoContent.kt | 11 +++++++++++ .../received/envelopeadd/content/memo/MemoState.kt | 1 + .../envelopeadd/content/memo/MemoViewModel.kt | 13 ++++++++++--- feature/received/src/main/res/values/strings.xml | 1 + 5 files changed, 24 insertions(+), 3 deletions(-) diff --git a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/ReceivedEnvelopeAddScreen.kt b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/ReceivedEnvelopeAddScreen.kt index 5e67d807..ce3bd738 100644 --- a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/ReceivedEnvelopeAddScreen.kt +++ b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/ReceivedEnvelopeAddScreen.kt @@ -172,6 +172,7 @@ fun ReceivedEnvelopeAddScreen( ) EnvelopeAddStep.MEMO -> MemoContentRoute( updateParentMemo = updateParentMemo, + onShowSnackbar = onShowSnackbar, ) } } diff --git a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/memo/MemoContent.kt b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/memo/MemoContent.kt index c5f31fd3..dc014da9 100644 --- a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/memo/MemoContent.kt +++ b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/memo/MemoContent.kt @@ -16,6 +16,7 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.navigation.compose.hiltViewModel @@ -24,6 +25,7 @@ import com.susu.core.designsystem.component.textfield.SusuBasicTextField import com.susu.core.designsystem.theme.Gray100 import com.susu.core.designsystem.theme.Gray40 import com.susu.core.designsystem.theme.SusuTheme +import com.susu.core.ui.SnackbarToken import com.susu.core.ui.extension.collectWithLifecycle import com.susu.feature.received.R import kotlinx.coroutines.android.awaitFrame @@ -33,10 +35,13 @@ import kotlinx.coroutines.launch fun MemoContentRoute( viewModel: MemoViewModel = hiltViewModel(), updateParentMemo: (String?) -> Unit, + onShowSnackbar: (SnackbarToken) -> Unit, ) { val uiState = viewModel.uiState.collectAsStateWithLifecycle().value val focusRequester = remember { FocusRequester() } val scope = rememberCoroutineScope() + val context = LocalContext.current + viewModel.sideEffect.collectWithLifecycle { sideEffect -> when (sideEffect) { is MemoSideEffect.UpdateParentMemo -> updateParentMemo(sideEffect.memo) @@ -44,6 +49,11 @@ fun MemoContentRoute( awaitFrame() focusRequester.requestFocus() } + MemoSideEffect.ShowNotValidSnackbar -> onShowSnackbar( + SnackbarToken( + message = context.getString(R.string.memo_content_snackbar_validation), + ), + ) } } @@ -91,6 +101,7 @@ fun MemoContent( placeholder = stringResource(R.string.memo_content_placeholder), placeholderColor = Gray40, modifier = Modifier.fillMaxWidth().focusRequester(focusRequester), + maxLines = 5, ) Spacer(modifier = Modifier.size(SusuTheme.spacing.spacing_xl)) } diff --git a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/memo/MemoState.kt b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/memo/MemoState.kt index 05ceb3fa..7ece5e7a 100644 --- a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/memo/MemoState.kt +++ b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/memo/MemoState.kt @@ -10,4 +10,5 @@ data class MemoState( sealed interface MemoSideEffect : SideEffect { data class UpdateParentMemo(val memo: String?) : MemoSideEffect data object ShowKeyboard : MemoSideEffect + data object ShowNotValidSnackbar : MemoSideEffect } diff --git a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/memo/MemoViewModel.kt b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/memo/MemoViewModel.kt index bbcc5dbd..ac274460 100644 --- a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/memo/MemoViewModel.kt +++ b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/memo/MemoViewModel.kt @@ -8,9 +8,16 @@ import javax.inject.Inject class MemoViewModel @Inject constructor() : BaseViewModel( MemoState(), ) { - fun updateMemo(memo: String?) = intent { - postSideEffect(MemoSideEffect.UpdateParentMemo(memo)) - copy(memo = memo ?: "") + fun updateMemo(memo: String?) { + if (memo != null && memo.length > 30) { + postSideEffect(MemoSideEffect.ShowNotValidSnackbar) + return + } + + intent { + postSideEffect(MemoSideEffect.UpdateParentMemo(memo)) + copy(memo = memo ?: "") + } } fun showKeyboardIfTextEmpty() { diff --git a/feature/received/src/main/res/values/strings.xml b/feature/received/src/main/res/values/strings.xml index 298100c7..7f529c91 100644 --- a/feature/received/src/main/res/values/strings.xml +++ b/feature/received/src/main/res/values/strings.xml @@ -77,4 +77,5 @@ 이름은 10글자까지만 입력 가능해요 선물은 30글자까지만 입력 가능해요 연락처는 11자리까지만 입력 가능해요 + 메모는 30글자까지만 입력 가능해요 From 1212989c4ff6aee98e6dcbc682658787d981491b Mon Sep 17 00:00:00 2001 From: syb8200 Date: Sun, 18 Feb 2024 23:48:59 +0900 Subject: [PATCH 08/18] =?UTF-8?q?fix:=20=EB=B0=9B=EC=95=84=EC=9A=94=20?= =?UTF-8?q?=EC=9E=A5=EB=B6=80=20=EB=B4=89=ED=88=AC=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80=EC=82=AC=20(=EA=B8=88?= =?UTF-8?q?=EC=95=A1)=20=EC=88=98=EC=A0=95=20=E2=86=92=20=EA=B8=88?= =?UTF-8?q?=EC=95=A1=20=EB=B2=84=ED=8A=BC=20=ED=81=B4=EB=A6=AD=20=EC=8B=9C?= =?UTF-8?q?=EC=97=90=EB=8F=84=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../envelopeadd/content/money/MoneyContent.kt | 4 ++-- .../envelopeadd/content/money/MoneyViewModel.kt | 11 ++++------- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/money/MoneyContent.kt b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/money/MoneyContent.kt index af2b12a3..cf9b0fe5 100644 --- a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/money/MoneyContent.kt +++ b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/money/MoneyContent.kt @@ -84,7 +84,7 @@ fun MoneyContent( uiState: MoneyState = MoneyState(), focusRequester: FocusRequester = remember { FocusRequester() }, onTextChangeMoney: (String) -> Unit = {}, - onClickMoneyButton: (Int) -> Unit = {}, + onClickMoneyButton: (String, Int) -> Unit = { _, _ -> }, ) { Column( modifier = Modifier @@ -123,7 +123,7 @@ fun MoneyContent( style = SmallButtonStyle.height32, text = stringResource(id = com.susu.core.ui.R.string.money_unit_format, money.toMoneyFormat()), onClick = { - onClickMoneyButton(money) + onClickMoneyButton(uiState.money, money) }, ) } diff --git a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/money/MoneyViewModel.kt b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/money/MoneyViewModel.kt index 4a31af4d..91270922 100644 --- a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/money/MoneyViewModel.kt +++ b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/money/MoneyViewModel.kt @@ -20,13 +20,10 @@ class MoneyViewModel @Inject constructor() : BaseViewModel Date: Mon, 19 Feb 2024 00:19:31 +0900 Subject: [PATCH 09/18] =?UTF-8?q?fix:=20=EB=B0=9B=EC=95=84=EC=9A=94=20?= =?UTF-8?q?=EC=9E=A5=EB=B6=80=20=ED=8E=B8=EC=A7=91=20=EC=9C=A0=ED=9A=A8?= =?UTF-8?q?=EC=84=B1=20=EA=B2=80=EC=82=AC=20(=EA=B2=BD=EC=A1=B0=EC=82=AC?= =?UTF-8?q?=EB=AA=85,=20=EA=B2=BD=EC=A1=B0=EC=82=AC)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../received/ledgeredit/LedgerEditContract.kt | 2 ++ .../received/ledgeredit/LedgerEditScreen.kt | 14 +++++++++ .../ledgeredit/LedgerEditViewModel.kt | 29 +++++++++++++++---- .../received/navigation/ReceivedNavigation.kt | 1 + 4 files changed, 41 insertions(+), 5 deletions(-) diff --git a/feature/received/src/main/java/com/susu/feature/received/ledgeredit/LedgerEditContract.kt b/feature/received/src/main/java/com/susu/feature/received/ledgeredit/LedgerEditContract.kt index 71cd52a4..2eea17a9 100644 --- a/feature/received/src/main/java/com/susu/feature/received/ledgeredit/LedgerEditContract.kt +++ b/feature/received/src/main/java/com/susu/feature/received/ledgeredit/LedgerEditContract.kt @@ -35,4 +35,6 @@ data class LedgerEditState( sealed interface LedgerEditSideEffect : SideEffect { data object PopBackStack : LedgerEditSideEffect data object FocusCustomCategory : LedgerEditSideEffect + data object ShowNotValidSnackbarName : LedgerEditSideEffect + data object ShowNotValidSnackbarCategory : LedgerEditSideEffect } diff --git a/feature/received/src/main/java/com/susu/feature/received/ledgeredit/LedgerEditScreen.kt b/feature/received/src/main/java/com/susu/feature/received/ledgeredit/LedgerEditScreen.kt index 49f1593d..0383450f 100644 --- a/feature/received/src/main/java/com/susu/feature/received/ledgeredit/LedgerEditScreen.kt +++ b/feature/received/src/main/java/com/susu/feature/received/ledgeredit/LedgerEditScreen.kt @@ -24,6 +24,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.graphics.RectangleShape +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview @@ -50,6 +51,7 @@ import com.susu.core.designsystem.theme.Gray30 import com.susu.core.designsystem.theme.Gray80 import com.susu.core.designsystem.theme.Orange60 import com.susu.core.designsystem.theme.SusuTheme +import com.susu.core.ui.SnackbarToken import com.susu.core.ui.extension.collectWithLifecycle import com.susu.core.ui.extension.susuClickable import com.susu.core.ui.util.AnnotatedText @@ -63,11 +65,13 @@ import kotlinx.coroutines.launch fun LedgerEditRoute( viewModel: LedgerEditViewModel = hiltViewModel(), popBackStack: () -> Unit, + onShowSnackbar: (SnackbarToken) -> Unit, ) { val uiState = viewModel.uiState.collectAsStateWithLifecycle().value val focusRequester = remember { FocusRequester() } val scope = rememberCoroutineScope() + val context = LocalContext.current viewModel.sideEffect.collectWithLifecycle { sideEffect -> when (sideEffect) { @@ -76,6 +80,16 @@ fun LedgerEditRoute( awaitFrame() focusRequester.requestFocus() } + LedgerEditSideEffect.ShowNotValidSnackbarName -> onShowSnackbar( + SnackbarToken( + message = context.getString(R.string.ledger_snackbar_category_name_validation), + ) + ) + LedgerEditSideEffect.ShowNotValidSnackbarCategory -> onShowSnackbar( + SnackbarToken( + message = context.getString(R.string.ledger_snackbar_category_validation) + ) + ) } } diff --git a/feature/received/src/main/java/com/susu/feature/received/ledgeredit/LedgerEditViewModel.kt b/feature/received/src/main/java/com/susu/feature/received/ledgeredit/LedgerEditViewModel.kt index e7dd95ce..0bec87a8 100644 --- a/feature/received/src/main/java/com/susu/feature/received/ledgeredit/LedgerEditViewModel.kt +++ b/feature/received/src/main/java/com/susu/feature/received/ledgeredit/LedgerEditViewModel.kt @@ -4,6 +4,7 @@ import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope import com.susu.core.model.Category import com.susu.core.model.Ledger +import com.susu.core.ui.USER_INPUT_REGEX import com.susu.core.ui.base.BaseViewModel import com.susu.core.ui.extension.decodeFromUri import com.susu.domain.usecase.categoryconfig.GetCategoryConfigUseCase @@ -87,7 +88,16 @@ class LedgerEditViewModel @Inject constructor( copy(selectedCategoryId = categoryId) } - fun updateName(name: String) = intent { copy(name = name) } + fun updateName(name: String) { + if (!USER_INPUT_REGEX.matches(name)) { // 한글, 영문 0~10 글자 + if (name.length > 10) { // 길이 넘친 경우 + postSideEffect(LedgerEditSideEffect.ShowNotValidSnackbarName) + } + return // 특수문자는 입력 안 됨 + } + + intent { copy(name = name) } + } fun toggleCustomCategorySaved() = intent { copy( @@ -95,10 +105,19 @@ class LedgerEditViewModel @Inject constructor( ) } - fun updateCustomCategory(customCategory: String) = intent { - copy( - customCategory = customCategory, - ) + fun updateCustomCategory(customCategory: String) { + if (!USER_INPUT_REGEX.matches(customCategory)) { // 한글, 영문 0~10 글자 + if (customCategory.length > 10) { // 길이 넘친 경우 + postSideEffect(LedgerEditSideEffect.ShowNotValidSnackbarCategory) + } + return // 특수문자는 입력 안 됨 + } + + intent { + copy( + customCategory = customCategory, + ) + } } fun showCustomCategoryButton() { diff --git a/feature/received/src/main/java/com/susu/feature/received/navigation/ReceivedNavigation.kt b/feature/received/src/main/java/com/susu/feature/received/navigation/ReceivedNavigation.kt index 45860aef..9f6e2036 100644 --- a/feature/received/src/main/java/com/susu/feature/received/navigation/ReceivedNavigation.kt +++ b/feature/received/src/main/java/com/susu/feature/received/navigation/ReceivedNavigation.kt @@ -139,6 +139,7 @@ fun NavGraphBuilder.receivedNavGraph( ) { LedgerEditRoute( popBackStack = popBackStack, + onShowSnackbar = onShowSnackbar, ) } From 92749f189943e49955dc3cb0b34213e9b4289405 Mon Sep 17 00:00:00 2001 From: syb8200 Date: Mon, 19 Feb 2024 01:17:05 +0900 Subject: [PATCH 10/18] =?UTF-8?q?fix:=20=EB=B0=9B=EC=95=84=EC=9A=94=20?= =?UTF-8?q?=EC=9E=A5=EB=B6=80=20=EB=B4=89=ED=88=AC=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?(=EA=B8=88=EC=95=A1,=20=EC=9D=B4=EB=A6=84,=20=EA=B4=80=EA=B3=84?= =?UTF-8?q?,=20=EC=84=A0=EB=AC=BC,=20=EC=97=B0=EB=9D=BD=EC=B2=98,=20?= =?UTF-8?q?=EB=A9=94=EB=AA=A8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ReceivedEnvelopeEditContract.kt | 6 + .../ReceivedEnvelopeEditScreen.kt | 38 +++++- .../ReceivedEnvelopeEditViewModel.kt | 129 ++++++++++++------ .../received/navigation/ReceivedNavigation.kt | 1 + .../received/src/main/res/values/strings.xml | 1 + 5 files changed, 135 insertions(+), 40 deletions(-) diff --git a/feature/received/src/main/java/com/susu/feature/received/envelopeedit/ReceivedEnvelopeEditContract.kt b/feature/received/src/main/java/com/susu/feature/received/envelopeedit/ReceivedEnvelopeEditContract.kt index a5a2ea0f..e58af00a 100644 --- a/feature/received/src/main/java/com/susu/feature/received/envelopeedit/ReceivedEnvelopeEditContract.kt +++ b/feature/received/src/main/java/com/susu/feature/received/envelopeedit/ReceivedEnvelopeEditContract.kt @@ -25,4 +25,10 @@ sealed interface ReceivedEnvelopeEditSideEffect : SideEffect { data object FocusCustomRelation : ReceivedEnvelopeEditSideEffect data object PopBackStack : ReceivedEnvelopeEditSideEffect data class HandleException(val throwable: Throwable, val retry: () -> Unit) : ReceivedEnvelopeEditSideEffect + data object ShowMoneyNotValidSnackbar : ReceivedEnvelopeEditSideEffect + data object ShowNameNotValidSnackbar : ReceivedEnvelopeEditSideEffect + data object ShowRelationshipNotValidSnackbar : ReceivedEnvelopeEditSideEffect + data object ShowPresentNotValidSnackbar : ReceivedEnvelopeEditSideEffect + data object ShowPhoneNotValidSnackbar : ReceivedEnvelopeEditSideEffect + data object ShowMemoNotValidSnackbar : ReceivedEnvelopeEditSideEffect } diff --git a/feature/received/src/main/java/com/susu/feature/received/envelopeedit/ReceivedEnvelopeEditScreen.kt b/feature/received/src/main/java/com/susu/feature/received/envelopeedit/ReceivedEnvelopeEditScreen.kt index 95c1d342..ccd86ac2 100644 --- a/feature/received/src/main/java/com/susu/feature/received/envelopeedit/ReceivedEnvelopeEditScreen.kt +++ b/feature/received/src/main/java/com/susu/feature/received/envelopeedit/ReceivedEnvelopeEditScreen.kt @@ -23,6 +23,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.graphics.RectangleShape +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.tooling.preview.Preview @@ -47,6 +48,7 @@ import com.susu.core.designsystem.theme.Gray40 import com.susu.core.designsystem.theme.Gray70 import com.susu.core.designsystem.theme.SusuTheme import com.susu.core.model.Relationship +import com.susu.core.ui.SnackbarToken import com.susu.core.ui.extension.collectWithLifecycle import com.susu.core.ui.extension.susuClickable import com.susu.feature.received.R @@ -59,11 +61,12 @@ fun ReceivedEnvelopeEditRoute( viewModel: ReceivedEnvelopeEditViewModel = hiltViewModel(), popBackStack: () -> Unit, handleException: (Throwable, () -> Unit) -> Unit, + onShowSnackbar: (SnackbarToken) -> Unit, ) { val uiState = viewModel.uiState.collectAsStateWithLifecycle().value - val focusRequester = remember { FocusRequester() } val scope = rememberCoroutineScope() + val context = LocalContext.current viewModel.sideEffect.collectWithLifecycle { sideEffect -> when (sideEffect) { @@ -71,12 +74,41 @@ fun ReceivedEnvelopeEditRoute( sideEffect.throwable, sideEffect.retry, ) - ReceivedEnvelopeEditSideEffect.PopBackStack -> popBackStack() ReceivedEnvelopeEditSideEffect.FocusCustomRelation -> scope.launch { awaitFrame() focusRequester.requestFocus() } + ReceivedEnvelopeEditSideEffect.ShowMoneyNotValidSnackbar -> onShowSnackbar( + SnackbarToken( + message = context.getString(R.string.money_content_snackbar_validation), + ), + ) + ReceivedEnvelopeEditSideEffect.ShowNameNotValidSnackbar -> onShowSnackbar( + SnackbarToken( + message = context.getString(R.string.name_content_snackbar_validation), + ), + ) + ReceivedEnvelopeEditSideEffect.ShowRelationshipNotValidSnackbar -> onShowSnackbar( + SnackbarToken( + message = context.getString(R.string.relationship_content_snackbar_validation), + ), + ) + ReceivedEnvelopeEditSideEffect.ShowPresentNotValidSnackbar -> onShowSnackbar( + SnackbarToken( + message = context.getString(R.string.present_content_snackbar_validation), + ), + ) + ReceivedEnvelopeEditSideEffect.ShowPhoneNotValidSnackbar -> onShowSnackbar( + SnackbarToken( + message = context.getString(R.string.phone_content_snackbar_validation), + ), + ) + ReceivedEnvelopeEditSideEffect.ShowMemoNotValidSnackbar -> onShowSnackbar( + SnackbarToken( + message = context.getString(R.string.memo_content_snackbar_validation), + ), + ) } } @@ -250,6 +282,7 @@ fun ReceivedEnvelopeEditScreen( placeholderColor = Gray30, textStyle = SusuTheme.typography.title_s, modifier = Modifier.fillMaxWidth(), + maxLines = 5, ) } EditDetailItem( @@ -279,6 +312,7 @@ fun ReceivedEnvelopeEditScreen( placeholderColor = Gray30, textStyle = SusuTheme.typography.title_s, modifier = Modifier.fillMaxWidth(), + maxLines = 5, ) } Spacer(modifier = Modifier.height(SusuTheme.spacing.spacing_xxxl)) diff --git a/feature/received/src/main/java/com/susu/feature/received/envelopeedit/ReceivedEnvelopeEditViewModel.kt b/feature/received/src/main/java/com/susu/feature/received/envelopeedit/ReceivedEnvelopeEditViewModel.kt index 68198454..7c6c7ae6 100644 --- a/feature/received/src/main/java/com/susu/feature/received/envelopeedit/ReceivedEnvelopeEditViewModel.kt +++ b/feature/received/src/main/java/com/susu/feature/received/envelopeedit/ReceivedEnvelopeEditViewModel.kt @@ -5,10 +5,15 @@ import androidx.lifecycle.viewModelScope import com.susu.core.model.Envelope import com.susu.core.model.Ledger import com.susu.core.model.Relationship +import com.susu.core.ui.MONEY_MAX_VALUE +import com.susu.core.ui.USER_INPUT_REGEX +import com.susu.core.ui.USER_INPUT_REGEX_INCLUDE_NUMBER +import com.susu.core.ui.USER_INPUT_REGEX_LONG import com.susu.core.ui.base.BaseViewModel import com.susu.core.ui.extension.decodeFromUri import com.susu.domain.usecase.envelope.EditReceivedEnvelopeUseCase import com.susu.domain.usecase.envelope.GetRelationShipConfigListUseCase +import com.susu.feature.received.envelopeadd.content.money.MoneySideEffect import com.susu.feature.received.navigation.ReceivedRoute import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.collections.immutable.toPersistentList @@ -87,16 +92,32 @@ class ReceivedEnvelopeEditViewModel @Inject constructor( fun popBackStack() = postSideEffect(ReceivedEnvelopeEditSideEffect.PopBackStack) - fun updateMoney(money: String) = intent { - copy( - envelope = envelope.copy(amount = money.toLongOrNull() ?: 0L), - ) + fun updateMoney(money: String) { + if (money.length > 10) { + postSideEffect(ReceivedEnvelopeEditSideEffect.ShowMoneyNotValidSnackbar) + return + } + + intent { + copy( + envelope = envelope.copy(amount = money.toLongOrNull() ?: 0L), + ) + } } - fun updateName(name: String) = intent { - copy( - envelope = envelope.copy(friend = envelope.friend.copy(name = name)), - ) + fun updateName(name: String) { + if (!USER_INPUT_REGEX.matches(name)) { + if (name.length > 10) { + postSideEffect(ReceivedEnvelopeEditSideEffect.ShowNameNotValidSnackbar) + } + return + } + + intent { + copy( + envelope = envelope.copy(friend = envelope.friend.copy(name = name)), + ) + } } fun updateRelation(relationship: Relationship) = intent { @@ -105,17 +126,26 @@ class ReceivedEnvelopeEditViewModel @Inject constructor( ) } - fun updateCustomRelation(customRelation: String?) = intent { - copy( - envelope = envelope.copy(relationship = envelope.relationship.copy(customRelation = customRelation)), - relationshipConfig = relationshipConfig.map { - if (it.id == envelope.relationship.id) { - it.copy(customRelation = customRelation) - } else { - it - } - }.toPersistentList(), - ) + fun updateCustomRelation(customRelation: String?) { + if (customRelation != null && !USER_INPUT_REGEX_INCLUDE_NUMBER.matches(customRelation)) { + if (customRelation.length > 10) { + postSideEffect(ReceivedEnvelopeEditSideEffect.ShowRelationshipNotValidSnackbar) + } + return + } + + intent { + copy( + envelope = envelope.copy(relationship = envelope.relationship.copy(customRelation = customRelation)), + relationshipConfig = relationshipConfig.map { + if (it.id == envelope.relationship.id) { + it.copy(customRelation = customRelation) + } else { + it + } + }.toPersistentList(), + ) + } } fun closeCustomRelation() = intent { @@ -164,30 +194,53 @@ class ReceivedEnvelopeEditViewModel @Inject constructor( ) } - fun updateGift(gift: String) = intent { - copy( - envelope = envelope.copy( - gift = gift.ifEmpty { null }, - ), - ) + fun updateGift(gift: String) { + if (gift != null && !USER_INPUT_REGEX_LONG.matches(gift)) { + if (gift.length > 30) { + postSideEffect(ReceivedEnvelopeEditSideEffect.ShowPresentNotValidSnackbar) + } + return + } + + intent { + copy( + envelope = envelope.copy( + gift = gift.ifEmpty { null }, + ), + ) + } } - fun updatePhoneNumber(phoneNumber: String) = intent { - copy( - envelope = envelope.copy( - friend = envelope.friend.copy( - phoneNumber = phoneNumber, + fun updatePhoneNumber(phoneNumber: String) { + if (phoneNumber != null && phoneNumber.length > 11) { + postSideEffect(ReceivedEnvelopeEditSideEffect.ShowPhoneNotValidSnackbar) + return + } + + intent { + copy( + envelope = envelope.copy( + friend = envelope.friend.copy( + phoneNumber = phoneNumber, + ), ), - ), - ) + ) + } } - fun updateMemo(memo: String) = intent { - copy( - envelope = envelope.copy( - memo = memo.ifEmpty { null }, - ), - ) + fun updateMemo(memo: String) { + if (memo != null && memo.length > 30) { + postSideEffect(ReceivedEnvelopeEditSideEffect.ShowMemoNotValidSnackbar) + return + } + + intent { + copy( + envelope = envelope.copy( + memo = memo.ifEmpty { null }, + ), + ) + } } fun hideDateBottomSheet(year: Int, month: Int, day: Int) = intent { diff --git a/feature/received/src/main/java/com/susu/feature/received/navigation/ReceivedNavigation.kt b/feature/received/src/main/java/com/susu/feature/received/navigation/ReceivedNavigation.kt index 9f6e2036..b8e7494a 100644 --- a/feature/received/src/main/java/com/susu/feature/received/navigation/ReceivedNavigation.kt +++ b/feature/received/src/main/java/com/susu/feature/received/navigation/ReceivedNavigation.kt @@ -202,6 +202,7 @@ fun NavGraphBuilder.receivedNavGraph( ReceivedEnvelopeEditRoute( popBackStack = popBackStack, handleException = handleException, + onShowSnackbar = onShowSnackbar, ) } } diff --git a/feature/received/src/main/res/values/strings.xml b/feature/received/src/main/res/values/strings.xml index 7f529c91..7a35219e 100644 --- a/feature/received/src/main/res/values/strings.xml +++ b/feature/received/src/main/res/values/strings.xml @@ -75,6 +75,7 @@ 금액은 20억원까지만 입력 가능해요 이름은 10글자까지만 입력 가능해요 + 나와의 관계는 10글자까지만 입력 가능해요 선물은 30글자까지만 입력 가능해요 연락처는 11자리까지만 입력 가능해요 메모는 30글자까지만 입력 가능해요 From a35c51af91486d732f1ce3853228201bf683cae6 Mon Sep 17 00:00:00 2001 From: syb8200 Date: Mon, 19 Feb 2024 01:21:10 +0900 Subject: [PATCH 11/18] =?UTF-8?q?fix:=20=EB=B0=9B=EC=95=84=EC=9A=94=20?= =?UTF-8?q?=EB=B4=89=ED=88=AC=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80?= =?UTF-8?q?=EC=82=AC=20(=EB=A9=94=EB=AA=A8)=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/susu/feature/envelopeedit/SentEnvelopeEditViewModel.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature/sent/src/main/java/com/susu/feature/envelopeedit/SentEnvelopeEditViewModel.kt b/feature/sent/src/main/java/com/susu/feature/envelopeedit/SentEnvelopeEditViewModel.kt index c72ae190..4157c4a7 100644 --- a/feature/sent/src/main/java/com/susu/feature/envelopeedit/SentEnvelopeEditViewModel.kt +++ b/feature/sent/src/main/java/com/susu/feature/envelopeedit/SentEnvelopeEditViewModel.kt @@ -123,7 +123,7 @@ class SentEnvelopeEditViewModel @Inject constructor( fun updateMemo(memo: String?) { if (memo != null && memo.length > 30) { - postSideEffect(SentEnvelopeEditSideEffect.ShowPresentNotValidSnackbar) + postSideEffect(SentEnvelopeEditSideEffect.ShowMemoNotValidSnackbar) return } intent { copy(memo = memo?.ifEmpty { null }) } From 3ea28c31f619264352229e48fd9808ecaf351a25 Mon Sep 17 00:00:00 2001 From: syb8200 Date: Mon, 19 Feb 2024 01:31:40 +0900 Subject: [PATCH 12/18] =?UTF-8?q?fix:=20=EB=B0=9B=EC=95=84=EC=9A=94=20?= =?UTF-8?q?=EC=9E=A5=EB=B6=80=20=EB=B4=89=ED=88=AC=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80=EC=82=AC=20(=EA=B4=80?= =?UTF-8?q?=EA=B3=84)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../envelopeadd/ReceivedEnvelopeAddScreen.kt | 1 + .../relationship/RelationShipContent.kt | 11 ++++++++++ .../relationship/RelationShipContract.kt | 1 + .../relationship/RelationShipViewModel.kt | 21 ++++++++++++++----- 4 files changed, 29 insertions(+), 5 deletions(-) diff --git a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/ReceivedEnvelopeAddScreen.kt b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/ReceivedEnvelopeAddScreen.kt index ce3bd738..d9000b7b 100644 --- a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/ReceivedEnvelopeAddScreen.kt +++ b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/ReceivedEnvelopeAddScreen.kt @@ -147,6 +147,7 @@ fun ReceivedEnvelopeAddScreen( ) EnvelopeAddStep.RELATIONSHIP -> RelationShipContentRoute( updateParentSelectedRelation = updateParentSelectedRelationShip, + onShowSnackbar = onShowSnackbar, ) EnvelopeAddStep.DATE -> DateContentRoute( friendName = friendName, diff --git a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/relationship/RelationShipContent.kt b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/relationship/RelationShipContent.kt index 0d05d788..b205ad64 100644 --- a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/relationship/RelationShipContent.kt +++ b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/relationship/RelationShipContent.kt @@ -17,6 +17,7 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.navigation.compose.hiltViewModel @@ -32,6 +33,7 @@ import com.susu.core.designsystem.component.textfieldbutton.style.MediumTextFiel import com.susu.core.designsystem.theme.Gray100 import com.susu.core.designsystem.theme.SusuTheme import com.susu.core.model.Relationship +import com.susu.core.ui.SnackbarToken import com.susu.core.ui.extension.collectWithLifecycle import com.susu.feature.received.R import kotlinx.coroutines.android.awaitFrame @@ -41,10 +43,13 @@ import kotlinx.coroutines.launch fun RelationShipContentRoute( viewModel: RelationShipViewModel = hiltViewModel(), updateParentSelectedRelation: (Relationship?) -> Unit = {}, + onShowSnackbar: (SnackbarToken) -> Unit, ) { val uiState = viewModel.uiState.collectAsStateWithLifecycle().value val focusRequester = remember { FocusRequester() } val scope = rememberCoroutineScope() + val context = LocalContext.current + viewModel.sideEffect.collectWithLifecycle { sideEffect -> when (sideEffect) { is RelationShipSideEffect.UpdateParentSelectedRelationShip -> { @@ -55,6 +60,12 @@ fun RelationShipContentRoute( awaitFrame() focusRequester.requestFocus() } + + RelationShipSideEffect.ShowNotValidSnackbar -> onShowSnackbar( + SnackbarToken( + message = context.getString(R.string.relationship_content_snackbar_validation), + ) + ) } } diff --git a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/relationship/RelationShipContract.kt b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/relationship/RelationShipContract.kt index 6cad6733..26626135 100644 --- a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/relationship/RelationShipContract.kt +++ b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/relationship/RelationShipContract.kt @@ -19,4 +19,5 @@ data class RelationShipState( sealed interface RelationShipSideEffect : SideEffect { data object FocusCustomRelationShip : RelationShipSideEffect data class UpdateParentSelectedRelationShip(val relationShip: Relationship?) : RelationShipSideEffect + data object ShowNotValidSnackbar : RelationShipSideEffect } diff --git a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/relationship/RelationShipViewModel.kt b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/relationship/RelationShipViewModel.kt index e1e3daaf..bbdeb1be 100644 --- a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/relationship/RelationShipViewModel.kt +++ b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/relationship/RelationShipViewModel.kt @@ -2,8 +2,10 @@ package com.susu.feature.received.envelopeadd.content.relationship import androidx.lifecycle.viewModelScope import com.susu.core.model.Relationship +import com.susu.core.ui.USER_INPUT_REGEX import com.susu.core.ui.base.BaseViewModel import com.susu.domain.usecase.envelope.GetRelationShipConfigListUseCase +import com.susu.feature.received.envelopeadd.content.name.NameSideEffect import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.collections.immutable.toPersistentList import kotlinx.coroutines.launch @@ -51,11 +53,20 @@ class RelationShipViewModel @Inject constructor( copy(selectedRelationship = customRelationship) } - fun updateCustomRelationShipText(text: String) = intent { - copy( - selectedRelationship = customRelationship.copy(customRelation = text), - customRelationship = customRelationship.copy(customRelation = text), - ) + fun updateCustomRelationShipText(text: String) { + if (!USER_INPUT_REGEX.matches(text)) { // 한글, 영문 0~10 글자 + if (text.length > 10) { // 길이 넘친 경우 + postSideEffect(RelationShipSideEffect.ShowNotValidSnackbar) + } + return // 특수문자는 입력 안 됨 + } + + intent { + copy( + selectedRelationship = customRelationship.copy(customRelation = text), + customRelationship = customRelationship.copy(customRelation = text), + ) + } } fun showCustomRelationShipTextField() = intent { From 03008c2845e43014472292b75ec779cda6ce61b2 Mon Sep 17 00:00:00 2001 From: syb8200 Date: Mon, 19 Feb 2024 01:54:34 +0900 Subject: [PATCH 13/18] =?UTF-8?q?fix:=20=EA=B8=88=EC=95=A1=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20string,=20=EC=B5=9C=EB=8C=93=EA=B0=92=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=EB=B0=8F=20=EB=B0=9B=EC=95=84=EC=9A=94=20=EC=9E=A5?= =?UTF-8?q?=EB=B6=80=20=EB=B4=89=ED=88=AC=20=EC=83=9D=EC=84=B1=20=EC=9C=A0?= =?UTF-8?q?=ED=9A=A8=EC=84=B1=20=EA=B2=80=EC=82=AC=20(=EA=B8=88=EC=95=A1)?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/susu/core/ui/Consts.kt | 2 +- .../envelopeadd/content/money/MoneyContent.kt | 4 ++-- .../content/money/MoneyViewModel.kt | 20 +++++++++++++++---- .../received/src/main/res/values/strings.xml | 2 +- feature/sent/src/main/res/values/strings.xml | 2 +- 5 files changed, 21 insertions(+), 9 deletions(-) diff --git a/core/ui/src/main/java/com/susu/core/ui/Consts.kt b/core/ui/src/main/java/com/susu/core/ui/Consts.kt index 9c5b582d..b42e9886 100644 --- a/core/ui/src/main/java/com/susu/core/ui/Consts.kt +++ b/core/ui/src/main/java/com/susu/core/ui/Consts.kt @@ -26,7 +26,7 @@ val USER_INPUT_REGEX_LONG = Regex("[a-zA-Zㄱ-ㅎㅏ-ㅣ가-힣0-9]{0,30}") val USER_INPUT_REGEX_INCLUDE_NUMBER = Regex("[a-zA-Zㄱ-ㅎㅏ-ㅣ가-힣0-9]{0,10}") val USER_BIRTH_RANGE = 1930..currentDate.year -const val MONEY_MAX_VALUE = 2_000_000_000L // TODO: 정책 확정 시 99억으로 변경 +const val MONEY_MAX_VALUE = 9_999_999_999L // TODO: 정책 확정 시 99억으로 변경 const val INTENT_ACTION_DOWNLOAD_COMPLETE = "android.intent.action.DOWNLOAD_COMPLETE" const val PRIVACY_POLICY_URL = "https://sites.google.com/view/team-oksusu/%ED%99%88" diff --git a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/money/MoneyContent.kt b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/money/MoneyContent.kt index cf9b0fe5..af2b12a3 100644 --- a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/money/MoneyContent.kt +++ b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/money/MoneyContent.kt @@ -84,7 +84,7 @@ fun MoneyContent( uiState: MoneyState = MoneyState(), focusRequester: FocusRequester = remember { FocusRequester() }, onTextChangeMoney: (String) -> Unit = {}, - onClickMoneyButton: (String, Int) -> Unit = { _, _ -> }, + onClickMoneyButton: (Int) -> Unit = {}, ) { Column( modifier = Modifier @@ -123,7 +123,7 @@ fun MoneyContent( style = SmallButtonStyle.height32, text = stringResource(id = com.susu.core.ui.R.string.money_unit_format, money.toMoneyFormat()), onClick = { - onClickMoneyButton(uiState.money, money) + onClickMoneyButton(money) }, ) } diff --git a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/money/MoneyViewModel.kt b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/money/MoneyViewModel.kt index 91270922..afd27e01 100644 --- a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/money/MoneyViewModel.kt +++ b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/money/MoneyViewModel.kt @@ -1,5 +1,6 @@ package com.susu.feature.received.envelopeadd.content.money +import com.susu.core.ui.MONEY_MAX_VALUE import com.susu.core.ui.base.BaseViewModel import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject @@ -20,10 +21,21 @@ class MoneyViewModel @Inject constructor() : BaseViewModel MONEY_MAX_VALUE) { + postSideEffect(MoneySideEffect.ShowNotValidSnackbar) + return + } + postSideEffect(MoneySideEffect.UpdateParentMoney(addedMoney)) + + intent { + copy( + money = addedMoney.toString(), + ) + } } fun showKeyboardIfMoneyEmpty() { diff --git a/feature/received/src/main/res/values/strings.xml b/feature/received/src/main/res/values/strings.xml index 7a35219e..f24ee9b3 100644 --- a/feature/received/src/main/res/values/strings.xml +++ b/feature/received/src/main/res/values/strings.xml @@ -73,7 +73,7 @@ 경조사는 10글자까지만 입력 가능해요 경조사명은 10글자까지만 입력 가능해요 - 금액은 20억원까지만 입력 가능해요 + 100억 미만의 금액만 입력 가능해요 이름은 10글자까지만 입력 가능해요 나와의 관계는 10글자까지만 입력 가능해요 선물은 30글자까지만 입력 가능해요 diff --git a/feature/sent/src/main/res/values/strings.xml b/feature/sent/src/main/res/values/strings.xml index 0856e81f..87d7cf8c 100644 --- a/feature/sent/src/main/res/values/strings.xml +++ b/feature/sent/src/main/res/values/strings.xml @@ -62,7 +62,7 @@ +%1$s원 %1$s원 - 금액은 20억원까지만 입력 가능해요 + 100억 미만의 금액만 입력 가능해요 이름은 10글자까지만 입력 가능해요 나와의 관계는 10글자까지만 입력 가능해요 경조사는 10글자까지만 입력 가능해요 From ebd807d988e406f08a619d0fee02106684df7ecc Mon Sep 17 00:00:00 2001 From: syb8200 Date: Mon, 19 Feb 2024 02:04:21 +0900 Subject: [PATCH 14/18] =?UTF-8?q?chore:=20ktlint=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../received/envelopeadd/content/money/MoneyContent.kt | 2 +- .../received/envelopeadd/content/name/NameContent.kt | 2 +- .../received/envelopeadd/content/present/PresentContent.kt | 2 +- .../envelopeadd/content/relationship/RelationShipContent.kt | 2 +- .../content/relationship/RelationShipViewModel.kt | 1 - .../received/envelopeedit/ReceivedEnvelopeEditViewModel.kt | 2 -- .../com/susu/feature/received/ledgeradd/LedgerAddScreen.kt | 2 +- .../received/ledgeradd/content/category/CategoryContent.kt | 2 +- .../feature/received/ledgeradd/content/name/NameContent.kt | 2 +- .../susu/feature/received/ledgeredit/LedgerEditScreen.kt | 6 +++--- 10 files changed, 10 insertions(+), 13 deletions(-) diff --git a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/money/MoneyContent.kt b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/money/MoneyContent.kt index af2b12a3..10310ae9 100644 --- a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/money/MoneyContent.kt +++ b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/money/MoneyContent.kt @@ -57,7 +57,7 @@ fun MoneyContentRoute( MoneySideEffect.ShowNotValidSnackbar -> onShowSnackbar( SnackbarToken( message = context.getString(R.string.money_content_snackbar_validation), - ) + ), ) } } diff --git a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/name/NameContent.kt b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/name/NameContent.kt index 7ec584e6..c6d2a64a 100644 --- a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/name/NameContent.kt +++ b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/name/NameContent.kt @@ -65,7 +65,7 @@ fun NameContentRoute( NameSideEffect.ShowNotValidSnackbar -> onShowSnackbar( SnackbarToken( message = context.getString(R.string.name_content_snackbar_validation), - ) + ), ) } } diff --git a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/present/PresentContent.kt b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/present/PresentContent.kt index 5d6715ec..509d0e18 100644 --- a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/present/PresentContent.kt +++ b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/present/PresentContent.kt @@ -51,7 +51,7 @@ fun PresentContentRoute( PresentSideEffect.ShowNotValidSnackbar -> onShowSnackbar( SnackbarToken( message = context.getString(R.string.present_content_snackbar_validation), - ) + ), ) } } diff --git a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/relationship/RelationShipContent.kt b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/relationship/RelationShipContent.kt index b205ad64..68fbea15 100644 --- a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/relationship/RelationShipContent.kt +++ b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/relationship/RelationShipContent.kt @@ -64,7 +64,7 @@ fun RelationShipContentRoute( RelationShipSideEffect.ShowNotValidSnackbar -> onShowSnackbar( SnackbarToken( message = context.getString(R.string.relationship_content_snackbar_validation), - ) + ), ) } } diff --git a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/relationship/RelationShipViewModel.kt b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/relationship/RelationShipViewModel.kt index bbdeb1be..53818d59 100644 --- a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/relationship/RelationShipViewModel.kt +++ b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/relationship/RelationShipViewModel.kt @@ -5,7 +5,6 @@ import com.susu.core.model.Relationship import com.susu.core.ui.USER_INPUT_REGEX import com.susu.core.ui.base.BaseViewModel import com.susu.domain.usecase.envelope.GetRelationShipConfigListUseCase -import com.susu.feature.received.envelopeadd.content.name.NameSideEffect import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.collections.immutable.toPersistentList import kotlinx.coroutines.launch diff --git a/feature/received/src/main/java/com/susu/feature/received/envelopeedit/ReceivedEnvelopeEditViewModel.kt b/feature/received/src/main/java/com/susu/feature/received/envelopeedit/ReceivedEnvelopeEditViewModel.kt index 7c6c7ae6..3a5b6482 100644 --- a/feature/received/src/main/java/com/susu/feature/received/envelopeedit/ReceivedEnvelopeEditViewModel.kt +++ b/feature/received/src/main/java/com/susu/feature/received/envelopeedit/ReceivedEnvelopeEditViewModel.kt @@ -5,7 +5,6 @@ import androidx.lifecycle.viewModelScope import com.susu.core.model.Envelope import com.susu.core.model.Ledger import com.susu.core.model.Relationship -import com.susu.core.ui.MONEY_MAX_VALUE import com.susu.core.ui.USER_INPUT_REGEX import com.susu.core.ui.USER_INPUT_REGEX_INCLUDE_NUMBER import com.susu.core.ui.USER_INPUT_REGEX_LONG @@ -13,7 +12,6 @@ import com.susu.core.ui.base.BaseViewModel import com.susu.core.ui.extension.decodeFromUri import com.susu.domain.usecase.envelope.EditReceivedEnvelopeUseCase import com.susu.domain.usecase.envelope.GetRelationShipConfigListUseCase -import com.susu.feature.received.envelopeadd.content.money.MoneySideEffect import com.susu.feature.received.navigation.ReceivedRoute import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.collections.immutable.toPersistentList diff --git a/feature/received/src/main/java/com/susu/feature/received/ledgeradd/LedgerAddScreen.kt b/feature/received/src/main/java/com/susu/feature/received/ledgeradd/LedgerAddScreen.kt index c23fdd0a..0d3067c1 100644 --- a/feature/received/src/main/java/com/susu/feature/received/ledgeradd/LedgerAddScreen.kt +++ b/feature/received/src/main/java/com/susu/feature/received/ledgeradd/LedgerAddScreen.kt @@ -84,7 +84,7 @@ fun LedgerAddRoute( updateParentDate = { startAt, endAt -> viewModel.updateDate(startAt, endAt) }, - onShowSnackbar = onShowSnackbar + onShowSnackbar = onShowSnackbar, ) } diff --git a/feature/received/src/main/java/com/susu/feature/received/ledgeradd/content/category/CategoryContent.kt b/feature/received/src/main/java/com/susu/feature/received/ledgeradd/content/category/CategoryContent.kt index a0e812ab..1bba1520 100644 --- a/feature/received/src/main/java/com/susu/feature/received/ledgeradd/content/category/CategoryContent.kt +++ b/feature/received/src/main/java/com/susu/feature/received/ledgeradd/content/category/CategoryContent.kt @@ -63,7 +63,7 @@ fun CategoryContentRoute( CategorySideEffect.ShowNotValidSnackbar -> onShowSnackbar( SnackbarToken( message = context.getString(R.string.ledger_snackbar_category_validation), - ) + ), ) } } diff --git a/feature/received/src/main/java/com/susu/feature/received/ledgeradd/content/name/NameContent.kt b/feature/received/src/main/java/com/susu/feature/received/ledgeradd/content/name/NameContent.kt index 41b5cc61..ee8f18e1 100644 --- a/feature/received/src/main/java/com/susu/feature/received/ledgeradd/content/name/NameContent.kt +++ b/feature/received/src/main/java/com/susu/feature/received/ledgeradd/content/name/NameContent.kt @@ -51,7 +51,7 @@ fun NameContentRoute( NameSideEffect.ShowNotValidSnackbar -> onShowSnackbar( SnackbarToken( message = context.getString(R.string.ledger_snackbar_category_name_validation), - ) + ), ) } } diff --git a/feature/received/src/main/java/com/susu/feature/received/ledgeredit/LedgerEditScreen.kt b/feature/received/src/main/java/com/susu/feature/received/ledgeredit/LedgerEditScreen.kt index 0383450f..f3b1f520 100644 --- a/feature/received/src/main/java/com/susu/feature/received/ledgeredit/LedgerEditScreen.kt +++ b/feature/received/src/main/java/com/susu/feature/received/ledgeredit/LedgerEditScreen.kt @@ -83,12 +83,12 @@ fun LedgerEditRoute( LedgerEditSideEffect.ShowNotValidSnackbarName -> onShowSnackbar( SnackbarToken( message = context.getString(R.string.ledger_snackbar_category_name_validation), - ) + ), ) LedgerEditSideEffect.ShowNotValidSnackbarCategory -> onShowSnackbar( SnackbarToken( - message = context.getString(R.string.ledger_snackbar_category_validation) - ) + message = context.getString(R.string.ledger_snackbar_category_validation), + ), ) } } From 98ac937a23ee81e563a5196585e477234a8dfb61 Mon Sep 17 00:00:00 2001 From: syb8200 Date: Mon, 19 Feb 2024 02:34:22 +0900 Subject: [PATCH 15/18] =?UTF-8?q?chore:=20=EC=A3=BC=EC=84=9D=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0=20=EB=B0=8F=20=EB=B0=9B=EC=95=84=EC=9A=94=20=EC=9E=A5?= =?UTF-8?q?=EB=B6=80=20=EB=B4=89=ED=88=AC=20ellipsis=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/ui/src/main/java/com/susu/core/ui/Consts.kt | 2 +- .../component/LedgerDetailEnvelopeContainer.kt | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/core/ui/src/main/java/com/susu/core/ui/Consts.kt b/core/ui/src/main/java/com/susu/core/ui/Consts.kt index b42e9886..ee398e86 100644 --- a/core/ui/src/main/java/com/susu/core/ui/Consts.kt +++ b/core/ui/src/main/java/com/susu/core/ui/Consts.kt @@ -26,7 +26,7 @@ val USER_INPUT_REGEX_LONG = Regex("[a-zA-Zㄱ-ㅎㅏ-ㅣ가-힣0-9]{0,30}") val USER_INPUT_REGEX_INCLUDE_NUMBER = Regex("[a-zA-Zㄱ-ㅎㅏ-ㅣ가-힣0-9]{0,10}") val USER_BIRTH_RANGE = 1930..currentDate.year -const val MONEY_MAX_VALUE = 9_999_999_999L // TODO: 정책 확정 시 99억으로 변경 +const val MONEY_MAX_VALUE = 9_999_999_999L const val INTENT_ACTION_DOWNLOAD_COMPLETE = "android.intent.action.DOWNLOAD_COMPLETE" const val PRIVACY_POLICY_URL = "https://sites.google.com/view/team-oksusu/%ED%99%88" diff --git a/feature/received/src/main/java/com/susu/feature/received/ledgerdetail/component/LedgerDetailEnvelopeContainer.kt b/feature/received/src/main/java/com/susu/feature/received/ledgerdetail/component/LedgerDetailEnvelopeContainer.kt index 5590cd68..fb18f90d 100644 --- a/feature/received/src/main/java/com/susu/feature/received/ledgerdetail/component/LedgerDetailEnvelopeContainer.kt +++ b/feature/received/src/main/java/com/susu/feature/received/ledgerdetail/component/LedgerDetailEnvelopeContainer.kt @@ -8,6 +8,7 @@ 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.size import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Icon @@ -18,6 +19,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.susu.core.designsystem.component.badge.BadgeColor @@ -86,8 +88,11 @@ fun LedgerDetailEnvelopeContainer( Text( text = envelope.friend.name, style = SusuTheme.typography.title_xs, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + modifier = Modifier.weight(1f, false), ) - Spacer(modifier = Modifier.weight(1f)) + Spacer(modifier = Modifier.size(SusuTheme.spacing.spacing_s)) Text( text = stringResource(id = R.string.money_unit_format, envelope.envelope.amount.toInt().toMoneyFormat()), style = SusuTheme.typography.title_m, From 32f230d79fb916d106fb7eff182c49e624c2234e Mon Sep 17 00:00:00 2001 From: syb8200 Date: Mon, 19 Feb 2024 20:39:39 +0900 Subject: [PATCH 16/18] =?UTF-8?q?feat:=20=EC=97=B0=EB=9D=BD=EC=B2=98=20?= =?UTF-8?q?=ED=98=95=EC=8B=9D=20=EA=B4=80=EB=A0=A8=20=EC=A0=95=EC=B1=85=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=E2=86=92=20=20=ED=95=A8=EC=88=98=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/susu/core/ui/extension/String.kt | 5 +++ .../core/ui/util/PhoneVisualTransformation.kt | 35 +++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 core/ui/src/main/java/com/susu/core/ui/extension/String.kt create mode 100644 core/ui/src/main/java/com/susu/core/ui/util/PhoneVisualTransformation.kt diff --git a/core/ui/src/main/java/com/susu/core/ui/extension/String.kt b/core/ui/src/main/java/com/susu/core/ui/extension/String.kt new file mode 100644 index 00000000..03b0590e --- /dev/null +++ b/core/ui/src/main/java/com/susu/core/ui/extension/String.kt @@ -0,0 +1,5 @@ +package com.susu.core.ui.extension + +fun String.toPhoneNumber(): String { + return "${this.substring(0, 3)}-${this.substring(3, 7)}-${this.substring(7)}" +} diff --git a/core/ui/src/main/java/com/susu/core/ui/util/PhoneVisualTransformation.kt b/core/ui/src/main/java/com/susu/core/ui/util/PhoneVisualTransformation.kt new file mode 100644 index 00000000..e9bcf3e5 --- /dev/null +++ b/core/ui/src/main/java/com/susu/core/ui/util/PhoneVisualTransformation.kt @@ -0,0 +1,35 @@ +package com.susu.core.ui.util + +import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.text.input.OffsetMapping +import androidx.compose.ui.text.input.TransformedText +import androidx.compose.ui.text.input.VisualTransformation + +class PhoneVisualTransformation : VisualTransformation { + override fun filter(text: AnnotatedString): TransformedText { + val trimmed = if (text.text.length > 11) text.text.substring(0 until 11) else text.text + var out = "" + for (i in trimmed.indices) { + out += trimmed[i] + if (i == 2 || i == 6) out += "-" + } + + return TransformedText(AnnotatedString(out), phoneOffsetTranslator) + } + + private val phoneOffsetTranslator = object : OffsetMapping { + override fun originalToTransformed(offset: Int): Int { + if (offset <= 2) return offset + if (offset <= 6) return offset + 1 + if (offset <= 11) return offset + 2 + return 13 + } + + override fun transformedToOriginal(offset: Int): Int { + if (offset <= 3) return offset + if (offset <= 8) return offset - 1 + if (offset <= 13) return offset - 2 + return 11 + } + } +} From 9a1b0835b1fb20741623975db054560ef2b905c1 Mon Sep 17 00:00:00 2001 From: syb8200 Date: Mon, 19 Feb 2024 20:40:26 +0900 Subject: [PATCH 17/18] =?UTF-8?q?fix:=20=EB=B3=B4=EB=82=B4=EC=9A=94,=20?= =?UTF-8?q?=EB=B0=9B=EC=95=84=EC=9A=94=20=EC=97=B0=EB=9D=BD=EC=B2=98=20?= =?UTF-8?q?=ED=98=95=EC=8B=9D=20=EC=88=98=EC=A0=95=20(000-0000-0000)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../received/envelopeadd/content/phone/PhoneContent.kt | 2 ++ .../received/envelopedetail/ReceivedEnvelopeDetailScreen.kt | 4 +++- .../received/envelopeedit/ReceivedEnvelopeEditScreen.kt | 2 ++ feature/received/src/main/res/values/strings.xml | 6 ++---- .../susu/feature/envelopeadd/content/phone/PhoneContent.kt | 2 ++ .../susu/feature/envelopedetail/SentEnvelopeDetailScreen.kt | 3 ++- .../com/susu/feature/envelopeedit/SentEnvelopeEditScreen.kt | 2 ++ feature/sent/src/main/res/values/strings.xml | 4 ++-- 8 files changed, 17 insertions(+), 8 deletions(-) diff --git a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/phone/PhoneContent.kt b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/phone/PhoneContent.kt index 9e5ae26c..17e14602 100644 --- a/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/phone/PhoneContent.kt +++ b/feature/received/src/main/java/com/susu/feature/received/envelopeadd/content/phone/PhoneContent.kt @@ -27,6 +27,7 @@ import com.susu.core.designsystem.theme.SusuTheme import com.susu.core.ui.SnackbarToken import com.susu.core.ui.extension.collectWithLifecycle import com.susu.core.ui.util.AnnotatedText +import com.susu.core.ui.util.PhoneVisualTransformation import com.susu.feature.received.R import kotlinx.coroutines.android.awaitFrame import kotlinx.coroutines.launch @@ -105,6 +106,7 @@ fun PhoneContent( placeholderColor = Gray40, modifier = Modifier.fillMaxWidth().focusRequester(focusRequester), keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number), + visualTransformation = PhoneVisualTransformation(), ) Spacer(modifier = Modifier.size(SusuTheme.spacing.spacing_xl)) } diff --git a/feature/received/src/main/java/com/susu/feature/received/envelopedetail/ReceivedEnvelopeDetailScreen.kt b/feature/received/src/main/java/com/susu/feature/received/envelopedetail/ReceivedEnvelopeDetailScreen.kt index 400fd000..2ac802ce 100644 --- a/feature/received/src/main/java/com/susu/feature/received/envelopedetail/ReceivedEnvelopeDetailScreen.kt +++ b/feature/received/src/main/java/com/susu/feature/received/envelopedetail/ReceivedEnvelopeDetailScreen.kt @@ -32,6 +32,7 @@ import com.susu.core.ui.DialogToken import com.susu.core.ui.SnackbarToken import com.susu.core.ui.extension.collectWithLifecycle import com.susu.core.ui.extension.toMoneyFormat +import com.susu.core.ui.extension.toPhoneNumber import com.susu.core.ui.util.to_yyyy_korYear_M_korMonth_d_korDay import com.susu.feature.received.R import com.susu.feature.received.envelopedetail.component.DetailItem @@ -174,7 +175,8 @@ fun ReceivedEnvelopeDetailScreen( ) DetailItem( categoryText = stringResource(id = com.susu.core.ui.R.string.word_phone_number), - contentText = uiState.envelope.friend.phoneNumber, + contentText = if (uiState.envelope.friend.phoneNumber.isNullOrEmpty()) "" else + uiState.envelope.friend.phoneNumber.toPhoneNumber(), isEmptyContent = uiState.envelope.friend.phoneNumber.isEmpty(), ) DetailItem( diff --git a/feature/received/src/main/java/com/susu/feature/received/envelopeedit/ReceivedEnvelopeEditScreen.kt b/feature/received/src/main/java/com/susu/feature/received/envelopeedit/ReceivedEnvelopeEditScreen.kt index ccd86ac2..a53a76a0 100644 --- a/feature/received/src/main/java/com/susu/feature/received/envelopeedit/ReceivedEnvelopeEditScreen.kt +++ b/feature/received/src/main/java/com/susu/feature/received/envelopeedit/ReceivedEnvelopeEditScreen.kt @@ -51,6 +51,7 @@ import com.susu.core.model.Relationship import com.susu.core.ui.SnackbarToken import com.susu.core.ui.extension.collectWithLifecycle import com.susu.core.ui.extension.susuClickable +import com.susu.core.ui.util.PhoneVisualTransformation import com.susu.feature.received.R import com.susu.feature.received.envelopeedit.component.EditDetailItem import kotlinx.coroutines.android.awaitFrame @@ -298,6 +299,7 @@ fun ReceivedEnvelopeEditScreen( textStyle = SusuTheme.typography.title_s, keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number), modifier = Modifier.fillMaxWidth(), + visualTransformation = PhoneVisualTransformation(), ) } EditDetailItem( diff --git a/feature/received/src/main/res/values/strings.xml b/feature/received/src/main/res/values/strings.xml index f24ee9b3..271448bf 100644 --- a/feature/received/src/main/res/values/strings.xml +++ b/feature/received/src/main/res/values/strings.xml @@ -40,7 +40,7 @@ 복수로 선택하셔도 좋아요 누구에게 받았나요 이름을 입력해주세요 - 01012345678 + 010-1234-5678 %s님의 연락처를 남겨주세요 %s님의 받은 선물을 알려주세요 @@ -54,7 +54,7 @@ 방문 여부 선물 한끼 식사 - 01012345678 + 010-1234-5678 입력해주세요 방문여부 선물 @@ -69,10 +69,8 @@ 봉투가 삭제됐어요 종료일 추가 시작일만 지정 - 경조사는 10글자까지만 입력 가능해요 경조사명은 10글자까지만 입력 가능해요 - 100억 미만의 금액만 입력 가능해요 이름은 10글자까지만 입력 가능해요 나와의 관계는 10글자까지만 입력 가능해요 diff --git a/feature/sent/src/main/java/com/susu/feature/envelopeadd/content/phone/PhoneContent.kt b/feature/sent/src/main/java/com/susu/feature/envelopeadd/content/phone/PhoneContent.kt index bf7fe25b..da5581d9 100644 --- a/feature/sent/src/main/java/com/susu/feature/envelopeadd/content/phone/PhoneContent.kt +++ b/feature/sent/src/main/java/com/susu/feature/envelopeadd/content/phone/PhoneContent.kt @@ -28,6 +28,7 @@ import com.susu.core.designsystem.theme.SusuTheme import com.susu.core.ui.SnackbarToken import com.susu.core.ui.extension.collectWithLifecycle import com.susu.core.ui.util.AnnotatedText +import com.susu.core.ui.util.PhoneVisualTransformation import com.susu.feature.sent.R import kotlinx.coroutines.android.awaitFrame import kotlinx.coroutines.launch @@ -109,6 +110,7 @@ fun PhoneContent( placeholderColor = Gray40, modifier = modifier.fillMaxWidth().focusRequester(focusRequester), keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number), + visualTransformation = PhoneVisualTransformation(), ) Spacer(modifier = modifier.size(SusuTheme.spacing.spacing_xl)) } diff --git a/feature/sent/src/main/java/com/susu/feature/envelopedetail/SentEnvelopeDetailScreen.kt b/feature/sent/src/main/java/com/susu/feature/envelopedetail/SentEnvelopeDetailScreen.kt index 1f386d70..84a993ad 100644 --- a/feature/sent/src/main/java/com/susu/feature/envelopedetail/SentEnvelopeDetailScreen.kt +++ b/feature/sent/src/main/java/com/susu/feature/envelopedetail/SentEnvelopeDetailScreen.kt @@ -31,6 +31,7 @@ import com.susu.core.ui.DialogToken import com.susu.core.ui.SnackbarToken import com.susu.core.ui.extension.collectWithLifecycle import com.susu.core.ui.extension.toMoneyFormat +import com.susu.core.ui.extension.toPhoneNumber import com.susu.core.ui.util.to_yyyy_korYear_M_korMonth_d_korDay import com.susu.feature.envelopedetail.component.DetailItem import com.susu.feature.sent.R @@ -187,7 +188,7 @@ fun SentEnvelopeDetailScreen( ) DetailItem( categoryText = stringResource(com.susu.core.ui.R.string.word_phone_number), - contentText = friend.phoneNumber, + contentText = if (friend.phoneNumber.isNullOrEmpty()) "" else friend.phoneNumber.toPhoneNumber(), isEmptyContent = friend.phoneNumber.isEmpty(), ) DetailItem( diff --git a/feature/sent/src/main/java/com/susu/feature/envelopeedit/SentEnvelopeEditScreen.kt b/feature/sent/src/main/java/com/susu/feature/envelopeedit/SentEnvelopeEditScreen.kt index 1cb99f82..f73e01dd 100644 --- a/feature/sent/src/main/java/com/susu/feature/envelopeedit/SentEnvelopeEditScreen.kt +++ b/feature/sent/src/main/java/com/susu/feature/envelopeedit/SentEnvelopeEditScreen.kt @@ -55,6 +55,7 @@ import com.susu.core.model.Relationship import com.susu.core.ui.SnackbarToken import com.susu.core.ui.extension.collectWithLifecycle import com.susu.core.ui.extension.susuClickable +import com.susu.core.ui.util.PhoneVisualTransformation import com.susu.core.ui.util.to_yyyy_korYear_M_korMonth_d_korDay import com.susu.feature.envelopeedit.component.EditDetailItem import com.susu.feature.sent.R @@ -385,6 +386,7 @@ fun SentEnvelopeEditScreen( keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number), modifier = Modifier.fillMaxWidth(), maxLines = 2, + visualTransformation = PhoneVisualTransformation(), ) } EditDetailItem( diff --git a/feature/sent/src/main/res/values/strings.xml b/feature/sent/src/main/res/values/strings.xml index 87d7cf8c..4421847b 100644 --- a/feature/sent/src/main/res/values/strings.xml +++ b/feature/sent/src/main/res/values/strings.xml @@ -9,7 +9,7 @@ 내역 보기 김철수 한끼 식사 - 01012345678 + 010-1234-5678 입력해주세요 저장 @@ -25,7 +25,7 @@ 무엇을 선물했나요 %s님의 연락처를 남겨주세요 %s님의 - 01012345678 + 010-1234-5678 추가로 남기실 내용이 있나요 입력해주세요 다음 From 9c566d22e1dcadf985fdaa7e4c6f0dfdc20f131d Mon Sep 17 00:00:00 2001 From: syb8200 Date: Mon, 19 Feb 2024 20:41:35 +0900 Subject: [PATCH 18/18] =?UTF-8?q?chore:=20ktlint=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../envelopedetail/ReceivedEnvelopeDetailScreen.kt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/feature/received/src/main/java/com/susu/feature/received/envelopedetail/ReceivedEnvelopeDetailScreen.kt b/feature/received/src/main/java/com/susu/feature/received/envelopedetail/ReceivedEnvelopeDetailScreen.kt index 2ac802ce..921f0a6e 100644 --- a/feature/received/src/main/java/com/susu/feature/received/envelopedetail/ReceivedEnvelopeDetailScreen.kt +++ b/feature/received/src/main/java/com/susu/feature/received/envelopedetail/ReceivedEnvelopeDetailScreen.kt @@ -175,8 +175,11 @@ fun ReceivedEnvelopeDetailScreen( ) DetailItem( categoryText = stringResource(id = com.susu.core.ui.R.string.word_phone_number), - contentText = if (uiState.envelope.friend.phoneNumber.isNullOrEmpty()) "" else - uiState.envelope.friend.phoneNumber.toPhoneNumber(), + contentText = if (uiState.envelope.friend.phoneNumber.isNullOrEmpty()) { + "" + } else { + uiState.envelope.friend.phoneNumber.toPhoneNumber() + }, isEmptyContent = uiState.envelope.friend.phoneNumber.isEmpty(), ) DetailItem(