Tusky-App-Android/app/src/main/java/com/keylesspalace/tusky/components/domainblocks/DomainBlocksViewModel.kt

72 lines
2.3 KiB
Kotlin
Raw Normal View History

package com.keylesspalace.tusky.components.domainblocks
2023-07-04 19:30:57 +02:00
import android.util.Log
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import androidx.paging.ExperimentalPagingApi
import androidx.paging.Pager
import androidx.paging.PagingConfig
import androidx.paging.cachedIn
import at.connyduck.calladapter.networkresult.fold
import com.keylesspalace.tusky.network.MastodonApi
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.launch
import javax.inject.Inject
class DomainBlocksViewModel @Inject constructor(
2023-07-04 19:30:57 +02:00
private val api: MastodonApi
) : ViewModel() {
val domains: MutableList<String> = mutableListOf()
val uiEvents = MutableSharedFlow<DomainBlockEvent>()
2023-07-04 19:30:57 +02:00
var nextKey: String? = null
var currentSource: DomainBlocksPagingSource? = null
2023-07-04 19:30:57 +02:00
@OptIn(ExperimentalPagingApi::class)
val pager = Pager(
config = PagingConfig(pageSize = 20),
remoteMediator = DomainBlocksRemoteMediator(api, this),
2023-07-04 19:30:57 +02:00
pagingSourceFactory = {
DomainBlocksPagingSource(
2023-07-04 19:30:57 +02:00
viewModel = this
).also { source ->
currentSource = source
}
}
).flow.cachedIn(viewModelScope)
fun block(domain: String) {
2023-07-04 19:30:57 +02:00
viewModelScope.launch {
api.blockDomain(domain).fold({
domains.add(domain)
currentSource?.invalidate()
}, { e ->
Log.w(TAG, "Error blocking domain $domain", e)
uiEvents.emit(DomainBlockEvent.BlockError(domain))
2023-07-04 19:30:57 +02:00
})
}
}
fun unblock(domain: String) {
2023-07-04 19:30:57 +02:00
viewModelScope.launch {
api.unblockDomain(domain).fold({
domains.remove(domain)
currentSource?.invalidate()
uiEvents.emit(DomainBlockEvent.BlockSuccess(domain))
2023-07-04 19:30:57 +02:00
}, { e ->
Log.w(TAG, "Error unblocking domain $domain", e)
uiEvents.emit(DomainBlockEvent.UnblockError(domain))
2023-07-04 19:30:57 +02:00
})
}
}
companion object {
private const val TAG = "DomainBlocksViewModel"
2023-07-04 19:30:57 +02:00
}
}
sealed class DomainBlockEvent {
data class BlockSuccess(val domain: String) : DomainBlockEvent()
data class UnblockError(val domain: String) : DomainBlockEvent()
data class BlockError(val domain: String) : DomainBlockEvent()
2023-07-04 19:30:57 +02:00
}