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

73 lines
2.2 KiB
Kotlin
Raw Normal View History

package com.keylesspalace.tusky.components.domainblocks
2023-07-04 19:30:57 +02:00
import android.view.View
import androidx.annotation.StringRes
2023-07-04 19:30:57 +02:00
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import androidx.paging.cachedIn
import at.connyduck.calladapter.networkresult.fold
2023-07-05 20:09:16 +02:00
import at.connyduck.calladapter.networkresult.onFailure
import com.keylesspalace.tusky.R
import javax.inject.Inject
2023-07-04 19:30:57 +02:00
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.launch
class DomainBlocksViewModel @Inject constructor(
2023-07-05 20:09:16 +02:00
private val repo: DomainBlocksRepository
2023-07-04 19:30:57 +02:00
) : ViewModel() {
2023-07-05 20:09:16 +02:00
val domainPager = repo.domainPager.cachedIn(viewModelScope)
val uiEvents = MutableSharedFlow<SnackbarEvent>()
2023-07-04 19:30:57 +02:00
fun block(domain: String) {
2023-07-04 19:30:57 +02:00
viewModelScope.launch {
2023-07-05 20:09:16 +02:00
repo.block(domain).onFailure { e ->
uiEvents.emit(
SnackbarEvent(
message = R.string.error_blocking_domain,
domain = domain,
throwable = e,
actionText = R.string.action_retry,
action = { block(domain) }
)
)
2023-07-05 20:09:16 +02:00
}
2023-07-04 19:30:57 +02:00
}
}
fun unblock(domain: String) {
2023-07-04 19:30:57 +02:00
viewModelScope.launch {
2023-07-05 20:09:16 +02:00
repo.unblock(domain).fold({
uiEvents.emit(
SnackbarEvent(
message = R.string.confirmation_domain_unmuted,
domain = domain,
throwable = null,
actionText = R.string.action_undo,
action = { block(domain) }
)
)
2023-07-04 19:30:57 +02:00
}, { e ->
uiEvents.emit(
SnackbarEvent(
message = R.string.error_unblocking_domain,
domain = domain,
throwable = e,
actionText = R.string.action_retry,
action = { unblock(domain) }
)
)
2023-07-04 19:30:57 +02:00
})
}
}
}
class SnackbarEvent(
@StringRes val message: Int,
val domain: String,
val throwable: Throwable?,
@StringRes val actionText: Int,
val action: (View) -> Unit
)