refactor: Update ViewThreadViewModel to use FiltersRepository (#156)
Instead of calling the filters API directly use `FiltersRepository` to handle the v1/v2 filter differences.
This commit is contained in:
parent
0902b0ba49
commit
ff5d7f1d27
@ -28,6 +28,8 @@ import app.pachli.appstore.StatusComposedEvent
|
||||
import app.pachli.appstore.StatusDeletedEvent
|
||||
import app.pachli.appstore.StatusEditedEvent
|
||||
import app.pachli.components.timeline.CachedTimelineRepository
|
||||
import app.pachli.components.timeline.FilterKind
|
||||
import app.pachli.components.timeline.FiltersRepository
|
||||
import app.pachli.components.timeline.util.ifExpected
|
||||
import app.pachli.db.AccountEntity
|
||||
import app.pachli.db.AccountManager
|
||||
@ -52,7 +54,6 @@ import kotlinx.coroutines.flow.MutableSharedFlow
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.update
|
||||
import kotlinx.coroutines.launch
|
||||
import retrofit2.HttpException
|
||||
import javax.inject.Inject
|
||||
|
||||
@HiltViewModel
|
||||
@ -65,6 +66,7 @@ class ViewThreadViewModel @Inject constructor(
|
||||
private val timelineDao: TimelineDao,
|
||||
private val gson: Gson,
|
||||
private val repository: CachedTimelineRepository,
|
||||
private val filtersRepository: FiltersRepository,
|
||||
) : ViewModel() {
|
||||
|
||||
private val _uiState: MutableStateFlow<ThreadUiState> = MutableStateFlow(ThreadUiState.Loading)
|
||||
@ -466,27 +468,24 @@ class ViewThreadViewModel @Inject constructor(
|
||||
|
||||
private fun loadFilters() {
|
||||
viewModelScope.launch {
|
||||
api.getFilters().fold(
|
||||
{
|
||||
filterModel.kind = Filter.Kind.THREAD
|
||||
updateStatuses()
|
||||
},
|
||||
{ throwable ->
|
||||
if (throwable is HttpException && throwable.code() == 404) {
|
||||
val filters = api.getFiltersV1().getOrElse {
|
||||
Log.w(TAG, "Failed to fetch filters", it)
|
||||
return@launch
|
||||
}
|
||||
|
||||
try {
|
||||
when (val filters = filtersRepository.getFilters()) {
|
||||
is FilterKind.V1 -> {
|
||||
filterModel.initWithFilters(
|
||||
filters.filter { filter -> filter.context.contains(FilterV1.THREAD) },
|
||||
filters.filters.filter { filter ->
|
||||
filter.context.contains(FilterV1.THREAD)
|
||||
},
|
||||
)
|
||||
updateStatuses()
|
||||
} else {
|
||||
Log.e(TAG, "Error getting filters", throwable)
|
||||
}
|
||||
},
|
||||
)
|
||||
|
||||
is FilterKind.V2 -> filterModel.kind = Filter.Kind.THREAD
|
||||
}
|
||||
updateStatuses()
|
||||
} catch (_: Exception) {
|
||||
// TODO: Deliberately don't emit to _errors here -- at the moment
|
||||
// ViewThreadFragment shows a generic error to the user, and that
|
||||
// would confuse them when the rest of the thread is loading OK.
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -10,6 +10,8 @@ import app.pachli.appstore.EventHub
|
||||
import app.pachli.appstore.FavoriteEvent
|
||||
import app.pachli.appstore.ReblogEvent
|
||||
import app.pachli.components.timeline.CachedTimelineRepository
|
||||
import app.pachli.components.timeline.FilterKind
|
||||
import app.pachli.components.timeline.FiltersRepository
|
||||
import app.pachli.components.timeline.mockStatus
|
||||
import app.pachli.components.timeline.mockStatusViewData
|
||||
import app.pachli.db.AccountEntity
|
||||
@ -33,6 +35,7 @@ import org.junit.runner.RunWith
|
||||
import org.mockito.kotlin.any
|
||||
import org.mockito.kotlin.doReturn
|
||||
import org.mockito.kotlin.mock
|
||||
import org.mockito.kotlin.reset
|
||||
import org.mockito.kotlin.stub
|
||||
import org.robolectric.Shadows.shadowOf
|
||||
import java.io.IOException
|
||||
@ -44,6 +47,7 @@ class ViewThreadViewModelTest {
|
||||
private lateinit var eventHub: EventHub
|
||||
private lateinit var viewModel: ViewThreadViewModel
|
||||
private lateinit var db: AppDatabase
|
||||
private val filtersRepository: FiltersRepository = mock()
|
||||
|
||||
private val threadId = "1234"
|
||||
|
||||
@ -104,6 +108,11 @@ class ViewThreadViewModelTest {
|
||||
onBlocking { getStatusViewData(any()) } doReturn emptyMap()
|
||||
}
|
||||
|
||||
reset(filtersRepository)
|
||||
filtersRepository.stub {
|
||||
onBlocking { getFilters() } doReturn FilterKind.V2(emptyList())
|
||||
}
|
||||
|
||||
viewModel = ViewThreadViewModel(
|
||||
api,
|
||||
filterModel,
|
||||
@ -113,6 +122,7 @@ class ViewThreadViewModelTest {
|
||||
db.timelineDao(),
|
||||
gson,
|
||||
cachedTimelineRepository,
|
||||
filtersRepository,
|
||||
)
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user