feat: show nice dates in events
This commit is contained in:
@@ -42,7 +42,13 @@ import com.russhwolf.settings.Settings
|
||||
sealed class Screen {
|
||||
data object Login : Screen()
|
||||
data object Schedule : Screen()
|
||||
data class EventDetail(val gameId: String, val account: String, val eventTitle: String) : Screen()
|
||||
data class EventDetail(
|
||||
val gameId: String,
|
||||
val account: String,
|
||||
val eventTitle: String,
|
||||
val eventStart: String,
|
||||
val eventEnd: String,
|
||||
) : Screen()
|
||||
}
|
||||
|
||||
@Composable
|
||||
@@ -82,14 +88,16 @@ fun App(
|
||||
Screen.Schedule -> ScheduleScreen(
|
||||
scheduleViewModel = scheduleViewModel,
|
||||
authViewModel = authViewModel,
|
||||
onEventClick = { gameId, account, eventTitle ->
|
||||
currentScreen = Screen.EventDetail(gameId, account, eventTitle)
|
||||
onEventClick = { gameId, account, eventTitle, eventStart, eventEnd ->
|
||||
currentScreen = Screen.EventDetail(gameId, account, eventTitle, eventStart, eventEnd)
|
||||
},
|
||||
)
|
||||
is Screen.EventDetail -> EventDetailScreen(
|
||||
gameId = screen.gameId,
|
||||
account = screen.account,
|
||||
eventTitle = screen.eventTitle,
|
||||
eventStart = screen.eventStart,
|
||||
eventEnd = screen.eventEnd,
|
||||
viewModel = eventDetailViewModel,
|
||||
onBack = { currentScreen = Screen.Schedule },
|
||||
)
|
||||
|
||||
@@ -80,7 +80,7 @@ fun EventCard(
|
||||
style = MaterialTheme.typography.bodySmall,
|
||||
)
|
||||
Text(
|
||||
text = formatEventDateTime(event.start, event.end),
|
||||
text = "Date: ${formatEventDateTime(event.start, event.end)}",
|
||||
style = MaterialTheme.typography.bodySmall,
|
||||
)
|
||||
}
|
||||
|
||||
@@ -44,6 +44,8 @@ import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.text.font.FontWeight
|
||||
import androidx.compose.ui.unit.dp
|
||||
import ch.parano.myice.ui.components.LoadingIndicator
|
||||
import ch.parano.myice.util.formatEventDate
|
||||
import ch.parano.myice.util.formatEventTimeRange
|
||||
import ch.parano.myice.viewmodel.EventDetailViewModel
|
||||
|
||||
@OptIn(ExperimentalMaterial3Api::class)
|
||||
@@ -52,6 +54,8 @@ fun EventDetailScreen(
|
||||
gameId: String,
|
||||
account: String,
|
||||
eventTitle: String,
|
||||
eventStart: String,
|
||||
eventEnd: String,
|
||||
viewModel: EventDetailViewModel,
|
||||
onBack: () -> Unit,
|
||||
modifier: Modifier = Modifier,
|
||||
@@ -113,7 +117,8 @@ fun EventDetailScreen(
|
||||
) {
|
||||
Text("Type: ${detail.type}")
|
||||
Text("Lieu: ${detail.place}")
|
||||
Text("Heure: ${detail.timeStart} - ${detail.timeEnd}")
|
||||
Text("Date: ${formatEventDate(eventStart)}")
|
||||
Text("Heure: ${formatEventTimeRange(eventStart, eventEnd)}")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -65,7 +65,7 @@ import ch.parano.myice.viewmodel.ScheduleViewModel
|
||||
fun ScheduleScreen(
|
||||
scheduleViewModel: ScheduleViewModel,
|
||||
authViewModel: AuthViewModel,
|
||||
onEventClick: (gameId: String, account: String, eventTitle: String) -> Unit,
|
||||
onEventClick: (gameId: String, account: String, eventTitle: String, eventStart: String, eventEnd: String) -> Unit,
|
||||
modifier: Modifier = Modifier,
|
||||
) {
|
||||
val scheduleState by scheduleViewModel.state.collectAsState()
|
||||
@@ -250,6 +250,8 @@ fun ScheduleScreen(
|
||||
event.idEvent,
|
||||
scheduleState.selectedAccount!!,
|
||||
event.title,
|
||||
event.start,
|
||||
event.end,
|
||||
)
|
||||
},
|
||||
)
|
||||
|
||||
@@ -19,23 +19,43 @@ package ch.parano.myice.util
|
||||
|
||||
import kotlinx.datetime.LocalDateTime
|
||||
|
||||
private val FRENCH_MONTHS = listOf(
|
||||
"janvier", "février", "mars", "avril", "mai", "juin",
|
||||
"juillet", "août", "septembre", "octobre", "novembre", "décembre",
|
||||
)
|
||||
|
||||
private fun parseOrNull(iso: String): LocalDateTime? = runCatching {
|
||||
LocalDateTime.parse(iso)
|
||||
LocalDateTime.parse(iso.replace(' ', 'T'))
|
||||
}.getOrNull()
|
||||
|
||||
private fun LocalDateTime.dateStr(): String =
|
||||
"${day.toString().padStart(2, '0')}.${monthNumber.toString().padStart(2, '0')}.${year.toString().padStart(4, '0')}"
|
||||
"${year.toString().padStart(4, '0')}-${monthNumber.toString().padStart(2, '0')}-${day.toString().padStart(2, '0')}"
|
||||
|
||||
private fun LocalDateTime.dateStrLong(): String =
|
||||
"$day ${FRENCH_MONTHS[monthNumber - 1]} $year"
|
||||
|
||||
private fun LocalDateTime.timeStr(): String =
|
||||
"${hour.toString().padStart(2, '0')}:${minute.toString().padStart(2, '0')}"
|
||||
if (minute == 0) "${hour}h" else "${hour}h${minute.toString().padStart(2, '0')}"
|
||||
|
||||
fun formatEventDateTime(start: String, end: String): String {
|
||||
val startDt = parseOrNull(start)
|
||||
val endDt = parseOrNull(end)
|
||||
if (startDt == null || endDt == null) return "$start - $end"
|
||||
return if (startDt.date == endDt.date) {
|
||||
"${startDt.dateStr()} ${startDt.timeStr()} - ${endDt.timeStr()}"
|
||||
"${startDt.dateStrLong()} de ${startDt.timeStr()} à ${endDt.timeStr()}"
|
||||
} else {
|
||||
"${startDt.dateStr()} ${startDt.timeStr()} - ${endDt.timeStr()} (${endDt.dateStr()})"
|
||||
"${startDt.dateStrLong()} de ${startDt.timeStr()} à ${endDt.timeStr()} (${endDt.dateStrLong()})"
|
||||
}
|
||||
}
|
||||
|
||||
fun formatEventDate(start: String): String {
|
||||
val dt = parseOrNull(start)
|
||||
return dt?.dateStrLong() ?: start
|
||||
}
|
||||
|
||||
fun formatEventTimeRange(start: String, end: String): String {
|
||||
val startDt = parseOrNull(start)
|
||||
val endDt = parseOrNull(end)
|
||||
if (startDt == null || endDt == null) return "$start - $end"
|
||||
return "${startDt.timeStr()} - ${endDt.timeStr()}"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user