pass datastore repo into networker

This commit is contained in:
Satindar Dhillon 2022-09-26 11:28:48 -07:00
parent 5d0305988b
commit 9a4c8a6886
4 changed files with 27 additions and 18 deletions

View file

@ -1,6 +1,7 @@
package app.omnivore.omnivore
import android.content.Context
import app.omnivore.omnivore.networking.Networker
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
@ -18,4 +19,10 @@ object AppModule {
@ApplicationContext app: Context
): DatastoreRepository = OmnivoreDatastore(app)
@Singleton
@Provides
fun provideNetworker(
@ApplicationContext app: Context,
datastore: DatastoreRepository
): Networker = Networker(datastore)
}

View file

@ -1,11 +1,23 @@
package app.omnivore.omnivore.networking
import app.omnivore.omnivore.Constants
import app.omnivore.omnivore.DatastoreKeys
import app.omnivore.omnivore.DatastoreRepository
import com.apollographql.apollo3.ApolloClient
import javax.inject.Inject
object Networker {
fun apolloClient(authToken: String) = ApolloClient.Builder()
.serverUrl("${Constants.apiURL}/api/graphql")
.addHttpHeader("Authorization", value = authToken)
class Networker @Inject constructor(
private val datastoreRepo: DatastoreRepository
) {
private val serverUrl = "${Constants.apiURL}/api/graphql"
private suspend fun authToken() = datastoreRepo.getString(DatastoreKeys.omnivoreAuthToken) ?: ""
suspend fun publicApolloClient() = ApolloClient.Builder()
.serverUrl(serverUrl)
.build()
suspend fun authenticatedApolloClient() = ApolloClient.Builder()
.serverUrl(serverUrl)
.addHttpHeader("Authorization", value = authToken())
.build()
}

View file

@ -12,10 +12,9 @@ data class SearchQueryResponse(
suspend fun Networker.search(
cursor: String? = null,
limit: Int = 15,
query: String,
authToken: String?
query: String
): SearchQueryResponse {
val result = apolloClient(authToken ?: "").query(
val result = authenticatedApolloClient().query(
SearchQuery(
after = Optional.presentIfNotNull(cursor),
first = Optional.presentIfNotNull(limit),

View file

@ -3,18 +3,16 @@ package app.omnivore.omnivore.ui.home
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import app.omnivore.omnivore.*
import app.omnivore.omnivore.models.LinkedItem
import app.omnivore.omnivore.networking.Networker
import app.omnivore.omnivore.networking.search
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import javax.inject.Inject
@HiltViewModel
class HomeViewModel @Inject constructor(
private val datastoreRepo: DatastoreRepository
private val networker: Networker
): ViewModel() {
private var cursor: String? = null
private var items: List<LinkedItem> = listOf()
@ -29,10 +27,6 @@ class HomeViewModel @Inject constructor(
val searchTextLiveData = MutableLiveData<String>("")
val itemsLiveData = MutableLiveData<List<LinkedItem>>(listOf())
private fun getAuthToken(): String? = runBlocking {
datastoreRepo.getString(DatastoreKeys.omnivoreAuthToken)
}
fun updateSearchText(text: String) {
searchTextLiveData.value = text
@ -51,12 +45,9 @@ class HomeViewModel @Inject constructor(
viewModelScope.launch {
val thisSearchIdx = searchIdx
searchIdx += 1
val authToken = getAuthToken()
// Execute the search
val searchResult = Networker.search(
cursor = cursor, query = searchQuery(), authToken = authToken
)
val searchResult = networker.search(cursor = cursor, query = searchQuery())
// Search results aren't guaranteed to return in order so this
// will discard old results that are returned while a user is typing.