diff --git a/app/src/main/java/com/into/websoso/ui/main/feed/model/FeedModel.kt b/app/src/main/java/com/into/websoso/ui/main/feed/model/FeedModel.kt index 4e6301722..488e9b57a 100644 --- a/app/src/main/java/com/into/websoso/ui/main/feed/model/FeedModel.kt +++ b/app/src/main/java/com/into/websoso/ui/main/feed/model/FeedModel.kt @@ -20,6 +20,7 @@ data class FeedModel( ) { val formattedCreatedDate: String = " · $createdDate" val isEmptyOfRelevantCategories: Boolean = relevantCategories.isEmpty() + val isVisible: Boolean get() = !isSpoiler && imageUrls.isNotEmpty() data class UserModel( val id: Long, diff --git a/app/src/main/java/com/into/websoso/ui/main/library/LibraryFragment.kt b/app/src/main/java/com/into/websoso/ui/main/library/LibraryFragment.kt index b4d6e4a69..6fe3bb9b5 100644 --- a/app/src/main/java/com/into/websoso/ui/main/library/LibraryFragment.kt +++ b/app/src/main/java/com/into/websoso/ui/main/library/LibraryFragment.kt @@ -60,6 +60,11 @@ class LibraryFragment : Fragment() { } } + override fun onResume() { + super.onResume() + libraryViewModel.refreshLibrary() + } + companion object { const val TAG = "LibraryFragment" } diff --git a/app/src/main/res/layout/item_feed.xml b/app/src/main/res/layout/item_feed.xml index baf1f0062..05de49972 100644 --- a/app/src/main/res/layout/item_feed.xml +++ b/app/src/main/res/layout/item_feed.xml @@ -130,7 +130,7 @@ android:layout_marginHorizontal="14dp" android:layout_marginTop="20dp" app:cornerRadius="@{8f}" - app:isVisible="@{!feed.imageUrls.empty}" + app:isVisible="@{feed.visible}" app:layout_constraintBottom_toTopOf="@id/cl_feed_novel_info" app:layout_constraintDimensionRatio="334:236" app:layout_constraintEnd_toEndOf="parent" @@ -150,7 +150,7 @@ android:text="@{String.valueOf(feed.imageCount)}" android:textAppearance="@style/body3" android:textColor="@color/white" - app:isVisible="@{!feed.imageUrls.empty}" + app:isVisible="@{feed.visible}" app:layout_constraintBottom_toBottomOf="@id/iv_feed_image" app:layout_constraintEnd_toEndOf="@id/iv_feed_image" tools:text="0" /> diff --git a/core/common/src/main/java/com/into/websoso/core/common/extensions/ComposeExtensions.kt b/core/common/src/main/java/com/into/websoso/core/common/extensions/ComposeExtensions.kt new file mode 100644 index 000000000..268ea9eab --- /dev/null +++ b/core/common/src/main/java/com/into/websoso/core/common/extensions/ComposeExtensions.kt @@ -0,0 +1,23 @@ +package com.into.websoso.core.common.extensions + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.semantics.Role + +@Composable +fun Modifier.clickableWithoutRipple( + enabled: Boolean = true, + onClickLabel: String? = null, + role: Role? = null, + onClick: () -> Unit, +) = clickable( + enabled = enabled, + onClickLabel = onClickLabel, + role = role, + indication = null, + interactionSource = remember { MutableInteractionSource() }, + onClick = onClick, +) diff --git a/core/database/src/main/java/com/into/websoso/core/database/datasource/library/DefaultLibraryLocalDataSource.kt b/core/database/src/main/java/com/into/websoso/core/database/datasource/library/DefaultLibraryLocalDataSource.kt index 08b8238fd..bef2dd1ee 100644 --- a/core/database/src/main/java/com/into/websoso/core/database/datasource/library/DefaultLibraryLocalDataSource.kt +++ b/core/database/src/main/java/com/into/websoso/core/database/datasource/library/DefaultLibraryLocalDataSource.kt @@ -36,6 +36,12 @@ internal class DefaultLibraryLocalDataSource override suspend fun insertNovel(novel: NovelEntity) { novelDao.apply { val novelIndex = selectNovelByUserNovelId(novel.userNovelId)?.sortIndex ?: 0 + + if (novel.readStatus.isEmpty() && novel.isInterest.not()) { + deleteNovel(novelId = novel.novelId) + return + } + insertNovel(novel.toNovelDatabase(novelIndex)) } } @@ -56,7 +62,23 @@ internal class DefaultLibraryLocalDataSource } override suspend fun deleteNovel(novelId: Long) { - novelDao.deleteNovel(novelId) + val existedNovel = novelDao.selectNovelByNovelId(novelId) ?: return + + novelDao.apply { + if (existedNovel.isInterest) { + val updatedNovel = existedNovel.copy( + readStatus = "", + userNovelRating = 0.0f, + attractivePoints = emptyList(), + startDate = "", + endDate = "", + keywords = emptyList(), + ) + insertNovel(updatedNovel) + } else { + deleteNovel(novelId) + } + } } } diff --git a/data/library/src/main/java/com/into/websoso/data/library/LibraryRepository.kt b/data/library/src/main/java/com/into/websoso/data/library/LibraryRepository.kt index d79391b5b..01b739b9c 100644 --- a/data/library/src/main/java/com/into/websoso/data/library/LibraryRepository.kt +++ b/data/library/src/main/java/com/into/websoso/data/library/LibraryRepository.kt @@ -7,6 +7,8 @@ import kotlinx.coroutines.flow.Flow interface LibraryRepository { val libraryFlow: Flow> + suspend fun refresh() + companion object { const val PAGE_SIZE = 20 } diff --git a/data/library/src/main/java/com/into/websoso/data/library/repository/MyLibraryRepository.kt b/data/library/src/main/java/com/into/websoso/data/library/repository/MyLibraryRepository.kt index 60d07830d..a9f75ea6e 100644 --- a/data/library/src/main/java/com/into/websoso/data/library/repository/MyLibraryRepository.kt +++ b/data/library/src/main/java/com/into/websoso/data/library/repository/MyLibraryRepository.kt @@ -49,6 +49,10 @@ class MyLibraryRepository ).flow } + override suspend fun refresh() { + libraryLocalDataSource.selectAllNovels().invalidate() + } + suspend fun deleteAllNovels() { libraryLocalDataSource.deleteAllNovels() } diff --git a/data/library/src/main/java/com/into/websoso/data/library/repository/UserLibraryRepository.kt b/data/library/src/main/java/com/into/websoso/data/library/repository/UserLibraryRepository.kt index a3e049c52..645f48cef 100644 --- a/data/library/src/main/java/com/into/websoso/data/library/repository/UserLibraryRepository.kt +++ b/data/library/src/main/java/com/into/websoso/data/library/repository/UserLibraryRepository.kt @@ -47,6 +47,9 @@ internal class UserLibraryRepository ).flow } + override suspend fun refresh() { + } + private suspend fun getUserNovels( lastUserNovelId: Long, libraryFilter: LibraryFilter, diff --git a/feature/library/src/main/java/com/into/websoso/feature/library/LibraryViewModel.kt b/feature/library/src/main/java/com/into/websoso/feature/library/LibraryViewModel.kt index 6a955a319..f003c9c84 100644 --- a/feature/library/src/main/java/com/into/websoso/feature/library/LibraryViewModel.kt +++ b/feature/library/src/main/java/com/into/websoso/feature/library/LibraryViewModel.kt @@ -35,7 +35,7 @@ import javax.inject.Inject class LibraryViewModel @Inject constructor( - libraryRepository: LibraryRepository, + private val libraryRepository: LibraryRepository, private val filterRepository: FilterRepository, ) : ViewModel() { private val _uiState = MutableStateFlow(LibraryUiState()) @@ -74,6 +74,10 @@ class LibraryViewModel } } + fun refreshLibrary() { + viewModelScope.launch { libraryRepository.refresh() } + } + fun updateViewType() { _uiState.update { it.copy(isGrid = !it.isGrid) diff --git a/feature/library/src/main/java/com/into/websoso/feature/library/component/LibraryGridListItem.kt b/feature/library/src/main/java/com/into/websoso/feature/library/component/LibraryGridListItem.kt index 3e006ebf3..5086620b5 100644 --- a/feature/library/src/main/java/com/into/websoso/feature/library/component/LibraryGridListItem.kt +++ b/feature/library/src/main/java/com/into/websoso/feature/library/component/LibraryGridListItem.kt @@ -2,7 +2,6 @@ package com.into.websoso.feature.library.component import androidx.compose.foundation.Image import androidx.compose.foundation.background -import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -28,6 +27,7 @@ import androidx.compose.ui.res.vectorResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp +import com.into.websoso.core.common.extensions.clickableWithoutRipple import com.into.websoso.core.designsystem.component.NetworkImage import com.into.websoso.core.designsystem.theme.Black import com.into.websoso.core.designsystem.theme.Gray200 @@ -59,7 +59,7 @@ internal fun NovelGridListItem( modifier = modifier .width(itemSize.width) .wrapContentHeight() - .clickable { onItemClick() }, + .clickableWithoutRipple { onItemClick() }, verticalArrangement = Arrangement.spacedBy(6.dp), ) { NovelGridThumbnail( @@ -139,7 +139,8 @@ private fun ReadStatusBadge( .background( color = readStatusUiModel.backgroundColor, shape = RoundedCornerShape(4.dp), - ).padding(vertical = 4.dp), + ) + .padding(vertical = 4.dp), contentAlignment = Alignment.Center, ) { Text( diff --git a/feature/library/src/main/java/com/into/websoso/feature/library/component/LibraryListItem.kt b/feature/library/src/main/java/com/into/websoso/feature/library/component/LibraryListItem.kt index 112f46656..1190e8215 100644 --- a/feature/library/src/main/java/com/into/websoso/feature/library/component/LibraryListItem.kt +++ b/feature/library/src/main/java/com/into/websoso/feature/library/component/LibraryListItem.kt @@ -2,7 +2,6 @@ package com.into.websoso.feature.library.component import androidx.compose.foundation.Image import androidx.compose.foundation.background -import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -34,6 +33,7 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import coil.compose.AsyncImage +import com.into.websoso.core.common.extensions.clickableWithoutRipple import com.into.websoso.core.designsystem.theme.Black import com.into.websoso.core.designsystem.theme.Gray200 import com.into.websoso.core.designsystem.theme.Gray300 @@ -72,7 +72,7 @@ internal fun LibraryListItem( Column( modifier = modifier .fillMaxWidth() - .clickable { onClick() }, + .clickableWithoutRipple { onClick() }, verticalArrangement = Arrangement.spacedBy(8.dp), ) { Row( @@ -162,7 +162,8 @@ private fun ReadStatusBadge( .background( color = it.backgroundColor, shape = RoundedCornerShape(8.dp), - ).padding(vertical = 4.dp), + ) + .padding(vertical = 4.dp), contentAlignment = Alignment.Center, ) { Text( diff --git a/feature/library/src/main/java/com/into/websoso/feature/library/component/LibrayFilterTopBar.kt b/feature/library/src/main/java/com/into/websoso/feature/library/component/LibrayFilterTopBar.kt index 55d04de19..e93aa4af1 100644 --- a/feature/library/src/main/java/com/into/websoso/feature/library/component/LibrayFilterTopBar.kt +++ b/feature/library/src/main/java/com/into/websoso/feature/library/component/LibrayFilterTopBar.kt @@ -3,7 +3,6 @@ package com.into.websoso.feature.library.component import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.Image import androidx.compose.foundation.background -import androidx.compose.foundation.clickable import androidx.compose.foundation.horizontalScroll import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -29,6 +28,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.res.vectorResource import androidx.compose.ui.unit.dp +import com.into.websoso.core.common.extensions.clickableWithoutRipple import com.into.websoso.core.designsystem.theme.Black import com.into.websoso.core.designsystem.theme.Gray200 import com.into.websoso.core.designsystem.theme.Gray300 @@ -137,7 +137,7 @@ private fun NovelFilterChip( shape = RoundedCornerShape(20.dp), modifier = Modifier .defaultMinSize(minHeight = 32.dp) - .clickable(onClick = onClick), + .clickableWithoutRipple(onClick = onClick), border = if (!isSelected) BorderStroke(1.dp, Gray70) else null, ) { Row( diff --git a/feature/library/src/main/java/com/into/websoso/feature/library/filter/component/LibraryFilterBottomSheetButtons.kt b/feature/library/src/main/java/com/into/websoso/feature/library/filter/component/LibraryFilterBottomSheetButtons.kt index a3db9ae6d..1541a0488 100644 --- a/feature/library/src/main/java/com/into/websoso/feature/library/filter/component/LibraryFilterBottomSheetButtons.kt +++ b/feature/library/src/main/java/com/into/websoso/feature/library/filter/component/LibraryFilterBottomSheetButtons.kt @@ -1,7 +1,6 @@ package com.into.websoso.feature.library.filter.component import androidx.compose.foundation.background -import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.IntrinsicSize @@ -20,6 +19,7 @@ import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.res.vectorResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import com.into.websoso.core.common.extensions.clickableWithoutRipple import com.into.websoso.core.designsystem.theme.Gray300 import com.into.websoso.core.designsystem.theme.Gray50 import com.into.websoso.core.designsystem.theme.Primary100 @@ -44,7 +44,7 @@ internal fun LibraryFilterBottomSheetButtons( modifier = Modifier .fillMaxHeight() .background(color = Gray50) - .clickable { onResetClick() } + .clickableWithoutRipple { onResetClick() } .padding( vertical = 20.dp, horizontal = 34.dp, @@ -66,7 +66,7 @@ internal fun LibraryFilterBottomSheetButtons( modifier = Modifier .fillMaxHeight() .background(color = Primary100) - .clickable { onFilterSearchClick() } + .clickableWithoutRipple { onFilterSearchClick() } .padding(vertical = 20.dp) .weight(weight = 1f), ) { diff --git a/feature/library/src/main/java/com/into/websoso/feature/library/filter/component/LibraryFilterBottomSheetClickableItem.kt b/feature/library/src/main/java/com/into/websoso/feature/library/filter/component/LibraryFilterBottomSheetClickableItem.kt index 0883c6195..0c85d4596 100644 --- a/feature/library/src/main/java/com/into/websoso/feature/library/filter/component/LibraryFilterBottomSheetClickableItem.kt +++ b/feature/library/src/main/java/com/into/websoso/feature/library/filter/component/LibraryFilterBottomSheetClickableItem.kt @@ -1,7 +1,6 @@ package com.into.websoso.feature.library.filter.component import androidx.annotation.DrawableRes -import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.height @@ -17,6 +16,7 @@ import androidx.compose.ui.res.vectorResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp +import com.into.websoso.core.common.extensions.clickableWithoutRipple import com.into.websoso.core.designsystem.theme.Gray100 import com.into.websoso.core.designsystem.theme.Gray300 import com.into.websoso.core.designsystem.theme.Primary100 @@ -35,7 +35,7 @@ internal fun LibraryFilterBottomSheetClickableItem( Column( horizontalAlignment = Alignment.CenterHorizontally, modifier = Modifier - .clickable(onClick = onClick) + .clickableWithoutRipple(onClick = onClick) .padding(horizontal = horizontalPadding), ) { Icon( diff --git a/feature/library/src/main/java/com/into/websoso/feature/library/filter/component/LibraryFilterBottomSheetHeader.kt b/feature/library/src/main/java/com/into/websoso/feature/library/filter/component/LibraryFilterBottomSheetHeader.kt index ad32169dc..4a853f68a 100644 --- a/feature/library/src/main/java/com/into/websoso/feature/library/filter/component/LibraryFilterBottomSheetHeader.kt +++ b/feature/library/src/main/java/com/into/websoso/feature/library/filter/component/LibraryFilterBottomSheetHeader.kt @@ -1,6 +1,5 @@ package com.into.websoso.feature.library.filter.component -import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Row @@ -15,6 +14,7 @@ import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.res.vectorResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import com.into.websoso.core.common.extensions.clickableWithoutRipple import com.into.websoso.core.designsystem.theme.Gray200 import com.into.websoso.core.designsystem.theme.WebsosoTheme import com.into.websoso.core.resource.R.drawable.ic_cancel_modal @@ -38,7 +38,7 @@ internal fun LibraryFilterBottomSheetHeader( Box( modifier = Modifier .padding(vertical = 20.dp) - .clickable { + .clickableWithoutRipple { onDismissRequest() }, ) { diff --git a/feature/library/src/main/java/com/into/websoso/feature/library/filter/component/LibraryFilterBottomSheetNovelRatingGrid.kt b/feature/library/src/main/java/com/into/websoso/feature/library/filter/component/LibraryFilterBottomSheetNovelRatingGrid.kt index 642a8fa01..989a9d19e 100644 --- a/feature/library/src/main/java/com/into/websoso/feature/library/filter/component/LibraryFilterBottomSheetNovelRatingGrid.kt +++ b/feature/library/src/main/java/com/into/websoso/feature/library/filter/component/LibraryFilterBottomSheetNovelRatingGrid.kt @@ -2,7 +2,6 @@ package com.into.websoso.feature.library.filter.component import androidx.compose.foundation.background import androidx.compose.foundation.border -import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -16,6 +15,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import com.into.websoso.core.common.extensions.clickableWithoutRipple import com.into.websoso.core.designsystem.theme.Gray300 import com.into.websoso.core.designsystem.theme.Gray50 import com.into.websoso.core.designsystem.theme.Primary100 @@ -47,7 +47,7 @@ internal fun LibraryFilterBottomSheetNovelRatingGrid( title = "3.5 이상", modifier = Modifier .weight(weight = 1f) - .clickable { + .clickableWithoutRipple { onRatingClick(THREE_POINT_FIVE) }, isSelected = selectedRating.isCloseTo(THREE_POINT_FIVE), @@ -56,7 +56,7 @@ internal fun LibraryFilterBottomSheetNovelRatingGrid( title = "4.0 이상", modifier = Modifier .weight(weight = 1f) - .clickable { + .clickableWithoutRipple { onRatingClick(FOUR) }, isSelected = selectedRating.isCloseTo(FOUR), @@ -71,7 +71,7 @@ internal fun LibraryFilterBottomSheetNovelRatingGrid( title = "4.5 이상", modifier = Modifier .weight(weight = 1f) - .clickable { + .clickableWithoutRipple { onRatingClick(FOUR_POINT_FIVE) }, isSelected = selectedRating.isCloseTo(FOUR_POINT_FIVE), @@ -80,7 +80,7 @@ internal fun LibraryFilterBottomSheetNovelRatingGrid( title = "4.8 이상", modifier = Modifier .weight(weight = 1f) - .clickable { + .clickableWithoutRipple { onRatingClick(FOUR_POINT_EIGHT) }, isSelected = selectedRating.isCloseTo(FOUR_POINT_EIGHT), @@ -102,7 +102,8 @@ private fun NovelRatingItem( .background( color = backgroundColor, shape = RoundedCornerShape(size = 8.dp), - ).then( + ) + .then( if (isSelected) { Modifier.border( width = 1.dp, @@ -112,7 +113,8 @@ private fun NovelRatingItem( } else { Modifier }, - ).padding(vertical = 14.dp, horizontal = 24.dp), + ) + .padding(vertical = 14.dp, horizontal = 24.dp), contentAlignment = Alignment.Center, ) { Text( diff --git a/feature/signin/src/main/java/com/into/websoso/feature/signin/component/SignInButtons.kt b/feature/signin/src/main/java/com/into/websoso/feature/signin/component/SignInButtons.kt index 7e6ebcc89..4a557cb1f 100644 --- a/feature/signin/src/main/java/com/into/websoso/feature/signin/component/SignInButtons.kt +++ b/feature/signin/src/main/java/com/into/websoso/feature/signin/component/SignInButtons.kt @@ -1,7 +1,6 @@ package com.into.websoso.feature.signin.component import androidx.compose.foundation.Image -import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth @@ -11,6 +10,7 @@ import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.res.vectorResource import androidx.compose.ui.tooling.preview.Preview import com.into.websoso.core.auth.AuthPlatform +import com.into.websoso.core.common.extensions.clickableWithoutRipple import com.into.websoso.core.designsystem.theme.WebsosoTheme import com.into.websoso.core.resource.R.drawable.ic_login_kakao @@ -35,7 +35,7 @@ private fun KakaoSignInButton( Image( imageVector = ImageVector.vectorResource(id = ic_login_kakao), contentDescription = null, - modifier = modifier.clickable { + modifier = modifier.clickableWithoutRipple { onClick(AuthPlatform.KAKAO) }, )