-
Notifications
You must be signed in to change notification settings - Fork 1
/
FeedProvider.kt
103 lines (94 loc) · 3.67 KB
/
FeedProvider.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
package com.dluvian.voyage.data.provider
import com.dluvian.voyage.core.EventIdHex
import com.dluvian.voyage.core.PubkeyHex
import com.dluvian.voyage.core.SHORT_DEBOUNCE
import com.dluvian.voyage.core.firstThenDistinctDebounce
import com.dluvian.voyage.core.model.RootPostUI
import com.dluvian.voyage.data.event.OldestUsedEvent
import com.dluvian.voyage.data.interactor.Vote
import com.dluvian.voyage.data.model.FeedSetting
import com.dluvian.voyage.data.model.HomeFeedSetting
import com.dluvian.voyage.data.model.ProfileFeedSetting
import com.dluvian.voyage.data.model.TopicFeedSetting
import com.dluvian.voyage.data.nostr.NostrSubscriber
import com.dluvian.voyage.data.room.dao.RootPostDao
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.onEach
class FeedProvider(
private val nostrSubscriber: NostrSubscriber,
private val rootPostDao: RootPostDao,
private val forcedVotes: Flow<Map<EventIdHex, Vote>>,
private val oldestUsedEvent: OldestUsedEvent,
private val annotatedStringProvider: AnnotatedStringProvider,
private val forcedFollows: Flow<Map<PubkeyHex, Boolean>>
) {
suspend fun getFeedFlow(
until: Long,
subUntil: Long,
size: Int,
setting: FeedSetting,
): Flow<List<RootPostUI>> {
nostrSubscriber.subFeed(until = subUntil, limit = size, setting = setting)
val flow = when (setting) {
is HomeFeedSetting -> rootPostDao.getHomeRootPostFlow(until = until, size = size)
is TopicFeedSetting -> rootPostDao.getTopicRootPostFlow(
topic = setting.topic,
until = until,
size = size
)
is ProfileFeedSetting -> rootPostDao.getProfileRootPostFlow(
pubkey = setting.pubkey,
until = until,
size = size
)
}
return combine(flow, forcedVotes, forcedFollows) { posts, votes, follows ->
posts.map {
it.mapToRootPostUI(
forcedVotes = votes,
forcedFollows = follows,
annotatedStringProvider = annotatedStringProvider
)
}
}
.firstThenDistinctDebounce(SHORT_DEBOUNCE)
.onEach { posts ->
oldestUsedEvent.updateOldestCreatedAt(posts.minOfOrNull { it.createdAt })
nostrSubscriber.subVotesAndReplies(posts = posts)
}
}
suspend fun getStaticFeed(
until: Long,
size: Int,
setting: FeedSetting,
): List<RootPostUI> {
val posts = when (setting) {
is HomeFeedSetting -> rootPostDao.getHomeRootPosts(until = until, size = size)
is TopicFeedSetting -> rootPostDao.getTopicRootPosts(
topic = setting.topic,
until = until,
size = size
)
is ProfileFeedSetting -> rootPostDao.getProfileRootPosts(
pubkey = setting.pubkey,
until = until,
size = size
)
}
return posts.map {
it.mapToRootPostUI(
forcedVotes = emptyMap(),
forcedFollows = emptyMap(),
annotatedStringProvider = annotatedStringProvider
)
}
}
fun settingHasPostsFlow(setting: FeedSetting): Flow<Boolean> {
return when (setting) {
is HomeFeedSetting -> rootPostDao.hasHomeRootPostsFlow()
is TopicFeedSetting -> rootPostDao.hasTopicRootPostsFlow(topic = setting.topic)
is ProfileFeedSetting -> rootPostDao.hasProfileRootPostsFlow(pubkey = setting.pubkey)
}
}
}