From 335df0e7cd09d58cc8555fdea83a0554d08da5c4 Mon Sep 17 00:00:00 2001 From: Sasikanth Miriyampalli Date: Wed, 7 Feb 2024 07:55:51 +0530 Subject: [PATCH] Change return type of `PostSourceFetcher#fetch` to `Result` Refactored reader presenter to fit these changes better --- .../core/network/post/PostSourceFetcher.kt | 8 ++--- .../rss/reader/reader/ReaderPresenter.kt | 36 ++++++++++++------- 2 files changed, 27 insertions(+), 17 deletions(-) diff --git a/core/network/src/commonMain/kotlin/dev/sasikanth/rss/reader/core/network/post/PostSourceFetcher.kt b/core/network/src/commonMain/kotlin/dev/sasikanth/rss/reader/core/network/post/PostSourceFetcher.kt index 02585a6d8..595329756 100644 --- a/core/network/src/commonMain/kotlin/dev/sasikanth/rss/reader/core/network/post/PostSourceFetcher.kt +++ b/core/network/src/commonMain/kotlin/dev/sasikanth/rss/reader/core/network/post/PostSourceFetcher.kt @@ -37,7 +37,7 @@ class PostSourceFetcher( private val dispatchersProvider: DispatchersProvider ) { - suspend fun fetch(link: String): String? { + suspend fun fetch(link: String): Result { return withContext(dispatchersProvider.io) { try { val response = httpClient.get(transformUrlToHttps(link)) @@ -45,14 +45,14 @@ class PostSourceFetcher( response.status == HttpStatusCode.OK && response.contentType()?.withoutParameters() == ContentType.Text.Html ) { - return@withContext response.bodyAsText() + val content = response.bodyAsText() + return@withContext Result.success(content) } } catch (e: Exception) { // no-op } - // TODO: Return [Result.failure] object to render different reader view - return@withContext null + return@withContext Result.failure(IllegalArgumentException("Failed to fetch the post")) } } diff --git a/shared/src/commonMain/kotlin/dev/sasikanth/rss/reader/reader/ReaderPresenter.kt b/shared/src/commonMain/kotlin/dev/sasikanth/rss/reader/reader/ReaderPresenter.kt index 2bd1a43bd..d0d01fb93 100644 --- a/shared/src/commonMain/kotlin/dev/sasikanth/rss/reader/reader/ReaderPresenter.kt +++ b/shared/src/commonMain/kotlin/dev/sasikanth/rss/reader/reader/ReaderPresenter.kt @@ -164,19 +164,10 @@ class ReaderPresenter( private fun articleShortcutClicked() { coroutineScope.launch { - when (_state.value.postMode) { - RssContent -> { - _state.update { it.copy(postMode = InProgress) } - val content = postSourceFetcher.fetch(postLink).orEmpty() - val htmlContent = extractArticleHtmlContent(postLink, content) - _state.update { it.copy(content = htmlContent, postMode = Source) } - } - Source -> { - _state.update { it.copy(postMode = InProgress) } - val postContent = rssRepository.post(postLink).rawContent.orEmpty() - val htmlContent = extractArticleHtmlContent(postLink, postContent) - _state.update { it.copy(content = htmlContent, postMode = RssContent) } - } + val currentPostMode = _state.value.postMode + when (currentPostMode) { + RssContent -> loadSourceArticle() + Source -> loadRssContent() InProgress, Idle -> { // no-op @@ -184,5 +175,24 @@ class ReaderPresenter( } } } + + private suspend fun loadRssContent() { + _state.update { it.copy(postMode = InProgress) } + val postContent = rssRepository.post(postLink).rawContent.orEmpty() + val htmlContent = extractArticleHtmlContent(postLink, postContent) + _state.update { it.copy(content = htmlContent, postMode = RssContent) } + } + + private suspend fun loadSourceArticle() { + _state.update { it.copy(postMode = InProgress) } + val content = postSourceFetcher.fetch(postLink) + + if (content.isSuccess) { + val htmlContent = extractArticleHtmlContent(postLink, content.getOrThrow()) + _state.update { it.copy(content = htmlContent) } + } + + _state.update { it.copy(postMode = Source) } + } } }