From 622f64c50e978556d4d15f2348cd0ee77e302d83 Mon Sep 17 00:00:00 2001 From: Jeong Sang Hoon Date: Sat, 17 Aug 2024 17:43:41 +0900 Subject: [PATCH 01/15] =?UTF-8?q?[chore]=20=EC=9B=A8=EC=9D=B4=ED=8C=85?= =?UTF-8?q?=ED=99=94=EB=A9=B4=20=EB=A6=AC=EC=86=8C=EC=8A=A4=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/unifest/android/core/designsystem/theme/Font.kt | 6 ++++++ core/designsystem/src/main/res/values/strings.xml | 2 ++ 2 files changed, 8 insertions(+) diff --git a/core/designsystem/src/main/kotlin/com/unifest/android/core/designsystem/theme/Font.kt b/core/designsystem/src/main/kotlin/com/unifest/android/core/designsystem/theme/Font.kt index 4b8345b7..8f05f415 100644 --- a/core/designsystem/src/main/kotlin/com/unifest/android/core/designsystem/theme/Font.kt +++ b/core/designsystem/src/main/kotlin/com/unifest/android/core/designsystem/theme/Font.kt @@ -181,3 +181,9 @@ val WaitingNumber3 = TextStyle( fontWeight = FontWeight.Bold, fontSize = 15.sp, ) + +val WaitingNumber4 = TextStyle( + fontFamily = pretendardFamily, + fontWeight = FontWeight.Bold, + fontSize = 18.sp, +) diff --git a/core/designsystem/src/main/res/values/strings.xml b/core/designsystem/src/main/res/values/strings.xml index 076116ef..d727ba29 100644 --- a/core/designsystem/src/main/res/values/strings.xml +++ b/core/designsystem/src/main/res/values/strings.xml @@ -65,6 +65,8 @@ 웨이팅 취소 부스 확인하기 번째 + 웨이팅을 취소합니다 + 정말 취소 하시겠습니까? 메뉴 From 55bb0a2404a387aff9155ee082fb8be3e5405323 Mon Sep 17 00:00:00 2001 From: Jeong Sang Hoon Date: Sat, 17 Aug 2024 17:44:16 +0900 Subject: [PATCH 02/15] =?UTF-8?q?[feat]=20=EC=9B=A8=EC=9D=B4=ED=8C=85=20?= =?UTF-8?q?=ED=83=AD=20=EB=82=B4=20=EC=9B=A8=EC=9D=B4=ED=8C=85=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20api=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../android/core/data/di/RepositoryModule.kt | 6 + .../core/data/mapper/MyWaitingMapper.kt | 19 +++ .../core/data/repository/WaitingRepository.kt | 7 ++ .../data/repository/WaitingRepositoryImpl.kt | 20 +++ .../core/designsystem/component/Dialog.kt | 20 +++ .../android/core/model/MyWaitingModel.kt | 17 +++ .../network/response/MyWaitingResponse.kt | 38 ++++++ .../core/network/service/UnifestService.kt | 8 ++ feature/waiting/build.gradle.kts | 2 + .../android/feature/waiting/WaitingScreen.kt | 117 ++++++++++++------ .../waiting/viewmodel/WaitingUiAction.kt | 4 +- .../waiting/viewmodel/WaitingUiState.kt | 9 +- .../waiting/viewmodel/WaitingViewModel.kt | 41 +++++- 13 files changed, 263 insertions(+), 45 deletions(-) create mode 100644 core/data/src/main/kotlin/com/unifest/android/core/data/mapper/MyWaitingMapper.kt create mode 100644 core/data/src/main/kotlin/com/unifest/android/core/data/repository/WaitingRepository.kt create mode 100644 core/data/src/main/kotlin/com/unifest/android/core/data/repository/WaitingRepositoryImpl.kt create mode 100644 core/model/src/main/kotlin/com/unifest/android/core/model/MyWaitingModel.kt create mode 100644 core/network/src/main/kotlin/com/unifest/android/core/network/response/MyWaitingResponse.kt diff --git a/core/data/src/main/kotlin/com/unifest/android/core/data/di/RepositoryModule.kt b/core/data/src/main/kotlin/com/unifest/android/core/data/di/RepositoryModule.kt index 771564e0..ab8ac5e3 100644 --- a/core/data/src/main/kotlin/com/unifest/android/core/data/di/RepositoryModule.kt +++ b/core/data/src/main/kotlin/com/unifest/android/core/data/di/RepositoryModule.kt @@ -12,6 +12,8 @@ import com.unifest.android.core.data.repository.OnboardingRepository import com.unifest.android.core.data.repository.OnboardingRepositoryImpl import com.unifest.android.core.data.repository.RemoteConfigRepository import com.unifest.android.core.data.repository.RemoteConfigRepositoryImpl +import com.unifest.android.core.data.repository.WaitingRepository +import com.unifest.android.core.data.repository.WaitingRepositoryImpl import dagger.Binds import dagger.Module import dagger.hilt.InstallIn @@ -44,4 +46,8 @@ internal abstract class RepositoryModule { @Binds @Singleton abstract fun bindRemoteConfigRepository(remoteConfigRepositoryImpl: RemoteConfigRepositoryImpl): RemoteConfigRepository + + @Binds + @Singleton + abstract fun bingWaitingRepository(waitingRepositoryImpl: WaitingRepositoryImpl): WaitingRepository } diff --git a/core/data/src/main/kotlin/com/unifest/android/core/data/mapper/MyWaitingMapper.kt b/core/data/src/main/kotlin/com/unifest/android/core/data/mapper/MyWaitingMapper.kt new file mode 100644 index 00000000..2bbc2757 --- /dev/null +++ b/core/data/src/main/kotlin/com/unifest/android/core/data/mapper/MyWaitingMapper.kt @@ -0,0 +1,19 @@ +package com.unifest.android.core.data.mapper + +import com.unifest.android.core.model.MyWaitingModel +import com.unifest.android.core.network.response.MyWaiting + +internal fun MyWaiting.toModel(): MyWaitingModel { + return MyWaitingModel( + boothId = boothId, + waitingId = waitingId, + partySize = partySize, + tel = tel, + deviceId = deviceId, + createdAt = createdAt, + updatedAt = updatedAt, + status = status, + waitingOrder = waitingOrder, + boothName = boothName, + ) +} diff --git a/core/data/src/main/kotlin/com/unifest/android/core/data/repository/WaitingRepository.kt b/core/data/src/main/kotlin/com/unifest/android/core/data/repository/WaitingRepository.kt new file mode 100644 index 00000000..942dfdd2 --- /dev/null +++ b/core/data/src/main/kotlin/com/unifest/android/core/data/repository/WaitingRepository.kt @@ -0,0 +1,7 @@ +package com.unifest.android.core.data.repository + +import com.unifest.android.core.model.MyWaitingModel + +interface WaitingRepository { + suspend fun getMyWaitingList(): Result> +} diff --git a/core/data/src/main/kotlin/com/unifest/android/core/data/repository/WaitingRepositoryImpl.kt b/core/data/src/main/kotlin/com/unifest/android/core/data/repository/WaitingRepositoryImpl.kt new file mode 100644 index 00000000..f4c9c234 --- /dev/null +++ b/core/data/src/main/kotlin/com/unifest/android/core/data/repository/WaitingRepositoryImpl.kt @@ -0,0 +1,20 @@ +package com.unifest.android.core.data.repository + +import android.content.Context +import com.unifest.android.core.common.getDeviceId +import com.unifest.android.core.data.mapper.toModel +import com.unifest.android.core.data.util.runSuspendCatching +import com.unifest.android.core.network.service.UnifestService +import dagger.hilt.android.qualifiers.ApplicationContext +import javax.inject.Inject + +class WaitingRepositoryImpl @Inject constructor( + @ApplicationContext private val context: Context, + private val service: UnifestService, +) : WaitingRepository { + override suspend fun getMyWaitingList() = runSuspendCatching { + service.getMyWaitingList( + deviceId = getDeviceId(context) + ).data.map { it.toModel() } + } +} diff --git a/core/designsystem/src/main/kotlin/com/unifest/android/core/designsystem/component/Dialog.kt b/core/designsystem/src/main/kotlin/com/unifest/android/core/designsystem/component/Dialog.kt index 29209db7..eea1b835 100644 --- a/core/designsystem/src/main/kotlin/com/unifest/android/core/designsystem/component/Dialog.kt +++ b/core/designsystem/src/main/kotlin/com/unifest/android/core/designsystem/component/Dialog.kt @@ -676,6 +676,26 @@ fun AppUpdateDialog( } } +@Composable +fun WaitingCancelDialog( + onCancelClick: () -> Unit, + onConfirmClick: () -> Unit, +) { + UnifestTheme { + UnifestDialog( + onDismissRequest = {}, + titleResId = R.string.waiting_cancel_dialog_title, + iconResId = R.drawable.ic_caution, + iconDescription = "Caution Icon", + descriptionResId = R.string.waiting_cancel_dialog_description, + confirmTextResId = R.string.confirm, + cancelTextResId = R.string.cancel, + onCancelClick = onCancelClick, + onConfirmClick = onConfirmClick, + ) + } +} + @ComponentPreview @Composable fun ServerErrorDialogPreview() { diff --git a/core/model/src/main/kotlin/com/unifest/android/core/model/MyWaitingModel.kt b/core/model/src/main/kotlin/com/unifest/android/core/model/MyWaitingModel.kt new file mode 100644 index 00000000..33af4f6b --- /dev/null +++ b/core/model/src/main/kotlin/com/unifest/android/core/model/MyWaitingModel.kt @@ -0,0 +1,17 @@ +package com.unifest.android.core.model + +import androidx.compose.runtime.Stable + +@Stable +data class MyWaitingModel( + val boothId: Long = 0L, + val waitingId: Long = 0L, + val partySize: Long = 0L, + val tel: String = "", + val deviceId: String = "", + val createdAt: String = "", + val updatedAt: String = "", + val status: String = "", + val waitingOrder: Long = 0L, + val boothName: String = "", +) diff --git a/core/network/src/main/kotlin/com/unifest/android/core/network/response/MyWaitingResponse.kt b/core/network/src/main/kotlin/com/unifest/android/core/network/response/MyWaitingResponse.kt new file mode 100644 index 00000000..e8b66918 --- /dev/null +++ b/core/network/src/main/kotlin/com/unifest/android/core/network/response/MyWaitingResponse.kt @@ -0,0 +1,38 @@ +package com.unifest.android.core.network.response + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class MyWaitingResponse( + @SerialName("code") + val code: String, + @SerialName("message") + val message: String, + @SerialName("data") + val data: List, +) + +@Serializable +data class MyWaiting( + @SerialName("boothId") + val boothId: Long = 0L, + @SerialName("waitingId") + val waitingId: Long = 0L, + @SerialName("partySize") + val partySize: Long = 0L, + @SerialName("tel") + val tel: String = "", + @SerialName("deviceId") + val deviceId: String = "", + @SerialName("createdAt") + val createdAt: String = "", + @SerialName("updatedAt") + val updatedAt: String = "", + @SerialName("status") + val status: String = "", + @SerialName("waitingOrder") + val waitingOrder: Long = 0L, + @SerialName("boothName") + val boothName: String = "", +) diff --git a/core/network/src/main/kotlin/com/unifest/android/core/network/service/UnifestService.kt b/core/network/src/main/kotlin/com/unifest/android/core/network/service/UnifestService.kt index 92d6f491..1ad7a0d2 100644 --- a/core/network/src/main/kotlin/com/unifest/android/core/network/service/UnifestService.kt +++ b/core/network/src/main/kotlin/com/unifest/android/core/network/service/UnifestService.kt @@ -10,6 +10,7 @@ import com.unifest.android.core.network.response.FestivalSearchResponse import com.unifest.android.core.network.response.FestivalTodayResponse import com.unifest.android.core.network.response.LikeBoothResponse import com.unifest.android.core.network.response.LikedBoothsResponse +import com.unifest.android.core.network.response.MyWaitingResponse import com.unifest.android.core.network.response.PopularBoothsResponse import com.unifest.android.core.network.response.WaitingResponse import retrofit2.http.Body @@ -79,4 +80,11 @@ interface UnifestService { suspend fun requestBoothWaiting( @Body boothWaitingRequest: BoothWaitingRequest, ): WaitingResponse + + @GET("waiting/me/{deviceId}") + suspend fun getMyWaitingList( + @Path("deviceId") deviceId: String, + ): MyWaitingResponse + + } diff --git a/feature/waiting/build.gradle.kts b/feature/waiting/build.gradle.kts index e6c8d31f..7f7b1ac9 100644 --- a/feature/waiting/build.gradle.kts +++ b/feature/waiting/build.gradle.kts @@ -11,6 +11,8 @@ android { dependencies { implementations( + projects.core.data, + libs.kotlinx.collections.immutable, libs.timber, ) diff --git a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/WaitingScreen.kt b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/WaitingScreen.kt index 1105e007..d88a7415 100644 --- a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/WaitingScreen.kt +++ b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/WaitingScreen.kt @@ -15,6 +15,7 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Card import androidx.compose.material3.CardColors @@ -31,6 +32,7 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.vectorResource +import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.hilt.navigation.compose.hiltViewModel @@ -39,8 +41,10 @@ import com.unifest.android.core.common.ObserveAsEvents import com.unifest.android.core.designsystem.ComponentPreview import com.unifest.android.core.designsystem.R import com.unifest.android.core.designsystem.component.UnifestOutlinedButton +import com.unifest.android.core.designsystem.component.WaitingCancelDialog import com.unifest.android.core.designsystem.theme.BoothTitle2 import com.unifest.android.core.designsystem.theme.Content1 +import com.unifest.android.core.designsystem.theme.Content2 import com.unifest.android.core.designsystem.theme.Content7 import com.unifest.android.core.designsystem.theme.DarkRed import com.unifest.android.core.designsystem.theme.LightGrey100 @@ -52,6 +56,8 @@ import com.unifest.android.core.designsystem.theme.Title5 import com.unifest.android.core.designsystem.theme.UnifestTheme import com.unifest.android.core.designsystem.theme.WaitingNumber import com.unifest.android.core.designsystem.theme.WaitingNumber2 +import com.unifest.android.core.designsystem.theme.WaitingNumber4 +import com.unifest.android.core.model.MyWaitingModel import com.unifest.android.core.ui.DevicePreview import com.unifest.android.feature.waiting.viewmodel.WaitingUiAction import com.unifest.android.feature.waiting.viewmodel.WaitingUiEvent @@ -79,7 +85,6 @@ internal fun WaitingRoute( ) } -@Suppress("UNUSED_PARAMETER") @Composable internal fun WaitingScreen( padding: PaddingValues, @@ -143,41 +148,63 @@ internal fun WaitingScreen( } } item { Spacer(modifier = Modifier.height(8.dp)) } - item { - WaitInfoCard(location = "컴공 주점", order = 35, waitingNumber = 112, people = 3) + + itemsIndexed( + items = waitingUiState.myWaitingList, + key = { _, waitingItem -> waitingItem.waitingId }, + ) { _, waitingItem -> + Column { + Spacer(modifier = Modifier.height(16.dp)) + WaitingInfoItem( + myWaitingModel = waitingItem, + onWaitingCancelClick = { onWaitingUiAction(WaitingUiAction.OnCancelWaitingClick) }, + onCheckBoothDetailClick = { onWaitingUiAction(WaitingUiAction.OnCheckBoothDetailClick) }, + ) + } + Spacer(modifier = Modifier.height(8.dp)) + } + } + } + if (waitingUiState.myWaitingList.isEmpty()) { + Box( + modifier = Modifier + .fillMaxSize(), + contentAlignment = Alignment.Center + ) { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, + ) { + Text( + text = "신청한 웨이팅이 없어요", + style = WaitingNumber4, + ) Spacer(modifier = Modifier.height(8.dp)) - WaitInfoCard(location = "학생회 부스", order = 13, waitingNumber = 134, people = 3) + Text( + text = "주점/부스 구경하러 가기>", + style = Content2.copy( + textDecoration = TextDecoration.Underline + ), + color = MaterialTheme.colorScheme.onSurfaceVariant, + ) } } -// if (waitingUiState.waitingLists.isEmpty()) { -// Column( -// modifier = Modifier -// .fillMaxSize() -// .padding(bottom = 50.dp), -// verticalArrangement = Arrangement.Center, -// horizontalAlignment = Alignment.CenterHorizontally, -// ) { -// Text( -// text = "신청한 웨이팅이 없어요", -// style = Title4.copy(fontSize = 16.sp), -// ) -// Spacer(modifier = Modifier.height(8.dp)) -// Text( -// text = "주점/부스 구경하러 가기>", -// style = Title4.copy(fontSize = 14.sp), -// color = Color.Gray, -// ) -// } -// } + } + + if (waitingUiState.isWaitingCancelDialogVisible) { + WaitingCancelDialog( + onCancelClick = { onWaitingUiAction(WaitingUiAction.OnWaitingCancelDialogCancelClick) }, + onConfirmClick = { onWaitingUiAction(WaitingUiAction.OnWaitingCancelDialogConfirmClick) }, + ) } } + @Composable -fun WaitInfoCard( - location: String, - order: Int, - waitingNumber: Int, - people: Int, +fun WaitingInfoItem( + myWaitingModel: MyWaitingModel, + onWaitingCancelClick: () -> Unit, + onCheckBoothDetailClick: () -> Unit, ) { Card( colors = CardColors( @@ -212,7 +239,7 @@ fun WaitInfoCard( ) Spacer(modifier = Modifier.width(5.dp)) Text( - text = location, + text = myWaitingModel.boothName, color = MaterialTheme.colorScheme.onBackground, style = Title3, ) @@ -228,7 +255,7 @@ fun WaitInfoCard( verticalAlignment = Alignment.Bottom, ) { Text( - text = order.toString(), + text = myWaitingModel.waitingOrder.toString(), style = WaitingNumber, color = MaterialTheme.colorScheme.primary, modifier = Modifier.alignByBaseline(), @@ -251,7 +278,7 @@ fun WaitInfoCard( ) Spacer(modifier = Modifier.width(5.dp)) Text( - text = "$waitingNumber", + text = myWaitingModel.waitingId.toString(), color = MaterialTheme.colorScheme.onBackground, style = WaitingNumber2, ) @@ -269,7 +296,7 @@ fun WaitInfoCard( ) Spacer(modifier = Modifier.width(6.dp)) Text( - text = "$people", + text = myWaitingModel.partySize.toString(), color = MaterialTheme.colorScheme.onBackground, style = WaitingNumber2, ) @@ -281,7 +308,7 @@ fun WaitInfoCard( modifier = Modifier.fillMaxWidth(), ) { UnifestOutlinedButton( - onClick = { }, + onClick = { onWaitingCancelClick() }, containerColor = LightGrey100, borderColor = LightGrey100, modifier = Modifier.weight(1f), @@ -294,7 +321,7 @@ fun WaitInfoCard( } Spacer(modifier = Modifier.width(10.dp)) UnifestOutlinedButton( - onClick = { }, + onClick = { onCheckBoothDetailClick() }, containerColor = LightGrey100, borderColor = LightGrey100, modifier = Modifier.weight(1f), @@ -326,11 +353,21 @@ fun WaitingScreenPreview() { @Composable fun WaitingScreenComponentPreview() { UnifestTheme { - WaitInfoCard( - location = "컴공 주점", - order = 35, - waitingNumber = 112, - people = 3, + WaitingInfoItem( + myWaitingModel = MyWaitingModel( + boothId = 1L, + waitingId = 1L, + partySize = 2L, + tel = "010-1234-5678", + deviceId = "1234567890", + createdAt = "2021-09-01T00:00:00", + updatedAt = "2021-09-01T00:00:00", + status = "waiting", + waitingOrder = 1L, + boothName = "Booth Name", + ), + onWaitingCancelClick = {}, + onCheckBoothDetailClick = {}, ) } } diff --git a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingUiAction.kt b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingUiAction.kt index 6c22c015..312a87f5 100644 --- a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingUiAction.kt +++ b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingUiAction.kt @@ -2,6 +2,8 @@ package com.unifest.android.feature.waiting.viewmodel sealed interface WaitingUiAction { data object OnCancelWaitingClick : WaitingUiAction - data object OnCheckBoothClick : WaitingUiAction + data object OnCheckBoothDetailClick : WaitingUiAction data object OnPullToRefresh : WaitingUiAction + data object OnWaitingCancelDialogCancelClick : WaitingUiAction + data object OnWaitingCancelDialogConfirmClick : WaitingUiAction } diff --git a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingUiState.kt b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingUiState.kt index 2b7cd3c3..55849564 100644 --- a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingUiState.kt +++ b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingUiState.kt @@ -1,7 +1,14 @@ package com.unifest.android.feature.waiting.viewmodel +import com.unifest.android.core.model.LikedBoothModel +import com.unifest.android.core.model.MyWaitingModel +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.persistentListOf + data class WaitingUiState( + val isLoading: Boolean = false, + val myWaitingList: ImmutableList = persistentListOf(), val isServerErrorDialogVisible: Boolean = false, val isNetworkErrorDialogVisible: Boolean = false, -// val waitingLists: ImmutableList = persistentListOf(), + val isWaitingCancelDialogVisible: Boolean = false, ) diff --git a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingViewModel.kt b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingViewModel.kt index b114d14a..639ef350 100644 --- a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingViewModel.kt +++ b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingViewModel.kt @@ -1,32 +1,67 @@ package com.unifest.android.feature.waiting.viewmodel import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope import com.unifest.android.core.common.ErrorHandlerActions +import com.unifest.android.core.common.handleException +import com.unifest.android.core.data.repository.WaitingRepository import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.channels.Channel +import kotlinx.coroutines.delay import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel -class WaitingViewModel @Inject constructor() : ViewModel(), ErrorHandlerActions { +class WaitingViewModel @Inject constructor( + private val waitingRepository: WaitingRepository, +) : ViewModel(), ErrorHandlerActions { private val _uiState = MutableStateFlow(WaitingUiState()) val uiState: StateFlow = _uiState.asStateFlow() private val _uiEvent = Channel() val uiEvent: Flow = _uiEvent.receiveAsFlow() + init { + getMyWaitingList() + } + fun onWaitingUiAction(action: WaitingUiAction) { when (action) { - is WaitingUiAction.OnCancelWaitingClick -> setServerErrorDialogVisible(false) - is WaitingUiAction.OnCheckBoothClick -> setNetworkErrorDialogVisible(true) + is WaitingUiAction.OnCancelWaitingClick -> setWaitingCancelDialogVisible(true) + is WaitingUiAction.OnCheckBoothDetailClick -> setNetworkErrorDialogVisible(true) is WaitingUiAction.OnPullToRefresh -> setNetworkErrorDialogVisible(false) + is WaitingUiAction.OnWaitingCancelDialogCancelClick -> setWaitingCancelDialogVisible(false) + is WaitingUiAction.OnWaitingCancelDialogConfirmClick -> setWaitingCancelDialogVisible(false) + } + } + + private fun getMyWaitingList() { + viewModelScope.launch { + waitingRepository.getMyWaitingList() + .onSuccess { waitingLists -> + _uiState.update { + it.copy(myWaitingList = waitingLists.toImmutableList()) + } + } + .onFailure { exception -> + handleException(exception, this@WaitingViewModel) + } } } + private fun setWaitingCancelDialogVisible(flag: Boolean) { + _uiState.update { + it.copy(isWaitingCancelDialogVisible = flag) + } + } + + override fun setServerErrorDialogVisible(flag: Boolean) { _uiState.update { it.copy(isServerErrorDialogVisible = flag) From 5bcd395386a7acf1dcb5384e4de78df60c3ba361 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 23 Aug 2024 04:32:15 +0000 Subject: [PATCH 03/15] fix(deps): update dependency com.pinterest:ktlint to v0.51.0-final --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index cd621c35..4096fbc0 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -16,7 +16,7 @@ google-service = "4.4.2" kotlin-detekt = "1.23.6" kotlin-ktlint-gradle = "11.6.1" -kotlin-ktlint-source = "0.50.0" +kotlin-ktlint-source = "0.51.0-FINAL" kotlinx-coroutines = "1.9.0-RC" kotlinx-datetime = "0.6.0" From 96abeef4235e7be410e134d9b5f7fe9fe42e42fd Mon Sep 17 00:00:00 2001 From: JeongSangHoon Date: Fri, 23 Aug 2024 16:02:02 +0900 Subject: [PATCH 04/15] =?UTF-8?q?[fix]=20=EC=9B=A8=EC=9D=B4=ED=8C=85=20?= =?UTF-8?q?=ED=99=95=EC=9D=B8=20=EB=8B=A4=EC=9D=B4=EC=96=BC=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=20=EC=9D=B8=EC=9B=90=EC=88=98=20=EC=B4=88=EA=B8=B0?= =?UTF-8?q?=ED=99=94=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../unifest/android/feature/booth/viewmodel/BoothViewModel.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/feature/booth/src/main/kotlin/com/unifest/android/feature/booth/viewmodel/BoothViewModel.kt b/feature/booth/src/main/kotlin/com/unifest/android/feature/booth/viewmodel/BoothViewModel.kt index 967dcb11..f10d1b83 100644 --- a/feature/booth/src/main/kotlin/com/unifest/android/feature/booth/viewmodel/BoothViewModel.kt +++ b/feature/booth/src/main/kotlin/com/unifest/android/feature/booth/viewmodel/BoothViewModel.kt @@ -196,7 +196,6 @@ class BoothViewModel @Inject constructor( it.copy( waitingId = waiting.waitingId, waitingTel = "", - waitingPartySize = 1, boothPinNumber = "", ) } From b00ff9423175d1bba0960b28a94e1064dad4537e Mon Sep 17 00:00:00 2001 From: JeongSangHoon Date: Fri, 23 Aug 2024 16:02:48 +0900 Subject: [PATCH 05/15] =?UTF-8?q?[design]=20=EB=8B=A4=EC=9D=B4=EC=96=BC?= =?UTF-8?q?=EB=A1=9C=EA=B7=B8=20=EC=B7=A8=EC=86=8C=EB=B2=84=ED=8A=BC=20?= =?UTF-8?q?=EB=8B=A4=ED=81=AC=EB=AA=A8=EB=93=9C=20=EC=83=89=20=EB=8C=80?= =?UTF-8?q?=EC=9D=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../unifest/android/core/designsystem/component/Dialog.kt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/core/designsystem/src/main/kotlin/com/unifest/android/core/designsystem/component/Dialog.kt b/core/designsystem/src/main/kotlin/com/unifest/android/core/designsystem/component/Dialog.kt index eea1b835..ecca80be 100644 --- a/core/designsystem/src/main/kotlin/com/unifest/android/core/designsystem/component/Dialog.kt +++ b/core/designsystem/src/main/kotlin/com/unifest/android/core/designsystem/component/Dialog.kt @@ -5,6 +5,7 @@ import androidx.compose.animation.AnimatedContent import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.clickable +import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -49,6 +50,11 @@ import com.unifest.android.core.designsystem.theme.BoothTitle2 import com.unifest.android.core.designsystem.theme.BoothTitle3 import com.unifest.android.core.designsystem.theme.Content2 import com.unifest.android.core.designsystem.theme.Content6 +import com.unifest.android.core.designsystem.theme.DarkGrey300 +import com.unifest.android.core.designsystem.theme.DarkGrey400 +import com.unifest.android.core.designsystem.theme.DarkRed +import com.unifest.android.core.designsystem.theme.LightGrey200 +import com.unifest.android.core.designsystem.theme.LightRed import com.unifest.android.core.designsystem.theme.Title1 import com.unifest.android.core.designsystem.theme.Title2 import com.unifest.android.core.designsystem.theme.Title3 @@ -140,7 +146,7 @@ fun UnifestDialog( .weight(1f) .height(45.dp) .padding(start = 4.dp), - containerColor = MaterialTheme.colorScheme.onTertiaryContainer, + containerColor = if (isSystemInDarkTheme()) DarkGrey400 else LightGrey200, ) { Text( text = stringResource(id = cancelTextResId), From 1b55c44a2fd202e7a230b0d33e35898576f0c091 Mon Sep 17 00:00:00 2001 From: JeongSangHoon Date: Fri, 23 Aug 2024 19:37:33 +0900 Subject: [PATCH 06/15] =?UTF-8?q?[feature]=20=EC=9B=A8=EC=9D=B4=ED=8C=85?= =?UTF-8?q?=20=ED=99=94=EB=A9=B4=EC=97=90=EC=84=9C=20=EC=B7=A8=EC=86=8C=20?= =?UTF-8?q?api=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/data/repository/WaitingRepository.kt | 1 + .../data/repository/WaitingRepositoryImpl.kt | 15 +++++++- .../core/network/request/WaitingRequest.kt | 12 +++++++ .../core/network/service/UnifestService.kt | 6 ++++ .../android/feature/waiting/WaitingScreen.kt | 13 +++---- .../waiting/viewmodel/WaitingUiAction.kt | 4 +-- .../waiting/viewmodel/WaitingUiState.kt | 1 + .../waiting/viewmodel/WaitingViewModel.kt | 35 ++++++++++++++++--- 8 files changed, 72 insertions(+), 15 deletions(-) create mode 100644 core/network/src/main/kotlin/com/unifest/android/core/network/request/WaitingRequest.kt diff --git a/core/data/src/main/kotlin/com/unifest/android/core/data/repository/WaitingRepository.kt b/core/data/src/main/kotlin/com/unifest/android/core/data/repository/WaitingRepository.kt index 942dfdd2..e3669659 100644 --- a/core/data/src/main/kotlin/com/unifest/android/core/data/repository/WaitingRepository.kt +++ b/core/data/src/main/kotlin/com/unifest/android/core/data/repository/WaitingRepository.kt @@ -4,4 +4,5 @@ import com.unifest.android.core.model.MyWaitingModel interface WaitingRepository { suspend fun getMyWaitingList(): Result> + suspend fun cancelBoothWaiting(waitingId:Long): Result } diff --git a/core/data/src/main/kotlin/com/unifest/android/core/data/repository/WaitingRepositoryImpl.kt b/core/data/src/main/kotlin/com/unifest/android/core/data/repository/WaitingRepositoryImpl.kt index f4c9c234..e5dbb9a6 100644 --- a/core/data/src/main/kotlin/com/unifest/android/core/data/repository/WaitingRepositoryImpl.kt +++ b/core/data/src/main/kotlin/com/unifest/android/core/data/repository/WaitingRepositoryImpl.kt @@ -4,6 +4,8 @@ import android.content.Context import com.unifest.android.core.common.getDeviceId import com.unifest.android.core.data.mapper.toModel import com.unifest.android.core.data.util.runSuspendCatching +import com.unifest.android.core.network.request.BoothWaitingRequest +import com.unifest.android.core.network.request.WaitingRequest import com.unifest.android.core.network.service.UnifestService import dagger.hilt.android.qualifiers.ApplicationContext import javax.inject.Inject @@ -14,7 +16,18 @@ class WaitingRepositoryImpl @Inject constructor( ) : WaitingRepository { override suspend fun getMyWaitingList() = runSuspendCatching { service.getMyWaitingList( - deviceId = getDeviceId(context) + deviceId = getDeviceId(context), ).data.map { it.toModel() } } + + override suspend fun cancelBoothWaiting(waitingId:Long): Result = runSuspendCatching { + service.cancelBoothWaiting( + WaitingRequest( + waitingId = waitingId, + deviceId = getDeviceId(context), + ), + ).data.toModel() + + + } } diff --git a/core/network/src/main/kotlin/com/unifest/android/core/network/request/WaitingRequest.kt b/core/network/src/main/kotlin/com/unifest/android/core/network/request/WaitingRequest.kt new file mode 100644 index 00000000..2666beae --- /dev/null +++ b/core/network/src/main/kotlin/com/unifest/android/core/network/request/WaitingRequest.kt @@ -0,0 +1,12 @@ +package com.unifest.android.core.network.request + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class WaitingRequest( + @SerialName("waitingId") + val waitingId: Long, + @SerialName("deviceId") + val deviceId: String, +) diff --git a/core/network/src/main/kotlin/com/unifest/android/core/network/service/UnifestService.kt b/core/network/src/main/kotlin/com/unifest/android/core/network/service/UnifestService.kt index 1ad7a0d2..a7fe47e1 100644 --- a/core/network/src/main/kotlin/com/unifest/android/core/network/service/UnifestService.kt +++ b/core/network/src/main/kotlin/com/unifest/android/core/network/service/UnifestService.kt @@ -3,6 +3,7 @@ package com.unifest.android.core.network.service import com.unifest.android.core.network.request.BoothWaitingRequest import com.unifest.android.core.network.request.CheckPinValidationRequest import com.unifest.android.core.network.request.LikeBoothRequest +import com.unifest.android.core.network.request.WaitingRequest import com.unifest.android.core.network.response.AllBoothsResponse import com.unifest.android.core.network.response.BoothDetailResponse import com.unifest.android.core.network.response.CheckPinValidationResponse @@ -16,6 +17,7 @@ import com.unifest.android.core.network.response.WaitingResponse import retrofit2.http.Body import retrofit2.http.GET import retrofit2.http.POST +import retrofit2.http.PUT import retrofit2.http.Path import retrofit2.http.Query @@ -86,5 +88,9 @@ interface UnifestService { @Path("deviceId") deviceId: String, ): MyWaitingResponse + @PUT("waiting") + suspend fun cancelBoothWaiting( + @Body request: WaitingRequest + ): WaitingResponse } diff --git a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/WaitingScreen.kt b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/WaitingScreen.kt index d88a7415..50dc43f2 100644 --- a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/WaitingScreen.kt +++ b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/WaitingScreen.kt @@ -157,8 +157,7 @@ internal fun WaitingScreen( Spacer(modifier = Modifier.height(16.dp)) WaitingInfoItem( myWaitingModel = waitingItem, - onWaitingCancelClick = { onWaitingUiAction(WaitingUiAction.OnCancelWaitingClick) }, - onCheckBoothDetailClick = { onWaitingUiAction(WaitingUiAction.OnCheckBoothDetailClick) }, + onWaitingUiAction = onWaitingUiAction, ) } Spacer(modifier = Modifier.height(8.dp)) @@ -203,8 +202,7 @@ internal fun WaitingScreen( @Composable fun WaitingInfoItem( myWaitingModel: MyWaitingModel, - onWaitingCancelClick: () -> Unit, - onCheckBoothDetailClick: () -> Unit, + onWaitingUiAction: (WaitingUiAction) -> Unit ) { Card( colors = CardColors( @@ -308,7 +306,7 @@ fun WaitingInfoItem( modifier = Modifier.fillMaxWidth(), ) { UnifestOutlinedButton( - onClick = { onWaitingCancelClick() }, + onClick = { onWaitingUiAction(WaitingUiAction.OnCancelWaitingClick(myWaitingModel.waitingId)) }, containerColor = LightGrey100, borderColor = LightGrey100, modifier = Modifier.weight(1f), @@ -321,7 +319,7 @@ fun WaitingInfoItem( } Spacer(modifier = Modifier.width(10.dp)) UnifestOutlinedButton( - onClick = { onCheckBoothDetailClick() }, + onClick = { onWaitingUiAction(WaitingUiAction.OnCheckBoothDetailClick(myWaitingModel.boothId)) }, containerColor = LightGrey100, borderColor = LightGrey100, modifier = Modifier.weight(1f), @@ -366,8 +364,7 @@ fun WaitingScreenComponentPreview() { waitingOrder = 1L, boothName = "Booth Name", ), - onWaitingCancelClick = {}, - onCheckBoothDetailClick = {}, + onWaitingUiAction = {}, ) } } diff --git a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingUiAction.kt b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingUiAction.kt index 312a87f5..d1a0703f 100644 --- a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingUiAction.kt +++ b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingUiAction.kt @@ -1,8 +1,8 @@ package com.unifest.android.feature.waiting.viewmodel sealed interface WaitingUiAction { - data object OnCancelWaitingClick : WaitingUiAction - data object OnCheckBoothDetailClick : WaitingUiAction + data class OnCancelWaitingClick(val waitingId: Long) : WaitingUiAction + data class OnCheckBoothDetailClick(val boothId: Long) : WaitingUiAction data object OnPullToRefresh : WaitingUiAction data object OnWaitingCancelDialogCancelClick : WaitingUiAction data object OnWaitingCancelDialogConfirmClick : WaitingUiAction diff --git a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingUiState.kt b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingUiState.kt index 55849564..7d754f76 100644 --- a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingUiState.kt +++ b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingUiState.kt @@ -11,4 +11,5 @@ data class WaitingUiState( val isServerErrorDialogVisible: Boolean = false, val isNetworkErrorDialogVisible: Boolean = false, val isWaitingCancelDialogVisible: Boolean = false, + val waitingCancelDialogWaitingId: Long = 0, ) diff --git a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingViewModel.kt b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingViewModel.kt index 639ef350..3fb1128e 100644 --- a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingViewModel.kt +++ b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingViewModel.kt @@ -8,7 +8,6 @@ import com.unifest.android.core.data.repository.WaitingRepository import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.channels.Channel -import kotlinx.coroutines.delay import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow @@ -33,11 +32,11 @@ class WaitingViewModel @Inject constructor( fun onWaitingUiAction(action: WaitingUiAction) { when (action) { - is WaitingUiAction.OnCancelWaitingClick -> setWaitingCancelDialogVisible(true) - is WaitingUiAction.OnCheckBoothDetailClick -> setNetworkErrorDialogVisible(true) + is WaitingUiAction.OnCancelWaitingClick -> setWaitingCancelDialogWaitingId(action.waitingId) + is WaitingUiAction.OnCheckBoothDetailClick -> navigateToBoothDetail(action.boothId) is WaitingUiAction.OnPullToRefresh -> setNetworkErrorDialogVisible(false) is WaitingUiAction.OnWaitingCancelDialogCancelClick -> setWaitingCancelDialogVisible(false) - is WaitingUiAction.OnWaitingCancelDialogConfirmClick -> setWaitingCancelDialogVisible(false) + is WaitingUiAction.OnWaitingCancelDialogConfirmClick -> cancelBoothWaiting() } } @@ -54,6 +53,34 @@ class WaitingViewModel @Inject constructor( } } } + //todo:404 일때, pull to refresh + + private fun setWaitingCancelDialogWaitingId(waitingId: Long) { + setWaitingCancelDialogVisible(true) + _uiState.update { + it.copy(waitingCancelDialogWaitingId = waitingId) + } + } + + private fun cancelBoothWaiting() { + viewModelScope.launch { + waitingRepository.cancelBoothWaiting(_uiState.value.waitingCancelDialogWaitingId) + .onSuccess { + getMyWaitingList() + setWaitingCancelDialogVisible(false) + } + .onFailure { exception -> + setWaitingCancelDialogVisible(false) + handleException(exception, this@WaitingViewModel) + } + } + } + + private fun navigateToBoothDetail(boothId: Long) { + viewModelScope.launch { +// _uiEvent.send(WaitingUiEvent.NavigateToBoothDetail(boothId)) + } + } private fun setWaitingCancelDialogVisible(flag: Boolean) { _uiState.update { From 9ed10726a3741b7acab408fb04ca3afda7308139 Mon Sep 17 00:00:00 2001 From: JeongSangHoon Date: Fri, 23 Aug 2024 20:34:22 +0900 Subject: [PATCH 07/15] =?UTF-8?q?[fix]=20=EB=82=B4=20=EC=9B=A8=EC=9D=B4?= =?UTF-8?q?=ED=8C=85=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=EA=B0=80=20null=20?= =?UTF-8?q?=EC=9D=BC=20=EA=B2=BD=EC=9A=B0=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../android/core/data/repository/WaitingRepositoryImpl.kt | 2 +- .../android/core/network/response/MyWaitingResponse.kt | 2 +- .../com/unifest/android/feature/waiting/WaitingScreen.kt | 4 ++++ .../android/feature/waiting/viewmodel/WaitingViewModel.kt | 4 ++-- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/core/data/src/main/kotlin/com/unifest/android/core/data/repository/WaitingRepositoryImpl.kt b/core/data/src/main/kotlin/com/unifest/android/core/data/repository/WaitingRepositoryImpl.kt index e5dbb9a6..e99b502d 100644 --- a/core/data/src/main/kotlin/com/unifest/android/core/data/repository/WaitingRepositoryImpl.kt +++ b/core/data/src/main/kotlin/com/unifest/android/core/data/repository/WaitingRepositoryImpl.kt @@ -17,7 +17,7 @@ class WaitingRepositoryImpl @Inject constructor( override suspend fun getMyWaitingList() = runSuspendCatching { service.getMyWaitingList( deviceId = getDeviceId(context), - ).data.map { it.toModel() } + ).data?.map { it.toModel() } ?: emptyList() } override suspend fun cancelBoothWaiting(waitingId:Long): Result = runSuspendCatching { diff --git a/core/network/src/main/kotlin/com/unifest/android/core/network/response/MyWaitingResponse.kt b/core/network/src/main/kotlin/com/unifest/android/core/network/response/MyWaitingResponse.kt index e8b66918..7b1f4908 100644 --- a/core/network/src/main/kotlin/com/unifest/android/core/network/response/MyWaitingResponse.kt +++ b/core/network/src/main/kotlin/com/unifest/android/core/network/response/MyWaitingResponse.kt @@ -10,7 +10,7 @@ data class MyWaitingResponse( @SerialName("message") val message: String, @SerialName("data") - val data: List, + val data: List?=null, ) @Serializable diff --git a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/WaitingScreen.kt b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/WaitingScreen.kt index 50dc43f2..aee3233d 100644 --- a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/WaitingScreen.kt +++ b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/WaitingScreen.kt @@ -25,6 +25,7 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.VerticalDivider import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -77,6 +78,9 @@ internal fun WaitingRoute( is WaitingUiEvent.NavigateBack -> popBackStack() } } + LaunchedEffect(key1 = Unit) { + viewModel.getMyWaitingList() + } WaitingScreen( padding = padding, diff --git a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingViewModel.kt b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingViewModel.kt index 3fb1128e..7ffbcc93 100644 --- a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingViewModel.kt +++ b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingViewModel.kt @@ -40,7 +40,7 @@ class WaitingViewModel @Inject constructor( } } - private fun getMyWaitingList() { + fun getMyWaitingList() { viewModelScope.launch { waitingRepository.getMyWaitingList() .onSuccess { waitingLists -> @@ -53,7 +53,7 @@ class WaitingViewModel @Inject constructor( } } } - //todo:404 일때, pull to refresh + //pull to refresh private fun setWaitingCancelDialogWaitingId(waitingId: Long) { setWaitingCancelDialogVisible(true) From cb2c472f2121c699f4f0714103e4e59868a823b6 Mon Sep 17 00:00:00 2001 From: JeongSangHoon Date: Fri, 23 Aug 2024 21:00:28 +0900 Subject: [PATCH 08/15] =?UTF-8?q?[feature]=20=EB=B6=80=EC=8A=A4=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=ED=99=94=EB=A9=B4=20=EA=B0=80=EA=B8=B0,=20?= =?UTF-8?q?=EC=A7=80=EB=8F=84=20=ED=99=94=EB=A9=B4=20=EA=B0=80=EA=B8=B0=20?= =?UTF-8?q?=EB=84=A4=EB=B9=84=EA=B2=8C=EC=9D=B4=EC=85=98=20=EC=97=B0?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/unifest/android/feature/main/MainScreen.kt | 1 + .../com/unifest/android/feature/waiting/WaitingScreen.kt | 7 +++++++ .../feature/waiting/navigation/WaitingNavigation.kt | 2 ++ .../android/feature/waiting/viewmodel/WaitingUiAction.kt | 1 + .../android/feature/waiting/viewmodel/WaitingUiEvent.kt | 2 ++ .../feature/waiting/viewmodel/WaitingViewModel.kt | 9 ++++++++- 6 files changed, 21 insertions(+), 1 deletion(-) diff --git a/feature/main/src/main/kotlin/com/unifest/android/feature/main/MainScreen.kt b/feature/main/src/main/kotlin/com/unifest/android/feature/main/MainScreen.kt index fa213ba0..6b9d4cb1 100644 --- a/feature/main/src/main/kotlin/com/unifest/android/feature/main/MainScreen.kt +++ b/feature/main/src/main/kotlin/com/unifest/android/feature/main/MainScreen.kt @@ -128,6 +128,7 @@ internal fun MainScreen( waitingNavGraph( padding = innerPadding, popBackStack = navigator::popBackStackIfNotMap, + navigateToBoothDetail = navigator::navigateToBoothDetail, ) menuNavGraph( padding = innerPadding, diff --git a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/WaitingScreen.kt b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/WaitingScreen.kt index aee3233d..76643d79 100644 --- a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/WaitingScreen.kt +++ b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/WaitingScreen.kt @@ -2,6 +2,7 @@ package com.unifest.android.feature.waiting import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.background +import androidx.compose.foundation.clickable import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -69,6 +70,7 @@ import com.unifest.android.feature.waiting.viewmodel.WaitingViewModel internal fun WaitingRoute( padding: PaddingValues, popBackStack: () -> Unit, + navigateToBoothDetail: (Long) -> Unit, viewModel: WaitingViewModel = hiltViewModel(), ) { val waitingUiState by viewModel.uiState.collectAsStateWithLifecycle() @@ -76,6 +78,8 @@ internal fun WaitingRoute( ObserveAsEvents(flow = viewModel.uiEvent) { event -> when (event) { is WaitingUiEvent.NavigateBack -> popBackStack() + is WaitingUiEvent.NavigateToMap -> popBackStack() + is WaitingUiEvent.NavigateToBoothDetail -> navigateToBoothDetail(event.boothId) } } LaunchedEffect(key1 = Unit) { @@ -189,6 +193,9 @@ internal fun WaitingScreen( textDecoration = TextDecoration.Underline ), color = MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier.clickable { + onWaitingUiAction(WaitingUiAction.OnLookForBoothClick) + } ) } } diff --git a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/navigation/WaitingNavigation.kt b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/navigation/WaitingNavigation.kt index 1bfe4867..9acbb511 100644 --- a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/navigation/WaitingNavigation.kt +++ b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/navigation/WaitingNavigation.kt @@ -15,11 +15,13 @@ fun NavController.navigateToWaiting(navOptions: NavOptions) { fun NavGraphBuilder.waitingNavGraph( padding: PaddingValues, popBackStack: () -> Unit, + navigateToBoothDetail: (Long) -> Unit, ) { composable { WaitingRoute( padding = padding, popBackStack = popBackStack, + navigateToBoothDetail = navigateToBoothDetail, ) } } diff --git a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingUiAction.kt b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingUiAction.kt index d1a0703f..e1e35034 100644 --- a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingUiAction.kt +++ b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingUiAction.kt @@ -6,4 +6,5 @@ sealed interface WaitingUiAction { data object OnPullToRefresh : WaitingUiAction data object OnWaitingCancelDialogCancelClick : WaitingUiAction data object OnWaitingCancelDialogConfirmClick : WaitingUiAction + data object OnLookForBoothClick : WaitingUiAction } diff --git a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingUiEvent.kt b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingUiEvent.kt index 6dca291e..8e390ced 100644 --- a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingUiEvent.kt +++ b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingUiEvent.kt @@ -2,4 +2,6 @@ package com.unifest.android.feature.waiting.viewmodel sealed interface WaitingUiEvent { data object NavigateBack : WaitingUiEvent + data object NavigateToMap : WaitingUiEvent + data class NavigateToBoothDetail(val boothId: Long) : WaitingUiEvent } diff --git a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingViewModel.kt b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingViewModel.kt index 7ffbcc93..55abd733 100644 --- a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingViewModel.kt +++ b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingViewModel.kt @@ -37,6 +37,7 @@ class WaitingViewModel @Inject constructor( is WaitingUiAction.OnPullToRefresh -> setNetworkErrorDialogVisible(false) is WaitingUiAction.OnWaitingCancelDialogCancelClick -> setWaitingCancelDialogVisible(false) is WaitingUiAction.OnWaitingCancelDialogConfirmClick -> cancelBoothWaiting() + is WaitingUiAction.OnLookForBoothClick -> navigateToMap() } } @@ -78,7 +79,13 @@ class WaitingViewModel @Inject constructor( private fun navigateToBoothDetail(boothId: Long) { viewModelScope.launch { -// _uiEvent.send(WaitingUiEvent.NavigateToBoothDetail(boothId)) + _uiEvent.send(WaitingUiEvent.NavigateToBoothDetail(boothId)) + } + } + + private fun navigateToMap() { + viewModelScope.launch { + _uiEvent.send(WaitingUiEvent.NavigateToMap) } } From 4c906cdf6772021ecfd3e17c717a18b555b30cf7 Mon Sep 17 00:00:00 2001 From: JeongSangHoon Date: Fri, 23 Aug 2024 21:06:06 +0900 Subject: [PATCH 09/15] =?UTF-8?q?[chore]=20string=20=EB=A6=AC=EC=86=8C?= =?UTF-8?q?=EC=8A=A4=20=EB=B6=84=EB=A6=AC,=20=EC=B4=9D=20=EC=9B=A8?= =?UTF-8?q?=EC=9D=B4=ED=8C=85=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=EC=88=98=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/designsystem/src/main/res/values/strings.xml | 2 ++ .../com/unifest/android/feature/waiting/WaitingScreen.kt | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/core/designsystem/src/main/res/values/strings.xml b/core/designsystem/src/main/res/values/strings.xml index d727ba29..640472dc 100644 --- a/core/designsystem/src/main/res/values/strings.xml +++ b/core/designsystem/src/main/res/values/strings.xml @@ -67,6 +67,8 @@ 번째 웨이팅을 취소합니다 정말 취소 하시겠습니까? + 신청한 웨이팅이 없어요 + 주점/부스 구경하러 가기> 메뉴 diff --git a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/WaitingScreen.kt b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/WaitingScreen.kt index 76643d79..9ff04c99 100644 --- a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/WaitingScreen.kt +++ b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/WaitingScreen.kt @@ -149,7 +149,7 @@ internal fun WaitingScreen( modifier = Modifier.fillMaxWidth(), ) { Text( - text = stringResource(id = R.string.waiting_total_cases, 2), + text = stringResource(id = R.string.waiting_total_cases, waitingUiState.myWaitingList.size), color = MaterialTheme.colorScheme.onBackground, style = Content7, ) @@ -183,12 +183,12 @@ internal fun WaitingScreen( verticalArrangement = Arrangement.Center, ) { Text( - text = "신청한 웨이팅이 없어요", + text = stringResource(id = R.string.waiting_no_waiting), style = WaitingNumber4, ) Spacer(modifier = Modifier.height(8.dp)) Text( - text = "주점/부스 구경하러 가기>", + text = stringResource(id = R.string.waiting_no_waiting_description), style = Content2.copy( textDecoration = TextDecoration.Underline ), From ce24a4bcd37a4dea5f8ba602d96fdbccb5ac124c Mon Sep 17 00:00:00 2001 From: JeongSangHoon Date: Fri, 23 Aug 2024 21:16:15 +0900 Subject: [PATCH 10/15] =?UTF-8?q?[feat]=20=EB=B6=80=EC=8A=A4=20=EC=9B=A8?= =?UTF-8?q?=EC=9D=B4=ED=8C=85=20=EA=B4=80=EB=A0=A8=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=EC=9D=80=20=EC=88=AB=EC=9E=90=20=ED=82=A4=ED=8C=A8=EB=93=9C?= =?UTF-8?q?=EB=A7=8C=20=ED=97=88=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../unifest/android/core/designsystem/component/Dialog.kt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/core/designsystem/src/main/kotlin/com/unifest/android/core/designsystem/component/Dialog.kt b/core/designsystem/src/main/kotlin/com/unifest/android/core/designsystem/component/Dialog.kt index ecca80be..70016a3f 100644 --- a/core/designsystem/src/main/kotlin/com/unifest/android/core/designsystem/component/Dialog.kt +++ b/core/designsystem/src/main/kotlin/com/unifest/android/core/designsystem/component/Dialog.kt @@ -20,6 +20,7 @@ import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.text.BasicTextField +import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Add import androidx.compose.material.icons.filled.Remove @@ -37,6 +38,7 @@ import androidx.compose.ui.graphics.SolidColor import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.vectorResource +import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.unit.dp @@ -242,6 +244,9 @@ fun WaitingPinDialog( color = MaterialTheme.colorScheme.onBackground, ), cursorBrush = SolidColor(MaterialTheme.colorScheme.onBackground), + keyboardOptions = KeyboardOptions( + keyboardType = KeyboardType.Number + ), decorationBox = { innerTextField -> if (pinNumber.isEmpty()) { Text( @@ -408,6 +413,9 @@ fun WaitingDialog( color = MaterialTheme.colorScheme.onBackground, ), cursorBrush = SolidColor(MaterialTheme.colorScheme.onBackground), + keyboardOptions = KeyboardOptions( + keyboardType = KeyboardType.Number + ), decorationBox = { innerTextField -> if (phoneNumber.isEmpty()) { Text( From 662cec493889e829581360ec5f958291a7d579ab Mon Sep 17 00:00:00 2001 From: JeongSangHoon Date: Fri, 23 Aug 2024 22:42:32 +0900 Subject: [PATCH 11/15] =?UTF-8?q?[feat]=20=EC=9B=A8=EC=9D=B4=ED=8C=85=20?= =?UTF-8?q?=ED=99=94=EB=A9=B4=20pulltorefresh=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../android/feature/waiting/WaitingScreen.kt | 18 +++++++++++++++++- .../waiting/viewmodel/WaitingUiAction.kt | 1 + .../waiting/viewmodel/WaitingViewModel.kt | 1 + gradle/libs.versions.toml | 3 +++ 4 files changed, 22 insertions(+), 1 deletion(-) diff --git a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/WaitingScreen.kt b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/WaitingScreen.kt index 9ff04c99..e70f1f9e 100644 --- a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/WaitingScreen.kt +++ b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/WaitingScreen.kt @@ -18,6 +18,11 @@ import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.CircularProgressIndicator +import androidx.compose.material.ExperimentalMaterialApi +import androidx.compose.material.pullrefresh.PullRefreshIndicator +import androidx.compose.material.pullrefresh.pullRefresh +import androidx.compose.material.pullrefresh.rememberPullRefreshState import androidx.compose.material3.Card import androidx.compose.material3.CardColors import androidx.compose.material3.CardDefaults @@ -93,15 +98,21 @@ internal fun WaitingRoute( ) } +@OptIn(ExperimentalMaterialApi::class) @Composable internal fun WaitingScreen( padding: PaddingValues, waitingUiState: WaitingUiState, onWaitingUiAction: (WaitingUiAction) -> Unit, ) { + val pullRefreshState = rememberPullRefreshState( + refreshing = waitingUiState.isLoading, + onRefresh = { onWaitingUiAction(WaitingUiAction.OnRefresh) } + ) Box( modifier = Modifier .fillMaxSize() + .pullRefresh(pullRefreshState) .background(MaterialTheme.colorScheme.background) .padding(padding), ) { @@ -172,6 +183,12 @@ internal fun WaitingScreen( } } } + PullRefreshIndicator( + refreshing = waitingUiState.isLoading, + state = pullRefreshState, + contentColor = MaterialTheme.colorScheme.primary, + scale = true + ) if (waitingUiState.myWaitingList.isEmpty()) { Box( modifier = Modifier @@ -209,7 +226,6 @@ internal fun WaitingScreen( } } - @Composable fun WaitingInfoItem( myWaitingModel: MyWaitingModel, diff --git a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingUiAction.kt b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingUiAction.kt index e1e35034..c9e5065c 100644 --- a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingUiAction.kt +++ b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingUiAction.kt @@ -7,4 +7,5 @@ sealed interface WaitingUiAction { data object OnWaitingCancelDialogCancelClick : WaitingUiAction data object OnWaitingCancelDialogConfirmClick : WaitingUiAction data object OnLookForBoothClick : WaitingUiAction + data object OnRefresh: WaitingUiAction } diff --git a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingViewModel.kt b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingViewModel.kt index 55abd733..16f9cfdd 100644 --- a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingViewModel.kt +++ b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingViewModel.kt @@ -38,6 +38,7 @@ class WaitingViewModel @Inject constructor( is WaitingUiAction.OnWaitingCancelDialogCancelClick -> setWaitingCancelDialogVisible(false) is WaitingUiAction.OnWaitingCancelDialogConfirmClick -> cancelBoothWaiting() is WaitingUiAction.OnLookForBoothClick -> navigateToMap() + is WaitingUiAction.OnRefresh -> getMyWaitingList() } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4096fbc0..7abeb03c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -36,6 +36,7 @@ androidx-room = "2.6.1" androidx-activity-compose = "1.9.1" androidx-compose = "1.6.8" androidx-compose-material3 = "1.2.1" +androidx-compose-material2 = "1.6.8" androidx-hilt-navigation-compose = "1.2.0" desugar-jdk-libs = "2.0.4" @@ -93,6 +94,7 @@ androidx-lifecycle-runtime-compose = { group = "androidx.lifecycle", name = "lif androidx-lifecycle-viewmodel-compose = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-compose", version.ref = "androidx-lifecycle" } androidx-compose-foundation = { group = "androidx.compose.foundation", name = "foundation", version.ref = "androidx-compose" } +androidx-compose-material = { group = "androidx.compose.material", name = "material", version.ref = "androidx-compose-material2" } androidx-compose-material-iconsExtended = { group = "androidx.compose.material", name = "material-icons-extended", version.ref = "androidx-compose" } androidx-compose-material3 = { group = "androidx.compose.material3", name = "material3", version.ref = "androidx-compose-material3" } androidx-compose-runtime = { group = "androidx.compose.runtime", name = "runtime", version.ref = "androidx-compose" } @@ -179,6 +181,7 @@ unifest-jvm-kotlin = { id = "unifest.jvm.kotlin", version = "unspecified" } androidx-compose = [ "androidx-compose-foundation", + "androidx-compose-material", "androidx-compose-material-iconsExtended", "androidx-compose-material3", "androidx-compose-runtime", From 0fd49752cfdf5b4690586df12a849463497a5e6a Mon Sep 17 00:00:00 2001 From: JeongSangHoon Date: Fri, 23 Aug 2024 22:57:23 +0900 Subject: [PATCH 12/15] [chore] style check success --- .../core/data/repository/WaitingRepository.kt | 2 +- .../data/repository/WaitingRepositoryImpl.kt | 5 +-- .../core/designsystem/component/Dialog.kt | 7 +--- .../network/response/MyWaitingResponse.kt | 2 +- .../core/network/service/UnifestService.kt | 3 +- .../android/feature/waiting/WaitingScreen.kt | 38 +++++++++---------- .../waiting/viewmodel/WaitingUiAction.kt | 2 +- .../waiting/viewmodel/WaitingUiState.kt | 1 - .../waiting/viewmodel/WaitingViewModel.kt | 2 - gradle/libs.versions.toml | 2 +- 10 files changed, 26 insertions(+), 38 deletions(-) diff --git a/core/data/src/main/kotlin/com/unifest/android/core/data/repository/WaitingRepository.kt b/core/data/src/main/kotlin/com/unifest/android/core/data/repository/WaitingRepository.kt index e3669659..e0000d56 100644 --- a/core/data/src/main/kotlin/com/unifest/android/core/data/repository/WaitingRepository.kt +++ b/core/data/src/main/kotlin/com/unifest/android/core/data/repository/WaitingRepository.kt @@ -4,5 +4,5 @@ import com.unifest.android.core.model.MyWaitingModel interface WaitingRepository { suspend fun getMyWaitingList(): Result> - suspend fun cancelBoothWaiting(waitingId:Long): Result + suspend fun cancelBoothWaiting(waitingId: Long): Result } diff --git a/core/data/src/main/kotlin/com/unifest/android/core/data/repository/WaitingRepositoryImpl.kt b/core/data/src/main/kotlin/com/unifest/android/core/data/repository/WaitingRepositoryImpl.kt index e99b502d..b76bfc89 100644 --- a/core/data/src/main/kotlin/com/unifest/android/core/data/repository/WaitingRepositoryImpl.kt +++ b/core/data/src/main/kotlin/com/unifest/android/core/data/repository/WaitingRepositoryImpl.kt @@ -4,7 +4,6 @@ import android.content.Context import com.unifest.android.core.common.getDeviceId import com.unifest.android.core.data.mapper.toModel import com.unifest.android.core.data.util.runSuspendCatching -import com.unifest.android.core.network.request.BoothWaitingRequest import com.unifest.android.core.network.request.WaitingRequest import com.unifest.android.core.network.service.UnifestService import dagger.hilt.android.qualifiers.ApplicationContext @@ -20,14 +19,12 @@ class WaitingRepositoryImpl @Inject constructor( ).data?.map { it.toModel() } ?: emptyList() } - override suspend fun cancelBoothWaiting(waitingId:Long): Result = runSuspendCatching { + override suspend fun cancelBoothWaiting(waitingId: Long): Result = runSuspendCatching { service.cancelBoothWaiting( WaitingRequest( waitingId = waitingId, deviceId = getDeviceId(context), ), ).data.toModel() - - } } diff --git a/core/designsystem/src/main/kotlin/com/unifest/android/core/designsystem/component/Dialog.kt b/core/designsystem/src/main/kotlin/com/unifest/android/core/designsystem/component/Dialog.kt index 70016a3f..af51e39e 100644 --- a/core/designsystem/src/main/kotlin/com/unifest/android/core/designsystem/component/Dialog.kt +++ b/core/designsystem/src/main/kotlin/com/unifest/android/core/designsystem/component/Dialog.kt @@ -52,11 +52,8 @@ import com.unifest.android.core.designsystem.theme.BoothTitle2 import com.unifest.android.core.designsystem.theme.BoothTitle3 import com.unifest.android.core.designsystem.theme.Content2 import com.unifest.android.core.designsystem.theme.Content6 -import com.unifest.android.core.designsystem.theme.DarkGrey300 import com.unifest.android.core.designsystem.theme.DarkGrey400 -import com.unifest.android.core.designsystem.theme.DarkRed import com.unifest.android.core.designsystem.theme.LightGrey200 -import com.unifest.android.core.designsystem.theme.LightRed import com.unifest.android.core.designsystem.theme.Title1 import com.unifest.android.core.designsystem.theme.Title2 import com.unifest.android.core.designsystem.theme.Title3 @@ -245,7 +242,7 @@ fun WaitingPinDialog( ), cursorBrush = SolidColor(MaterialTheme.colorScheme.onBackground), keyboardOptions = KeyboardOptions( - keyboardType = KeyboardType.Number + keyboardType = KeyboardType.Number, ), decorationBox = { innerTextField -> if (pinNumber.isEmpty()) { @@ -414,7 +411,7 @@ fun WaitingDialog( ), cursorBrush = SolidColor(MaterialTheme.colorScheme.onBackground), keyboardOptions = KeyboardOptions( - keyboardType = KeyboardType.Number + keyboardType = KeyboardType.Number, ), decorationBox = { innerTextField -> if (phoneNumber.isEmpty()) { diff --git a/core/network/src/main/kotlin/com/unifest/android/core/network/response/MyWaitingResponse.kt b/core/network/src/main/kotlin/com/unifest/android/core/network/response/MyWaitingResponse.kt index 7b1f4908..580ab94c 100644 --- a/core/network/src/main/kotlin/com/unifest/android/core/network/response/MyWaitingResponse.kt +++ b/core/network/src/main/kotlin/com/unifest/android/core/network/response/MyWaitingResponse.kt @@ -10,7 +10,7 @@ data class MyWaitingResponse( @SerialName("message") val message: String, @SerialName("data") - val data: List?=null, + val data: List? = null, ) @Serializable diff --git a/core/network/src/main/kotlin/com/unifest/android/core/network/service/UnifestService.kt b/core/network/src/main/kotlin/com/unifest/android/core/network/service/UnifestService.kt index a7fe47e1..0dbed2ee 100644 --- a/core/network/src/main/kotlin/com/unifest/android/core/network/service/UnifestService.kt +++ b/core/network/src/main/kotlin/com/unifest/android/core/network/service/UnifestService.kt @@ -90,7 +90,6 @@ interface UnifestService { @PUT("waiting") suspend fun cancelBoothWaiting( - @Body request: WaitingRequest + @Body request: WaitingRequest, ): WaitingResponse - } diff --git a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/WaitingScreen.kt b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/WaitingScreen.kt index e70f1f9e..3a84a8e5 100644 --- a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/WaitingScreen.kt +++ b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/WaitingScreen.kt @@ -18,7 +18,6 @@ import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material.CircularProgressIndicator import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.material.pullrefresh.PullRefreshIndicator import androidx.compose.material.pullrefresh.pullRefresh @@ -107,7 +106,7 @@ internal fun WaitingScreen( ) { val pullRefreshState = rememberPullRefreshState( refreshing = waitingUiState.isLoading, - onRefresh = { onWaitingUiAction(WaitingUiAction.OnRefresh) } + onRefresh = { onWaitingUiAction(WaitingUiAction.OnRefresh) }, ) Box( modifier = Modifier @@ -167,33 +166,32 @@ internal fun WaitingScreen( } } item { Spacer(modifier = Modifier.height(8.dp)) } - - itemsIndexed( - items = waitingUiState.myWaitingList, - key = { _, waitingItem -> waitingItem.waitingId }, - ) { _, waitingItem -> - Column { - Spacer(modifier = Modifier.height(16.dp)) - WaitingInfoItem( - myWaitingModel = waitingItem, - onWaitingUiAction = onWaitingUiAction, - ) - } - Spacer(modifier = Modifier.height(8.dp)) + itemsIndexed( + items = waitingUiState.myWaitingList, + key = { _, waitingItem -> waitingItem.waitingId }, + ) { _, waitingItem -> + Column { + Spacer(modifier = Modifier.height(16.dp)) + WaitingInfoItem( + myWaitingModel = waitingItem, + onWaitingUiAction = onWaitingUiAction, + ) } + Spacer(modifier = Modifier.height(8.dp)) } } + } PullRefreshIndicator( refreshing = waitingUiState.isLoading, state = pullRefreshState, contentColor = MaterialTheme.colorScheme.primary, - scale = true + scale = true, ) if (waitingUiState.myWaitingList.isEmpty()) { Box( modifier = Modifier .fillMaxSize(), - contentAlignment = Alignment.Center + contentAlignment = Alignment.Center, ) { Column( horizontalAlignment = Alignment.CenterHorizontally, @@ -207,12 +205,12 @@ internal fun WaitingScreen( Text( text = stringResource(id = R.string.waiting_no_waiting_description), style = Content2.copy( - textDecoration = TextDecoration.Underline + textDecoration = TextDecoration.Underline, ), color = MaterialTheme.colorScheme.onSurfaceVariant, modifier = Modifier.clickable { onWaitingUiAction(WaitingUiAction.OnLookForBoothClick) - } + }, ) } } @@ -229,7 +227,7 @@ internal fun WaitingScreen( @Composable fun WaitingInfoItem( myWaitingModel: MyWaitingModel, - onWaitingUiAction: (WaitingUiAction) -> Unit + onWaitingUiAction: (WaitingUiAction) -> Unit, ) { Card( colors = CardColors( diff --git a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingUiAction.kt b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingUiAction.kt index c9e5065c..c38c8061 100644 --- a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingUiAction.kt +++ b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingUiAction.kt @@ -7,5 +7,5 @@ sealed interface WaitingUiAction { data object OnWaitingCancelDialogCancelClick : WaitingUiAction data object OnWaitingCancelDialogConfirmClick : WaitingUiAction data object OnLookForBoothClick : WaitingUiAction - data object OnRefresh: WaitingUiAction + data object OnRefresh : WaitingUiAction } diff --git a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingUiState.kt b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingUiState.kt index 7d754f76..c7efddfb 100644 --- a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingUiState.kt +++ b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingUiState.kt @@ -1,6 +1,5 @@ package com.unifest.android.feature.waiting.viewmodel -import com.unifest.android.core.model.LikedBoothModel import com.unifest.android.core.model.MyWaitingModel import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf diff --git a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingViewModel.kt b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingViewModel.kt index 16f9cfdd..87a98c4b 100644 --- a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingViewModel.kt +++ b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/viewmodel/WaitingViewModel.kt @@ -55,7 +55,6 @@ class WaitingViewModel @Inject constructor( } } } - //pull to refresh private fun setWaitingCancelDialogWaitingId(waitingId: Long) { setWaitingCancelDialogVisible(true) @@ -96,7 +95,6 @@ class WaitingViewModel @Inject constructor( } } - override fun setServerErrorDialogVisible(flag: Boolean) { _uiState.update { it.copy(isServerErrorDialogVisible = flag) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 7abeb03c..ff0ddb01 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -16,7 +16,7 @@ google-service = "4.4.2" kotlin-detekt = "1.23.6" kotlin-ktlint-gradle = "11.6.1" -kotlin-ktlint-source = "0.51.0-FINAL" +kotlin-ktlint-source = "0.50.0" kotlinx-coroutines = "1.9.0-RC" kotlinx-datetime = "0.6.0" From bd7aa6e118f2a34e24dce5ceacca7fb413f2c1af Mon Sep 17 00:00:00 2001 From: JeongSangHoon Date: Sat, 24 Aug 2024 09:29:31 +0900 Subject: [PATCH 13/15] =?UTF-8?q?[design]=20=EC=9B=A8=EC=9D=B4=ED=8C=85=20?= =?UTF-8?q?=EB=B2=88=ED=98=B8=EA=B0=80=201=EB=B2=88=EC=9D=BC=20=EA=B2=BD?= =?UTF-8?q?=EC=9A=B0=201=EB=B2=88=EC=A7=B8=20=EB=8C=80=EC=8B=A0=20"?= =?UTF-8?q?=EC=9E=85=EC=9E=A5=ED=95=B4=EC=A3=BC=EC=84=B8=EC=9A=94",=20?= =?UTF-8?q?=EB=8B=A4=ED=81=AC=EB=AA=A8=EB=93=9C=20=EC=83=89=EB=8C=80?= =?UTF-8?q?=EC=9D=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../android/core/designsystem/theme/Font.kt | 6 +++++ .../src/main/res/values/strings.xml | 1 + .../android/feature/waiting/WaitingScreen.kt | 25 +++++++++++-------- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/core/designsystem/src/main/kotlin/com/unifest/android/core/designsystem/theme/Font.kt b/core/designsystem/src/main/kotlin/com/unifest/android/core/designsystem/theme/Font.kt index 8f05f415..9695e84e 100644 --- a/core/designsystem/src/main/kotlin/com/unifest/android/core/designsystem/theme/Font.kt +++ b/core/designsystem/src/main/kotlin/com/unifest/android/core/designsystem/theme/Font.kt @@ -187,3 +187,9 @@ val WaitingNumber4 = TextStyle( fontWeight = FontWeight.Bold, fontSize = 18.sp, ) + +val WaitingNumber5 = TextStyle( + fontFamily = pretendardFamily, + fontWeight = FontWeight.SemiBold, + fontSize = 30.sp, +) diff --git a/core/designsystem/src/main/res/values/strings.xml b/core/designsystem/src/main/res/values/strings.xml index 640472dc..593c0e49 100644 --- a/core/designsystem/src/main/res/values/strings.xml +++ b/core/designsystem/src/main/res/values/strings.xml @@ -69,6 +69,7 @@ 정말 취소 하시겠습니까? 신청한 웨이팅이 없어요 주점/부스 구경하러 가기> + 입장해주세요 메뉴 diff --git a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/WaitingScreen.kt b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/WaitingScreen.kt index 3a84a8e5..09e6703a 100644 --- a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/WaitingScreen.kt +++ b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/WaitingScreen.kt @@ -52,6 +52,7 @@ import com.unifest.android.core.designsystem.theme.BoothTitle2 import com.unifest.android.core.designsystem.theme.Content1 import com.unifest.android.core.designsystem.theme.Content2 import com.unifest.android.core.designsystem.theme.Content7 +import com.unifest.android.core.designsystem.theme.DarkGrey100 import com.unifest.android.core.designsystem.theme.DarkRed import com.unifest.android.core.designsystem.theme.LightGrey100 import com.unifest.android.core.designsystem.theme.LightGrey700 @@ -63,6 +64,7 @@ import com.unifest.android.core.designsystem.theme.UnifestTheme import com.unifest.android.core.designsystem.theme.WaitingNumber import com.unifest.android.core.designsystem.theme.WaitingNumber2 import com.unifest.android.core.designsystem.theme.WaitingNumber4 +import com.unifest.android.core.designsystem.theme.WaitingNumber5 import com.unifest.android.core.model.MyWaitingModel import com.unifest.android.core.ui.DevicePreview import com.unifest.android.feature.waiting.viewmodel.WaitingUiAction @@ -200,6 +202,7 @@ internal fun WaitingScreen( Text( text = stringResource(id = R.string.waiting_no_waiting), style = WaitingNumber4, + color = MaterialTheme.colorScheme.onBackground, ) Spacer(modifier = Modifier.height(8.dp)) Text( @@ -278,18 +281,20 @@ fun WaitingInfoItem( verticalAlignment = Alignment.Bottom, ) { Text( - text = myWaitingModel.waitingOrder.toString(), - style = WaitingNumber, + text = if (myWaitingModel.waitingOrder.toInt() == 1) stringResource(id = R.string.waiting_my_turn) else myWaitingModel.waitingOrder.toString(), + style = if (myWaitingModel.waitingOrder.toInt() == 1) WaitingNumber5 else WaitingNumber, color = MaterialTheme.colorScheme.primary, modifier = Modifier.alignByBaseline(), ) Spacer(modifier = Modifier.width(8.dp)) - Text( - text = stringResource(id = R.string.waiting_nth), - fontSize = 18.sp, - color = MaterialTheme.colorScheme.onBackground, - modifier = Modifier.alignByBaseline(), - ) + if (myWaitingModel.waitingOrder.toInt() != 1) { + Text( + text = stringResource(id = R.string.waiting_nth), + fontSize = 18.sp, + color = MaterialTheme.colorScheme.onBackground, + modifier = Modifier.alignByBaseline(), + ) + } } Row( verticalAlignment = Alignment.CenterVertically, @@ -332,8 +337,8 @@ fun WaitingInfoItem( ) { UnifestOutlinedButton( onClick = { onWaitingUiAction(WaitingUiAction.OnCancelWaitingClick(myWaitingModel.waitingId)) }, - containerColor = LightGrey100, - borderColor = LightGrey100, + containerColor = if (isSystemInDarkTheme()) DarkGrey100 else LightGrey100, + borderColor = if (isSystemInDarkTheme()) DarkGrey100 else LightGrey100, modifier = Modifier.weight(1f), ) { Text( From 8f9f61e5f42a0e1b8de01f9728fcddce128760d2 Mon Sep 17 00:00:00 2001 From: JeongSangHoon Date: Sat, 24 Aug 2024 10:24:57 +0900 Subject: [PATCH 14/15] =?UTF-8?q?[feat]=20pull=20to=20refresh=20material3?= =?UTF-8?q?=EB=A1=9C=20=EB=A7=88=EC=9D=B4=EA=B7=B8=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=85=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../android/feature/waiting/WaitingScreen.kt | 39 +++++++++++-------- gradle/libs.versions.toml | 3 -- 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/WaitingScreen.kt b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/WaitingScreen.kt index 09e6703a..5464b18a 100644 --- a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/WaitingScreen.kt +++ b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/WaitingScreen.kt @@ -18,17 +18,16 @@ import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material.ExperimentalMaterialApi -import androidx.compose.material.pullrefresh.PullRefreshIndicator -import androidx.compose.material.pullrefresh.pullRefresh -import androidx.compose.material.pullrefresh.rememberPullRefreshState import androidx.compose.material3.Card import androidx.compose.material3.CardColors import androidx.compose.material3.CardDefaults +import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.VerticalDivider +import androidx.compose.material3.pulltorefresh.PullToRefreshContainer +import androidx.compose.material3.pulltorefresh.rememberPullToRefreshState import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue @@ -36,6 +35,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.vectorResource import androidx.compose.ui.text.style.TextDecoration @@ -71,6 +71,7 @@ import com.unifest.android.feature.waiting.viewmodel.WaitingUiAction import com.unifest.android.feature.waiting.viewmodel.WaitingUiEvent import com.unifest.android.feature.waiting.viewmodel.WaitingUiState import com.unifest.android.feature.waiting.viewmodel.WaitingViewModel +import kotlinx.coroutines.delay @Composable internal fun WaitingRoute( @@ -99,21 +100,27 @@ internal fun WaitingRoute( ) } -@OptIn(ExperimentalMaterialApi::class) +@OptIn(ExperimentalMaterial3Api::class) @Composable internal fun WaitingScreen( padding: PaddingValues, waitingUiState: WaitingUiState, onWaitingUiAction: (WaitingUiAction) -> Unit, ) { - val pullRefreshState = rememberPullRefreshState( - refreshing = waitingUiState.isLoading, - onRefresh = { onWaitingUiAction(WaitingUiAction.OnRefresh) }, - ) + val pullToRefreshState = rememberPullToRefreshState() + + LaunchedEffect(key1 = pullToRefreshState.isRefreshing) { + if (pullToRefreshState.isRefreshing) { + delay(1000) + onWaitingUiAction(WaitingUiAction.OnRefresh) + pullToRefreshState.endRefresh() + } + } + Box( modifier = Modifier .fillMaxSize() - .pullRefresh(pullRefreshState) + .nestedScroll(pullToRefreshState.nestedScrollConnection) .background(MaterialTheme.colorScheme.background) .padding(padding), ) { @@ -182,13 +189,13 @@ internal fun WaitingScreen( Spacer(modifier = Modifier.height(8.dp)) } } + if (pullToRefreshState.isRefreshing) { + PullToRefreshContainer( + modifier = Modifier.align(Alignment.TopCenter), + state = pullToRefreshState, + ) + } } - PullRefreshIndicator( - refreshing = waitingUiState.isLoading, - state = pullRefreshState, - contentColor = MaterialTheme.colorScheme.primary, - scale = true, - ) if (waitingUiState.myWaitingList.isEmpty()) { Box( modifier = Modifier diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ff0ddb01..cd621c35 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -36,7 +36,6 @@ androidx-room = "2.6.1" androidx-activity-compose = "1.9.1" androidx-compose = "1.6.8" androidx-compose-material3 = "1.2.1" -androidx-compose-material2 = "1.6.8" androidx-hilt-navigation-compose = "1.2.0" desugar-jdk-libs = "2.0.4" @@ -94,7 +93,6 @@ androidx-lifecycle-runtime-compose = { group = "androidx.lifecycle", name = "lif androidx-lifecycle-viewmodel-compose = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-compose", version.ref = "androidx-lifecycle" } androidx-compose-foundation = { group = "androidx.compose.foundation", name = "foundation", version.ref = "androidx-compose" } -androidx-compose-material = { group = "androidx.compose.material", name = "material", version.ref = "androidx-compose-material2" } androidx-compose-material-iconsExtended = { group = "androidx.compose.material", name = "material-icons-extended", version.ref = "androidx-compose" } androidx-compose-material3 = { group = "androidx.compose.material3", name = "material3", version.ref = "androidx-compose-material3" } androidx-compose-runtime = { group = "androidx.compose.runtime", name = "runtime", version.ref = "androidx-compose" } @@ -181,7 +179,6 @@ unifest-jvm-kotlin = { id = "unifest.jvm.kotlin", version = "unspecified" } androidx-compose = [ "androidx-compose-foundation", - "androidx-compose-material", "androidx-compose-material-iconsExtended", "androidx-compose-material3", "androidx-compose-runtime", From d4893d133a5c1eff676afe1a81bb554a23726e6c Mon Sep 17 00:00:00 2001 From: JeongSangHoon Date: Sat, 24 Aug 2024 10:29:53 +0900 Subject: [PATCH 15/15] [chore] code style check success --- .../com/unifest/android/feature/waiting/WaitingScreen.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/WaitingScreen.kt b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/WaitingScreen.kt index 5464b18a..c0b01344 100644 --- a/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/WaitingScreen.kt +++ b/feature/waiting/src/main/kotlin/com/unifest/android/feature/waiting/WaitingScreen.kt @@ -288,7 +288,11 @@ fun WaitingInfoItem( verticalAlignment = Alignment.Bottom, ) { Text( - text = if (myWaitingModel.waitingOrder.toInt() == 1) stringResource(id = R.string.waiting_my_turn) else myWaitingModel.waitingOrder.toString(), + text = if (myWaitingModel.waitingOrder.toInt() == 1) { + stringResource(id = R.string.waiting_my_turn) + } else { + myWaitingModel.waitingOrder.toString() + }, style = if (myWaitingModel.waitingOrder.toInt() == 1) WaitingNumber5 else WaitingNumber, color = MaterialTheme.colorScheme.primary, modifier = Modifier.alignByBaseline(),