summaryrefslogtreecommitdiff
path: root/android/app/src/main/java/org/terst/doot/widget/ui/EventDetailActivity.kt
blob: b8423ce5b2b4b0c423ac5f3667e23bb2e3609b19 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
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<String?>(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))
        }
    }
}