11package com.cornellappdev.score.screen
22
33import ScoringSummary
4+ import android.content.Context
5+ import android.content.Intent
6+ import android.net.Uri
7+ import android.provider.CalendarContract
48import androidx.compose.foundation.Image
59import androidx.compose.foundation.background
610import androidx.compose.foundation.horizontalScroll
@@ -31,6 +35,7 @@ import androidx.compose.ui.unit.sp
3135import androidx.hilt.navigation.compose.hiltViewModel
3236import com.cornellappdev.score.R
3337import com.cornellappdev.score.components.BoxScore
38+ import com.cornellappdev.score.components.ButtonPrimary
3439import com.cornellappdev.score.components.EmptyStateBox
3540import com.cornellappdev.score.components.ErrorState
3641import com.cornellappdev.score.components.GameDetailsLoadingScreen
@@ -55,6 +60,10 @@ import com.cornellappdev.score.theme.Style.heading3
5560import com.cornellappdev.score.theme.White
5661import com.cornellappdev.score.viewmodel.GameDetailsViewModel
5762import java.time.LocalDate
63+ import java.time.LocalTime
64+ import java.time.ZoneId
65+ import java.time.format.DateTimeFormatter
66+ import java.util.Locale
5867
5968@Composable
6069fun GameDetailsScreen (
@@ -220,16 +229,26 @@ fun GameDetailsContent(
220229 }
221230
222231 Spacer (modifier = Modifier .weight(1f ))
223-
224- // ButtonPrimary(
225- // "Add to Calendar",
226- // painterResource(R.drawable.ic_calendar),
227- // onClick = {
228- // gameCard.toCalendarEvent()?.let { event ->
229- // addToCalendar(context = context, event)
230- // }
231- // }
232- // )
232+ Row () {
233+ ButtonPrimary (
234+ " Buy Tickets" ,
235+ painterResource(R .drawable.ticket),
236+ onClick = {
237+ gameCard.ticketUrl?.let { url ->
238+ val intent = Intent (Intent .ACTION_VIEW , Uri .parse(url))
239+ context.startActivity(intent)
240+ }
241+ }
242+ )
243+ Spacer (Modifier .size(16 .dp))
244+ ButtonPrimary (
245+ " Add to Calendar" ,
246+ painterResource(R .drawable.ic_calendar),
247+ onClick = {
248+ addGameToCalendar(context, gameCard)
249+ }
250+ )
251+ }
233252 }
234253
235254 }
@@ -331,7 +350,8 @@ private fun GameDetailsPreview() {
331350 daysUntilGame = 6 ,
332351 hoursUntilGame = 144 ,
333352 homeScore = 78 ,
334- oppScore = 75
353+ oppScore = 75 ,
354+ ticketUrl = " "
335355 ), navigateToGameScoreSummary = {}
336356 )
337357}
@@ -382,7 +402,36 @@ private fun EmptyGameDetailsPreview() {
382402 daysUntilGame = 0 ,
383403 hoursUntilGame = 0 ,
384404 homeScore = 0 ,
385- oppScore = 0
386- ), navigateToGameScoreSummary = {}
405+ oppScore = 0 ,
406+ ticketUrl = " "
407+ ),
408+ navigateToGameScoreSummary = {},
387409 )
410+ }
411+
412+ // helper
413+ fun addGameToCalendar (context : Context , gameCard : DetailsCardData ) {
414+ val date = gameCard.date ? : return
415+ val time = gameCard.time
416+
417+ val startDateTime = try {
418+ val formatter = DateTimeFormatter .ofPattern(" h:mm a" , Locale .ENGLISH )
419+ val localTime = LocalTime .parse(time.trim().uppercase(), formatter)
420+ date.atTime(localTime)
421+ } catch (e: Exception ) {
422+ date.atStartOfDay()
423+ }
424+
425+ val zoneId = ZoneId .systemDefault()
426+ val startMillis = startDateTime.atZone(zoneId).toInstant().toEpochMilli()
427+ val endMillis = startDateTime.plusHours(2 ).atZone(zoneId).toInstant().toEpochMilli()
428+
429+ val intent = Intent (Intent .ACTION_INSERT , CalendarContract .Events .CONTENT_URI ).apply {
430+ putExtra(CalendarContract .EXTRA_EVENT_BEGIN_TIME , startMillis)
431+ putExtra(CalendarContract .EXTRA_EVENT_END_TIME , endMillis)
432+ putExtra(CalendarContract .Events .TITLE , gameCard.title)
433+ putExtra(CalendarContract .Events .EVENT_LOCATION , gameCard.locationString)
434+ putExtra(CalendarContract .Events .DESCRIPTION , " ${gameCard.sport} - ${gameCard.gender} " )
435+ }
436+ context.startActivity(intent)
388437}
0 commit comments