Skip to content

Commit

Permalink
- Refactor tags view
Browse files Browse the repository at this point in the history
  • Loading branch information
DesarrolloAntonio committed May 3, 2024
1 parent 405ae84 commit 2be00c5
Show file tree
Hide file tree
Showing 12 changed files with 302 additions and 266 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import androidx.paging.PagingData
import kotlinx.coroutines.flow.Flow
import com.desarrollodroide.model.Bookmark
import com.desarrollodroide.common.result.Result
import com.desarrollodroide.model.Tag
import com.desarrollodroide.model.UpdateCachePayload

interface BookmarksRepository {
Expand All @@ -16,7 +17,9 @@ interface BookmarksRepository {
fun getPagingBookmarks(
xSession: String,
serverUrl: String,
searchText: String
searchText: String,
tags: List<Tag>,
saveToLocal: Boolean
): Flow<PagingData<Bookmark>>

fun addBookmark(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import com.desarrollodroide.data.local.room.dao.BookmarksDao
import com.desarrollodroide.data.mapper.*
import com.desarrollodroide.data.repository.paging.MoviePagingSource
import com.desarrollodroide.model.Bookmark
import com.desarrollodroide.model.Tag
import com.desarrollodroide.model.UpdateCachePayload
import com.desarrollodroide.network.model.BookmarkDTO
import com.desarrollodroide.network.model.BookmarkResponseDTO
Expand Down Expand Up @@ -60,7 +61,9 @@ class BookmarksRepositoryImpl(
override fun getPagingBookmarks(
xSession: String,
serverUrl: String,
searchText: String
searchText: String,
tags: List<Tag>,
saveToLocal: Boolean
): Flow<PagingData<Bookmark>> {
return Pager(
config = PagingConfig(pageSize = 20, prefetchDistance = 2),
Expand All @@ -71,6 +74,8 @@ class BookmarksRepositoryImpl(
serverUrl = serverUrl,
xSessionId = xSession,
searchText = searchText,
tags = tags,
saveToLocal = saveToLocal
)
}
).flow
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import com.desarrollodroide.data.local.room.dao.BookmarksDao
import com.desarrollodroide.data.mapper.toDomainModel
import com.desarrollodroide.data.mapper.toEntityModel
import com.desarrollodroide.model.Bookmark
import com.desarrollodroide.model.Tag
import com.desarrollodroide.network.retrofit.RetrofitNetwork
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.map
Expand All @@ -20,25 +21,30 @@ class MoviePagingSource(
private val serverUrl: String,
private val xSessionId: String,
private val searchText: String,
private val tags: List<Tag>,
private val saveToLocal: Boolean,
) : PagingSource<Int, Bookmark>() {

override suspend fun load(params: LoadParams<Int>): LoadResult<Int, Bookmark> {
return try {
val page = params.key ?: 1
val pageSize = params.loadSize // Not needed
val searchParams = if (searchText.isNotEmpty())"&keyword=$searchText" else ""
val searchKeywordsParams = if (searchText.isNotEmpty())"&keyword=$searchText" else ""
val searchTagsParams = if (tags.isNotEmpty())"&tags=${tags.joinToString(",") { it.name }}" else ""
val bookmarksDto = remoteDataSource.getPagingBookmarks(
xSessionId = xSessionId,
url = "${serverUrl.removeTrailingSlash()}/api/bookmarks?page=$page$searchParams",
url = "${serverUrl.removeTrailingSlash()}/api/bookmarks?page=$page$searchKeywordsParams$searchTagsParams",
)
if (bookmarksDto.errorBody()?.string() == SESSION_HAS_BEEN_EXPIRED) {
return LoadResult.Error(Exception(SESSION_HAS_BEEN_EXPIRED))
}
bookmarksDto.body()?.bookmarks?.map { it.toEntityModel() }?.let { bookmarksList ->
if (page == 1) {
bookmarksDao.deleteAll()
if (saveToLocal){
bookmarksDto.body()?.bookmarks?.map { it.toEntityModel() }?.let { bookmarksList ->
if (page == 1) {
bookmarksDao.deleteAll()
}
bookmarksDao.insertAll(bookmarksList)
}
bookmarksDao.insertAll(bookmarksList)
}
val bookmarks = bookmarksDto.body()?.bookmarks?.map { it.toDomainModel() }?: emptyList()
LoadResult.Page(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.desarrollodroide.domain.usecase
import androidx.paging.PagingData
import com.desarrollodroide.data.repository.BookmarksRepository
import com.desarrollodroide.model.Bookmark
import com.desarrollodroide.model.Tag
import kotlinx.coroutines.flow.Flow

class GetPagingBookmarksUseCase(
Expand All @@ -12,11 +13,15 @@ class GetPagingBookmarksUseCase(
serverUrl: String,
xSession: String,
searchText: String = "",
tags: List<Tag>,
saveToLocal: Boolean
): Flow<PagingData<Bookmark>> {
return bookmarksRepository.getPagingBookmarks(
xSession = xSession,
serverUrl = serverUrl,
searchText = searchText,
tags = tags,
saveToLocal = saveToLocal
)
}
}
Expand Down
4 changes: 2 additions & 2 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ android.nonTransitiveRClass=true
compileSdkVersion=34
minSdkVersion=21
targetSdkVersion=34
versionCode=36
versionName=1.21.2
versionCode=37
versionName=1.21.3
android.defaults.buildfeatures.buildconfig=true
android.nonFinalResIds=false
2 changes: 1 addition & 1 deletion presentation/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ dependencies {
implementation (libs.androidx.lifecycle.runtimeCompose)
implementation (libs.androidx.preference)
implementation (libs.androidx.paging.compose)
implementation ("androidx.paging:paging-common:3.2.1")
implementation ("androidx.paging:paging-common-ktx:3.2.1")

implementation (libs.compose.ui.ui)
implementation (libs.compose.ui.tooling.preview)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ fun presenterModule() = module {

viewModel {
FeedViewModel(
bookmarkDatabase = get(),
settingsPreferenceDataSource = get(),
getBookmarksUseCase = get(),
deleteBookmarkUseCase = get(),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
package com.desarrollodroide.pagekeeper.ui.feed

import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.material3.Button
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.State
import androidx.compose.runtime.mutableStateListOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.desarrollodroide.model.Tag
import com.desarrollodroide.pagekeeper.ui.components.Categories
import com.desarrollodroide.pagekeeper.ui.components.CategoriesType

@Composable
@OptIn(ExperimentalMaterial3Api::class)
fun CategoriesView(
onApply: (List<Tag>) -> Unit,
onDismiss: () -> Unit,
uniqueCategories: State<List<Tag>>,
) {
val context = LocalContext.current
val sortingOptions = remember { mutableStateListOf(Tag("Alphabetical order"), Tag("Date")) }
val selectedSorting = remember { mutableStateOf(listOf<Tag>()) }
val mutableUniqueCategories = remember { mutableStateOf(uniqueCategories.value) }

val selectedTags = remember { mutableStateOf(listOf<Tag>()) }

Column(
modifier = Modifier
.fillMaxWidth()
.padding(16.dp),
horizontalAlignment = Alignment.CenterHorizontally
) {
// Text("Sort by", style = MaterialTheme.typography.headlineSmall)
// Categories(
// categoriesType = CategoriesType.SELECTABLES,
// showCategories = true,
// uniqueCategories = remember { mutableStateOf(sortingOptions) },
// selectedTags = selectedSorting,
// onCategoriesSelectedChanged = { tags ->
// selectedSorting.value = tags.take(1) // Only allow one sorting option
// }
// )

// Spacer(Modifier.height(24.dp))

Text("Categories", style = MaterialTheme.typography.headlineSmall)
Spacer(Modifier.height(8.dp))
Categories(
categoriesType = CategoriesType.SELECTABLES,
showCategories = true,
uniqueCategories = mutableUniqueCategories,
selectedTags = selectedTags,
onCategoriesSelectedChanged = { tags ->
selectedTags.value = tags
}
)

Spacer(Modifier.height(24.dp))

Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween) {
Button(
onClick = {
selectedTags.value = listOf()
},
modifier = Modifier.weight(1f)
) {
Text("Reset All")
}

Spacer(Modifier.width(8.dp))

Button(
onClick = {
onApply(selectedTags.value)
},
modifier = Modifier.weight(1f)
) {
Text("Apply")
}
}
Spacer(modifier = Modifier.height(20.dp))
}
}

@Preview(showBackground = true)
@Composable
fun SortAndFilterScreenPreview() {
val regionOptions = remember {
mutableStateOf(
listOf(
Tag("Northern Europe"), Tag("Western Europe"),
Tag("Southern Europe"), Tag("Southeast Europe"),
Tag("Central Europe"), Tag("Eastern Europe")
)
)}
MaterialTheme {
CategoriesView(
onApply = {},
onDismiss = {},
uniqueCategories = regionOptions
)
}
}
Loading

0 comments on commit 2be00c5

Please sign in to comment.