diff --git a/composeApp/src/androidMain/kotlin/org/whosin/client/core/util/KeyboardUtil.android.kt b/composeApp/src/androidMain/kotlin/org/whosin/client/core/util/KeyboardUtil.android.kt new file mode 100644 index 0000000..3a97cd7 --- /dev/null +++ b/composeApp/src/androidMain/kotlin/org/whosin/client/core/util/KeyboardUtil.android.kt @@ -0,0 +1,4 @@ +package org.whosin.client.core.util + +actual fun hideKeyboard() { +} \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/org/whosin/client/core/util/KeyboardUtil.kt b/composeApp/src/commonMain/kotlin/org/whosin/client/core/util/KeyboardUtil.kt new file mode 100644 index 0000000..bb88503 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/org/whosin/client/core/util/KeyboardUtil.kt @@ -0,0 +1,3 @@ +package org.whosin.client.core.util + +expect fun hideKeyboard() \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/org/whosin/client/presentation/auth/clubcode/ClubCodeInputScreen.kt b/composeApp/src/commonMain/kotlin/org/whosin/client/presentation/auth/clubcode/ClubCodeInputScreen.kt index 909ddf6..3bc7c7d 100644 --- a/composeApp/src/commonMain/kotlin/org/whosin/client/presentation/auth/clubcode/ClubCodeInputScreen.kt +++ b/composeApp/src/commonMain/kotlin/org/whosin/client/presentation/auth/clubcode/ClubCodeInputScreen.kt @@ -26,23 +26,24 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.platform.LocalSoftwareKeyboardController import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.lifecycle.compose.collectAsStateWithLifecycle -import kotlinx.coroutines.delay import coil3.compose.AsyncImage +import kotlinx.coroutines.delay import org.jetbrains.compose.resources.stringResource import org.jetbrains.compose.ui.tooling.preview.Preview import org.koin.compose.viewmodel.koinViewModel +import org.whosin.client.core.util.hideKeyboard import org.whosin.client.presentation.auth.login.component.CommonLoginButton import org.whosin.client.presentation.auth.login.component.NumberInputBox import whosinclient.composeapp.generated.resources.Res import whosinclient.composeapp.generated.resources.back_button import whosinclient.composeapp.generated.resources.club_code_confirm_button -import whosinclient.composeapp.generated.resources.club_code_error_message import whosinclient.composeapp.generated.resources.club_code_title_1 import whosinclient.composeapp.generated.resources.club_code_title_2 import whosinclient.composeapp.generated.resources.confirm_button @@ -62,6 +63,7 @@ fun ClubCodeInputScreen( val currentState = uiState.verificationState val focusRequesters = remember { List(6) { FocusRequester() } } val keyboardController = LocalSoftwareKeyboardController.current + val focusManager = LocalFocusManager.current LaunchedEffect(Unit) { delay(300) @@ -84,7 +86,7 @@ fun ClubCodeInputScreen( focusRequesters[0].requestFocus() viewModel.resetErrorState() } - if (currentState == ClubCodeState.SUCCESS){ + if (currentState == ClubCodeState.SUCCESS) { keyboardController?.hide() } } @@ -161,8 +163,11 @@ fun ClubCodeInputScreen( focusRequesters[index + 1].requestFocus() keyboardController?.show() } + // 마지막 자리 입력 완료 시 키보드 숨기기 else if (input.isNotEmpty() && index == 5) { + focusManager.clearFocus() keyboardController?.hide() + hideKeyboard() } // 현재 박스가 비워지고 이전 박스가 있으면 이전으로 이동 else if (input.isEmpty() && index > 0) { @@ -209,7 +214,7 @@ fun ClubCodeInputScreen( // 에러 메시지 if (currentState == ClubCodeState.ERROR) { Text( - text = uiState.errorMessage?:"예상치 못한 오류가 발생했습니다", + text = uiState.errorMessage ?: "예상치 못한 오류가 발생했습니다", fontSize = 16.sp, fontWeight = FontWeight.W500, color = Color(0xFFFF3636), @@ -232,7 +237,7 @@ fun ClubCodeInputScreen( onClick = { if (isComplete) { viewModel.confirmClubCode(clubCode = fullCode) - if (currentState == ClubCodeState.SUCCESS){ + if (currentState == ClubCodeState.SUCCESS) { keyboardController?.hide() } } @@ -294,7 +299,7 @@ fun ClubCodeInputScreen( text = stringResource(Res.string.confirm_button), onClick = { if (currentState == ClubCodeState.SUCCESS) { - if (uiState.clubId != null){ + if (uiState.clubId != null) { viewModel.addClub(uiState.clubId) } } else { diff --git a/composeApp/src/commonMain/kotlin/org/whosin/client/presentation/auth/login/EmailVerificationScreen.kt b/composeApp/src/commonMain/kotlin/org/whosin/client/presentation/auth/login/EmailVerificationScreen.kt index e6f08f8..784d1fb 100644 --- a/composeApp/src/commonMain/kotlin/org/whosin/client/presentation/auth/login/EmailVerificationScreen.kt +++ b/composeApp/src/commonMain/kotlin/org/whosin/client/presentation/auth/login/EmailVerificationScreen.kt @@ -25,6 +25,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.platform.LocalSoftwareKeyboardController import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign @@ -37,6 +38,7 @@ import org.jetbrains.compose.resources.stringResource import org.jetbrains.compose.ui.tooling.preview.Preview import org.koin.compose.koinInject import org.whosin.client.core.network.ApiResult +import org.whosin.client.core.util.hideKeyboard import org.whosin.client.data.repository.AuthRepository import org.whosin.client.presentation.auth.login.component.CommonLoginButton import org.whosin.client.presentation.auth.login.component.NumberInputBox @@ -58,6 +60,7 @@ fun EmailVerificationScreen( var errorMessage by remember { mutableStateOf(null) } val focusRequesters = remember { List(6) { FocusRequester() } } val keyboardController = LocalSoftwareKeyboardController.current + val focusManager = LocalFocusManager.current val authRepository: AuthRepository = koinInject() val coroutineScope = rememberCoroutineScope() @@ -134,8 +137,11 @@ fun EmailVerificationScreen( currentFocusIndex = index + 1 focusRequesters[index + 1].requestFocus() } + // 마지막 자리 입력 완료 시 키보드 숨기기 else if (input.isNotEmpty() && index == 5) { + focusManager.clearFocus() keyboardController?.hide() + hideKeyboard() } // 현재 박스가 비워지고 이전 박스가 있으면 이전으로 이동 else if (input.isEmpty() && index > 0) { diff --git a/composeApp/src/iosMain/kotlin/org/whosin/client/core/util/KeyboardUtil.ios.kt b/composeApp/src/iosMain/kotlin/org/whosin/client/core/util/KeyboardUtil.ios.kt new file mode 100644 index 0000000..bc761f4 --- /dev/null +++ b/composeApp/src/iosMain/kotlin/org/whosin/client/core/util/KeyboardUtil.ios.kt @@ -0,0 +1,12 @@ +package org.whosin.client.core.util + +import platform.UIKit.UIApplication +import platform.UIKit.endEditing +import platform.darwin.dispatch_async +import platform.darwin.dispatch_get_main_queue + +actual fun hideKeyboard() { + dispatch_async(dispatch_get_main_queue()) { + UIApplication.sharedApplication.keyWindow?.endEditing(true) + } +} \ No newline at end of file diff --git a/composeApp/src/jvmMain/kotlin/org/whosin/client/core/util/KeyboardUtil.jvm.kt b/composeApp/src/jvmMain/kotlin/org/whosin/client/core/util/KeyboardUtil.jvm.kt new file mode 100644 index 0000000..3a97cd7 --- /dev/null +++ b/composeApp/src/jvmMain/kotlin/org/whosin/client/core/util/KeyboardUtil.jvm.kt @@ -0,0 +1,4 @@ +package org.whosin.client.core.util + +actual fun hideKeyboard() { +} \ No newline at end of file diff --git a/composeApp/src/wasmJsMain/kotlin/org/whosin/client/core/util/KeyboardUtil.wasmJs.kt b/composeApp/src/wasmJsMain/kotlin/org/whosin/client/core/util/KeyboardUtil.wasmJs.kt new file mode 100644 index 0000000..3a97cd7 --- /dev/null +++ b/composeApp/src/wasmJsMain/kotlin/org/whosin/client/core/util/KeyboardUtil.wasmJs.kt @@ -0,0 +1,4 @@ +package org.whosin.client.core.util + +actual fun hideKeyboard() { +} \ No newline at end of file