-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFeedList.kt
110 lines (106 loc) · 3.37 KB
/
FeedList.kt
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
package com.github.jetbrains.rssreader.androidApp.composeui
import androidx.compose.foundation.Image
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.itemsIndexed
import androidx.compose.material.FloatingActionButton
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.vectorResource
import androidx.compose.ui.unit.dp
import com.github.jetbrains.rssreader.androidApp.R
import com.github.jetbrains.rssreader.app.FeedAction
import com.github.jetbrains.rssreader.app.FeedStore
import com.github.jetbrains.rssreader.core.entity.Feed
import com.google.accompanist.insets.navigationBarsWithImePadding
import com.google.accompanist.insets.statusBarsHeight
@Composable
fun FeedList(store: FeedStore) {
Box(
modifier = Modifier.fillMaxSize()
) {
val state = store.observeState().collectAsState()
val showAddDialog = remember { mutableStateOf(false) }
val feedForDelete = remember<MutableState<Feed?>> { mutableStateOf(null) }
FeedItemList(feeds = state.value.feeds) {
feedForDelete.value = it
}
FloatingActionButton(
modifier = Modifier
.align(Alignment.BottomEnd)
.padding(16.dp)
.navigationBarsWithImePadding(),
onClick = { showAddDialog.value = true }
) {
Image(
imageVector = ImageVector.vectorResource(R.drawable.ic_add),
modifier = Modifier.align(Alignment.Center),
contentDescription = null
)
}
if (showAddDialog.value) {
AddFeedDialog(
onAdd = {
store.dispatch(FeedAction.Add(it))
showAddDialog.value = false
},
onDismiss = {
showAddDialog.value = false
}
)
}
feedForDelete.value?.let { feed ->
DeleteFeedDialog(
feed = feed,
onDelete = {
store.dispatch(FeedAction.Delete(feed.sourceUrl))
feedForDelete.value = null
},
onDismiss = {
feedForDelete.value = null
}
)
}
}
}
@Composable
fun FeedItemList(
feeds: List<Feed>,
onClick: (Feed) -> Unit
) {
LazyColumn {
itemsIndexed(feeds) { i, feed ->
if (i == 0) Spacer(modifier = Modifier.statusBarsHeight())
FeedItem(feed) { onClick(feed) }
}
}
}
@Composable
fun FeedItem(
feed: Feed,
onClick: () -> Unit
) {
Row(
Modifier
.clickable(onClick = onClick, enabled = !feed.isDefault)
.padding(16.dp)
) {
FeedIcon(feed = feed)
Spacer(modifier = Modifier.size(16.dp))
Column {
Text(
style = MaterialTheme.typography.body1,
text = feed.title
)
Text(
style = MaterialTheme.typography.body2,
text = feed.desc
)
}
}
}