1
1
package com.lahsuak.apps.geminiai.ui.screen
2
2
3
+ import androidx.compose.foundation.ExperimentalFoundationApi
4
+ import androidx.compose.foundation.clickable
5
+ import androidx.compose.foundation.layout.Arrangement
6
+ import androidx.compose.foundation.layout.Column
7
+ import androidx.compose.foundation.layout.fillMaxSize
8
+ import androidx.compose.foundation.layout.fillMaxWidth
3
9
import androidx.compose.foundation.layout.padding
4
10
import androidx.compose.foundation.lazy.LazyColumn
5
11
import androidx.compose.foundation.lazy.items
12
+ import androidx.compose.foundation.shape.RoundedCornerShape
6
13
import androidx.compose.material.icons.Icons
7
14
import androidx.compose.material.icons.filled.Add
8
- import androidx.compose.material3.Card
9
15
import androidx.compose.material3.ExperimentalMaterial3Api
10
16
import androidx.compose.material3.FloatingActionButton
11
17
import androidx.compose.material3.Icon
18
+ import androidx.compose.material3.MaterialTheme
12
19
import androidx.compose.material3.Scaffold
13
20
import androidx.compose.material3.Text
14
21
import androidx.compose.material3.TopAppBar
15
22
import androidx.compose.runtime.Composable
16
23
import androidx.compose.runtime.collectAsState
17
24
import androidx.compose.runtime.getValue
25
+ import androidx.compose.ui.Alignment
18
26
import androidx.compose.ui.Modifier
27
+ import androidx.compose.ui.draw.clip
28
+ import androidx.compose.ui.graphics.Color
29
+ import androidx.compose.ui.res.painterResource
19
30
import androidx.compose.ui.res.stringResource
20
31
import androidx.compose.ui.text.style.TextOverflow
21
32
import androidx.compose.ui.unit.dp
22
33
import com.lahsuak.apps.geminiai.R
23
34
import com.lahsuak.apps.geminiai.ui.model.Role
24
35
import com.lahsuak.apps.geminiai.ui.viewmodel.GroupViewModel
36
+ import java.text.SimpleDateFormat
37
+ import java.util.Locale
25
38
import java.util.UUID
26
39
27
- @OptIn(ExperimentalMaterial3Api ::class )
40
+ @OptIn(ExperimentalMaterial3Api ::class , ExperimentalFoundationApi :: class )
28
41
@Composable
29
42
fun MenuScreen (
30
43
groupViewModel : GroupViewModel ,
@@ -43,26 +56,78 @@ fun MenuScreen(
43
56
}
44
57
}
45
58
) { paddingValue ->
46
- LazyColumn (
47
- Modifier
48
- .padding(paddingValue)
49
- .padding(top = 16 .dp, bottom = 16 .dp)
50
- ) {
51
- items(list.reversed()) {
52
- Card (
53
- modifier = Modifier .padding(bottom = 8 .dp, start = 8 .dp, end = 8 .dp),
54
- onClick = {
55
- onItemClicked(" chat" , it.id)
56
- }) {
57
- Text (
58
- text = it.chats.lastOrNull{
59
- it.role == Role .YOU
60
- }?.text ? : " " ,
61
- overflow = TextOverflow .Ellipsis ,
62
- modifier = Modifier .padding(12 .dp)
63
- )
59
+ if (list.isEmpty()) {
60
+ Column (modifier = Modifier .fillMaxSize(), verticalArrangement = Arrangement .Center ) {
61
+ Icon (
62
+ painter = painterResource(id = R .drawable.ic_launcher_foreground),
63
+ contentDescription = " null" ,
64
+ modifier = Modifier .align(Alignment .CenterHorizontally )
65
+ )
66
+ Text (
67
+ " Start a new chat" ,
68
+ style = MaterialTheme .typography.titleLarge,
69
+ modifier = Modifier .align(Alignment .CenterHorizontally )
70
+ )
71
+ }
72
+ } else {
73
+ LazyColumn (
74
+ Modifier
75
+ .fillMaxSize()
76
+ .padding(paddingValue)
77
+ .padding(top = 16 .dp, bottom = 16 .dp)
78
+ ) {
79
+ val groupItems = list.sortedByDescending {
80
+ it.chats.last().time!! .time
81
+ }.groupBy {
82
+ getDate(it.chats.last().time!! .time)
83
+ }
84
+ groupItems.forEach { (date, items) ->
85
+ stickyHeader {
86
+ Text (
87
+ date,
88
+ style = MaterialTheme .typography.titleSmall,
89
+ color = MaterialTheme .colorScheme.primary,
90
+ modifier = Modifier .padding(start = 12 .dp),
91
+ )
92
+ }
93
+ items(items, key = { item -> item.id }) {
94
+ Column (
95
+ modifier = Modifier
96
+ .fillMaxWidth()
97
+ .padding(bottom = 8 .dp, start = 8 .dp, end = 8 .dp)
98
+ .clip(RoundedCornerShape (8 .dp))
99
+ .clickable {
100
+ onItemClicked(" chat" , it.id)
101
+ }
102
+ ) {
103
+ Text (
104
+ text = it.chats.lastOrNull {
105
+ it.role == Role .YOU
106
+ }?.text ? : " " ,
107
+ overflow = TextOverflow .Ellipsis ,
108
+ maxLines = 1 ,
109
+ style = MaterialTheme .typography.titleMedium,
110
+ modifier = Modifier .padding(horizontal = 8 .dp)
111
+ )
112
+ Text (
113
+ text = it.chats.lastOrNull {
114
+ it.role == Role .GEMINI
115
+ }?.text?.take(100 ) ? : " " ,
116
+ maxLines = 2 ,
117
+ overflow = TextOverflow .Ellipsis ,
118
+ modifier = Modifier .padding(8 .dp),
119
+ style = MaterialTheme .typography.bodyMedium,
120
+ color = Color .Gray
121
+ )
122
+ }
123
+ }
64
124
}
65
125
}
66
126
}
67
127
}
128
+ }
129
+
130
+ fun getDate (date : Long ): String {
131
+ val sdf = SimpleDateFormat (" dd MMM" , Locale .getDefault())
132
+ return sdf.format(date)
68
133
}
0 commit comments