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:
Nik Clayton 2023-10-12 12:47:27 +02:00 committed by GitHub
parent 0902b0ba49
commit ff5d7f1d27
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 28 additions and 19 deletions

View File

@ -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.
}
}
}

View File

@ -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,
)
}