-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMainFeed.kt
95 lines (91 loc) · 3.03 KB
/
MainFeed.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
package com.github.jetbrains.rssreader.androidApp.composeui
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyRow
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import com.github.jetbrains.rssreader.app.FeedAction
import com.github.jetbrains.rssreader.app.FeedStore
import com.github.jetbrains.rssreader.core.entity.Feed
import com.github.jetbrains.rssreader.core.entity.Post
import com.google.accompanist.insets.navigationBarsHeight
import kotlinx.coroutines.launch
@Composable
fun MainFeed(
store: FeedStore,
onPostClick: (Post) -> Unit,
onEditClick: () -> Unit,
) {
val state = store.observeState().collectAsState()
val posts = remember(state.value.feeds, state.value.selectedFeed) {
(state.value.selectedFeed?.posts ?: state.value.feeds.flatMap { it.posts })
.sortedByDescending { it.date }
}
Column {
val coroutineScope = rememberCoroutineScope()
val listState = rememberLazyListState()
PostList(
modifier = Modifier.weight(1f),
posts = posts,
listState = listState
) { post -> onPostClick(post) }
MainFeedBottomBar(
feeds = state.value.feeds,
selectedFeed = state.value.selectedFeed,
onFeedClick = { feed ->
coroutineScope.launch { listState.scrollToItem(0) }
store.dispatch(FeedAction.SelectFeed(feed))
},
onEditClick = onEditClick
)
Spacer(
Modifier
.navigationBarsHeight()
.fillMaxWidth()
)
}
}
private sealed class Icons {
object All : Icons()
class FeedIcon(val feed: Feed) : Icons()
object Edit : Icons()
}
@Composable
fun MainFeedBottomBar(
feeds: List<Feed>,
selectedFeed: Feed?,
onFeedClick: (Feed?) -> Unit,
onEditClick: () -> Unit
) {
val items = buildList {
add(Icons.All)
addAll(feeds.map { Icons.FeedIcon(it) })
add(Icons.Edit)
}
LazyRow(
modifier = Modifier.fillMaxWidth(),
contentPadding = PaddingValues(16.dp)
) {
this.items(items) { item ->
when (item) {
is Icons.All -> FeedIcon(
feed = null,
isSelected = selectedFeed == null,
onClick = { onFeedClick(null) }
)
is Icons.FeedIcon -> FeedIcon(
feed = item.feed,
isSelected = selectedFeed == item.feed,
onClick = { onFeedClick(item.feed) }
)
is Icons.Edit -> EditIcon(onClick = onEditClick)
}
Spacer(modifier = Modifier.size(16.dp))
}
}
}