package org.terst.doot.widget.ui import android.content.Intent import android.net.Uri import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.foundation.background import androidx.compose.foundation.layout.* import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.* import androidx.compose.runtime.* import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.lifecycle.lifecycleScope import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch import okhttp3.OkHttpClient import org.terst.doot.widget.data.Keys import org.terst.doot.widget.data.WidgetRepository import org.terst.doot.widget.data.dataStore class EventDetailActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val title = intent.getStringExtra(EXTRA_TITLE) ?: "" val source = intent.getStringExtra(EXTRA_SOURCE) ?: "calendar" val url = intent.getStringExtra(EXTRA_URL) ?: "" val recurringEventId = intent.getStringExtra(EXTRA_RECURRING_EVENT_ID) setContent { MaterialTheme(colorScheme = darkColorScheme()) { EventDetailSheet( title = title, source = source, recurringEventId = recurringEventId, onOpenCalendar = { startActivity( Intent(Intent.ACTION_VIEW, Uri.parse(url.ifEmpty { "https://calendar.google.com" })) ) finish() }, onDismiss = ::finish ) } } } companion object { const val EXTRA_TITLE = "event_title" const val EXTRA_SOURCE = "event_source" const val EXTRA_URL = "event_url" const val EXTRA_RECURRING_EVENT_ID = "event_recurring_id" } } @OptIn(ExperimentalMaterial3Api::class) @Composable fun EventDetailSheet( title: String, source: String, recurringEventId: String?, onOpenCalendar: () -> Unit, onDismiss: () -> Unit ) { val context = LocalContext.current var recurrenceText by remember { mutableStateOf(null) } LaunchedEffect(recurringEventId) { if (recurringEventId == null) return@LaunchedEffect recurrenceText = "Loading…" val prefs = context.dataStore.data.first() val url = prefs[Keys.SERVER_URL]?.trimEnd('/') ?: return@LaunchedEffect val token = prefs[Keys.TOKEN] ?: return@LaunchedEffect val repo = WidgetRepository(OkHttpClient(), url, token) repo.getRecurrence(recurringEventId).onSuccess { text -> recurrenceText = text }.onFailure { recurrenceText = null } } ModalBottomSheet( onDismissRequest = onDismiss, sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true), containerColor = Color(0xFF1E293B), tonalElevation = 0.dp, dragHandle = { Box( modifier = Modifier .padding(vertical = 12.dp) .width(36.dp) .height(4.dp) .background(Color.White.copy(alpha = 0.25f), RoundedCornerShape(2.dp)) ) } ) { Column( modifier = Modifier .fillMaxWidth() .padding(horizontal = 20.dp) .navigationBarsPadding() ) { Row(verticalAlignment = androidx.compose.ui.Alignment.CenterVertically) { Box( modifier = Modifier .size(10.dp) .background(sourceColor(source), RoundedCornerShape(5.dp)) ) Spacer(Modifier.width(10.dp)) Text( text = title, fontSize = 17.sp, fontWeight = FontWeight.SemiBold, color = Color.White, modifier = Modifier.weight(1f) ) } recurrenceText?.let { text -> Spacer(Modifier.height(8.dp)) Text( text = text, fontSize = 13.sp, color = Color.White.copy(alpha = 0.6f) ) } Spacer(Modifier.height(20.dp)) OutlinedButton( onClick = onOpenCalendar, modifier = Modifier.fillMaxWidth(), colors = ButtonDefaults.outlinedButtonColors(contentColor = Color.White), border = androidx.compose.foundation.BorderStroke(1.dp, Color.White.copy(alpha = 0.3f)) ) { Text("Open in Calendar", fontSize = 15.sp) } Spacer(Modifier.height(20.dp)) } } }