Skip to content

Commit

Permalink
[REFACTOR] #125 : 병렬적으로 데이터 받아서 가끔 Loading 상태 갱신 안된던 버그 수정
Browse files Browse the repository at this point in the history
  • Loading branch information
tgyuuAn committed Feb 16, 2024
1 parent 8e0c8ea commit 6c472a6
Show file tree
Hide file tree
Showing 10 changed files with 85 additions and 66 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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) },
Expand All @@ -177,6 +181,8 @@ internal fun EventEditScreen(
Column(
modifier = Modifier
.fillMaxSize()
.verticalScroll(scrollState)
.height(IntrinsicSize.Max)
.padding(paddingValues)
.padding(vertical = 16.dp),
) {
Expand All @@ -203,6 +209,7 @@ internal fun EventEditScreen(
startTime = startTime,
endDate = endDate,
endTime = endTime,
scrollState = scrollState,
showStartDatePicker = showStartDatePicker,
showStartTimePicker = showStartTimePicker,
showEndDatePicker = showEndDatePicker,
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -50,6 +48,7 @@ internal fun EventRegistrationContent(
showStartTimePicker: Boolean,
showEndDatePicker: Boolean,
showEndTimePicker: Boolean,
scrollState: ScrollState,
timePickerState: TimePickerState,
onTitleChanged: (String) -> Unit,
onContentChanged: (String) -> Unit,
Expand All @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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) },
Expand All @@ -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
) {
Expand All @@ -170,6 +176,7 @@ internal fun EventRegistrationScreen(
startTime = startTime,
endDate = endDate,
endTime = endTime,
scrollState = scrollState,
showStartDatePicker = showStartDatePicker,
showStartTimePicker = showStartTimePicker,
showEndDatePicker = showEndDatePicker,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -113,9 +111,7 @@ internal fun SurveyFormContent(
onTimeChanged = onTimeChanged,
onRegisterButtonClicked = onRegisterButtonClicked,
onDatePickerStateChanged = onDatePickerStateChanged,
onPreviousButtonClicked = {
onPreviousButtonClicked(SurveyFormState.QUESTION)
},
onPreviousButtonClicked = { onPreviousButtonClicked(SurveyFormState.QUESTION) },
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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)

Expand All @@ -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),
Expand All @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand Down Expand Up @@ -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()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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()
Expand Down

0 comments on commit 6c472a6

Please sign in to comment.