From e994462b61b8a77ce4da2812973c6327b1b767d0 Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Tue, 20 Dec 2022 08:08:58 -0800 Subject: [PATCH] use typeahead search to handle searches on Android --- .../src/main/graphql/TypeAheadSearch.graphql | 15 +++++++ .../omnivore/networking/SearchQuery.kt | 41 +++++++++++++++++++ .../omnivore/ui/home/HomeViewModel.kt | 7 +++- .../ui/linkedItemViews/LinkedItemCard.kt | 2 +- 4 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 android/Omnivore/app/src/main/graphql/TypeAheadSearch.graphql diff --git a/android/Omnivore/app/src/main/graphql/TypeAheadSearch.graphql b/android/Omnivore/app/src/main/graphql/TypeAheadSearch.graphql new file mode 100644 index 000000000..489ec923a --- /dev/null +++ b/android/Omnivore/app/src/main/graphql/TypeAheadSearch.graphql @@ -0,0 +1,15 @@ +query TypeaheadSearch($query: String!) { + typeaheadSearch(query: $query) { + ... on TypeaheadSearchSuccess { + items { + id + title + slug + siteName + } + } + ... on TypeaheadSearchError { + errorCodes + } + } +} diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SearchQuery.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SearchQuery.kt index ca43f6dc6..1716ad54e 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SearchQuery.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SearchQuery.kt @@ -1,6 +1,7 @@ package app.omnivore.omnivore.networking import app.omnivore.omnivore.graphql.generated.SearchQuery +import app.omnivore.omnivore.graphql.generated.TypeaheadSearchQuery import app.omnivore.omnivore.models.LinkedItem import com.apollographql.apollo3.api.Optional @@ -9,6 +10,46 @@ data class SearchQueryResponse( val items: List ) +suspend fun Networker.typeaheadSearch( + query: String +): SearchQueryResponse { + try { + val result = authenticatedApolloClient().query( + TypeaheadSearchQuery(query) + ).execute() + + val itemList = result.data?.typeaheadSearch?.onTypeaheadSearchSuccess?.items ?: listOf() + + val items = itemList.map { + LinkedItem( + id = it.id, + title = it.title, + createdAt = "", + savedAt = "", + readAt = "", + updatedAt = "", + readingProgress = 0.0, + readingProgressAnchor = 0, + imageURLString = null, + pageURLString = "", + descriptionText = "", + publisherURLString = "", + siteName = it.siteName, + author = "", + publishDate = null, + slug = it.slug, + isArchived = false, + contentReader = null, + content = null + ) + } + + return SearchQueryResponse(null, items) + } catch (e: java.lang.Exception) { + return SearchQueryResponse(null, listOf()) + } +} + suspend fun Networker.search( cursor: String? = null, limit: Int = 15, diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/home/HomeViewModel.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/home/HomeViewModel.kt index 55969a73b..3e442743a 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/home/HomeViewModel.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/home/HomeViewModel.kt @@ -59,7 +59,12 @@ class HomeViewModel @Inject constructor( searchIdx += 1 // Execute the search - val searchResult = networker.search(cursor = cursor, query = searchQuery()) + val searchResult = + if (searchTextLiveData.value != "") { + networker.typeaheadSearch(searchTextLiveData.value ?: "") + } else { + 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. diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/linkedItemViews/LinkedItemCard.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/linkedItemViews/LinkedItemCard.kt index 05bdb58d3..775ed6be7 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/linkedItemViews/LinkedItemCard.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/linkedItemViews/LinkedItemCard.kt @@ -47,7 +47,7 @@ fun LinkedItemCard(item: LinkedItem, onClickHandler: () -> Unit, actionHandler: lineHeight = 20.sp ) - if (item.author != null) { + if (item.author != null && item.author != "") { Text( text = "By ${item.author}", style = MaterialTheme.typography.bodyMedium,