-
Notifications
You must be signed in to change notification settings - Fork 1
/
TopicViewModel.kt
56 lines (51 loc) · 2.05 KB
/
TopicViewModel.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
package com.dluvian.voyage.core.viewModel
import androidx.compose.foundation.lazy.LazyListState
import androidx.compose.runtime.mutableStateOf
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.dluvian.voyage.core.TopicViewAction
import com.dluvian.voyage.core.TopicViewAppend
import com.dluvian.voyage.core.TopicViewRefresh
import com.dluvian.voyage.core.model.Paginator
import com.dluvian.voyage.core.navigator.TopicNavView
import com.dluvian.voyage.core.normalizeTopic
import com.dluvian.voyage.data.model.TopicFeedSetting
import com.dluvian.voyage.data.nostr.SubscriptionCreator
import com.dluvian.voyage.data.provider.FeedProvider
import com.dluvian.voyage.data.provider.TopicProvider
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.stateIn
class TopicViewModel(
feedProvider: FeedProvider,
private val subCreator: SubscriptionCreator,
private val topicProvider: TopicProvider,
val feedState: LazyListState,
) : ViewModel() {
val currentTopic = mutableStateOf("")
var isFollowed: StateFlow<Boolean> = MutableStateFlow(false)
val paginator = Paginator(
feedProvider = feedProvider,
scope = viewModelScope,
subCreator = subCreator
)
fun openTopic(topicNavView: TopicNavView) {
val stripped = topicNavView.topic.normalizeTopic()
subCreator.unsubAll()
paginator.init(setting = TopicFeedSetting(topic = stripped))
val initVal = if (currentTopic.value == stripped) isFollowed.value else false
currentTopic.value = stripped
isFollowed = topicProvider.getIsFollowedFlow(topic = topicNavView.topic)
.stateIn(viewModelScope, SharingStarted.Eagerly, initVal)
}
fun handle(action: TopicViewAction) {
when (action) {
is TopicViewRefresh -> {
subCreator.unsubAll()
paginator.refresh()
}
is TopicViewAppend -> paginator.append()
}
}
}