From 81602a1f806b77e0b7c2a19e44fe6fed697f0201 Mon Sep 17 00:00:00 2001 From: algosketch Date: Tue, 12 Nov 2024 23:34:29 +0900 Subject: [PATCH] =?UTF-8?q?feat=20:=20=ED=8B=B0=EC=BC=93=20=ED=8C=90?= =?UTF-8?q?=EB=A7=A4=20=EC=A2=85=EB=A3=8C=20=EC=B9=B4=EC=9A=B4=ED=8A=B8=20?= =?UTF-8?q?=EB=8B=A4=EC=9A=B4=20=EB=B0=B0=EB=84=88=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/extension/LocalDateTime.kt | 17 ------ .../screen/showdetail/ShowDetailButtons.kt | 19 ++++++- .../screen/showdetail/ShowDetailScreen.kt | 57 +++++++++++++++++++ presentation/src/main/res/values/strings.xml | 1 + 4 files changed, 75 insertions(+), 19 deletions(-) diff --git a/presentation/src/main/java/com/nexters/boolti/presentation/extension/LocalDateTime.kt b/presentation/src/main/java/com/nexters/boolti/presentation/extension/LocalDateTime.kt index d456d776..652f1f45 100644 --- a/presentation/src/main/java/com/nexters/boolti/presentation/extension/LocalDateTime.kt +++ b/presentation/src/main/java/com/nexters/boolti/presentation/extension/LocalDateTime.kt @@ -2,9 +2,7 @@ package com.nexters.boolti.presentation.extension import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringArrayResource -import androidx.compose.ui.res.stringResource import com.nexters.boolti.presentation.R -import java.time.Duration import java.time.LocalDate import java.time.LocalDateTime import java.time.format.DateTimeFormatter @@ -38,19 +36,4 @@ val LocalDateTime.dDay: Long get() = run { val today = LocalDate.now() ChronoUnit.DAYS.between(today, toLocalDate()) - } - -val LocalDateTime.countDownString: String - @Composable - get() = run { - val now = LocalDateTime.now() - - val duration = Duration.between(now, this) - - val days = duration.toDays() - val hours = duration.toHours() % 24 - val minutes = duration.toMinutes() % 60 - - stringResource(id = R.string.ticketing_button_ticket_countdown, days) + - " ${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}" } \ No newline at end of file diff --git a/presentation/src/main/java/com/nexters/boolti/presentation/screen/showdetail/ShowDetailButtons.kt b/presentation/src/main/java/com/nexters/boolti/presentation/screen/showdetail/ShowDetailButtons.kt index 66cbe223..aba65ba2 100644 --- a/presentation/src/main/java/com/nexters/boolti/presentation/screen/showdetail/ShowDetailButtons.kt +++ b/presentation/src/main/java/com/nexters/boolti/presentation/screen/showdetail/ShowDetailButtons.kt @@ -21,11 +21,11 @@ import com.nexters.boolti.domain.model.ShowState import com.nexters.boolti.presentation.R import com.nexters.boolti.presentation.component.MainButton import com.nexters.boolti.presentation.component.MainButtonDefaults -import com.nexters.boolti.presentation.extension.countDownString import com.nexters.boolti.presentation.theme.BooltiTheme import com.nexters.boolti.presentation.theme.Grey50 import com.nexters.boolti.presentation.theme.Grey80 import com.nexters.boolti.presentation.theme.marginHorizontal +import java.time.Duration import java.time.LocalDateTime @Composable @@ -137,4 +137,19 @@ fun ShowDetailButtonsBeforeTicketingPreview() { onGiftClicked = {} ) } -} \ No newline at end of file +} + +private val LocalDateTime.countDownString: String + @Composable + get() = run { + val now = LocalDateTime.now() + + val duration = Duration.between(now, this) + + val days = duration.toDays() + val hours = duration.toHours() % 24 + val minutes = duration.toMinutes() % 60 + + stringResource(id = R.string.ticketing_button_ticket_countdown, days) + + " ${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}" + } \ No newline at end of file diff --git a/presentation/src/main/java/com/nexters/boolti/presentation/screen/showdetail/ShowDetailScreen.kt b/presentation/src/main/java/com/nexters/boolti/presentation/screen/showdetail/ShowDetailScreen.kt index 19963fb1..587e0f53 100644 --- a/presentation/src/main/java/com/nexters/boolti/presentation/screen/showdetail/ShowDetailScreen.kt +++ b/presentation/src/main/java/com/nexters/boolti/presentation/screen/showdetail/ShowDetailScreen.kt @@ -62,6 +62,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.vectorResource import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel @@ -81,18 +82,23 @@ import com.nexters.boolti.presentation.extension.showDateTimeString import com.nexters.boolti.presentation.screen.LocalSnackbarController import com.nexters.boolti.presentation.screen.ticketing.ChooseTicketBottomSheet import com.nexters.boolti.presentation.screen.ticketing.TicketBottomSheetType +import com.nexters.boolti.presentation.theme.BooltiTheme +import com.nexters.boolti.presentation.theme.Grey05 import com.nexters.boolti.presentation.theme.Grey20 import com.nexters.boolti.presentation.theme.Grey30 import com.nexters.boolti.presentation.theme.Grey50 import com.nexters.boolti.presentation.theme.Grey70 import com.nexters.boolti.presentation.theme.Grey80 import com.nexters.boolti.presentation.theme.Grey85 +import com.nexters.boolti.presentation.theme.Grey90 import com.nexters.boolti.presentation.theme.marginHorizontal import com.nexters.boolti.presentation.theme.point2 import com.nexters.boolti.presentation.theme.point3 import com.nexters.boolti.presentation.util.UrlParser import kotlinx.coroutines.launch import timber.log.Timber +import java.time.Duration +import java.time.LocalDateTime import kotlin.math.ceil @Composable @@ -172,6 +178,12 @@ fun ShowDetailScreen( LazyColumn( modifier = Modifier, ) { + item { + CountDownBanner( + uiState.showDetail.salesEndDate.plusDays(1).atStartOfDay().minusMinutes(1) + ) + } + item { Poster( modifier = modifier.fillMaxWidth(), @@ -771,3 +783,48 @@ private fun Cast( private fun Divider(modifier: Modifier = Modifier) { HorizontalDivider(modifier = modifier, color = Grey85) } + +@Composable +private fun CountDownBanner(deadlineDateTime: LocalDateTime) { + Box( + modifier = Modifier + .height(40.dp) + .fillMaxWidth() + .background(Grey05), + contentAlignment = Alignment.Center + ) { + Text( + text = deadlineDateTime.countDownString, + style = MaterialTheme.typography.titleLarge.copy(color = Grey90) + ) + } +} + +private val LocalDateTime.countDownString: String + @Composable + get() = run { + val now = LocalDateTime.now() + + val duration = Duration.between(now, this) + val hours = duration.toHours() % 24 + val minutes = duration.toMinutes() % 60 + val seconds = duration.seconds % 60 + + stringResource(id = R.string.show_ticketing_deadline_countdown) + " " + + "${hours.toString().padStart(2, '0')}:" + + "${minutes.toString().padStart(2, '0')}:" + + seconds.toString().padStart(2, '0') + } + +@Preview +@Composable +private fun CountDownBannerPreview() { + BooltiTheme { + CountDownBanner( + deadlineDateTime = LocalDateTime.now() + .plusHours(0) + .plusMinutes(5) + .plusSeconds(12) + ) + } +} \ No newline at end of file diff --git a/presentation/src/main/res/values/strings.xml b/presentation/src/main/res/values/strings.xml index 42c5e0c1..a5f24514 100644 --- a/presentation/src/main/res/values/strings.xml +++ b/presentation/src/main/res/values/strings.xml @@ -221,6 +221,7 @@ 공연 정보 출연진 %d매 판매 완료 + 🔥 판매 종료까지 COMING SOON 조금만 기다려주세요!