diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/SearchScreen.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/SearchScreen.kt index c5eb1f3..f8f5da9 100644 --- a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/SearchScreen.kt +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/SearchScreen.kt @@ -34,13 +34,12 @@ import it.vfsfitvnm.route.RouteHandler import it.vfsfitvnm.vimusic.Database import it.vfsfitvnm.vimusic.R import it.vfsfitvnm.vimusic.query -import it.vfsfitvnm.vimusic.ui.components.OutcomeItem import it.vfsfitvnm.vimusic.ui.components.TopAppBar +import it.vfsfitvnm.vimusic.ui.components.themed.LoadingOrError import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette import it.vfsfitvnm.vimusic.ui.styling.LocalTypography import it.vfsfitvnm.vimusic.utils.medium import it.vfsfitvnm.vimusic.utils.secondary -import it.vfsfitvnm.youtubemusic.Outcome import it.vfsfitvnm.youtubemusic.YouTube import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay @@ -68,8 +67,8 @@ fun SearchScreen( FocusRequester() } - val searchSuggestions by produceState?>>( - initialValue = Outcome.Initial, + val searchSuggestionsResult by produceState?>?>( + initialValue = null, key1 = textFieldValue ) { value = if (textFieldValue.text.isNotEmpty()) { @@ -77,7 +76,7 @@ fun SearchScreen( YouTube.getSearchSuggestions(textFieldValue.text) } } else { - Outcome.Initial + null } } @@ -304,10 +303,8 @@ fun SearchScreen( } } - OutcomeItem( - outcome = searchSuggestions - ) { suggestions -> - suggestions?.forEach { suggestion -> + searchSuggestionsResult?.getOrNull()?.let { suggestions -> + suggestions.forEach { suggestion -> Row( verticalAlignment = Alignment.CenterVertically, modifier = Modifier @@ -352,6 +349,8 @@ fun SearchScreen( ) } } + } ?: searchSuggestionsResult?.exceptionOrNull()?.let { throwable -> + LoadingOrError(errorMessage = throwable.javaClass.canonicalName) {} } } } diff --git a/youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/YouTube.kt b/youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/YouTube.kt index 1630390..787021b 100644 --- a/youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/YouTube.kt +++ b/youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/YouTube.kt @@ -420,19 +420,21 @@ object YouTube { }.recoverIfCancelled() } - suspend fun getSearchSuggestions(input: String): Outcome?> { - return client.postCatching("/youtubei/v1/music/get_search_suggestions") { - contentType(ContentType.Application.Json) - setBody( - GetSearchSuggestionsBody( - context = Context.DefaultWeb, - input = input + suspend fun getSearchSuggestions(input: String): Result?>? { + return runCatching { + val body = client.post("/youtubei/v1/music/get_search_suggestions") { + contentType(ContentType.Application.Json) + setBody( + GetSearchSuggestionsBody( + context = Context.DefaultWeb, + input = input + ) ) - ) - parameter("key", Key) - parameter("prettyPrint", false) - }.bodyCatching().map { response -> - response + parameter("key", Key) + parameter("prettyPrint", false) + }.body() + + body .contents ?.flatMap { content -> content @@ -445,7 +447,7 @@ object YouTube { ?.query } } - } + }.recoverIfCancelled() } suspend fun player(videoId: String, playlistId: String? = null): Outcome {