@@ -26,6 +26,8 @@ import androidx.compose.foundation.layout.windowInsetsPadding
2626import androidx.compose.foundation.lazy.LazyRow
2727import androidx.compose.foundation.lazy.items
2828import androidx.compose.foundation.rememberScrollState
29+ import androidx.compose.foundation.text.KeyboardActions
30+ import androidx.compose.foundation.text.KeyboardOptions
2931import androidx.compose.foundation.verticalScroll
3032import androidx.compose.material3.ExperimentalMaterial3Api
3133import androidx.compose.material3.Text
@@ -36,7 +38,11 @@ import androidx.compose.runtime.remember
3638import androidx.compose.runtime.setValue
3739import androidx.compose.ui.Alignment
3840import androidx.compose.ui.Modifier
41+ import androidx.compose.ui.focus.FocusRequester
42+ import androidx.compose.ui.focus.focusRequester
3943import androidx.compose.ui.platform.LocalContext
44+ import androidx.compose.ui.platform.LocalFocusManager
45+ import androidx.compose.ui.text.input.ImeAction
4046import androidx.compose.ui.text.style.TextAlign
4147import androidx.compose.ui.tooling.preview.Preview
4248import androidx.compose.ui.unit.dp
@@ -62,6 +68,7 @@ import com.threegap.bitnagil.presentation.report.model.ReportSideEffect
6268import com.threegap.bitnagil.presentation.report.model.ReportState
6369import com.threegap.bitnagil.presentation.report.model.SubmitState
6470import com.threegap.bitnagil.presentation.report.model.uiTitle
71+ import kotlinx.coroutines.delay
6572import org.orbitmvi.orbit.compose.collectAsState
6673import org.orbitmvi.orbit.compose.collectSideEffect
6774
@@ -73,10 +80,15 @@ fun ReportScreenContainer(
7380) {
7481 val context = LocalContext .current
7582 val uiState by viewModel.collectAsState()
83+ val contentFocusRequester = remember { FocusRequester () }
7684
7785 viewModel.collectSideEffect { sideEffect ->
7886 when (sideEffect) {
7987 is ReportSideEffect .NavigateToBack -> navigateToBack()
88+ is ReportSideEffect .FocusOnContent -> {
89+ delay(100 )
90+ contentFocusRequester.requestFocus()
91+ }
8092 }
8193 }
8294
@@ -165,6 +177,7 @@ fun ReportScreenContainer(
165177 SubmitState .IDLE -> {
166178 ReportScreen (
167179 uiState = uiState,
180+ contentFocusRequester = contentFocusRequester,
168181 onReportTitleChange = viewModel::updateReportTitle,
169182 onReportContentChange = viewModel::updateReportContent,
170183 onShowImageSourceBottomSheet = viewModel::showImageSourceBottomSheet,
@@ -190,6 +203,7 @@ fun ReportScreenContainer(
190203@Composable
191204private fun ReportScreen (
192205 uiState : ReportState ,
206+ contentFocusRequester : FocusRequester ,
193207 onReportTitleChange : (String ) -> Unit ,
194208 onReportContentChange : (String ) -> Unit ,
195209 onShowImageSourceBottomSheet : () -> Unit ,
@@ -200,6 +214,7 @@ private fun ReportScreen(
200214 onBackClick : () -> Unit ,
201215) {
202216 val scrollState = rememberScrollState()
217+ val focusManager = LocalFocusManager .current
203218
204219 Column (
205220 modifier = Modifier
@@ -250,6 +265,12 @@ private fun ReportScreen(
250265 value = uiState.reportTitle,
251266 onValueChange = onReportTitleChange,
252267 singleLine = true ,
268+ keyboardActions = KeyboardActions (
269+ onDone = {
270+ focusManager.clearFocus()
271+ onShowReportCategoryBottomSheet()
272+ },
273+ ),
253274 placeholder = {
254275 Text (
255276 text = " 제보 제목을 작성해주세요." ,
@@ -263,15 +284,28 @@ private fun ReportScreen(
263284 ReportField (title = " 카테고리" ) {
264285 ReportCategorySelector (
265286 title = uiState.selectedCategory?.uiTitle,
266- onClick = onShowReportCategoryBottomSheet,
287+ onClick = {
288+ focusManager.clearFocus()
289+ onShowReportCategoryBottomSheet()
290+ },
267291 )
268292 }
269293
270294 ReportField (title = " 상세 제보 내용" ) {
271295 BitnagilTextField (
272296 value = uiState.reportContent,
273297 onValueChange = onReportContentChange,
274- modifier = Modifier .height(88 .dp),
298+ modifier = Modifier
299+ .height(88 .dp)
300+ .focusRequester(contentFocusRequester),
301+ keyboardOptions = KeyboardOptions (
302+ imeAction = ImeAction .Done ,
303+ ),
304+ keyboardActions = KeyboardActions (
305+ onDone = {
306+ focusManager.clearFocus()
307+ },
308+ ),
275309 placeholder = {
276310 Text (
277311 text = " 어떤 위험인지 간단히 설명해주세요.(100자 내외)" ,
@@ -318,6 +352,7 @@ private fun ReportScreen(
318352private fun Preview () {
319353 ReportScreen (
320354 uiState = ReportState .Init ,
355+ contentFocusRequester = remember { FocusRequester () },
321356 onReportTitleChange = {},
322357 onReportContentChange = {},
323358 onRemoveImage = {},
0 commit comments