@@ -24,9 +24,9 @@ import androidx.compose.ui.res.stringResource
2424import androidx.compose.ui.res.vectorResource
2525import androidx.compose.ui.text.input.ImeAction
2626import androidx.compose.ui.text.input.KeyboardType
27- import androidx.compose.ui.tooling.preview.Preview
2827import androidx.compose.ui.unit.dp
2928import androidx.lifecycle.compose.collectAsStateWithLifecycle
29+ import androidx.lifecycle.viewmodel.compose.viewModel
3030import com.poti.android.R
3131import com.poti.android.core.common.extension.getSuccessDataOrNull
3232import com.poti.android.core.common.extension.noRippleClickable
@@ -43,7 +43,6 @@ import com.poti.android.core.designsystem.component.navigation.PotiBottomButton
4343import com.poti.android.core.designsystem.component.navigation.PotiHeaderPage
4444import com.poti.android.core.designsystem.theme.PotiTheme
4545import com.poti.android.domain.model.artist.MemberPriceOption
46- import com.poti.android.domain.model.delivery.DeliveryOption
4746import com.poti.android.presentation.party.create.component.CreateDeliverySetting
4847import com.poti.android.presentation.party.create.component.CreateDropdownField
4948import com.poti.android.presentation.party.create.component.CreateMemberSetting
@@ -53,11 +52,8 @@ import com.poti.android.presentation.party.create.component.ViewType
5352import com.poti.android.presentation.party.create.model.CreateUiEffect
5453import com.poti.android.presentation.party.create.model.CreateUiIntent
5554import com.poti.android.presentation.party.create.model.CreateUiState
56- import com.poti.android.presentation.party.create.model.FieldError
57- import com.poti.android.presentation.party.create.model.MemberSettingStatus
5855import com.poti.android.presentation.party.create.util.DateTransformation
5956import com.poti.android.presentation.party.create.util.toImageInfosForPresigned
60- import kotlinx.collections.immutable.persistentListOf
6157
6258@Composable
6359fun PartyCreateRoute (
@@ -150,9 +146,11 @@ fun PartyCreateRoute(
150146
151147 PartyCreateScreen (
152148 uiState = uiState,
149+ onScrollComplete = { viewModel.processIntent(CreateUiIntent .OnScrollComplete ) },
153150 onBackClick = { viewModel.processIntent(CreateUiIntent .OnBackClick ) },
154151 onImageChanged = { viewModel.processIntent(CreateUiIntent .OnImagesChanged (it)) },
155152 onSearchArtist = { viewModel.processIntent(CreateUiIntent .OnSearchClick ) },
153+ onProductFocusChanged = { viewModel.processIntent(CreateUiIntent .OnProductFocus (it)) },
156154 onProductChanged = { viewModel.processIntent(CreateUiIntent .OnProductChange (it)) },
157155 onProductSearchItemClick = { viewModel.processIntent(CreateUiIntent .OnProductSelect (it)) },
158156 onDeadlineChanged = { viewModel.processIntent(CreateUiIntent .OnDeadlineChange (it)) },
@@ -170,9 +168,11 @@ fun PartyCreateRoute(
170168@Composable
171169private fun PartyCreateScreen (
172170 uiState : CreateUiState ,
171+ onScrollComplete : () -> Unit ,
173172 onBackClick : () -> Unit ,
174173 onImageChanged : (List <Uri >) -> Unit ,
175174 onSearchArtist : () -> Unit ,
175+ onProductFocusChanged : (Boolean ) -> Unit ,
176176 onProductChanged : (String ) -> Unit ,
177177 onProductSearchItemClick : (String ) -> Unit ,
178178 onDeadlineChanged : (String ) -> Unit ,
@@ -188,31 +188,12 @@ private fun PartyCreateScreen(
188188 val listState = rememberLazyListState()
189189 val dateTransformation = remember { DateTransformation () }
190190
191- LaunchedEffect (
192- uiState.imageError,
193- uiState.artistError,
194- uiState.productError,
195- uiState.deadlineError,
196- uiState.descriptionError,
197- uiState.accountNumberError,
198- uiState.bankError,
199- uiState.memberSettingStatus,
200- ) {
201- val firstErrorFieldIndex = when {
202- uiState.imageError != null -> 0
203- uiState.artistError != null -> 1
204- uiState.productError != null -> 2
205- uiState.deadlineError != null -> 3
206- uiState.descriptionError != null -> 4
207- uiState.accountNumberError != null -> 5
208- uiState.bankError != null -> 6
209- uiState.memberSettingStatus == MemberSettingStatus .ERROR_NO_PRICE || uiState.memberSettingStatus == MemberSettingStatus .ERROR_NO_MEMBER -> 7
210- else -> null
211- }
212-
213- firstErrorFieldIndex?.let { index ->
191+ LaunchedEffect (uiState.errorIndexToScroll) {
192+ val index = uiState.errorIndexToScroll
193+ index?.let {
214194 listState.animateScrollToItem(index)
215195 }
196+ onScrollComplete()
216197 }
217198
218199 Scaffold (
@@ -274,8 +255,8 @@ private fun PartyCreateScreen(
274255 Icon (
275256 imageVector = ImageVector .vectorResource(R .drawable.ic_search),
276257 contentDescription = null ,
277- tint = PotiTheme .colors.black ,
278- modifier = Modifier .size(18 .dp),
258+ tint = PotiTheme .colors.gray700 ,
259+ modifier = Modifier .size(24 .dp),
279260 )
280261 },
281262 )
@@ -295,6 +276,8 @@ private fun PartyCreateScreen(
295276 .padding(bottom = 28 .dp),
296277 fieldErrorMsg = uiState.productError?.let { stringResource(it.message) } ? : " " ,
297278 selectedString = uiState.selectedProductName,
279+ readOnly = uiState.isProductFieldReadOnly,
280+ onFocusChanged = onProductFocusChanged,
298281 )
299282 }
300283
@@ -407,101 +390,3 @@ private fun PartyCreateScreen(
407390 }
408391 }
409392}
410-
411- @Preview
412- @Composable
413- private fun PartyCreateScreenDefaultPreview () {
414- val deliveryOptions =
415- persistentListOf(
416- DeliveryOption (deliveryId = 1 , name = " 일반택배" , price = 4000 ),
417- DeliveryOption (deliveryId = 2 , name = " 준등기" , price = 1800 ),
418- )
419- val selectedDeliveryIds = setOf (1 .toLong())
420-
421- PotiTheme {
422- PartyCreateScreen (
423- uiState = CreateUiState (
424- editableDeliveryOptions = deliveryOptions,
425- selectedDeliveryIds = selectedDeliveryIds,
426- ),
427- onBackClick = {},
428- onImageChanged = {},
429- onSearchArtist = {},
430- onProductChanged = {},
431- onProductSearchItemClick = {},
432- onDeadlineChanged = {},
433- onDescriptionChanged = {},
434- onAccountNumberChanged = {},
435- onBankChanged = {},
436- onMemberPriceChanged = {},
437- onMemberEditBtnClick = {},
438- onDeliveryRadioBtnClick = {},
439- onCreateBtnClick = {},
440- )
441- }
442- }
443-
444- @Preview
445- @Composable
446- private fun PartyCreateScreenAccountNumberErrorPreview () {
447- val deliveryOptions =
448- persistentListOf(
449- DeliveryOption (deliveryId = 1 , name = " 일반택배" , price = 4000 ),
450- DeliveryOption (deliveryId = 2 , name = " 준등기" , price = 1800 ),
451- )
452- var accountNumberError by remember { mutableStateOf<FieldError ?>(null ) }
453-
454- PotiTheme {
455- PartyCreateScreen (
456- uiState = CreateUiState (
457- editableDeliveryOptions = deliveryOptions,
458- accountNumberError = accountNumberError,
459- ),
460- onBackClick = {},
461- onImageChanged = {},
462- onSearchArtist = {},
463- onProductChanged = {},
464- onProductSearchItemClick = {},
465- onDeadlineChanged = {},
466- onDescriptionChanged = {},
467- onAccountNumberChanged = {},
468- onBankChanged = {},
469- onMemberPriceChanged = {},
470- onMemberEditBtnClick = {},
471- onDeliveryRadioBtnClick = {},
472- onCreateBtnClick = { accountNumberError = FieldError .ACCOUNT_NUMBER_ERROR },
473- )
474- }
475- }
476-
477- @Preview
478- @Composable
479- private fun PartyCreateMemberPreview () {
480- val deliveryOptions =
481- persistentListOf(
482- DeliveryOption (deliveryId = 1 , name = " 일반택배" , price = 4000 ),
483- DeliveryOption (deliveryId = 2 , name = " 준등기" , price = 1800 ),
484- )
485-
486- PotiTheme {
487- PartyCreateScreen (
488- uiState = CreateUiState (
489- editableDeliveryOptions = deliveryOptions,
490- memberSettingStatus = MemberSettingStatus .ERROR_NO_MEMBER ,
491- ),
492- onBackClick = {},
493- onImageChanged = {},
494- onSearchArtist = {},
495- onProductChanged = {},
496- onProductSearchItemClick = {},
497- onDeadlineChanged = {},
498- onDescriptionChanged = {},
499- onAccountNumberChanged = {},
500- onBankChanged = {},
501- onMemberPriceChanged = {},
502- onMemberEditBtnClick = {},
503- onDeliveryRadioBtnClick = {},
504- onCreateBtnClick = {},
505- )
506- }
507- }
0 commit comments