diff --git a/data/src/main/java/com/desarrollodroide/data/local/room/dao/TagDao.kt b/data/src/main/java/com/desarrollodroide/data/local/room/dao/TagDao.kt index 86f7394..21c07bb 100644 --- a/data/src/main/java/com/desarrollodroide/data/local/room/dao/TagDao.kt +++ b/data/src/main/java/com/desarrollodroide/data/local/room/dao/TagDao.kt @@ -5,6 +5,7 @@ import androidx.room.Delete import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query +import androidx.room.Transaction import com.desarrollodroide.data.local.room.entity.TagEntity import kotlinx.coroutines.flow.Flow @@ -24,4 +25,13 @@ interface TagDao { @Query("DELETE FROM tags") suspend fun deleteAllTags() + + @Transaction + @Query(""" + SELECT DISTINCT t.* + FROM tags t + LEFT JOIN bookmark_tag_cross_ref bt ON t.id = bt.tagId + ORDER BY t.name + """) + fun observeAllTags(): Flow> } diff --git a/data/src/main/java/com/desarrollodroide/data/mapper/Mapper.kt b/data/src/main/java/com/desarrollodroide/data/mapper/Mapper.kt index 2e870b1..4160140 100644 --- a/data/src/main/java/com/desarrollodroide/data/mapper/Mapper.kt +++ b/data/src/main/java/com/desarrollodroide/data/mapper/Mapper.kt @@ -78,6 +78,12 @@ fun Account.toRequestBody() = password = password ) +fun Tag.toEntityModel() = TagEntity( + id = id, + name = name, + nBookmarks = nBookmarks +) + fun BookmarkDTO.toEntityModel() = BookmarkEntity( id = id?:0, url = url?:"", diff --git a/data/src/main/java/com/desarrollodroide/data/repository/BookmarksRepositoryImpl.kt b/data/src/main/java/com/desarrollodroide/data/repository/BookmarksRepositoryImpl.kt index b6648ca..0b3c926 100644 --- a/data/src/main/java/com/desarrollodroide/data/repository/BookmarksRepositoryImpl.kt +++ b/data/src/main/java/com/desarrollodroide/data/repository/BookmarksRepositoryImpl.kt @@ -141,7 +141,6 @@ class BookmarksRepositoryImpl( } ).flow.map { pagingData -> pagingData.map { - Log.v("Bookmark", it.title) it.toDomainModel() } } diff --git a/data/src/main/java/com/desarrollodroide/data/repository/TagsRepositoryImpl.kt b/data/src/main/java/com/desarrollodroide/data/repository/TagsRepositoryImpl.kt index 7b0c71c..9af9596 100644 --- a/data/src/main/java/com/desarrollodroide/data/repository/TagsRepositoryImpl.kt +++ b/data/src/main/java/com/desarrollodroide/data/repository/TagsRepositoryImpl.kt @@ -1,5 +1,6 @@ package com.desarrollodroide.data.repository +import android.util.Log import com.desarrollodroide.common.result.ErrorHandler import com.desarrollodroide.data.extensions.removeTrailingSlash import com.desarrollodroide.data.local.room.dao.TagDao @@ -12,6 +13,7 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.onEach class TagsRepositoryImpl( private val apiService: RetrofitNetwork, @@ -46,9 +48,13 @@ class TagsRepositoryImpl( }.asFlow().flowOn(Dispatchers.IO) override fun getLocalTags(): Flow> { - return tagsDao.getAllTags().map { entities -> - entities.map { it.toDomainModel() } - } + return tagsDao.observeAllTags() + .onEach { entities -> + Log.d("TagsRepository", "Tags updated in repository: ${entities.size}") + } + .map { entities -> + entities.map { it.toDomainModel() } + } } } diff --git a/data/src/test/java/com/desarrollodroide/data/repository/BookmarksRepositoryTest.kt b/data/src/test/java/com/desarrollodroide/data/repository/BookmarksRepositoryTest.kt index 904bd5b..9a70f27 100644 --- a/data/src/test/java/com/desarrollodroide/data/repository/BookmarksRepositoryTest.kt +++ b/data/src/test/java/com/desarrollodroide/data/repository/BookmarksRepositoryTest.kt @@ -2,6 +2,8 @@ package com.desarrollodroide.data.repository import androidx.paging.Pager import androidx.paging.PagingConfig +import androidx.paging.PagingSource +import androidx.paging.map import com.desarrollodroide.common.result.ErrorHandler import com.desarrollodroide.network.retrofit.RetrofitNetwork import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -28,6 +30,7 @@ import com.desarrollodroide.model.Bookmark import com.desarrollodroide.model.Tag import com.desarrollodroide.network.model.BookmarkDTO import com.desarrollodroide.network.model.BookmarksDTO +import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.first import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.ResponseBody.Companion.toResponseBody @@ -177,28 +180,37 @@ class BookmarksRepositoryTest { maxPage = 1, page = 1, bookmarks = listOf( - BookmarkDTO(1, "http://bookmark1.com", "Bookmark 1", "Excerpt 1", "Author 1", 1, "2023-01-01", "","http://image1.com", true, true, true, listOf(), true, true), - BookmarkDTO(2, "http://bookmark2.com", "Bookmark 2", "Excerpt 2", "Author 2", 1, "2023-01-02", "","http://image2.com", true, true, true, listOf(), true, true) + BookmarkDTO(1, "http://bookmark1.com", "Bookmark 1", "Excerpt 1", "Author 1", 1, "2023-01-01", "", "http://image1.com", true, true, true, listOf(), true, true), + BookmarkDTO(2, "http://bookmark2.com", "Bookmark 2", "Excerpt 2", "Author 2", 1, "2023-01-02", "", "http://image2.com", true, true, true, listOf(), true, true) ) ) - val bookmarkEntities = listOf( - BookmarkEntity(1, "http://bookmark1.com", "Bookmark 1", "Excerpt 1", "Author 1", 1, "2023-01-01", "", "http://image1.com", true, true, true, listOf(), true, true), - BookmarkEntity(2, "http://bookmark2.com", "Bookmark 2", "Excerpt 2", "Author 2", 1, "2023-01-02", "", "http://image2.com", true, true, true, listOf(), true, true) - ) - val expectedBookmarks = bookmarkEntities.map { it.toDomainModel() } + val expectedBookmarks = bookmarksDTO.bookmarks?.map { it.toDomainModel() } `when`(apiService.getPagingBookmarks(eq(xSessionId), anyString())).thenReturn(Response.success(bookmarksDTO)) - `when`(bookmarksDao.getAll()).thenReturn(flowOf(bookmarkEntities)) + `when`(bookmarksDao.getAll()).thenReturn(flowOf(emptyList())) // Act - val pager = Pager( - config = PagingConfig(pageSize = 20, prefetchDistance = 2), - pagingSourceFactory = { BookmarkPagingSource(apiService, bookmarksDao, serverUrl, xSessionId, searchText, tags, saveToLocal) } - ).flow + val pagingSource = BookmarkPagingSource( + remoteDataSource = apiService, + bookmarksDao = bookmarksDao, + serverUrl = serverUrl, + xSessionId = xSessionId, + searchText = searchText, + tags = tags, + saveToLocal = saveToLocal + ) - val snapshot = pager.first() + val loadResult = pagingSource.load( + PagingSource.LoadParams.Refresh( + key = null, + loadSize = 20, + placeholdersEnabled = false + ) + ) // Assert - assertEquals(expectedBookmarks, snapshot) + assertTrue(loadResult is PagingSource.LoadResult.Page) + loadResult as PagingSource.LoadResult.Page + assertEquals(expectedBookmarks, loadResult.data) } } \ No newline at end of file diff --git a/domain/src/main/java/com/desarrollodroide/domain/usecase/EditBookmarkUseCase.kt b/domain/src/main/java/com/desarrollodroide/domain/usecase/EditBookmarkUseCase.kt index 530cf29..42d0eb7 100644 --- a/domain/src/main/java/com/desarrollodroide/domain/usecase/EditBookmarkUseCase.kt +++ b/domain/src/main/java/com/desarrollodroide/domain/usecase/EditBookmarkUseCase.kt @@ -4,6 +4,7 @@ import android.os.Build import androidx.annotation.RequiresApi import com.desarrollodroide.model.Bookmark import com.desarrollodroide.data.local.room.dao.BookmarksDao +import com.desarrollodroide.data.local.room.dao.TagDao import com.desarrollodroide.data.mapper.toEntityModel import com.desarrollodroide.data.repository.SyncWorks import com.desarrollodroide.model.SyncOperationType @@ -12,6 +13,7 @@ import java.time.format.DateTimeFormatter class EditBookmarkUseCase( private val bookmarksDao: BookmarksDao, + private val tagsDao: TagDao, private val syncManager: SyncWorks ) { @RequiresApi(Build.VERSION_CODES.O) @@ -21,7 +23,10 @@ class EditBookmarkUseCase( val updatedBookmark = bookmark.copy( modified = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) ) - bookmarksDao.updateBookmark(updatedBookmark.toEntityModel()) + updatedBookmark.tags.forEach { tag -> + tagsDao.insertTag(tag.toEntityModel()) + } + bookmarksDao.updateBookmarkWithTags(updatedBookmark.toEntityModel()) syncManager.scheduleSyncWork(SyncOperationType.UPDATE, updatedBookmark) } } \ No newline at end of file diff --git a/presentation/src/main/java/com/desarrollodroide/pagekeeper/di/AppModule.kt b/presentation/src/main/java/com/desarrollodroide/pagekeeper/di/AppModule.kt index 04ce3ad..4d3607c 100644 --- a/presentation/src/main/java/com/desarrollodroide/pagekeeper/di/AppModule.kt +++ b/presentation/src/main/java/com/desarrollodroide/pagekeeper/di/AppModule.kt @@ -87,6 +87,7 @@ fun appModule() = module { single { EditBookmarkUseCase( bookmarksDao = get(), + tagsDao = get(), syncManager = get() ) } diff --git a/presentation/src/main/java/com/desarrollodroide/pagekeeper/navigation/NavItem.kt b/presentation/src/main/java/com/desarrollodroide/pagekeeper/navigation/NavItem.kt index e783f26..5c59504 100644 --- a/presentation/src/main/java/com/desarrollodroide/pagekeeper/navigation/NavItem.kt +++ b/presentation/src/main/java/com/desarrollodroide/pagekeeper/navigation/NavItem.kt @@ -13,13 +13,9 @@ sealed class NavItem( data object SettingsNavItem : NavItem("settings") data object TermsOfUseNavItem : NavItem("termsOfUse") data object PrivacyPolicyNavItem : NavItem("privacyPolicy") - data object ReadableContentNavItem : NavItem("readable_content/{bookmarkId}/{bookmarkUrl}/{bookmarkDate}/{bookmarkTitle}/{bookmarkIsRtl}") { - fun createRoute(bookmarkId: Int, bookmarkUrl: String, bookmarkDate: String, bookmarkTitle: String, bookmarkIsRtl: Boolean): String { - val encodedUrl = Uri.encode(bookmarkUrl) - val encodedDate = Uri.encode(bookmarkDate) - val encodedTitle = Uri.encode(bookmarkTitle) - val encodedIsRtl = bookmarkIsRtl.toString() - return "readable_content/$bookmarkId/$encodedUrl/$encodedDate/$encodedTitle/$encodedIsRtl" + data object ReadableContentNavItem : NavItem("readable_content/{bookmarkId}") { + fun createRoute(bookmarkId: Int): String { + return "readable_content/$bookmarkId" } } data object NetworkLoggerNavItem : NavItem("networkLogger") diff --git a/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/bookmarkeditor/BookmarkEditorView.kt b/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/bookmarkeditor/BookmarkEditorView.kt index 44d2303..fb224bd 100644 --- a/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/bookmarkeditor/BookmarkEditorView.kt +++ b/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/bookmarkeditor/BookmarkEditorView.kt @@ -168,13 +168,6 @@ fun BookmarkEditorView( .padding(horizontal = 6.dp) .verticalScroll(rememberScrollState()) ) { -// Categories( -// categoriesType = CategoriesType.REMOVEABLES, -// showCategories = true, -// uniqueCategories = assignedTags, -// onCategoriesSelectedChanged = {} -// ) - Categories( categoriesType = CategoriesType.REMOVEABLES, showCategories = true, diff --git a/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/bookmarkeditor/BookmarkViewModel.kt b/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/bookmarkeditor/BookmarkViewModel.kt index 77b8962..be70a26 100644 --- a/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/bookmarkeditor/BookmarkViewModel.kt +++ b/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/bookmarkeditor/BookmarkViewModel.kt @@ -101,38 +101,6 @@ class BookmarkViewModel( public = if (makeArchivePublic) 1 else 0 ) ) -// .collect { result -> -// when (result) { -// is Result.Error -> { -// if (result.error is Result.ErrorType.SessionExpired) { -// settingsPreferenceDataSource.resetUser() -// bookmarksRepository.deleteAllLocalBookmarks() -// sessionExpired = true -// _bookmarkUiState.error( -// errorMessage = result.error?.message ?: "" -// ) -// emitToastIfAutoAdd(result.error?.message ?: "") -// } else { -// Log.v("Add BookmarkViewModel", result.error?.message ?: "") -// _bookmarkUiState.error( -// errorMessage = result.error?.message ?: "Unknown error" -// ) -// emitToastIfAutoAdd("Error: ${result.error?.message ?: "Unknown error"}") -// } -// } -// -// is Result.Loading -> { -// Log.v("Add BookmarkViewModel", "Loading") -// _bookmarkUiState.isLoading(true) -// } -// -// is Result.Success -> { -// Log.v("Add BookmarkViewModel", "Success") -// _bookmarkUiState.success(result.data) -// emitToastIfAutoAdd("Bookmark saved successfully") -// } -// } -// } } fun editBookmark(bookmark: Bookmark) = viewModelScope.launch { diff --git a/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/components/Dialogs.kt b/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/components/Dialogs.kt index e9bdb1e..98ce917 100644 --- a/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/components/Dialogs.kt +++ b/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/components/Dialogs.kt @@ -205,7 +205,9 @@ fun UpdateCacheDialog( } AlertDialog( - onDismissRequest = { }, + onDismissRequest = { + showDialog.value = false + }, title = { Text("Update cache for selected bookmark? This action is irreversible.") }, text = { Column { diff --git a/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/components/pulltorefresh/PullRefreshState.kt b/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/components/pulltorefresh/PullRefreshState.kt index a341301..b3982b6 100644 --- a/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/components/pulltorefresh/PullRefreshState.kt +++ b/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/components/pulltorefresh/PullRefreshState.kt @@ -195,7 +195,7 @@ object PullRefreshDefaults { * If the indicator is below this threshold offset when it is released, a refresh * will be triggered. */ - val RefreshThreshold = 80.dp + val RefreshThreshold = 100.dp /** * The offset at which the indicator should be rendered whilst a refresh is occurring. diff --git a/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/feed/FeedContent.kt b/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/feed/FeedContent.kt index 6cc0b75..212f8f6 100644 --- a/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/feed/FeedContent.kt +++ b/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/feed/FeedContent.kt @@ -173,6 +173,7 @@ fun FeedContent( modifier = Modifier.align(alignment = Alignment.TopCenter), refreshing = isRefreshing, state = refreshState, + scale = true ) val showScrollToTopButton by remember { derivedStateOf { listState.firstVisibleItemIndex > 0 } diff --git a/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/feed/FeedScreen.kt b/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/feed/FeedScreen.kt index 84b8a63..7380b7d 100644 --- a/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/feed/FeedScreen.kt +++ b/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/feed/FeedScreen.kt @@ -226,7 +226,7 @@ fun FeedScreen( isLoading = isUpdating, showDialog = feedViewModel.showSyncDialog ) { keepOldTitle, updateArchive, updateEbook -> - feedViewModel.updateBookmark( + feedViewModel.updateBookmarkCache( keepOldTitle = keepOldTitle, updateEbook = updateEbook, updateArchive = updateArchive, diff --git a/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/feed/FeedViewModel.kt b/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/feed/FeedViewModel.kt index 1429c07..bfb8fed 100644 --- a/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/feed/FeedViewModel.kt +++ b/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/feed/FeedViewModel.kt @@ -32,6 +32,7 @@ import androidx.paging.cachedIn import androidx.paging.PagingData import com.desarrollodroide.data.helpers.SESSION_HAS_BEEN_EXPIRED import com.desarrollodroide.data.local.room.dao.BookmarksDao +import com.desarrollodroide.data.mapper.toDomainModel import com.desarrollodroide.data.repository.SyncWorks import com.desarrollodroide.data.repository.SyncStatus import com.desarrollodroide.domain.usecase.DeleteLocalBookmarkUseCase @@ -75,6 +76,9 @@ class FeedViewModel( private val _tagsState = MutableStateFlow(UiState>(idle = true)) val tagsState = _tagsState.asStateFlow() + private val _currentBookmark = MutableStateFlow(null) + val currentBookmark = _currentBookmark.asStateFlow() + private var tagsJob: Job? = null private var serverUrl = "" private var xSessionId = "" @@ -135,6 +139,19 @@ class FeedViewModel( _bookmarksState.value = pagingData } } + + viewModelScope.launch { + getTagsUseCase.getLocalTags() + .distinctUntilChanged() + .collect { localTags -> + Log.d("FeedViewModel", "Tags updated: ${localTags.size}") + if (localTags.isNotEmpty()) { + _tagsState.success(localTags) + } else { + _tagsState.success(emptyList()) + } + } + } } fun loadInitialData() { @@ -142,7 +159,7 @@ class FeedViewModel( serverUrl = settingsPreferenceDataSource.getUrl() token = settingsPreferenceDataSource.getToken() xSessionId = settingsPreferenceDataSource.getSession() - getLocalTags() + //getLocalTags() if (_tagsState.value.data.isNullOrEmpty()) { getRemoteTags() } @@ -160,6 +177,7 @@ class FeedViewModel( getTagsUseCase.getLocalTags() .distinctUntilChanged() .collect { localTags -> + Log.d("FeedViewModel", "Tags updated: ${localTags.size}") if (localTags.isNotEmpty()) { _tagsState.success(localTags) } else { @@ -194,7 +212,7 @@ class FeedViewModel( } } is Result.Error -> { - _syncState.value = UiState(error = result.error?.message) + //_syncState.value = UiState(error = result.error?.message) Log.e(TAG, "Error syncing bookmarks: ${result.error?.message}") } is Result.Loading -> {} @@ -245,7 +263,7 @@ class FeedViewModel( _bookmarksUiState.error(errorMessage = SESSION_HAS_BEEN_EXPIRED) } else { Log.e(TAG, "Unhandled exception: ${error.message}") - _bookmarksUiState.error(errorMessage = "Unhandled exception: ${error.message}") + //_bookmarksUiState.error(errorMessage = "Unhandled exception: ${error.message}") } } @@ -253,6 +271,8 @@ class FeedViewModel( viewModelScope.launch { val localBookmarkIds = bookmarkDatabase.getAllBookmarkIds() syncBookmarks(localBookmarkIds, settingsPreferenceDataSource.getLastSyncTimestamp()) + // TODO remove with sync is completed in backend + retrieveAllRemoteBookmarks() } } @@ -290,7 +310,7 @@ class FeedViewModel( } } - fun updateBookmark( + fun updateBookmarkCache( keepOldTitle: Boolean, updateArchive: Boolean, updateEbook: Boolean, @@ -408,4 +428,9 @@ class FeedViewModel( } } + fun loadBookmarkById(id: Int) { + viewModelScope.launch { + _currentBookmark.value = bookmarkDatabase.getBookmarkById(id)?.toDomainModel() + } + } } diff --git a/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/feed/item/SmallBookmarkView.kt b/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/feed/item/SmallBookmarkView.kt index 0543c3a..e7aba75 100644 --- a/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/feed/item/SmallBookmarkView.kt +++ b/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/feed/item/SmallBookmarkView.kt @@ -55,7 +55,7 @@ fun SmallBookmarkView( ) { val bookmark by remember { derivedStateOf(getBookmark) } val imageUrl by remember { derivedStateOf { - "${serverURL.removeTrailingSlash()}${bookmark.imageURL}?lastUpdated=${bookmark.modified}" + "${serverURL.removeTrailingSlash()}${bookmark.imageURL}" }} val modifier = if (bookmark.imageURL.isNotEmpty()) Modifier.height(90.dp) else Modifier.wrapContentHeight() val isArabic by remember { derivedStateOf { bookmark.title.isRTLText() || bookmark.excerpt.isRTLText() } } diff --git a/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/home/HomeScreen.kt b/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/home/HomeScreen.kt index a4ef81b..da58012 100644 --- a/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/home/HomeScreen.kt +++ b/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/home/HomeScreen.kt @@ -1,9 +1,6 @@ package com.desarrollodroide.pagekeeper.ui.home -import android.net.Uri -import android.os.Build import androidx.activity.compose.BackHandler -import androidx.annotation.RequiresApi import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.core.Animatable import androidx.compose.animation.core.LinearEasing @@ -82,7 +79,6 @@ import com.desarrollodroide.pagekeeper.ui.settings.crash.CrashLogScreen import com.desarrollodroide.pagekeeper.ui.settings.logcat.NetworkLogScreen import kotlinx.coroutines.launch -@RequiresApi(Build.VERSION_CODES.N) @OptIn(ExperimentalMaterial3Api::class) @Composable fun HomeScreen( @@ -170,10 +166,6 @@ fun HomeScreen( goToReadableContent = { bookmark-> navController.navigate(NavItem.ReadableContentNavItem.createRoute( bookmarkId = bookmark.id, - bookmarkUrl = bookmark.url, - bookmarkDate = bookmark.modified, - bookmarkTitle = bookmark.title, - bookmarkIsRtl = bookmark.title.isRTLText() || bookmark.excerpt.isRTLText() )) }, ) @@ -237,31 +229,30 @@ fun HomeScreen( composable( route = NavItem.ReadableContentNavItem.route, arguments = listOf( - navArgument("bookmarkId") { type = NavType.IntType }, - navArgument("bookmarkUrl") { type = NavType.StringType }, - navArgument("bookmarkDate") { type = NavType.StringType }, - navArgument("bookmarkTitle") { type = NavType.StringType }, - navArgument("bookmarkIsRtl") { type = NavType.BoolType } + navArgument("bookmarkId") { type = NavType.IntType } ) ) { backStackEntry -> val bookmarkId = backStackEntry.arguments?.getInt("bookmarkId") ?: 0 - val bookmarkUrl = backStackEntry.arguments?.getString("bookmarkUrl")?.let { Uri.decode(it) } ?: "" - val bookmarkDate = backStackEntry.arguments?.getString("bookmarkDate")?.let { Uri.decode(it) } ?: "" - val bookmarkTitle = backStackEntry.arguments?.getString("bookmarkTitle")?.let { Uri.decode(it) } ?: "" - val bookmarkIsRtl = backStackEntry.arguments?.getBoolean("bookmarkIsRtl")?: false + val bookmark by feedViewModel.currentBookmark.collectAsState() - ReadableContentScreen( - readableContentViewModel = get(), - bookmarkUrl = bookmarkUrl, - bookmarkId = bookmarkId, - bookmarkDate = bookmarkDate, - onBack = { - navController.navigateUp() - }, - openUrlInBrowser = openUrlInBrowser, - bookmarkTitle = bookmarkTitle, - isRtl = bookmarkIsRtl - ) + LaunchedEffect(bookmarkId) { + feedViewModel.loadBookmarkById(bookmarkId) + } + + bookmark?.let { + ReadableContentScreen( + readableContentViewModel = get(), + bookmarkId = bookmarkId, + bookmarkUrl = it.url, + onBack = { + navController.navigateUp() + }, + openUrlInBrowser = openUrlInBrowser, + bookmarkDate = it.modified, + bookmarkTitle = it.title, + isRtl = it.title.isRTLText() || it.excerpt.isRTLText() + ) + } } } }