diff --git a/app/build.gradle.kts b/app/build.gradle.kts index a3f4bcba8..7f26c5109 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -11,8 +11,8 @@ android { namespace = "com.idle.care" defaultConfig { - versionCode = 9 - versionName = "1.1.2" + versionCode = 10 + versionName = "1.1.3" targetSdk = 34 testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" diff --git a/core/common-ui/compose/src/main/java/com/idle/compose/ModifierUtil.kt b/core/common-ui/compose/src/main/java/com/idle/compose/ModifierUtil.kt index e9d6e265f..633207deb 100644 --- a/core/common-ui/compose/src/main/java/com/idle/compose/ModifierUtil.kt +++ b/core/common-ui/compose/src/main/java/com/idle/compose/ModifierUtil.kt @@ -4,12 +4,19 @@ import androidx.compose.foundation.clickable import androidx.compose.foundation.gestures.detectTapGestures import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier +import androidx.compose.ui.composed import androidx.compose.ui.focus.FocusManager import androidx.compose.ui.input.pointer.pointerInput -fun Modifier.addFocusCleaner(focusManager: FocusManager, doOnClear: () -> Unit = {}): Modifier { +fun Modifier.addFocusCleaner( + focusManager: FocusManager, + doOnClear: () -> Unit = {}, +): Modifier { return this.pointerInput(Unit) { detectTapGestures( onTap = { @@ -23,12 +30,20 @@ fun Modifier.addFocusCleaner(focusManager: FocusManager, doOnClear: () -> Unit = @Composable fun Modifier.clickable( enabled: Boolean = true, + throttleTime: Long = 0L, onClick: () -> Unit, -): Modifier { - return this.clickable( +): Modifier = composed { + var lastClickTime by remember { mutableStateOf(0L) } + + this.clickable( interactionSource = remember { MutableInteractionSource() }, indication = null, enabled = enabled, - onClick = onClick, - ) -} \ No newline at end of file + ) { + val currentTime = System.currentTimeMillis() + if (currentTime - lastClickTime >= throttleTime) { + onClick() + lastClickTime = currentTime + } + } +} diff --git a/core/designsystem/compose/src/main/java/com/idle/designsystem/compose/component/Button.kt b/core/designsystem/compose/src/main/java/com/idle/designsystem/compose/component/Button.kt index 25238edb2..21e080ea3 100644 --- a/core/designsystem/compose/src/main/java/com/idle/designsystem/compose/component/Button.kt +++ b/core/designsystem/compose/src/main/java/com/idle/designsystem/compose/component/Button.kt @@ -12,6 +12,10 @@ import androidx.compose.material3.Button import androidx.compose.material3.ButtonColors import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.tooling.preview.Devices @@ -26,9 +30,18 @@ fun CareButtonSmall( onClick: () -> Unit, enable: Boolean, modifier: Modifier = Modifier, + throttleTime: Long = 0L, ) { + var lastClickTime by remember { mutableStateOf(0L) } + Button( - onClick = onClick, + onClick = { + val currentTime = System.currentTimeMillis() + if (currentTime - lastClickTime >= throttleTime) { + onClick() + lastClickTime = currentTime + } + }, enabled = enable, shape = RoundedCornerShape(8.dp), contentPadding = PaddingValues(0.dp), @@ -57,9 +70,18 @@ fun CareButtonMedium( containerColor: Color = CareTheme.colors.orange500, textColor: Color = CareTheme.colors.white000, border: BorderStroke? = null, + throttleTime: Long = 0L, ) { + var lastClickTime by remember { mutableStateOf(0L) } + Button( - onClick = onClick, + onClick = { + val currentTime = System.currentTimeMillis() + if (currentTime - lastClickTime >= throttleTime) { + onClick() + lastClickTime = currentTime + } + }, enabled = enable, shape = RoundedCornerShape(8.dp), border = border, @@ -89,9 +111,18 @@ fun CareButtonLarge( disabledContainerColor: Color = CareTheme.colors.gray200, textColor: Color = CareTheme.colors.white000, border: BorderStroke? = null, + throttleTime: Long = 0L, ) { + var lastClickTime by remember { mutableStateOf(0L) } + Button( - onClick = onClick, + onClick = { + val currentTime = System.currentTimeMillis() + if (currentTime - lastClickTime >= throttleTime) { + onClick() + lastClickTime = currentTime + } + }, enabled = enable, shape = RoundedCornerShape(8.dp), colors = ButtonColors( @@ -117,9 +148,18 @@ fun CareButtonCardLarge( onClick: () -> Unit, modifier: Modifier = Modifier, enable: Boolean = true, + throttleTime: Long = 0L, ) { + var lastClickTime by remember { mutableStateOf(0L) } + Button( - onClick = onClick, + onClick = { + val currentTime = System.currentTimeMillis() + if (currentTime - lastClickTime >= throttleTime) { + onClick() + lastClickTime = currentTime + } + }, enabled = enable, shape = RoundedCornerShape(6.dp), colors = ButtonColors( @@ -147,9 +187,18 @@ fun CareButtonCardMedium( containerColor: Color = CareTheme.colors.orange500, textColor: Color = CareTheme.colors.white000, border: BorderStroke? = null, + throttleTime: Long = 0L, ) { + var lastClickTime by remember { mutableStateOf(0L) } + Button( - onClick = onClick, + onClick = { + val currentTime = System.currentTimeMillis() + if (currentTime - lastClickTime >= throttleTime) { + onClick() + lastClickTime = currentTime + } + }, enabled = enable, border = border, shape = RoundedCornerShape(6.dp), @@ -175,9 +224,18 @@ fun CareButtonRound( onClick: () -> Unit, modifier: Modifier = Modifier, enable: Boolean = true, + throttleTime: Long = 0L, ) { + var lastClickTime by remember { mutableStateOf(0L) } + Button( - onClick = onClick, + onClick = { + val currentTime = System.currentTimeMillis() + if (currentTime - lastClickTime >= throttleTime) { + onClick() + lastClickTime = currentTime + } + }, enabled = enable, shape = RoundedCornerShape(19.dp), border = BorderStroke(width = 1.dp, color = CareTheme.colors.gray100), @@ -207,9 +265,18 @@ fun CareButtonLine( borderColor: Color = CareTheme.colors.orange400, containerColor: Color = CareTheme.colors.white000, textColor: Color = CareTheme.colors.orange500, + throttleTime: Long = 0L, ) { + var lastClickTime by remember { mutableStateOf(0L) } + Button( - onClick = onClick, + onClick = { + val currentTime = System.currentTimeMillis() + if (currentTime - lastClickTime >= throttleTime) { + onClick() + lastClickTime = currentTime + } + }, enabled = enable, shape = RoundedCornerShape(6.dp), border = BorderStroke( @@ -241,9 +308,18 @@ fun CareDialogButton( modifier: Modifier = Modifier, border: BorderStroke? = null, enable: Boolean = true, + throttleTime: Long = 0L, ) { + var lastClickTime by remember { mutableStateOf(0L) } + Button( - onClick = onClick, + onClick = { + val currentTime = System.currentTimeMillis() + if (currentTime - lastClickTime >= throttleTime) { + onClick() + lastClickTime = currentTime + } + }, enabled = enable, shape = RoundedCornerShape(6.dp), border = border, @@ -273,9 +349,18 @@ fun CareFloatingButton( modifier: Modifier = Modifier, border: BorderStroke? = null, enable: Boolean = true, + throttleTime: Long = 0L, ) { + var lastClickTime by remember { mutableStateOf(0L) } + Button( - onClick = onClick, + onClick = { + val currentTime = System.currentTimeMillis() + if (currentTime - lastClickTime >= throttleTime) { + onClick() + lastClickTime = currentTime + } + }, enabled = enable, shape = RoundedCornerShape(50.dp), border = border, @@ -440,7 +525,11 @@ private fun PreviewButtonPrimaryDefaultFloating() { } // Flip Group Previews -@Preview(name = "Button_Primary_Flip_Large", showBackground = true, device = FLIP, group = "Flip") +@Preview( + name = "Button_Primary_Flip_Large", showBackground = true, + device = FLIP, + group = "Flip" +) @Composable private fun PreviewButtonPrimaryFlipLarge() { PreviewButtonLarge() diff --git a/core/designsystem/compose/src/main/java/com/idle/designsystem/compose/component/TextField.kt b/core/designsystem/compose/src/main/java/com/idle/designsystem/compose/component/TextField.kt index 94a169509..0136bbb13 100644 --- a/core/designsystem/compose/src/main/java/com/idle/designsystem/compose/component/TextField.kt +++ b/core/designsystem/compose/src/main/java/com/idle/designsystem/compose/component/TextField.kt @@ -21,7 +21,10 @@ import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalSoftwareKeyboardController @@ -51,6 +54,7 @@ fun CareTextField( readOnly: Boolean = false, enabled: Boolean = true, isError: Boolean = false, + throttleTime: Long = 0L, onDone: () -> Unit = {}, textStyle: TextStyle = CareTheme.typography.body3.copy( color = if (readOnly) { @@ -74,6 +78,7 @@ fun CareTextField( CareTheme.colors.gray100 }, ) + var lastDoneTime by remember { mutableStateOf(0L) } Column( verticalArrangement = Arrangement.spacedBy(4.dp), @@ -110,8 +115,12 @@ fun CareTextField( imeAction = ImeAction.Done ), keyboardActions = KeyboardActions(onDone = { - keyboardController?.hide() - onDone() + val currentTime = System.currentTimeMillis() + if (currentTime - lastDoneTime >= throttleTime) { + keyboardController?.hide() + onDone() + lastDoneTime = currentTime + } }), modifier = Modifier .weight(1f) @@ -156,6 +165,7 @@ fun CareTextField( readOnly: Boolean = false, enabled: Boolean = true, isError: Boolean = false, + throttleTime: Long = 0L, onDone: () -> Unit = {}, textStyle: TextStyle = CareTheme.typography.body3.copy( color = if (readOnly) { @@ -179,6 +189,7 @@ fun CareTextField( CareTheme.colors.gray100 }, ) + var lastDoneTime by remember { mutableStateOf(0L) } Row( verticalAlignment = Alignment.CenterVertically, @@ -211,8 +222,12 @@ fun CareTextField( imeAction = ImeAction.Done ), keyboardActions = KeyboardActions(onDone = { - keyboardController?.hide() - onDone() + val currentTime = System.currentTimeMillis() + if (currentTime - lastDoneTime >= throttleTime) { + keyboardController?.hide() + onDone() + lastDoneTime = currentTime + } }), modifier = Modifier .weight(1f) @@ -244,6 +259,7 @@ fun CareTextFieldLong( isError: Boolean = false, visualTransformation: VisualTransformation = VisualTransformation.None, onValueChanged: (String) -> Unit, + throttleTime: Long = 0L, onDone: () -> Unit = {}, modifier: Modifier = Modifier, ) { @@ -260,6 +276,7 @@ fun CareTextFieldLong( CareTheme.colors.gray100 }, ) + var lastDoneTime by remember { mutableStateOf(0L) } Box( modifier = modifier @@ -293,8 +310,12 @@ fun CareTextFieldLong( visualTransformation = visualTransformation, keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done), keyboardActions = KeyboardActions(onDone = { - onDone() - keyboardController?.hide() + val currentTime = System.currentTimeMillis() + if (currentTime - lastDoneTime >= throttleTime) { + keyboardController?.hide() + onDone() + lastDoneTime = currentTime + } }), modifier = Modifier.fillMaxSize(), decorationBox = { innerTextField -> @@ -318,6 +339,7 @@ fun CareClickableTextField( onClick: () -> Unit, modifier: Modifier = Modifier, hint: String = "", + throttleTime: Long = 0L, leftComponent: @Composable () -> Unit = {}, ) { Row( @@ -330,7 +352,10 @@ fun CareClickableTextField( border = BorderStroke(width = 1.dp, color = CareTheme.colors.gray100), shape = RoundedCornerShape(6.dp) ) - .clickable(onClick = onClick) + .clickable( + onClick = onClick, + throttleTime = throttleTime, + ) .padding(horizontal = 16.dp), ) { Text( diff --git a/core/navigation/src/main/java/com/idle/navigation/NavigationHelper.kt b/core/navigation/src/main/java/com/idle/navigation/NavigationHelper.kt index 50ae0f573..5c2fbe6be 100644 --- a/core/navigation/src/main/java/com/idle/navigation/NavigationHelper.kt +++ b/core/navigation/src/main/java/com/idle/navigation/NavigationHelper.kt @@ -53,12 +53,10 @@ class NavigationHelper @Inject constructor() { listOf( NavigationEvent.NavigateTo(CenterHome), NavigationEvent.NavigateTo(CenterJobDetail(jobPostingId)), - NavigationEvent.NavigateTo(CenterApplicantInquiry(jobPostingId)), ) } else { listOf( NavigationEvent.NavigateTo(CenterJobDetail(jobPostingId)), - NavigationEvent.NavigateTo(CenterApplicantInquiry(jobPostingId)), ) } @@ -100,7 +98,6 @@ class NavigationHelper @Inject constructor() { notificationContent?.let { content -> listOf( NavigationEvent.NavigateTo(CenterJobDetail(content.jobPostingId)), - NavigationEvent.NavigateTo(CenterApplicantInquiry(content.jobPostingId)), ) } ?: listOf() } diff --git a/feature/center/job-posting-edit/src/main/java/com/idle/center/job/edit/JobEditScreen.kt b/feature/center/job-posting-edit/src/main/java/com/idle/center/job/edit/JobEditScreen.kt index 4049b3a8d..7d50c75ca 100644 --- a/feature/center/job-posting-edit/src/main/java/com/idle/center/job/edit/JobEditScreen.kt +++ b/feature/center/job-posting-edit/src/main/java/com/idle/center/job/edit/JobEditScreen.kt @@ -420,7 +420,7 @@ fun JobEditScreen( text = stringResource(id = R.string.save), style = CareTheme.typography.subtitle2, color = CareTheme.colors.orange500, - modifier = Modifier.clickable { + modifier = Modifier.clickable(throttleTime = 2000L) { if (localWeekDays.isEmpty()) { showSnackBar("근무 요일은 최소한 하나 이상을 선택해야 합니다.") return@clickable diff --git a/feature/center/job-posting-post/src/main/java/com/idle/center/jobposting/step/JobPostingSummary.kt b/feature/center/job-posting-post/src/main/java/com/idle/center/jobposting/step/JobPostingSummary.kt index 8b4c5819c..c1367a374 100644 --- a/feature/center/job-posting-post/src/main/java/com/idle/center/jobposting/step/JobPostingSummary.kt +++ b/feature/center/job-posting-post/src/main/java/com/idle/center/jobposting/step/JobPostingSummary.kt @@ -139,6 +139,7 @@ internal fun JobPostingSummaryScreen( CareButtonLarge( text = stringResource(id = R.string.confirm), onClick = postJobPosting, + throttleTime = 2000L, modifier = Modifier .fillMaxWidth() .padding(start = 20.dp, end = 20.dp, bottom = 28.dp), diff --git a/feature/center/pending/src/main/java/com/idle/pending/CenterPendingFragment.kt b/feature/center/pending/src/main/java/com/idle/pending/CenterPendingFragment.kt index 2cc59785e..835f5b005 100644 --- a/feature/center/pending/src/main/java/com/idle/pending/CenterPendingFragment.kt +++ b/feature/center/pending/src/main/java/com/idle/pending/CenterPendingFragment.kt @@ -35,6 +35,7 @@ import androidx.compose.ui.unit.dp import androidx.fragment.app.viewModels import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.navigation.fragment.navArgs +import com.idle.analytics.businessmetric.TrackScreenViewEvent import com.idle.center.pending.R import com.idle.compose.base.BaseComposeFragment import com.idle.compose.clickable @@ -163,6 +164,7 @@ private fun CenterPendingScreen( else "관리자 인증 요청 중이에요", onClick = sendVerificationRequest, enable = status == CenterManagerAccountStatus.NEW, + throttleTime = 2000L, modifier = Modifier .fillMaxWidth() .background(CareTheme.colors.white000) @@ -171,6 +173,8 @@ private fun CenterPendingScreen( ) } } + + TrackScreenViewEvent(screenName = "center_pending_screen") } @Composable diff --git a/feature/center/profile/src/main/java/com/idle/center/profile/CenterProfileFragment.kt b/feature/center/profile/src/main/java/com/idle/center/profile/CenterProfileFragment.kt index bc2e29e62..a0e67c546 100644 --- a/feature/center/profile/src/main/java/com/idle/center/profile/CenterProfileFragment.kt +++ b/feature/center/profile/src/main/java/com/idle/center/profile/CenterProfileFragment.kt @@ -144,7 +144,7 @@ internal fun CenterProfileScreen( text = stringResource(id = R.string.save), style = CareTheme.typography.subtitle2, color = CareTheme.colors.orange500, - modifier = Modifier.clickable { + modifier = Modifier.clickable(throttleTime = 2000L) { updateCenterProfile() } ) @@ -271,7 +271,7 @@ internal fun CenterProfileScreen( Box( modifier = Modifier .padding(bottom = 60.dp) - .clickable { + .clickable(throttleTime = 2000L) { if (isEditState) singlePhotoPickerLauncher.launch( PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly) ) diff --git a/feature/center/register-info/src/main/java/com/idle/center/register/step/CenterIntroduceScreen.kt b/feature/center/register-info/src/main/java/com/idle/center/register/step/CenterIntroduceScreen.kt index 6743efb18..a780cd214 100644 --- a/feature/center/register-info/src/main/java/com/idle/center/register/step/CenterIntroduceScreen.kt +++ b/feature/center/register-info/src/main/java/com/idle/center/register/step/CenterIntroduceScreen.kt @@ -121,7 +121,7 @@ internal fun CenterIntroduceScreen( .height(243.dp) .fillMaxWidth() .clip(RoundedCornerShape(6.dp)) - .clickable { + .clickable(throttleTime = 2000L) { singlePhotoPickerLauncher.launch( PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly) ) diff --git a/feature/center/register-info/src/main/java/com/idle/center/register/step/CenterRegisterSummaryScreen.kt b/feature/center/register-info/src/main/java/com/idle/center/register/step/CenterRegisterSummaryScreen.kt index 67c9ef6b0..476a14e0b 100644 --- a/feature/center/register-info/src/main/java/com/idle/center/register/step/CenterRegisterSummaryScreen.kt +++ b/feature/center/register-info/src/main/java/com/idle/center/register/step/CenterRegisterSummaryScreen.kt @@ -193,6 +193,7 @@ internal fun CenterRegisterSummaryScreen( CareButtonMedium( text = stringResource(id = R.string.confirm), onClick = registerCenterProfile, + throttleTime = 2000L, modifier = Modifier.weight(1f), ) } diff --git a/feature/notification/src/main/java/com/idle/notification/NotificationFragment.kt b/feature/notification/src/main/java/com/idle/notification/NotificationFragment.kt index ce650cef0..61228ec76 100644 --- a/feature/notification/src/main/java/com/idle/notification/NotificationFragment.kt +++ b/feature/notification/src/main/java/com/idle/notification/NotificationFragment.kt @@ -179,7 +179,7 @@ private fun NotificationItem( verticalAlignment = Alignment.CenterVertically, modifier = Modifier .fillMaxWidth() - .clickable { onClick(notification) } + .clickable(throttleTime = 2000L) { onClick(notification) } .padding(horizontal = 20.dp, vertical = 12.dp) ) { AsyncImage( diff --git a/feature/signin/src/main/java/com/idle/signin/center/CenterSignInFragment.kt b/feature/signin/src/main/java/com/idle/signin/center/CenterSignInFragment.kt index 58c88372f..fa71fe0ab 100644 --- a/feature/signin/src/main/java/com/idle/signin/center/CenterSignInFragment.kt +++ b/feature/signin/src/main/java/com/idle/signin/center/CenterSignInFragment.kt @@ -154,6 +154,7 @@ internal fun CenterSignInScreen( isError = isLoginError, visualTransformation = PasswordVisualTransformation(), onDone = { if (centerPassword.isNotBlank()) signInCenter() }, + throttleTime = 2000L, modifier = Modifier .fillMaxWidth() .padding(bottom = 2.dp), @@ -183,6 +184,7 @@ internal fun CenterSignInScreen( text = stringResource(id = R.string.login), enable = centerPassword.isNotBlank(), onClick = signInCenter, + throttleTime = 2000L, modifier = Modifier .fillMaxWidth() .padding(bottom = 28.dp), diff --git a/feature/signin/src/main/java/com/idle/signin/center/newpassword/step/GenerateNewPasswordScreen.kt b/feature/signin/src/main/java/com/idle/signin/center/newpassword/step/GenerateNewPasswordScreen.kt index 2350b48a5..74160f53e 100644 --- a/feature/signin/src/main/java/com/idle/signin/center/newpassword/step/GenerateNewPasswordScreen.kt +++ b/feature/signin/src/main/java/com/idle/signin/center/newpassword/step/GenerateNewPasswordScreen.kt @@ -128,6 +128,7 @@ internal fun GenerateNewPasswordScreen( visualTransformation = PasswordVisualTransformation(), isError = newPasswordForConfirm.isNotBlank() && newPassword != newPasswordForConfirm, onDone = { if (isPasswordValid) generateNewPassword() }, + throttleTime = 2000L, modifier = Modifier.fillMaxWidth() ) } @@ -146,6 +147,7 @@ internal fun GenerateNewPasswordScreen( text = stringResource(id = R.string.change_password), enable = isPasswordValid, onClick = generateNewPassword, + throttleTime = 2000L, modifier = Modifier .fillMaxWidth() .padding(bottom = 28.dp), diff --git a/feature/signin/src/main/java/com/idle/signin/center/newpassword/step/PhoneNumberScreen.kt b/feature/signin/src/main/java/com/idle/signin/center/newpassword/step/PhoneNumberScreen.kt index f082ca2a9..dd86c53e8 100644 --- a/feature/signin/src/main/java/com/idle/signin/center/newpassword/step/PhoneNumberScreen.kt +++ b/feature/signin/src/main/java/com/idle/signin/center/newpassword/step/PhoneNumberScreen.kt @@ -81,6 +81,7 @@ internal fun PhoneNumberScreen( CareButtonSmall( enable = phoneNumber.length == 11 && !(timerMinute != "" && timerSeconds != ""), + throttleTime = 2000L, text = stringResource(id = R.string.verification), onClick = sendPhoneNumber, ) @@ -104,6 +105,7 @@ internal fun PhoneNumberScreen( onValueChanged = onAuthCodeChanged, isError = isAuthCodeError, onDone = { confirmAuthCode() }, + throttleTime = 2000L, supportingText = if (isAuthCodeError) stringResource(R.string.confirm_code_error_description) else if (isConfirmAuthCode) "인증이 완료되었습니다." else "", readOnly = !(timerMinute != "" && timerSeconds != "") || isConfirmAuthCode, @@ -121,6 +123,7 @@ internal fun PhoneNumberScreen( CareButtonSmall( enable = authCode.isNotBlank() && !isConfirmAuthCode, + throttleTime = 2000L, text = stringResource(id = R.string.confirm_short), onClick = confirmAuthCode, ) diff --git a/feature/signup/src/main/java/com/idle/signup/center/step/CenterPhoneNumberScreen.kt b/feature/signup/src/main/java/com/idle/signup/center/step/CenterPhoneNumberScreen.kt index b267dc032..9e7b9deea 100644 --- a/feature/signup/src/main/java/com/idle/signup/center/step/CenterPhoneNumberScreen.kt +++ b/feature/signup/src/main/java/com/idle/signup/center/step/CenterPhoneNumberScreen.kt @@ -81,6 +81,7 @@ internal fun CenterPhoneNumberScreen( onDone = { if (centerPhoneNumber.length == 11) sendPhoneNumber() }, + throttleTime = 2000L, modifier = Modifier .weight(1f) .focusRequester(focusRequester), @@ -90,6 +91,7 @@ internal fun CenterPhoneNumberScreen( enable = centerPhoneNumber.length == 11 && !(centerAuthCodeTimerMinute != "" && centerAuthCodeTimerSeconds != ""), text = stringResource(id = R.string.verification), + throttleTime = 2000L, onClick = sendPhoneNumber, ) } @@ -114,6 +116,7 @@ internal fun CenterPhoneNumberScreen( isError = isAuthCodeError, readOnly = !(centerAuthCodeTimerMinute != "" && centerAuthCodeTimerSeconds != "") || isConfirmAuthCode, onDone = { if (centerAuthCode.isNotBlank()) confirmAuthCode() }, + throttleTime = 2000L, supportingText = if (isAuthCodeError) stringResource(R.string.confirm_code_error_description) else if (isConfirmAuthCode) "* 인증이 완료되었습니다." else "", leftComponent = { @@ -131,6 +134,7 @@ internal fun CenterPhoneNumberScreen( CareButtonSmall( enable = centerAuthCode.isNotBlank() && !isConfirmAuthCode, text = stringResource(id = R.string.confirm_short), + throttleTime = 2000L, onClick = confirmAuthCode, ) } diff --git a/feature/signup/src/main/java/com/idle/signup/center/step/IdPasswordScreen.kt b/feature/signup/src/main/java/com/idle/signup/center/step/IdPasswordScreen.kt index ed76009c1..9ad502d6c 100644 --- a/feature/signup/src/main/java/com/idle/signup/center/step/IdPasswordScreen.kt +++ b/feature/signup/src/main/java/com/idle/signup/center/step/IdPasswordScreen.kt @@ -257,6 +257,7 @@ internal fun IdPasswordScreen( isPasswordConfirmFieldFocused = false keyboardController?.hide() }, + throttleTime = 2000L, modifier = Modifier.weight(1f), ) } diff --git a/feature/signup/src/main/java/com/idle/signup/worker/step/AddressScreen.kt b/feature/signup/src/main/java/com/idle/signup/worker/step/AddressScreen.kt index fc6ff4406..1cb1271c3 100644 --- a/feature/signup/src/main/java/com/idle/signup/worker/step/AddressScreen.kt +++ b/feature/signup/src/main/java/com/idle/signup/worker/step/AddressScreen.kt @@ -80,6 +80,7 @@ internal fun AddressScreen( enable = roadNameAddress.isNotBlank(), onClick = signUpWorker, modifier = Modifier.weight(1f), + throttleTime = 2000L, ) } } diff --git a/feature/signup/src/main/java/com/idle/signup/worker/step/WorkerPhoneNumberScreen.kt b/feature/signup/src/main/java/com/idle/signup/worker/step/WorkerPhoneNumberScreen.kt index 93a874c00..d1346695a 100644 --- a/feature/signup/src/main/java/com/idle/signup/worker/step/WorkerPhoneNumberScreen.kt +++ b/feature/signup/src/main/java/com/idle/signup/worker/step/WorkerPhoneNumberScreen.kt @@ -75,6 +75,7 @@ internal fun WorkerPhoneNumberScreen( onValueChanged = { onWorkerPhoneNumberChanged(it) }, readOnly = (workerAuthCodeTimerMinute != "" && workerAuthCodeTimerSeconds != ""), onDone = { if (workerPhoneNumber.length == 11) sendPhoneNumber() }, + throttleTime = 2000L, modifier = Modifier .weight(1f) .focusRequester(focusRequester), @@ -84,6 +85,7 @@ internal fun WorkerPhoneNumberScreen( enable = workerPhoneNumber.length == 11 && !(workerAuthCodeTimerMinute != "" && workerAuthCodeTimerSeconds != ""), text = stringResource(id = R.string.verification), + throttleTime = 2000L, onClick = sendPhoneNumber, ) } @@ -106,6 +108,7 @@ internal fun WorkerPhoneNumberScreen( hint = "", onValueChanged = onWorkerAuthCodeChanged, onDone = { if (workerAuthCode.isNotBlank() && !isConfirmAuthCode) confirmAuthCode() }, + throttleTime = 2000L, isError = isAuthCodeError, supportingText = if (isAuthCodeError) stringResource(R.string.confirm_code_error_description) else if (isConfirmAuthCode) "* 인증이 완료되었습니다." else "", @@ -125,6 +128,7 @@ internal fun WorkerPhoneNumberScreen( CareButtonSmall( enable = workerAuthCode.isNotBlank() && !isConfirmAuthCode, text = stringResource(id = R.string.confirm_short), + throttleTime = 2000L, onClick = confirmAuthCode, ) } diff --git a/feature/withdrawal/src/main/java/com/idle/withdrawal/step/PhoneNumberScreen.kt b/feature/withdrawal/src/main/java/com/idle/withdrawal/step/PhoneNumberScreen.kt index 3acbcef1a..0f726a1dc 100644 --- a/feature/withdrawal/src/main/java/com/idle/withdrawal/step/PhoneNumberScreen.kt +++ b/feature/withdrawal/src/main/java/com/idle/withdrawal/step/PhoneNumberScreen.kt @@ -86,6 +86,7 @@ internal fun PhoneNumberScreen( }, readOnly = (timerMinute != "" && timerSeconds != ""), onDone = { if (phoneNumber.length == 11) sendPhoneNumber() }, + throttleTime = 2000L, modifier = Modifier .weight(1f) .focusRequester(focusRequester), @@ -95,6 +96,7 @@ internal fun PhoneNumberScreen( enable = phoneNumber.length == 11 && !(timerMinute != "" && timerSeconds != ""), text = stringResource(id = R.string.verification), + throttleTime = 2000L, onClick = sendPhoneNumber, ) } @@ -124,6 +126,7 @@ internal fun PhoneNumberScreen( }, readOnly = !(timerMinute != "" && timerSeconds != "") || isConfirmAuthCode, onDone = { if (authCode.isNotBlank()) confirmAuthCode() }, + throttleTime = 2000L, leftComponent = { if (timerMinute != "" && timerSeconds != "") { Text( @@ -146,6 +149,7 @@ internal fun PhoneNumberScreen( CareButtonSmall( enable = authCode.isNotBlank() && !isConfirmAuthCode, text = stringResource(id = R.string.confirm_short), + throttleTime = 2000L, onClick = confirmAuthCode, ) } diff --git a/feature/worker/profile/src/main/java/com/idle/worker/profile/WorkerProfileFragment.kt b/feature/worker/profile/src/main/java/com/idle/worker/profile/WorkerProfileFragment.kt index 4d79bd541..a82ff425a 100644 --- a/feature/worker/profile/src/main/java/com/idle/worker/profile/WorkerProfileFragment.kt +++ b/feature/worker/profile/src/main/java/com/idle/worker/profile/WorkerProfileFragment.kt @@ -284,7 +284,7 @@ internal fun WorkerProfileScreen( text = stringResource(id = R.string.save), style = CareTheme.typography.subtitle2, color = CareTheme.colors.orange500, - modifier = Modifier.clickable { + modifier = Modifier.clickable(throttleTime = 2000L) { updateWorkerProfile() } ) @@ -337,7 +337,10 @@ internal fun WorkerProfileScreen( ) { Box( modifier = Modifier - .clickable(enabled = isEditState) { + .clickable( + enabled = isEditState, + throttleTime = 2000L, + ) { singlePhotoPickerLauncher.launch( PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly) )