From 84e3117b9f2ea797407c24030aac05d1b0eb8016 Mon Sep 17 00:00:00 2001 From: mangbaam Date: Sun, 16 Jun 2024 20:53:06 +0900 Subject: [PATCH] =?UTF-8?q?Boolti-235=20feat:=20=ED=8B=B0=EC=BC=93=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=EC=97=90=20N=EB=A7=A4=20=ED=8B=B0=EC=BC=93?= =?UTF-8?q?=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit todo: 기존 티켓 정보 영역 제거 todo: 사용됐거나 공연 종료된 QR 블러처리 --- .../com/nexters/boolti/domain/model/Ticket.kt | 44 ++-- .../screen/home/HomeNavigation.kt | 5 - .../presentation/screen/home/HomeScreen.kt | 7 +- .../screen/ticket/TicketScreen.kt | 3 - .../ticket/detail/TicketDetailScreen.kt | 227 ++++++++++++++---- .../ticket/detail/TicketDetailUiState.kt | 2 + .../ticket/detail/TicketDetailViewModel.kt | 10 +- presentation/src/main/res/values/strings.xml | 1 + 8 files changed, 215 insertions(+), 84 deletions(-) diff --git a/domain/src/main/java/com/nexters/boolti/domain/model/Ticket.kt b/domain/src/main/java/com/nexters/boolti/domain/model/Ticket.kt index 155884a8..c33ab8e7 100644 --- a/domain/src/main/java/com/nexters/boolti/domain/model/Ticket.kt +++ b/domain/src/main/java/com/nexters/boolti/domain/model/Ticket.kt @@ -15,30 +15,30 @@ data class Ticket( ) data class TicketGroup( - val userId: String, - val showId: String, - val reservationId: String, - val showName: String, - val placeName: String, - val streetAddress: String, - val detailAddress: String, - val showDate: LocalDateTime, - val notice: String, - val ticketNotice: String, - val poster: String, - val ticketType: TicketType, - val ticketName: String, - val hostName: String, - val hostPhoneNumber: String, - val tickets: List, + val userId: String = "", + val showId: String = "", + val reservationId: String = "", + val showName: String = "", + val placeName: String = "", + val streetAddress: String = "", + val detailAddress: String = "", + val showDate: LocalDateTime = LocalDateTime.MIN, + val notice: String = "", + val ticketNotice: String = "", + val poster: String = "", + val ticketType: TicketType = TicketType.Unknown, + val ticketName: String = "", + val hostName: String = "", + val hostPhoneNumber: String = "", + val tickets: List = emptyList(), ) { data class Ticket( - val ticketId: String, - val entryCode: String, - val usedAt: LocalDateTime?, - val ticketCreatedAt: LocalDateTime, - val csTicketId: String, - val showDate: LocalDateTime, + val ticketId: String = "", + val entryCode: String = "", + val usedAt: LocalDateTime? = null, + val ticketCreatedAt: LocalDateTime = LocalDateTime.MIN, + val csTicketId: String = "", + val showDate: LocalDateTime = LocalDateTime.MIN, ) { val ticketState: TicketState get() = run { diff --git a/presentation/src/main/java/com/nexters/boolti/presentation/screen/home/HomeNavigation.kt b/presentation/src/main/java/com/nexters/boolti/presentation/screen/home/HomeNavigation.kt index 186dfce7..15ef653d 100644 --- a/presentation/src/main/java/com/nexters/boolti/presentation/screen/home/HomeNavigation.kt +++ b/presentation/src/main/java/com/nexters/boolti/presentation/screen/home/HomeNavigation.kt @@ -16,11 +16,6 @@ fun NavGraphBuilder.HomeScreen( modifier = modifier, onClickShowItem = { navigateTo("${MainDestination.ShowDetail.route}/$it") }, onClickTicket = { navigateTo("${MainDestination.TicketDetail.route}/$it") }, - onClickQr = { code, ticketName -> - navigateTo( - "${MainDestination.Qr.route}/${code.filter { c -> c.isLetterOrDigit() }}?ticketName=$ticketName" - ) - }, onClickQrScan = { navigateTo(MainDestination.HostedShows.route) }, onClickSignout = { navigateTo(MainDestination.SignOut.route) }, navigateToReservations = { navigateTo(MainDestination.Reservations.route) }, diff --git a/presentation/src/main/java/com/nexters/boolti/presentation/screen/home/HomeScreen.kt b/presentation/src/main/java/com/nexters/boolti/presentation/screen/home/HomeScreen.kt index 9c20a35c..071d80f9 100644 --- a/presentation/src/main/java/com/nexters/boolti/presentation/screen/home/HomeScreen.kt +++ b/presentation/src/main/java/com/nexters/boolti/presentation/screen/home/HomeScreen.kt @@ -7,7 +7,7 @@ import androidx.annotation.StringRes import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding -import androidx.compose.material3.Divider +import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.NavigationBar @@ -40,13 +40,11 @@ import com.nexters.boolti.presentation.screen.ticket.TicketScreen import com.nexters.boolti.presentation.theme.Grey10 import com.nexters.boolti.presentation.theme.Grey50 import com.nexters.boolti.presentation.theme.Grey85 -import kotlinx.coroutines.channels.consumeEach @Composable fun HomeScreen( onClickShowItem: (showId: String) -> Unit, onClickTicket: (ticketId: String) -> Unit, - onClickQr: (data: String, ticketName: String) -> Unit, onClickQrScan: () -> Unit, onClickSignout: () -> Unit, navigateToReservations: () -> Unit, @@ -108,7 +106,6 @@ fun HomeScreen( when (loggedIn) { true -> TicketScreen( onClickTicket = onClickTicket, - onClickQr = onClickQr, modifier = modifier.padding(innerPadding), ) @@ -153,7 +150,7 @@ private fun HomeNavigationBar( modifier: Modifier = Modifier, ) { Column { - Divider( + HorizontalDivider( modifier = Modifier.fillMaxWidth(), thickness = 1.dp, color = Grey85, diff --git a/presentation/src/main/java/com/nexters/boolti/presentation/screen/ticket/TicketScreen.kt b/presentation/src/main/java/com/nexters/boolti/presentation/screen/ticket/TicketScreen.kt index cc1303e1..e168f7c4 100644 --- a/presentation/src/main/java/com/nexters/boolti/presentation/screen/ticket/TicketScreen.kt +++ b/presentation/src/main/java/com/nexters/boolti/presentation/screen/ticket/TicketScreen.kt @@ -30,7 +30,6 @@ import kotlin.math.absoluteValue @Composable fun TicketScreen( onClickTicket: (String) -> Unit, - onClickQr: (entryCode: String, ticketName: String) -> Unit, modifier: Modifier = Modifier, viewModel: TicketViewModel = hiltViewModel(), ) { @@ -49,7 +48,6 @@ fun TicketScreen( uiState.tickets.isNotEmpty() -> TicketNotEmptyScreen( modifier, uiState, - onClickQr, onClickTicket = onClickTicket ) @@ -62,7 +60,6 @@ fun TicketScreen( private fun TicketNotEmptyScreen( modifier: Modifier, uiState: TicketUiState, - onClickQr: (entryCode: String, ticketName: String) -> Unit, onClickTicket: (ticketId: String) -> Unit, ) { Column( diff --git a/presentation/src/main/java/com/nexters/boolti/presentation/screen/ticket/detail/TicketDetailScreen.kt b/presentation/src/main/java/com/nexters/boolti/presentation/screen/ticket/detail/TicketDetailScreen.kt index 1a3458fe..67076d5f 100644 --- a/presentation/src/main/java/com/nexters/boolti/presentation/screen/ticket/detail/TicketDetailScreen.kt +++ b/presentation/src/main/java/com/nexters/boolti/presentation/screen/ticket/detail/TicketDetailScreen.kt @@ -6,22 +6,30 @@ import androidx.compose.animation.core.Spring import androidx.compose.animation.core.animateFloatAsState import androidx.compose.animation.core.spring import androidx.compose.animation.core.tween +import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.BoxScope import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.foundation.layout.IntrinsicSize import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.aspectRatio +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.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.pager.HorizontalPager +import androidx.compose.foundation.pager.PagerState +import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape @@ -57,6 +65,7 @@ import androidx.compose.ui.graphics.Color.Companion.White import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.graphics.SolidColor import androidx.compose.ui.graphics.graphicsLayer +import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.onGloballyPositioned @@ -64,6 +73,7 @@ import androidx.compose.ui.platform.LocalClipboardManager import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.res.vectorResource import androidx.compose.ui.semantics.Role import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.font.FontWeight @@ -78,11 +88,13 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.composable import coil.compose.AsyncImage +import com.nexters.boolti.domain.model.TicketGroup import com.nexters.boolti.domain.model.TicketState import com.nexters.boolti.presentation.R import com.nexters.boolti.presentation.component.BTDialog import com.nexters.boolti.presentation.component.BtBackAppBar import com.nexters.boolti.presentation.component.DottedDivider +import com.nexters.boolti.presentation.component.InstagramIndicator import com.nexters.boolti.presentation.component.ShowInquiry import com.nexters.boolti.presentation.component.ToastSnackbarHost import com.nexters.boolti.presentation.extension.dayOfWeekString @@ -92,6 +104,7 @@ import com.nexters.boolti.presentation.extension.toPx import com.nexters.boolti.presentation.screen.MainDestination import com.nexters.boolti.presentation.screen.ticketId import com.nexters.boolti.presentation.theme.BooltiTheme +import com.nexters.boolti.presentation.theme.Grey10 import com.nexters.boolti.presentation.theme.Grey20 import com.nexters.boolti.presentation.theme.Grey30 import com.nexters.boolti.presentation.theme.Grey40 @@ -101,6 +114,7 @@ import com.nexters.boolti.presentation.theme.Grey80 import com.nexters.boolti.presentation.theme.Grey95 import com.nexters.boolti.presentation.theme.marginHorizontal import com.nexters.boolti.presentation.theme.point2 +import com.nexters.boolti.presentation.theme.point4 import com.nexters.boolti.presentation.util.TicketShape import com.nexters.boolti.presentation.util.asyncImageBlurModel import com.nexters.boolti.presentation.util.rememberQrBitmapPainter @@ -130,7 +144,7 @@ fun NavGraphBuilder.TicketDetailScreen( } } -@OptIn(ExperimentalMaterial3Api::class) +@OptIn(ExperimentalMaterial3Api::class, ExperimentalFoundationApi::class) @Composable private fun TicketDetailScreen( modifier: Modifier = Modifier, @@ -157,7 +171,11 @@ private fun TicketDetailScreen( val uiState by viewModel.uiState.collectAsStateWithLifecycle() val managerCodeState by viewModel.managerCodeState.collectAsStateWithLifecycle() - val ticket = uiState.legacyTicket + val ticketGroup = uiState.ticketGroup + val pagerState = rememberPagerState { ticketGroup.tickets.size } + val currentTicket = remember(ticketGroup, pagerState.currentPage) { + ticketGroup.tickets.getOrElse(pagerState.currentPage) { TicketGroup.Ticket() } + } val pullToRefreshState = rememberPullToRefreshState() @@ -176,7 +194,12 @@ private fun TicketDetailScreen( } Scaffold( - topBar = { BtBackAppBar(onClickBack = onBackClicked) }, + topBar = { + BtBackAppBar( + title = stringResource(R.string.ticket_detail_title), + onClickBack = onBackClicked, + ) + }, snackbarHost = { ToastSnackbarHost( modifier = Modifier.padding(bottom = 54.dp), @@ -190,7 +213,11 @@ private fun TicketDetailScreen( } } - Box(modifier = Modifier.nestedScroll(pullToRefreshState.nestedScrollConnection)) { + Box( + modifier = Modifier + .nestedScroll(pullToRefreshState.nestedScrollConnection) + .padding(top = 16.dp) + ) { Column( modifier = modifier .padding(innerPadding) @@ -225,7 +252,7 @@ private fun TicketDetailScreen( Box { // 배경 블러된 이미지 AsyncImage( - model = asyncImageBlurModel(context, ticket.poster, radius = 24), + model = asyncImageBlurModel(context, ticketGroup.poster, radius = 24), modifier = Modifier .size( width = contentWidth.toDp(), @@ -263,16 +290,14 @@ private fun TicketDetailScreen( coordinates.size.height.toFloat() } ) { - Title(ticketName = ticket.ticketName, csTicketId = ticket.csTicketId) + Title(showName = ticketGroup.showName) - AsyncImage( + QrCodes( modifier = Modifier - .padding(marginHorizontal) - .aspectRatio(0.75f) - .clip(RoundedCornerShape(8.dp)), - model = ticket.poster, - contentScale = ContentScale.Crop, - contentDescription = stringResource(R.string.description_poster) + .fillMaxWidth() + .padding(marginHorizontal), + ticketGroup = ticketGroup, + pagerState = pagerState, ) DottedDivider( @@ -285,12 +310,12 @@ private fun TicketDetailScreen( TicketInfo( bottomAreaHeight = ticketInfoHeight, - showName = ticket.showName, - showDate = ticket.showDate, - placeName = ticket.placeName, - entryCode = ticket.entryCode, - ticketState = ticket.ticketState, - onClickQr = { onClickQr(it, ticket.ticketName) }, + showName = ticketGroup.showName, + showDate = ticketGroup.showDate, + placeName = ticketGroup.placeName, + entryCode = currentTicket.entryCode, + ticketState = currentTicket.ticketState, + onClickQr = { onClickQr(it, ticketGroup.ticketName) }, ) } // 티켓 좌상단 꼭지점 그라데이션 @@ -308,15 +333,14 @@ private fun TicketDetailScreen( ) } - Notice(notice = ticket.ticketNotice) + Notice(notice = ticketGroup.ticketNotice) - val copiedMessage = - stringResource(id = R.string.ticketing_address_copied_message) + val copiedMessage = stringResource(id = R.string.ticketing_address_copied_message) Inquiry( - hostName = ticket.hostName, - hostPhoneNumber = ticket.hostPhoneNumber, + hostName = ticketGroup.hostName, + hostPhoneNumber = ticketGroup.hostPhoneNumber, onClickCopyPlace = { - clipboardManager.setText(AnnotatedString(ticket.streetAddress)) + clipboardManager.setText(AnnotatedString(ticketGroup.streetAddress)) if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.S_V2) { scope.launch { snackbarHostState.showSnackbar(copiedMessage) @@ -324,7 +348,7 @@ private fun TicketDetailScreen( } }, onClickNavigateToShowDetail = { - navigateToShowDetail(ticket.showId) + navigateToShowDetail(ticketGroup.showId) } ) } @@ -332,7 +356,7 @@ private fun TicketDetailScreen( Spacer(modifier = Modifier.size(20.dp)) RefundPolicySection(uiState.refundPolicy) - if (uiState.legacyTicket.ticketState == TicketState.Ready) { + if (currentTicket.ticketState == TicketState.Ready) { Text( modifier = Modifier .padding(top = 20.dp, bottom = 60.dp) @@ -353,7 +377,7 @@ private fun TicketDetailScreen( } if (showEnterCodeDialog) { - if (LocalDate.now().toEpochDay() < uiState.legacyTicket.showDate.toLocalDate().toEpochDay()) { + if (LocalDate.now().toEpochDay() < uiState.ticketGroup.showDate.toLocalDate().toEpochDay()) { // 아직 공연일 아님 BTDialog( showCloseButton = false, @@ -366,7 +390,7 @@ private fun TicketDetailScreen( color = MaterialTheme.colorScheme.onSurfaceVariant, ) } - } else if (uiState.legacyTicket.ticketState == TicketState.Ready) { + } else if (currentTicket.ticketState == TicketState.Ready) { ManagerCodeDialog( managerCode = managerCodeState.code, onManagerCodeChanged = viewModel::setManagerCode, @@ -396,10 +420,7 @@ private fun TicketDetailScreen( } @Composable -private fun Title( - ticketName: String = "", - csTicketId: String = "", -) { +private fun Title(showName: String = "") { Row( modifier = Modifier .background(White.copy(alpha = 0.3f)) @@ -407,26 +428,140 @@ private fun Title( .padding(horizontal = 20.dp, vertical = 10.dp), verticalAlignment = Alignment.CenterVertically, ) { - Image( - modifier = Modifier.padding(end = 4.dp), - painter = painterResource(R.drawable.ic_logo), - colorFilter = ColorFilter.tint(Grey70.copy(alpha = 0.5f)), - contentDescription = null, - ) Text( modifier = Modifier.weight(1f), - text = ticketName, + text = showName, style = MaterialTheme.typography.bodySmall.copy(fontWeight = FontWeight.SemiBold), color = Grey80, ) - Text( - text = csTicketId, - style = MaterialTheme.typography.bodySmall.copy(fontWeight = FontWeight.SemiBold), - color = Grey80, + Image( + modifier = Modifier.padding(end = 4.dp), + painter = painterResource(R.drawable.ic_logo), + colorFilter = ColorFilter.tint(Grey70.copy(alpha = 0.5f)), + contentDescription = null, ) } } +@OptIn(ExperimentalFoundationApi::class) +@Composable +private fun QrCodes( + modifier: Modifier = Modifier, + ticketGroup: TicketGroup, + pagerState: PagerState, +) { + Column( + modifier = modifier, + horizontalAlignment = Alignment.CenterHorizontally, + ) { + HorizontalPager( + modifier = Modifier + .fillMaxSize() + .aspectRatio(0.75f) + .clip(RoundedCornerShape(8.dp)) + .background(White), + state = pagerState, + pageSpacing = 8.dp, + ) { i -> + val ticket = ticketGroup.tickets[i] + QrCode( + ticketName = ticketGroup.ticketName, + qrCode = ticket.entryCode, + csTicketId = ticket.csTicketId, + ticketState = ticket.ticketState, + ) + } + if (ticketGroup.tickets.size > 1) { + InstagramIndicator( + modifier = Modifier.padding(top = 16.dp), + pagerState = pagerState, + ) + } + } +} + +@Composable +private fun QrCode( + ticketName: String, + qrCode: String, + csTicketId: String, + ticketState: TicketState, + modifier: Modifier = Modifier, +) { + Box( + modifier = modifier.fillMaxSize(), + contentAlignment = Alignment.Center, + ) { + Column( + modifier = Modifier, + horizontalAlignment = Alignment.CenterHorizontally, + ) { + Text( + modifier = Modifier + .clip(RoundedCornerShape(100.dp)) + .background(Grey10) + .padding(horizontal = 16.dp, vertical = 4.dp), + text = ticketName, + color = Grey70, + style = MaterialTheme.typography.titleLarge, + ) + Box( + modifier = Modifier + .height(IntrinsicSize.Max) + .width(IntrinsicSize.Max), + ) { + Image( + modifier = Modifier.padding(top = 16.dp), + painter = rememberQrBitmapPainter(qrCode, size = 178.dp), + contentDescription = stringResource(R.string.description_qr), + ) + when (ticketState) { + TicketState.Used -> QrCoverView(MaterialTheme.colorScheme.primary, "입장 완료") + TicketState.Finished -> QrCoverView(Grey80, "공연 종료") + TicketState.Ready -> Unit + } + } + Text( + modifier = Modifier + .padding(top = 16.dp), + text = csTicketId, + style = MaterialTheme.typography.bodySmall, + color = Grey70, + ) + } + } +} + +@Composable +private fun BoxScope.QrCoverView( + color: Color, + text: String, +) { + Box( + modifier = Modifier.Companion + .matchParentSize() + .background(White.copy(0.9f)), + contentAlignment = Alignment.Center, + ) { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + ) { + Icon( + modifier = Modifier.size(42.dp), + imageVector = ImageVector.vectorResource(R.drawable.ic_logo), + tint = color, + contentDescription = null, + ) + Text( + text = text, + style = point4, + fontSize = 20.sp, + color = color, + ) + } + } +} + @Composable private fun TicketInfo( bottomAreaHeight: Dp, @@ -601,7 +736,9 @@ private fun Inquiry( hostNumber = hostPhoneNumber ) Row( - modifier = Modifier.padding(top = 16.dp).fillMaxWidth(), + modifier = Modifier + .padding(top = 16.dp) + .fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(9.dp) ) { TextButton( diff --git a/presentation/src/main/java/com/nexters/boolti/presentation/screen/ticket/detail/TicketDetailUiState.kt b/presentation/src/main/java/com/nexters/boolti/presentation/screen/ticket/detail/TicketDetailUiState.kt index 6aafebdd..fa13f73d 100644 --- a/presentation/src/main/java/com/nexters/boolti/presentation/screen/ticket/detail/TicketDetailUiState.kt +++ b/presentation/src/main/java/com/nexters/boolti/presentation/screen/ticket/detail/TicketDetailUiState.kt @@ -1,8 +1,10 @@ package com.nexters.boolti.presentation.screen.ticket.detail import com.nexters.boolti.domain.model.LegacyTicket +import com.nexters.boolti.domain.model.TicketGroup data class TicketDetailUiState( val legacyTicket: LegacyTicket = LegacyTicket(), val refundPolicy: List = emptyList(), + val ticketGroup: TicketGroup = TicketGroup(), ) diff --git a/presentation/src/main/java/com/nexters/boolti/presentation/screen/ticket/detail/TicketDetailViewModel.kt b/presentation/src/main/java/com/nexters/boolti/presentation/screen/ticket/detail/TicketDetailViewModel.kt index 15a75a5b..5877464f 100644 --- a/presentation/src/main/java/com/nexters/boolti/presentation/screen/ticket/detail/TicketDetailViewModel.kt +++ b/presentation/src/main/java/com/nexters/boolti/presentation/screen/ticket/detail/TicketDetailViewModel.kt @@ -48,15 +48,16 @@ class TicketDetailViewModel @Inject constructor( private fun load(): Job { return viewModelScope.launch(recordExceptionHandler) { - repository.legacyGetTicket(ticketId) + repository.getTicket(ticketId) .catch { e -> when (e) { TicketException.TicketNotFound -> event(TicketDetailEvent.NotFound) } } - .singleOrNull()?.let { ticket -> - _uiState.update { it.copy(legacyTicket = ticket) } + .onEach { ticketGroup -> + _uiState.update { it.copy(ticketGroup = ticketGroup) } } + .launchIn(viewModelScope + recordExceptionHandler) getRefundPolicyUsecase().onEach { refundPolicy -> _uiState.update { it.copy(refundPolicy = refundPolicy) } @@ -68,9 +69,10 @@ class TicketDetailViewModel @Inject constructor( fun requestEntrance(managerCode: String) { val ticket = uiState.value.legacyTicket + val ticketGroup = uiState.value.ticketGroup viewModelScope.launch(recordExceptionHandler) { repository.requestEntrance( - ManagerCodeRequest(showId = ticket.showId, ticketId = ticket.ticketId, managerCode = managerCode) + ManagerCodeRequest(showId = ticketGroup.showId, ticketId = ticket.ticketId, managerCode = managerCode) ).catch { e -> when (e) { is ManagerCodeException -> { diff --git a/presentation/src/main/res/values/strings.xml b/presentation/src/main/res/values/strings.xml index e700d993..76dadfdc 100644 --- a/presentation/src/main/res/values/strings.xml +++ b/presentation/src/main/res/values/strings.xml @@ -103,6 +103,7 @@ 공연 관련 문의 공연장 주소 복사 공연 정보 보기 + 티켓 상세 옵션 선택