diff --git a/feature/management-event/src/main/java/com/wap/wapp/feature/management/event/edit/EventEditScreen.kt b/feature/management-event/src/main/java/com/wap/wapp/feature/management/event/edit/EventEditScreen.kt index ec1a0e55..2eeeda5f 100644 --- a/feature/management-event/src/main/java/com/wap/wapp/feature/management/event/edit/EventEditScreen.kt +++ b/feature/management-event/src/main/java/com/wap/wapp/feature/management/event/edit/EventEditScreen.kt @@ -7,6 +7,7 @@ import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.IntrinsicSize import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.WindowInsets @@ -15,7 +16,9 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.wrapContentSize +import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.Divider @@ -159,6 +162,7 @@ internal fun EventEditScreen( var showEndTimePicker by remember { mutableStateOf(false) } var showDeleteEventDialog by remember { mutableStateOf(false) } val timePickerState = rememberTimePickerState() + val scrollState = rememberScrollState() Scaffold( snackbarHost = { SnackbarHost(snackBarHostState) }, @@ -177,6 +181,8 @@ internal fun EventEditScreen( Column( modifier = Modifier .fillMaxSize() + .verticalScroll(scrollState) + .height(IntrinsicSize.Max) .padding(paddingValues) .padding(vertical = 16.dp), ) { @@ -203,6 +209,7 @@ internal fun EventEditScreen( startTime = startTime, endDate = endDate, endTime = endTime, + scrollState = scrollState, showStartDatePicker = showStartDatePicker, showStartTimePicker = showStartTimePicker, showEndDatePicker = showEndDatePicker, diff --git a/feature/management-event/src/main/java/com/wap/wapp/feature/management/event/registration/EventRegistrationContent.kt b/feature/management-event/src/main/java/com/wap/wapp/feature/management/event/registration/EventRegistrationContent.kt index 759a93fa..93f00935 100644 --- a/feature/management-event/src/main/java/com/wap/wapp/feature/management/event/registration/EventRegistrationContent.kt +++ b/feature/management-event/src/main/java/com/wap/wapp/feature/management/event/registration/EventRegistrationContent.kt @@ -1,16 +1,14 @@ package com.wap.wapp.feature.management.event.registration +import androidx.compose.foundation.ScrollState import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.IntrinsicSize import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.verticalScroll import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Text import androidx.compose.material3.TimePickerState @@ -50,6 +48,7 @@ internal fun EventRegistrationContent( showStartTimePicker: Boolean, showEndDatePicker: Boolean, showEndTimePicker: Boolean, + scrollState: ScrollState, timePickerState: TimePickerState, onTitleChanged: (String) -> Unit, onContentChanged: (String) -> Unit, @@ -65,15 +64,9 @@ internal fun EventRegistrationContent( onNextButtonClicked: () -> Unit, onRegisterButtonClicked: () -> Unit, ) { - val scrollState = rememberScrollState() val coroutineScope = rememberCoroutineScope() - Column( - modifier = modifier - .fillMaxSize() - .verticalScroll(scrollState) - .height(IntrinsicSize.Max), - ) { + Column(modifier = modifier.fillMaxSize()) { when (eventRegistrationState) { EventRegistrationState.EVENT_DETAILS -> EventDetailsContent( eventTitle = eventTitle, diff --git a/feature/management-event/src/main/java/com/wap/wapp/feature/management/event/registration/EventRegistrationScreen.kt b/feature/management-event/src/main/java/com/wap/wapp/feature/management/event/registration/EventRegistrationScreen.kt index 973942e8..ab8fb5ab 100644 --- a/feature/management-event/src/main/java/com/wap/wapp/feature/management/event/registration/EventRegistrationScreen.kt +++ b/feature/management-event/src/main/java/com/wap/wapp/feature/management/event/registration/EventRegistrationScreen.kt @@ -5,12 +5,15 @@ import androidx.compose.animation.core.animateFloatAsState import androidx.compose.animation.core.spring import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.IntrinsicSize import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.LinearProgressIndicator import androidx.compose.material3.Scaffold @@ -134,6 +137,7 @@ internal fun EventRegistrationScreen( var showEndDatePicker by remember { mutableStateOf(false) } var showEndTimePicker by remember { mutableStateOf(false) } val timePickerState = rememberTimePickerState() + val scrollState = rememberScrollState() Scaffold( snackbarHost = { SnackbarHost(snackBarHostState) }, @@ -145,6 +149,8 @@ internal fun EventRegistrationScreen( Column( modifier = Modifier .fillMaxSize() + .verticalScroll(scrollState) + .height(IntrinsicSize.Max) .padding(paddingValues) // paddingValue padding .padding(top = 20.dp), // dp value padding ) { @@ -170,6 +176,7 @@ internal fun EventRegistrationScreen( startTime = startTime, endDate = endDate, endTime = endTime, + scrollState = scrollState, showStartDatePicker = showStartDatePicker, showStartTimePicker = showStartTimePicker, showEndDatePicker = showEndDatePicker, diff --git a/feature/management-survey/src/main/java/com/wap/wapp/feature/management/survey/SurveyEventContent.kt b/feature/management-survey/src/main/java/com/wap/wapp/feature/management/survey/SurveyEventContent.kt index db8409d3..12701cf2 100644 --- a/feature/management-survey/src/main/java/com/wap/wapp/feature/management/survey/SurveyEventContent.kt +++ b/feature/management-survey/src/main/java/com/wap/wapp/feature/management/survey/SurveyEventContent.kt @@ -4,8 +4,10 @@ import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.IntrinsicSize import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items @@ -38,7 +40,9 @@ internal fun SurveyEventContent( LazyColumn( verticalArrangement = Arrangement.spacedBy(16.dp), - modifier = Modifier.weight(1f), + modifier = Modifier + .fillMaxWidth() + .height(IntrinsicSize.Max), ) { when (eventsState) { is EventsState.Loading -> item { diff --git a/feature/management-survey/src/main/java/com/wap/wapp/feature/management/survey/SurveyFormContent.kt b/feature/management-survey/src/main/java/com/wap/wapp/feature/management/survey/SurveyFormContent.kt index ce2a49fc..cae6a975 100644 --- a/feature/management-survey/src/main/java/com/wap/wapp/feature/management/survey/SurveyFormContent.kt +++ b/feature/management-survey/src/main/java/com/wap/wapp/feature/management/survey/SurveyFormContent.kt @@ -87,9 +87,7 @@ internal fun SurveyFormContent( onAddSurveyQuestionButtonClicked = onAddQuestionButtonClicked, currentQuestionNumber = currentQuestionNumber, totalQuestionNumber = totalQuestionNumber, - onPreviousButtonClicked = { - onPreviousButtonClicked(SurveyFormState.INFORMATION) - }, + onPreviousButtonClicked = { onPreviousButtonClicked(SurveyFormState.INFORMATION) }, onNextButtonClicked = { onNextButtonClicked( SurveyFormState.QUESTION, @@ -113,9 +111,7 @@ internal fun SurveyFormContent( onTimeChanged = onTimeChanged, onRegisterButtonClicked = onRegisterButtonClicked, onDatePickerStateChanged = onDatePickerStateChanged, - onPreviousButtonClicked = { - onPreviousButtonClicked(SurveyFormState.QUESTION) - }, + onPreviousButtonClicked = { onPreviousButtonClicked(SurveyFormState.QUESTION) }, ) } } diff --git a/feature/management-survey/src/main/java/com/wap/wapp/feature/management/survey/SurveyInformationContent.kt b/feature/management-survey/src/main/java/com/wap/wapp/feature/management/survey/SurveyInformationContent.kt index ba91f118..14af03fc 100644 --- a/feature/management-survey/src/main/java/com/wap/wapp/feature/management/survey/SurveyInformationContent.kt +++ b/feature/management-survey/src/main/java/com/wap/wapp/feature/management/survey/SurveyInformationContent.kt @@ -8,8 +8,6 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier @@ -29,13 +27,9 @@ internal fun SurveyInformationContent( onPreviousButtonClicked: () -> Unit, onNextButtonClicked: () -> Unit, ) { - val scrollState = rememberScrollState() - Column( verticalArrangement = Arrangement.spacedBy(16.dp), - modifier = Modifier - .fillMaxSize() - .verticalScroll(scrollState), + modifier = Modifier.fillMaxSize(), ) { WappTitle( title = stringResource(R.string.survey_information_title), diff --git a/feature/management-survey/src/main/java/com/wap/wapp/feature/management/survey/SurveyQuestionContent.kt b/feature/management-survey/src/main/java/com/wap/wapp/feature/management/survey/SurveyQuestionContent.kt index 1b1f6adf..5076a4c7 100644 --- a/feature/management-survey/src/main/java/com/wap/wapp/feature/management/survey/SurveyQuestionContent.kt +++ b/feature/management-survey/src/main/java/com/wap/wapp/feature/management/survey/SurveyQuestionContent.kt @@ -51,13 +51,9 @@ internal fun SurveyQuestionContent( onNextButtonClicked: () -> Unit, onAddSurveyQuestionButtonClicked: () -> Unit, ) { - val scrollState = rememberScrollState() - Column( verticalArrangement = Arrangement.spacedBy(10.dp), - modifier = Modifier - .fillMaxSize() - .verticalScroll(scrollState), + modifier = Modifier.fillMaxSize() ) { WappTitle( title = stringResource(R.string.survey_question_title), diff --git a/feature/management-survey/src/main/java/com/wap/wapp/feature/management/survey/edit/SurveyFormEditScreen.kt b/feature/management-survey/src/main/java/com/wap/wapp/feature/management/survey/edit/SurveyFormEditScreen.kt index 04f812d6..df946301 100644 --- a/feature/management-survey/src/main/java/com/wap/wapp/feature/management/survey/edit/SurveyFormEditScreen.kt +++ b/feature/management-survey/src/main/java/com/wap/wapp/feature/management/survey/edit/SurveyFormEditScreen.kt @@ -5,6 +5,8 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Scaffold import androidx.compose.material3.SnackbarHost @@ -17,6 +19,10 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.input.nestedscroll.NestedScrollConnection +import androidx.compose.ui.input.nestedscroll.NestedScrollSource +import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle @@ -55,9 +61,22 @@ internal fun SurveyFormEditScreen( val timePickerState = rememberTimePickerState() var showDatePicker by remember { mutableStateOf(false) } var showTimePicker by remember { mutableStateOf(false) } - + val scrollState = rememberScrollState() var showDeleteSurveyDialog by remember { mutableStateOf(false) } + val nestedScrollConnection = remember { + object : NestedScrollConnection { + override fun onPreScroll( + available: Offset, + source: NestedScrollSource, + ): Offset { + + return Offset.Zero + } + } + } + + LaunchedEffect(true) { viewModel.getSurveyForm(surveyFormId) @@ -83,21 +102,12 @@ internal fun SurveyFormEditScreen( containerColor = WappTheme.colors.backgroundBlack, modifier = Modifier.fillMaxSize(), contentWindowInsets = WindowInsets(0.dp), - topBar = { - WappSubTopBar( - titleRes = R.string.survey_edit, - showLeftButton = true, - showRightButton = true, - leftButtonDrawableRes = drawable.ic_close, - modifier = Modifier.padding(top = 16.dp), - onClickLeftButton = navigateToManagement, - onClickRightButton = { showDeleteSurveyDialog = true }, - ) - }, ) { paddingValues -> Column( modifier = Modifier .fillMaxSize() + .nestedScroll(nestedScrollConnection) + .verticalScroll(scrollState) .padding(paddingValues) // paddingValue padding .padding(vertical = 16.dp, horizontal = 20.dp), // dp value padding verticalArrangement = Arrangement.spacedBy(20.dp), @@ -109,10 +119,18 @@ internal fun SurveyFormEditScreen( ) } - SurveyFormStateIndicator( - surveyRegistrationState = currentRegistrationState, + WappSubTopBar( + titleRes = R.string.survey_edit, + showLeftButton = true, + showRightButton = true, + leftButtonDrawableRes = drawable.ic_close, + modifier = Modifier.padding(top = 16.dp), + onClickLeftButton = navigateToManagement, + onClickRightButton = { showDeleteSurveyDialog = true }, ) + SurveyFormStateIndicator(surveyRegistrationState = currentRegistrationState) + SurveyFormContent( surveyRegistrationState = currentRegistrationState, eventsState = eventList, diff --git a/feature/management/src/main/java/com/wap/wapp/feature/management/ManagementSurveyCard.kt b/feature/management/src/main/java/com/wap/wapp/feature/management/ManagementSurveyCard.kt index 89deda34..3e114b6e 100644 --- a/feature/management/src/main/java/com/wap/wapp/feature/management/ManagementSurveyCard.kt +++ b/feature/management/src/main/java/com/wap/wapp/feature/management/ManagementSurveyCard.kt @@ -40,9 +40,7 @@ internal fun ManagementSurveyCard( ) { Card( shape = RoundedCornerShape(10.dp), - colors = CardDefaults.cardColors( - containerColor = WappTheme.colors.black25, - ), + colors = CardDefaults.cardColors(containerColor = WappTheme.colors.black25), modifier = Modifier .padding(vertical = 20.dp) .padding(horizontal = 8.dp), @@ -73,7 +71,7 @@ private fun ManagementSurveyContent( onAddSurveyButtonClicked: () -> Unit, ) { when (surveyFormsState) { - is ManagementViewModel.SurveyFormsState.Init -> { } + is ManagementViewModel.SurveyFormsState.Init -> {} is ManagementViewModel.SurveyFormsState.Loading -> CircleLoader( modifier = Modifier .fillMaxWidth() diff --git a/feature/management/src/main/java/com/wap/wapp/feature/management/ManagementViewModel.kt b/feature/management/src/main/java/com/wap/wapp/feature/management/ManagementViewModel.kt index 30f88485..8d940ff4 100644 --- a/feature/management/src/main/java/com/wap/wapp/feature/management/ManagementViewModel.kt +++ b/feature/management/src/main/java/com/wap/wapp/feature/management/ManagementViewModel.kt @@ -10,6 +10,7 @@ import com.wap.wapp.core.model.event.Event import com.wap.wapp.core.model.survey.SurveyForm import com.wap.wapp.core.model.user.UserRole import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.async import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharedFlow @@ -50,31 +51,36 @@ class ManagementViewModel @Inject constructor( } fun getEventSurveyList() = viewModelScope.launch { - launch { getMonthEventList() } - getSurveyFormList() - } - - private suspend fun getMonthEventList() { _eventList.value = EventsState.Loading + _surveyFormList.value = SurveyFormsState.Loading - getMonthEventListUseCase(generateNowDate()).onSuccess { events -> - _eventList.value = EventsState.Success(events) - }.onFailure { exception -> - _errorFlow.emit(exception) - _eventList.value = EventsState.Failure(exception) - } + val monthEventList = async { getMonthEventList() } + val surveyFormList = async { getSurveyFormList() } + + _eventList.value = monthEventList.await() + _surveyFormList.value = surveyFormList.await() } - private suspend fun getSurveyFormList() { - _surveyFormList.value = SurveyFormsState.Loading + private suspend fun getMonthEventList(): EventsState = + getMonthEventListUseCase(generateNowDate()).fold( + onSuccess = { events -> + EventsState.Success(events) + }, + onFailure = { exception -> + _errorFlow.emit(exception) + EventsState.Failure(exception) + }, + ) - getSurveyFormListUseCase().onSuccess { surveyForms -> - _surveyFormList.value = SurveyFormsState.Success(surveyForms) - }.onFailure { exception -> + private suspend fun getSurveyFormList(): SurveyFormsState = getSurveyFormListUseCase().fold( + onSuccess = { surveyForms -> + SurveyFormsState.Success(surveyForms) + }, + onFailure = { exception -> _errorFlow.emit(exception) - _eventList.value = EventsState.Failure(exception) - } - } + SurveyFormsState.Failure(exception) + }, + ) sealed class UserRoleUiState { data object Init : UserRoleUiState()