diff --git a/app/src/main/java/pokitmons/pokit/navigation/RootNavHost.kt b/app/src/main/java/pokitmons/pokit/navigation/RootNavHost.kt index eec5f8d4..c9edf027 100644 --- a/app/src/main/java/pokitmons/pokit/navigation/RootNavHost.kt +++ b/app/src/main/java/pokitmons/pokit/navigation/RootNavHost.kt @@ -185,7 +185,9 @@ fun RootNavHost( onNavigateToPokitDetail = { navHostController.navigate("${PokitDetail.route}/$it") }, onNavigateAddLink = { navHostController.navigate(AddLink.route) }, onNavigateAddPokit = { navHostController.navigate(AddPokit.route) }, - onNavigateToLinkModify = { navHostController.navigate("${AddLink.route}?${AddLink.linkIdArg}=$it") } + onNavigateToLinkModify = { navHostController.navigate("${AddLink.route}?${AddLink.linkIdArg}=$it") }, + onNavigateToPokitModify = { navHostController.navigate("${AddPokit.route}?${AddPokit.pokitIdArg}=$it") }, + onNavigateToAlarm = { navHostController.navigate(Alarm.route) } ) } diff --git a/feature/pokitdetail/src/main/java/com/strayalpaca/pokitdetail/components/block/Link.kt b/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/linkurlcard/LinkUrlCard.kt similarity index 82% rename from feature/pokitdetail/src/main/java/com/strayalpaca/pokitdetail/components/block/Link.kt rename to core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/linkurlcard/LinkUrlCard.kt index 54c929b3..2e610797 100644 --- a/feature/pokitdetail/src/main/java/com/strayalpaca/pokitdetail/components/block/Link.kt +++ b/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/linkurlcard/LinkUrlCard.kt @@ -1,4 +1,4 @@ -package com.strayalpaca.pokitdetail.components.block +package pokitmons.pokit.core.ui.components.block.linkurlcard import androidx.compose.foundation.Image import androidx.compose.foundation.border @@ -6,6 +6,7 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.IntrinsicSize import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding @@ -15,19 +16,20 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.unit.dp -import coil.compose.rememberAsyncImagePainter -import com.strayalpaca.pokitdetail.model.Link import pokitmons.pokit.core.ui.theme.PokitTheme import pokitmons.pokit.core.ui.utils.noRippleClickable @Composable -internal fun Link( - link: Link, +fun LinkUrlCard( modifier: Modifier = Modifier, - openWebBrowserByClick: Boolean = true, + thumbnailPainter: Painter, + url: String, + title: String, + openWebBrowserByClick: Boolean, ) { val uriHandler = LocalUriHandler.current @@ -38,7 +40,7 @@ internal fun Link( .height(IntrinsicSize.Min) .noRippleClickable { if (openWebBrowserByClick) { - uriHandler.openUri(link.url) + uriHandler.openUri(url) } } .border( @@ -48,12 +50,10 @@ internal fun Link( ) ) { Image( - painter = rememberAsyncImagePainter( - model = link.imageUrl - ), + painter = thumbnailPainter, contentDescription = null, contentScale = ContentScale.Crop, - modifier = Modifier.width(124.dp) + modifier = Modifier.width(124.dp).fillMaxHeight() ) Column( @@ -63,7 +63,7 @@ internal fun Link( ) { Text( modifier = Modifier.fillMaxWidth(), - text = link.title, + text = title, maxLines = 2, style = PokitTheme.typography.body3Medium.copy(color = PokitTheme.colors.textSecondary) ) @@ -72,7 +72,7 @@ internal fun Link( Text( modifier = Modifier.fillMaxWidth(), - text = link.url, + text = url, maxLines = 2, style = PokitTheme.typography.detail2.copy(color = PokitTheme.colors.textTertiary) ) diff --git a/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/linkurlcard/Preview.kt b/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/linkurlcard/Preview.kt new file mode 100644 index 00000000..ebb1a9a6 --- /dev/null +++ b/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/linkurlcard/Preview.kt @@ -0,0 +1,42 @@ +package pokitmons.pokit.core.ui.components.block.linkurlcard + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Surface +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import pokitmons.pokit.core.ui.R +import pokitmons.pokit.core.ui.theme.PokitTheme + +@Preview(showBackground = true) +@Composable +private fun LinkUrlCardPreview() { + PokitTheme { + Surface(modifier = Modifier.fillMaxSize()) { + Column( + modifier = Modifier.fillMaxSize(), + verticalArrangement = Arrangement.spacedBy(12.dp) + ) { + LinkUrlCard( + thumbnailPainter = painterResource(id = R.drawable.icon_24_google), + url = "https://naver.com", + title = "네이버", + openWebBrowserByClick = false + ) + + LinkUrlCard( + modifier = Modifier.padding(20.dp), + thumbnailPainter = painterResource(id = R.drawable.icon_24_google), + url = "https://naver.com", + title = "네이버", + openWebBrowserByClick = false + ) + } + } + } +} diff --git a/feature/search/src/main/java/pokitmons/pokit/search/components/linkdetailbottomsheet/LinkDetailBottomSheet.kt b/core/ui/src/main/java/pokitmons/pokit/core/ui/components/template/linkdetailbottomsheet/LinkDetailBottomSheet.kt similarity index 62% rename from feature/search/src/main/java/pokitmons/pokit/search/components/linkdetailbottomsheet/LinkDetailBottomSheet.kt rename to core/ui/src/main/java/pokitmons/pokit/core/ui/components/template/linkdetailbottomsheet/LinkDetailBottomSheet.kt index 1495f062..6d49d07a 100644 --- a/feature/search/src/main/java/pokitmons/pokit/search/components/linkdetailbottomsheet/LinkDetailBottomSheet.kt +++ b/core/ui/src/main/java/pokitmons/pokit/core/ui/components/template/linkdetailbottomsheet/LinkDetailBottomSheet.kt @@ -1,4 +1,4 @@ -package pokitmons.pokit.search.components.linkdetailbottomsheet +package pokitmons.pokit.core.ui.components.template.linkdetailbottomsheet import androidx.compose.foundation.Image import androidx.compose.foundation.background @@ -22,25 +22,33 @@ import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.res.painterResource -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import pokitmons.pokit.core.ui.R +import pokitmons.pokit.core.ui.components.block.linkurlcard.LinkUrlCard import pokitmons.pokit.core.ui.components.template.bottomsheet.PokitBottomSheet import pokitmons.pokit.core.ui.theme.PokitTheme import pokitmons.pokit.core.ui.theme.color.Orange50 -import pokitmons.pokit.search.model.Link @Composable fun LinkDetailBottomSheet( - link: Link, + title: String, + memo: String, + url: String, + thumbnailPainter: Painter, + bookmark: Boolean, + openWebBrowserByClick: Boolean, + linkType: String, + dateString: String, onHideBottomSheet: () -> Unit, show: Boolean = false, - onClickRemoveLink: (Link) -> Unit, - onClickModifyLink: (Link) -> Unit, - onClickBookmark: () -> Unit, + onClickBookmark: (() -> Unit)? = null, + onClickRemoveLink: (() -> Unit)? = null, + onClickModifyLink: (() -> Unit)? = null, + onClickShareLink: (() -> Unit)? = null, ) { PokitBottomSheet( onHideBottomSheet = onHideBottomSheet, @@ -71,7 +79,7 @@ fun LinkDetailBottomSheet( Spacer(modifier = Modifier.width(4.dp)) Text( - text = stringResource(id = link.linkType.textResourceId), + text = linkType, modifier = Modifier .border( width = 1.dp, @@ -90,7 +98,7 @@ fun LinkDetailBottomSheet( Spacer(modifier = Modifier.height(8.dp)) Text( - text = link.title, + text = title, maxLines = 2, overflow = TextOverflow.Ellipsis, style = PokitTheme.typography.title3.copy(color = PokitTheme.colors.textPrimary) @@ -100,7 +108,7 @@ fun LinkDetailBottomSheet( Text( modifier = Modifier.fillMaxWidth(), - text = link.dateString, + text = dateString, style = PokitTheme.typography.detail2.copy(color = PokitTheme.colors.textTertiary), textAlign = TextAlign.End ) @@ -118,12 +126,17 @@ fun LinkDetailBottomSheet( .fillMaxWidth() .padding(horizontal = 20.dp, vertical = 24.dp) ) { - Link(link = link) + LinkUrlCard( + thumbnailPainter = thumbnailPainter, + url = url, + title = title, + openWebBrowserByClick = openWebBrowserByClick + ) Spacer(modifier = Modifier.height(16.dp)) Text( - text = link.memo, + text = memo, modifier = Modifier .fillMaxWidth() .background( @@ -151,67 +164,76 @@ fun LinkDetailBottomSheet( Image( modifier = Modifier .size(36.dp) + .padding(6.dp) .clickable( indication = null, interactionSource = remember { MutableInteractionSource() }, - onClick = onClickBookmark - ) - .padding(6.dp), + onClick = { + onClickBookmark?.invoke() + } + ), painter = painterResource(id = R.drawable.icon_24_star), contentDescription = "bookmark", colorFilter = ColorFilter.tint( - color = if (link.bookmark) PokitTheme.colors.brand else PokitTheme.colors.iconTertiary + color = if (bookmark) PokitTheme.colors.brand else PokitTheme.colors.iconTertiary ) ) Spacer(modifier = Modifier.weight(1f)) -// Image( -// modifier = Modifier -// .size(36.dp) -// .padding(6.dp), -// painter = painterResource(id = R.drawable.icon_24_share), -// contentDescription = "share", -// colorFilter = ColorFilter.tint( -// color = PokitTheme.colors.iconSecondary -// ) -// ) -// -// Image( -// modifier = Modifier -// .size(36.dp) -// .clickable( -// indication = null, -// interactionSource = remember { MutableInteractionSource() }, -// onClick = { -// onClickModifyLink(link) -// } -// ) -// .padding(6.dp), -// painter = painterResource(id = R.drawable.icon_24_edit), -// contentDescription = "edit", -// colorFilter = ColorFilter.tint( -// color = PokitTheme.colors.iconSecondary -// ) -// ) -// -// Image( -// modifier = Modifier -// .size(36.dp) -// .clickable( -// indication = null, -// interactionSource = remember { MutableInteractionSource() }, -// onClick = { -// onClickRemoveLink(link) -// } -// ) -// .padding(6.dp), -// painter = painterResource(id = R.drawable.icon_24_trash), -// contentDescription = "remove", -// colorFilter = ColorFilter.tint( -// color = PokitTheme.colors.iconSecondary -// ) -// ) + onClickShareLink?.let { + Image( + modifier = Modifier + .size(36.dp) + .padding(6.dp) + .clickable( + indication = null, + interactionSource = remember { MutableInteractionSource() }, + onClick = onClickShareLink + ), + painter = painterResource(id = R.drawable.icon_24_share), + contentDescription = "share", + colorFilter = ColorFilter.tint( + color = PokitTheme.colors.iconSecondary + ) + ) + } + + onClickModifyLink?.let { + Image( + modifier = Modifier + .size(36.dp) + .padding(6.dp) + .clickable( + indication = null, + interactionSource = remember { MutableInteractionSource() }, + onClick = onClickModifyLink + ), + painter = painterResource(id = R.drawable.icon_24_edit), + contentDescription = "edit", + colorFilter = ColorFilter.tint( + color = PokitTheme.colors.iconSecondary + ) + ) + } + + onClickRemoveLink?.let { + Image( + modifier = Modifier + .size(36.dp) + .padding(6.dp) + .clickable( + indication = null, + interactionSource = remember { MutableInteractionSource() }, + onClick = onClickRemoveLink + ), + painter = painterResource(id = R.drawable.icon_24_trash), + contentDescription = "remove", + colorFilter = ColorFilter.tint( + color = PokitTheme.colors.iconSecondary + ) + ) + } } } } diff --git a/core/ui/src/main/java/pokitmons/pokit/core/ui/components/template/linkdetailbottomsheet/Preview.kt b/core/ui/src/main/java/pokitmons/pokit/core/ui/components/template/linkdetailbottomsheet/Preview.kt new file mode 100644 index 00000000..74f99887 --- /dev/null +++ b/core/ui/src/main/java/pokitmons/pokit/core/ui/components/template/linkdetailbottomsheet/Preview.kt @@ -0,0 +1,35 @@ +package pokitmons.pokit.core.ui.components.template.linkdetailbottomsheet + +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.Surface +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.tooling.preview.Preview +import pokitmons.pokit.core.ui.R +import pokitmons.pokit.core.ui.theme.PokitTheme + +@Preview(showBackground = true) +@Composable +private fun LinkDetailBottomSheetPreview() { + PokitTheme { + Surface(modifier = Modifier.fillMaxSize()) { + LinkDetailBottomSheet( + title = "title", + memo = "some memo", + url = "https://naver.com", + thumbnailPainter = painterResource(id = R.drawable.icon_24_google), + bookmark = true, + openWebBrowserByClick = false, + show = true, + linkType = "TEXT", + dateString = "2024.08.27", + onHideBottomSheet = { }, + onClickBookmark = { }, + onClickModifyLink = { }, + onClickRemoveLink = { }, + onClickShareLink = { } + ) + } + } +} diff --git a/data/src/main/java/pokitmons/pokit/data/model/home/remind/Remind.kt b/data/src/main/java/pokitmons/pokit/data/model/home/remind/Remind.kt index 21cc45a3..b1f8c21e 100644 --- a/data/src/main/java/pokitmons/pokit/data/model/home/remind/Remind.kt +++ b/data/src/main/java/pokitmons/pokit/data/model/home/remind/Remind.kt @@ -9,7 +9,7 @@ data class Remind( val createdAt: String, val data: String, val domain: String, - val isRead: Boolean, + val isRead: Boolean = false, // today의 경우 isRead가 빠져서 오기에, 기본값 설정 필요 val thumbNail: String, val title: String, ) diff --git a/data/src/main/java/pokitmons/pokit/data/model/link/request/ModifyLinkRequest.kt b/data/src/main/java/pokitmons/pokit/data/model/link/request/ModifyLinkRequest.kt index 3ac57dda..508ed63b 100644 --- a/data/src/main/java/pokitmons/pokit/data/model/link/request/ModifyLinkRequest.kt +++ b/data/src/main/java/pokitmons/pokit/data/model/link/request/ModifyLinkRequest.kt @@ -9,5 +9,5 @@ data class ModifyLinkRequest( val categoryId: Int, val memo: String, val alertYn: String, - val thumbNail: String, + val thumbNail: String?, ) diff --git a/data/src/main/java/pokitmons/pokit/data/repository/link/LinkRepositoryImpl.kt b/data/src/main/java/pokitmons/pokit/data/repository/link/LinkRepositoryImpl.kt index 3cd860f3..6c4b621e 100644 --- a/data/src/main/java/pokitmons/pokit/data/repository/link/LinkRepositoryImpl.kt +++ b/data/src/main/java/pokitmons/pokit/data/repository/link/LinkRepositoryImpl.kt @@ -109,7 +109,7 @@ class LinkRepositoryImpl @Inject constructor( categoryId = categoryId, memo = memo, alertYn = alertYn, - thumbNail = thumbNail + thumbNail = if (thumbNail.isEmpty()) thumbNail else null ) val response = dataSource.modifyLink(contentId = linkId, modifyLinkRequest = modifyLinkRequest) val mappedResponse = LinkMapper.mapperToLink(response) @@ -127,7 +127,7 @@ class LinkRepositoryImpl @Inject constructor( categoryId = categoryId, memo = memo, alertYn = alertYn, - thumbNail = thumbNail + thumbNail = if (thumbNail.isEmpty()) thumbNail else null ) val response = dataSource.createLink(createLinkRequest = createLinkRequest) val mappedResponse = LinkMapper.mapperToLink(response) diff --git a/feature/home/src/main/java/pokitmons/pokit/home/HomeHeader.kt b/feature/home/src/main/java/pokitmons/pokit/home/HomeHeader.kt index c16a403d..d58a0736 100644 --- a/feature/home/src/main/java/pokitmons/pokit/home/HomeHeader.kt +++ b/feature/home/src/main/java/pokitmons/pokit/home/HomeHeader.kt @@ -1,7 +1,6 @@ package pokitmons.pokit.home import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth @@ -26,6 +25,7 @@ fun HomeHeader( viewModel: PokitViewModel, onNavigateToSetting: () -> Unit, onNavigateToSearch: () -> Unit, + onNavigateToAlarm: () -> Unit, ) { Spacer(modifier = Modifier.height(8.dp)) Row( @@ -33,7 +33,7 @@ fun HomeHeader( .background(color = Color.White) .fillMaxWidth() .height(56.dp) - .padding(horizontal = 20.dp), + .padding(start = 20.dp, end = 14.dp), verticalAlignment = Alignment.CenterVertically ) { Icon( @@ -47,20 +47,22 @@ fun HomeHeader( Spacer(modifier = Modifier.weight(1f)) - Row( - horizontalArrangement = Arrangement.spacedBy(12.dp) - ) { + Row { Icon( painterResource(id = R.drawable.icon_24_search), contentDescription = "검색", modifier = Modifier - .size(24.dp) + .size(36.dp) .noRippleClickable { onNavigateToSearch() } + .padding(6.dp) ) Icon( painterResource(id = R.drawable.icon_24_bell), contentDescription = "알림", - modifier = Modifier.size(24.dp) + modifier = Modifier + .size(36.dp) + .noRippleClickable { onNavigateToAlarm() } + .padding(6.dp) ) when (viewModel.screenType.value) { @@ -69,8 +71,9 @@ fun HomeHeader( painterResource(id = R.drawable.icon_24_setup), contentDescription = "설정", modifier = Modifier - .size(24.dp) + .size(36.dp) .noRippleClickable { onNavigateToSetting() } + .padding(6.dp) ) } is ScreenType.Remind -> Unit diff --git a/feature/home/src/main/java/pokitmons/pokit/home/HomeScreen.kt b/feature/home/src/main/java/pokitmons/pokit/home/HomeScreen.kt index 4a0e5c58..4757dcb8 100644 --- a/feature/home/src/main/java/pokitmons/pokit/home/HomeScreen.kt +++ b/feature/home/src/main/java/pokitmons/pokit/home/HomeScreen.kt @@ -55,6 +55,8 @@ fun HomeScreen( onNavigateAddLink: () -> Unit, onNavigateAddPokit: () -> Unit, onNavigateToLinkModify: (String) -> Unit, + onNavigateToPokitModify: (String) -> Unit, + onNavigateToAlarm: () -> Unit, ) { val sheetState = rememberModalBottomSheetState() val scope = rememberCoroutineScope() @@ -164,7 +166,8 @@ fun HomeScreen( HomeHeader( viewModel = viewModel, onNavigateToSearch = { onNavigateToSearch() }, - onNavigateToSetting = { onNavigateToSetting() } + onNavigateToSetting = { onNavigateToSetting() }, + onNavigateToAlarm = onNavigateToAlarm ) Scaffold( bottomBar = { BottomNavigationBar() } @@ -176,7 +179,8 @@ fun HomeScreen( viewModel = viewModel, modifier = Modifier.padding(padding), onNavigateToPokitDetail = onNavigateToPokitDetail, - onNavigateToLinkModify = onNavigateToLinkModify + onNavigateToLinkModify = onNavigateToLinkModify, + onNavigateToPokitModify = onNavigateToPokitModify ) } diff --git a/feature/home/src/main/java/pokitmons/pokit/home/pokit/CategorySelector.kt b/feature/home/src/main/java/pokitmons/pokit/home/pokit/CategorySelector.kt index 096a685d..c613972d 100644 --- a/feature/home/src/main/java/pokitmons/pokit/home/pokit/CategorySelector.kt +++ b/feature/home/src/main/java/pokitmons/pokit/home/pokit/CategorySelector.kt @@ -91,21 +91,39 @@ fun HomeMid(viewModel: PokitViewModel = hiltViewModel()) { Spacer(modifier = Modifier.padding(start = 2.dp)) - Text( - modifier = Modifier - .noRippleClickable { - when (viewModel.sortOrder.value) { - is SortOrder.Latest -> viewModel.updateSortOrder(SortOrder.Name) - is SortOrder.Name -> viewModel.updateSortOrder(SortOrder.Latest) + if (viewModel.selectedCategory.value == Category.Pokit) { + Text( + modifier = Modifier + .noRippleClickable { + when (viewModel.pokitsSortOrder.value) { + is PokitsSortOrder.Latest -> viewModel.updatePokitsSortOrder(PokitsSortOrder.Name) + is PokitsSortOrder.Name -> viewModel.updatePokitsSortOrder(PokitsSortOrder.Latest) + } } - } - .align(Alignment.CenterVertically), - text = when (viewModel.sortOrder.value) { - is SortOrder.Latest -> "최신순" - is SortOrder.Name -> "이름순" - }, - style = PokitTheme.typography.body3Medium - ) + .align(Alignment.CenterVertically), + text = when (viewModel.pokitsSortOrder.value) { + is PokitsSortOrder.Latest -> "최신순" + is PokitsSortOrder.Name -> "이름순" + }, + style = PokitTheme.typography.body3Medium + ) + } else { + Text( + modifier = Modifier + .noRippleClickable { + when (viewModel.linksSortOrder.value) { + is UncategorizedLinksSortOrder.Latest -> viewModel.updateLinksSortOrder(UncategorizedLinksSortOrder.Older) + is UncategorizedLinksSortOrder.Older -> viewModel.updateLinksSortOrder(UncategorizedLinksSortOrder.Latest) + } + } + .align(Alignment.CenterVertically), + text = when (viewModel.linksSortOrder.value) { + is UncategorizedLinksSortOrder.Latest -> "최신순" + is UncategorizedLinksSortOrder.Older -> "오래된순" + }, + style = PokitTheme.typography.body3Medium + ) + } } } Spacer(modifier = Modifier.height(20.dp)) diff --git a/feature/home/src/main/java/pokitmons/pokit/home/pokit/PokitScreen.kt b/feature/home/src/main/java/pokitmons/pokit/home/pokit/PokitScreen.kt index 5a531f2e..e808aad0 100644 --- a/feature/home/src/main/java/pokitmons/pokit/home/pokit/PokitScreen.kt +++ b/feature/home/src/main/java/pokitmons/pokit/home/pokit/PokitScreen.kt @@ -36,6 +36,7 @@ fun PokitScreen( viewModel: PokitViewModel, onNavigateToPokitDetail: (String) -> Unit, onNavigateToLinkModify: (String) -> Unit, + onNavigateToPokitModify: (String) -> Unit, ) { val pokits = viewModel.pokits.collectAsState() val pokitsState by viewModel.pokitsState.collectAsState() @@ -57,7 +58,7 @@ fun PokitScreen( onClickModify = remember { { viewModel.hidePokitDetailRemoveBottomSheet() - onNavigateToPokitDetail(currentDetailSelectedCategory!!.id) + onNavigateToPokitModify(currentDetailSelectedCategory!!.id) } }, onClickRemove = viewModel::showPokitDetailRemoveBottomSheet @@ -86,7 +87,7 @@ fun PokitScreen( .padding(horizontal = 20.dp) .fillMaxSize() ) { - HomeMid() + HomeMid(viewModel = viewModel) when (selectedCategory) { is Category.Pokit -> { @@ -117,7 +118,10 @@ fun PokitScreen( verticalArrangement = Arrangement.spacedBy(12.dp), horizontalArrangement = Arrangement.spacedBy(12.dp) ) { - items(pokits.value) { pokitDetail -> + items( + items = pokits.value, + key = { it.id } + ) { pokitDetail -> PokitCard( text = pokitDetail.title, linkCount = pokitDetail.count, diff --git a/feature/home/src/main/java/pokitmons/pokit/home/pokit/PokitViewModel.kt b/feature/home/src/main/java/pokitmons/pokit/home/pokit/PokitViewModel.kt index 5a940fc6..3cb65303 100644 --- a/feature/home/src/main/java/pokitmons/pokit/home/pokit/PokitViewModel.kt +++ b/feature/home/src/main/java/pokitmons/pokit/home/pokit/PokitViewModel.kt @@ -22,6 +22,7 @@ import pokitmons.pokit.domain.commom.PokitResult import pokitmons.pokit.domain.model.link.Link import pokitmons.pokit.domain.model.link.LinksSort import pokitmons.pokit.domain.model.pokit.MAX_POKIT_COUNT +import pokitmons.pokit.domain.model.pokit.PokitsSort import pokitmons.pokit.domain.usecase.link.DeleteLinkUseCase import pokitmons.pokit.domain.usecase.link.GetLinksUseCase import pokitmons.pokit.domain.usecase.pokit.DeletePokitUseCase @@ -115,7 +116,10 @@ class PokitViewModel @Inject constructor( var selectedCategory = mutableStateOf(Category.Pokit) private set - var sortOrder = mutableStateOf(SortOrder.Latest) + var pokitsSortOrder = mutableStateOf(PokitsSortOrder.Latest) + private set + + var linksSortOrder = mutableStateOf(UncategorizedLinksSortOrder.Latest) private set var screenType = mutableStateOf(ScreenType.Pokit) @@ -136,15 +140,13 @@ class PokitViewModel @Inject constructor( initCategoryId = 1 ) - private var _pokits: MutableStateFlow> = pokitPaging._pagingData val pokits: StateFlow> - get() = _pokits.asStateFlow() + get() = pokitPaging._pagingData.asStateFlow() val pokitsState = pokitPaging.pagingState - private var _unCategoryLinks: MutableStateFlow> = linkPaging._pagingData val unCategoryLinks: StateFlow> - get() = _unCategoryLinks.asStateFlow() + get() = linkPaging._pagingData.asStateFlow() val linksState = linkPaging.pagingState @@ -176,28 +178,44 @@ class PokitViewModel @Inject constructor( selectedCategory.value = category } - fun updateSortOrder(order: SortOrder) { - sortOrder.value = order + fun updatePokitsSortOrder(order: PokitsSortOrder) { + pokitsSortOrder.value = order sortPokits() } private fun sortPokits() { - when (sortOrder.value) { - is SortOrder.Name -> { - _pokits.update { pokit -> - pokit.sortedBy { pokitDetail -> - pokitDetail.title - } - } + when (pokitsSortOrder.value) { + is PokitsSortOrder.Name -> { + pokitPaging.changeSort(PokitsSort.ALPHABETICAL) } - is SortOrder.Latest -> { - _pokits.update { pokit -> - pokit.sortedByDescending { pokitDetail -> - pokitDetail.createdAt - } - } + is PokitsSortOrder.Latest -> { + pokitPaging.changeSort(PokitsSort.RECENT) } } + + viewModelScope.launch { + pokitPaging.refresh() + } + } + + fun updateLinksSortOrder(order: UncategorizedLinksSortOrder) { + linksSortOrder.value = order + sortUncategorizedLinks() + } + + private fun sortUncategorizedLinks() { + when (linksSortOrder.value) { + is UncategorizedLinksSortOrder.Latest -> { + linkPaging.changeOptions(0, LinksSort.RECENT) + } + is UncategorizedLinksSortOrder.Older -> { + linkPaging.changeOptions(0, LinksSort.OLDER) + } + } + + viewModelScope.launch { + linkPaging.refresh() + } } private suspend fun getUncategorizedLinks(categoryId: Int, size: Int, page: Int, sort: LinksSort): PokitResult> { @@ -307,9 +325,14 @@ sealed class Category { data object Unclassified : Category() } -sealed class SortOrder { - data object Latest : SortOrder() - data object Name : SortOrder() +sealed class PokitsSortOrder { + data object Latest : PokitsSortOrder() + data object Name : PokitsSortOrder() +} + +sealed class UncategorizedLinksSortOrder { + data object Latest : UncategorizedLinksSortOrder() + data object Older : UncategorizedLinksSortOrder() } sealed class ScreenType { diff --git a/feature/home/src/main/java/pokitmons/pokit/home/pokit/UnclassifiedScreen.kt b/feature/home/src/main/java/pokitmons/pokit/home/pokit/UnclassifiedScreen.kt index 9eaac9ed..ad18e172 100644 --- a/feature/home/src/main/java/pokitmons/pokit/home/pokit/UnclassifiedScreen.kt +++ b/feature/home/src/main/java/pokitmons/pokit/home/pokit/UnclassifiedScreen.kt @@ -15,11 +15,10 @@ import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import coil.compose.rememberAsyncImagePainter import com.strayalpaca.pokitdetail.R -import com.strayalpaca.pokitdetail.components.template.linkdetailbottomsheet.LinkDetailBottomSheet import com.strayalpaca.pokitdetail.model.BottomSheetType -import com.strayalpaca.pokitdetail.model.Link import pokitmons.pokit.core.ui.components.block.linkcard.LinkCard import pokitmons.pokit.core.ui.components.template.bottomsheet.PokitBottomSheet +import pokitmons.pokit.core.ui.components.template.linkdetailbottomsheet.LinkDetailBottomSheet import pokitmons.pokit.core.ui.components.template.modifybottomsheet.ModifyBottomSheetContent import pokitmons.pokit.core.ui.components.template.removeItemBottomSheet.TwoButtonBottomSheetContent @@ -34,11 +33,21 @@ fun UnclassifiedScreen( val currentSelectedLink by viewModel.currentSelectedLink.collectAsState() val currentDetailShowLink by viewModel.currentDetailShowLink.collectAsState() - LinkDetailBottomSheet( - show = currentDetailShowLink != null, - link = currentDetailShowLink ?: Link(), - onHideBottomSheet = viewModel::hideDetailLinkBottomSheet - ) + currentDetailShowLink?.let { link -> + LinkDetailBottomSheet( + title = link.title, + memo = link.memo, + url = link.url, + thumbnailPainter = rememberAsyncImagePainter(model = link.imageUrl), + bookmark = link.bookmark, + openWebBrowserByClick = true, + linkType = stringResource(link.linkType.textResourceId), + dateString = link.dateString, + onHideBottomSheet = viewModel::hideDetailLinkBottomSheet, + show = true, + onClickBookmark = {} + ) + } PokitBottomSheet( onHideBottomSheet = viewModel::hideLinkOptionBottomSheet, diff --git a/feature/home/src/main/java/pokitmons/pokit/home/remind/RemindScreen.kt b/feature/home/src/main/java/pokitmons/pokit/home/remind/RemindScreen.kt index d4e1cea8..81390306 100644 --- a/feature/home/src/main/java/pokitmons/pokit/home/remind/RemindScreen.kt +++ b/feature/home/src/main/java/pokitmons/pokit/home/remind/RemindScreen.kt @@ -22,13 +22,12 @@ import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import coil.compose.rememberAsyncImagePainter import com.strayalpaca.pokitdetail.R -import com.strayalpaca.pokitdetail.components.template.linkdetailbottomsheet.LinkDetailBottomSheet import com.strayalpaca.pokitdetail.model.BottomSheetType -import com.strayalpaca.pokitdetail.model.Link import pokitmons.pokit.core.feature.model.NetworkState import pokitmons.pokit.core.ui.components.atom.loading.LoadingProgress import pokitmons.pokit.core.ui.components.block.linkcard.LinkCard import pokitmons.pokit.core.ui.components.template.bottomsheet.PokitBottomSheet +import pokitmons.pokit.core.ui.components.template.linkdetailbottomsheet.LinkDetailBottomSheet import pokitmons.pokit.core.ui.components.template.modifybottomsheet.ModifyBottomSheetContent import pokitmons.pokit.core.ui.components.template.pokkiempty.EmptyPokki import pokitmons.pokit.core.ui.components.template.pokkierror.ErrorPokki @@ -98,11 +97,21 @@ fun RemindScreen( } } - LinkDetailBottomSheet( - show = currentDetailShowLink != null, - link = currentDetailShowLink ?: Link(), - onHideBottomSheet = viewModel::hideDetailLinkBottomSheet - ) + currentDetailShowLink?.let { link -> + LinkDetailBottomSheet( + title = link.title, + memo = link.memo, + url = link.url, + thumbnailPainter = rememberAsyncImagePainter(model = link.imageUrl), + bookmark = link.bookmark, + openWebBrowserByClick = true, + linkType = stringResource(link.linkType.textResourceId), + dateString = link.dateString, + onHideBottomSheet = viewModel::hideDetailLinkBottomSheet, + show = true, + onClickBookmark = viewModel::toggleBookmark + ) + } if (showTotalEmpty) { ErrorPokki( diff --git a/feature/home/src/main/java/pokitmons/pokit/home/remind/RemindViewModel.kt b/feature/home/src/main/java/pokitmons/pokit/home/remind/RemindViewModel.kt index 414243f9..0944b352 100644 --- a/feature/home/src/main/java/pokitmons/pokit/home/remind/RemindViewModel.kt +++ b/feature/home/src/main/java/pokitmons/pokit/home/remind/RemindViewModel.kt @@ -20,6 +20,8 @@ import pokitmons.pokit.domain.usecase.home.remind.BookMarkContentsUseCase import pokitmons.pokit.domain.usecase.home.remind.TodayContentsUseCase import pokitmons.pokit.domain.usecase.home.remind.UnReadContentsUseCase import pokitmons.pokit.domain.usecase.link.DeleteLinkUseCase +import pokitmons.pokit.domain.usecase.link.GetLinkUseCase +import pokitmons.pokit.domain.usecase.link.SetBookmarkUseCase import javax.inject.Inject @HiltViewModel @@ -27,7 +29,9 @@ class RemindViewModel @Inject constructor( private val unReadContentsUseCase: UnReadContentsUseCase, private val todayContentsUseCase: TodayContentsUseCase, private val bookMarkContentsUseCase: BookMarkContentsUseCase, + private val bookmarkUseCase: SetBookmarkUseCase, private val deleteLinkUseCase: DeleteLinkUseCase, + private val getLinkUseCase: GetLinkUseCase, ) : ViewModel() { private var _unReadContents: MutableStateFlow> = MutableStateFlow(emptyList()) @@ -228,6 +232,28 @@ class RemindViewModel @Inject constructor( imageUrl = remindResult.thumbNail ) } + + viewModelScope.launch { + val response = getLinkUseCase.getLink(remindResult.id) + if (response is PokitResult.Success) { + val responseLink = response.result + if (_currentShowingLink.value?.id == responseLink.id.toString()) { + _currentShowingLink.update { + Link( + id = responseLink.id.toString(), + title = responseLink.title, + dateString = responseLink.createdAt, + url = responseLink.data, + isRead = responseLink.isRead, + domainUrl = responseLink.domain, + imageUrl = _currentShowingLink.value?.imageUrl, + memo = responseLink.memo, + bookmark = responseLink.favorites + ) + } + } + } + } } fun hideDetailLinkBottomSheet() { @@ -270,4 +296,16 @@ class RemindViewModel @Inject constructor( } } } + + fun toggleBookmark() { + val currentLink = currentShowingLink.value ?: return + val applyBookmarked = !currentLink.bookmark + viewModelScope.launch { + val response = bookmarkUseCase.setBookMarked(currentLink.id.toInt(), applyBookmarked) + + if (currentLink == currentShowingLink.value && response is PokitResult.Success) { + _currentShowingLink.update { currentLink.copy(bookmark = applyBookmarked) } + } + } + } } diff --git a/feature/home/src/main/java/pokitmons/pokit/home/remind/TodayLinkCard.kt b/feature/home/src/main/java/pokitmons/pokit/home/remind/TodayLinkCard.kt index deaec852..888f971b 100644 --- a/feature/home/src/main/java/pokitmons/pokit/home/remind/TodayLinkCard.kt +++ b/feature/home/src/main/java/pokitmons/pokit/home/remind/TodayLinkCard.kt @@ -24,6 +24,7 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp @@ -52,6 +53,7 @@ fun ToadyLinkCard( Image( painter = painter, contentDescription = null, + contentScale = ContentScale.Crop, modifier = Modifier.fillMaxSize() ) Box( diff --git a/feature/pokitdetail/src/main/java/com/strayalpaca/pokitdetail/PokitDetailScreen.kt b/feature/pokitdetail/src/main/java/com/strayalpaca/pokitdetail/PokitDetailScreen.kt index ff69eeea..c909d635 100644 --- a/feature/pokitdetail/src/main/java/com/strayalpaca/pokitdetail/PokitDetailScreen.kt +++ b/feature/pokitdetail/src/main/java/com/strayalpaca/pokitdetail/PokitDetailScreen.kt @@ -23,7 +23,6 @@ import coil.compose.rememberAsyncImagePainter import com.strayalpaca.pokitdetail.components.block.TitleArea import com.strayalpaca.pokitdetail.components.block.Toolbar import com.strayalpaca.pokitdetail.components.template.filterselectbottomsheet.FilterSelectBottomSheet -import com.strayalpaca.pokitdetail.components.template.linkdetailbottomsheet.LinkDetailBottomSheet import com.strayalpaca.pokitdetail.model.BottomSheetType import com.strayalpaca.pokitdetail.model.Filter import com.strayalpaca.pokitdetail.model.Link @@ -36,6 +35,7 @@ import pokitmons.pokit.core.ui.components.block.linkcard.LinkCard import pokitmons.pokit.core.ui.components.block.pokitlist.PokitList import pokitmons.pokit.core.ui.components.block.pokitlist.attributes.PokitListState import pokitmons.pokit.core.ui.components.template.bottomsheet.PokitBottomSheet +import pokitmons.pokit.core.ui.components.template.linkdetailbottomsheet.LinkDetailBottomSheet import pokitmons.pokit.core.ui.components.template.modifybottomsheet.ModifyBottomSheetContent import pokitmons.pokit.core.ui.components.template.pokkiempty.EmptyPokki import pokitmons.pokit.core.ui.components.template.pokkierror.ErrorPokki @@ -212,11 +212,20 @@ fun PokitDetailScreen( } } - LinkDetailBottomSheet( - show = state.linkDetailBottomSheetVisible && state.currentLink != null, - link = state.currentLink ?: Link(), - onHideBottomSheet = hideLinkDetailBottomSheet - ) + if (state.currentLink != null) { + LinkDetailBottomSheet( + title = state.currentLink.title, + memo = state.currentLink.memo, + url = state.currentLink.url, + thumbnailPainter = rememberAsyncImagePainter(state.currentLink.imageUrl), + bookmark = state.currentLink.bookmark, + openWebBrowserByClick = true, + linkType = stringResource(state.currentLink.linkType.textResourceId), + dateString = state.currentLink.dateString, + onHideBottomSheet = hideLinkDetailBottomSheet, + show = state.linkDetailBottomSheetVisible + ) + } FilterSelectBottomSheet( filter = state.currentFilter, diff --git a/feature/pokitdetail/src/main/java/com/strayalpaca/pokitdetail/components/template/linkdetailbottomsheet/LinkDetailBottomSheet.kt b/feature/pokitdetail/src/main/java/com/strayalpaca/pokitdetail/components/template/linkdetailbottomsheet/LinkDetailBottomSheet.kt deleted file mode 100644 index 98919bd8..00000000 --- a/feature/pokitdetail/src/main/java/com/strayalpaca/pokitdetail/components/template/linkdetailbottomsheet/LinkDetailBottomSheet.kt +++ /dev/null @@ -1,193 +0,0 @@ -package com.strayalpaca.pokitdetail.components.template.linkdetailbottomsheet - -import androidx.compose.foundation.Image -import androidx.compose.foundation.background -import androidx.compose.foundation.border -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.size -import androidx.compose.foundation.layout.width -import androidx.compose.foundation.shape.CircleShape -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material3.HorizontalDivider -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.ColorFilter -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.text.style.TextOverflow -import androidx.compose.ui.unit.dp -import com.strayalpaca.pokitdetail.components.block.Link -import com.strayalpaca.pokitdetail.model.Link -import pokitmons.pokit.core.ui.components.template.bottomsheet.PokitBottomSheet -import pokitmons.pokit.core.ui.theme.PokitTheme -import pokitmons.pokit.core.ui.theme.color.Orange50 -import pokitmons.pokit.core.ui.R.drawable as coreDrawable - -@Composable -fun LinkDetailBottomSheet( - link: Link, - onHideBottomSheet: () -> Unit, - show: Boolean = false, -) { - PokitBottomSheet( - onHideBottomSheet = onHideBottomSheet, - show = show - ) { - Column( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 20.dp) - ) { - Row( - modifier = Modifier.fillMaxWidth(), - verticalAlignment = Alignment.CenterVertically - ) { - Image( - painter = painterResource(id = coreDrawable.icon_24_bell), - contentDescription = null, - modifier = Modifier - .size(20.dp) - .background( - color = PokitTheme.colors.brand, - shape = CircleShape - ) - .padding(2.dp), - colorFilter = ColorFilter.tint(PokitTheme.colors.inverseWh) - ) - - Spacer(modifier = Modifier.width(4.dp)) - - Text( - text = stringResource(id = link.linkType.textResourceId), - modifier = Modifier - .border( - width = 1.dp, - color = PokitTheme.colors.borderTertiary, - shape = RoundedCornerShape(4.dp) - ) - .background( - color = PokitTheme.colors.backgroundBase, - shape = RoundedCornerShape(4.dp) - ) - .padding(horizontal = 8.dp, vertical = 4.dp), - style = PokitTheme.typography.label4.copy(color = PokitTheme.colors.textTertiary) - ) - } - - Spacer(modifier = Modifier.height(8.dp)) - - Text( - text = link.title, - maxLines = 2, - overflow = TextOverflow.Ellipsis, - style = PokitTheme.typography.title3.copy(color = PokitTheme.colors.textPrimary) - ) - - Spacer(modifier = Modifier.height(8.dp)) - - Text( - modifier = Modifier.fillMaxWidth(), - text = link.dateString, - style = PokitTheme.typography.detail2.copy(color = PokitTheme.colors.textTertiary), - textAlign = TextAlign.End - ) - } - - Spacer(modifier = Modifier.height(12.dp)) - - HorizontalDivider( - thickness = 1.dp, - color = PokitTheme.colors.borderTertiary - ) - - Column( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 20.dp, vertical = 24.dp) - ) { - Link(link = link) - - Spacer(modifier = Modifier.height(16.dp)) - - Text( - text = link.memo, - modifier = Modifier - .fillMaxWidth() - .background( - color = Orange50, - shape = RoundedCornerShape(8.dp) - ) - .padding(16.dp), - style = PokitTheme.typography.body3Regular.copy(color = PokitTheme.colors.textPrimary), - maxLines = 4, - minLines = 4 - ) - } - - HorizontalDivider( - thickness = 1.dp, - color = PokitTheme.colors.borderTertiary - ) - - Row( - modifier = Modifier - .fillMaxWidth() - .padding(top = 10.dp, start = 10.dp, end = 10.dp), - verticalAlignment = Alignment.CenterVertically - ) { - Image( - modifier = Modifier - .size(36.dp) - .padding(6.dp), - painter = painterResource(id = coreDrawable.icon_24_star), - contentDescription = "bookmark", - colorFilter = ColorFilter.tint( - color = if (link.bookmark) PokitTheme.colors.brand else PokitTheme.colors.iconTertiary - ) - ) - - Spacer(modifier = Modifier.weight(1f)) - -// Image( -// modifier = Modifier -// .size(36.dp) -// .padding(6.dp), -// painter = painterResource(id = coreDrawable.icon_24_share), -// contentDescription = "share", -// colorFilter = ColorFilter.tint( -// color = PokitTheme.colors.iconSecondary -// ) -// ) -// -// Image( -// modifier = Modifier -// .size(36.dp) -// .padding(6.dp), -// painter = painterResource(id = coreDrawable.icon_24_edit), -// contentDescription = "edit", -// colorFilter = ColorFilter.tint( -// color = PokitTheme.colors.iconSecondary -// ) -// ) -// -// Image( -// modifier = Modifier -// .size(36.dp) -// .padding(6.dp), -// painter = painterResource(id = coreDrawable.icon_24_trash), -// contentDescription = "remove", -// colorFilter = ColorFilter.tint( -// color = PokitTheme.colors.iconSecondary -// ) -// ) - } - } -} diff --git a/feature/pokitdetail/src/main/java/com/strayalpaca/pokitdetail/components/template/linkdetailbottomsheet/Preview.kt b/feature/pokitdetail/src/main/java/com/strayalpaca/pokitdetail/components/template/linkdetailbottomsheet/Preview.kt deleted file mode 100644 index 6a7a7ccc..00000000 --- a/feature/pokitdetail/src/main/java/com/strayalpaca/pokitdetail/components/template/linkdetailbottomsheet/Preview.kt +++ /dev/null @@ -1,30 +0,0 @@ -package com.strayalpaca.pokitdetail.components.template.linkdetailbottomsheet - -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.padding -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import com.strayalpaca.pokitdetail.model.sampleLinkList -import pokitmons.pokit.core.ui.theme.PokitTheme - -@Preview(showBackground = true) -@Composable -fun LinkCardPreview() { - PokitTheme { - Column( - modifier = Modifier - .fillMaxSize() - .background(Color.LightGray) - .padding(12.dp), - verticalArrangement = Arrangement.spacedBy(12.dp) - ) { - LinkDetailBottomSheet(link = sampleLinkList[0], onHideBottomSheet = {}) - } - } -} diff --git a/feature/pokitdetail/src/main/java/com/strayalpaca/pokitdetail/paging/PokitPaging.kt b/feature/pokitdetail/src/main/java/com/strayalpaca/pokitdetail/paging/PokitPaging.kt index ab2229ce..ca2a8702 100644 --- a/feature/pokitdetail/src/main/java/com/strayalpaca/pokitdetail/paging/PokitPaging.kt +++ b/feature/pokitdetail/src/main/java/com/strayalpaca/pokitdetail/paging/PokitPaging.kt @@ -11,6 +11,7 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import pokitmons.pokit.domain.commom.PokitResult +import pokitmons.pokit.domain.model.pokit.PokitsSort import pokitmons.pokit.domain.usecase.pokit.GetPokitsUseCase class PokitPaging( @@ -28,6 +29,7 @@ class PokitPaging( override val pagingData: StateFlow> = _pagingData.asStateFlow() private var currentPageIndex = initPage private var requestJob: Job? = null + private var sort: PokitsSort = PokitsSort.RECENT override suspend fun refresh() { requestJob?.cancel() @@ -37,7 +39,7 @@ class PokitPaging( requestJob = coroutineScope.launch { try { currentPageIndex = initPage - val response = getPokits.getPokits(size = perPage * firstRequestPage, page = currentPageIndex) + val response = getPokits.getPokits(sort = sort, size = perPage * firstRequestPage, page = currentPageIndex) when (response) { is PokitResult.Success -> { val pokitList = response.result.map { domainPokit -> @@ -66,7 +68,7 @@ class PokitPaging( requestJob = coroutineScope.launch { try { - val response = getPokits.getPokits(size = perPage, page = currentPageIndex) + val response = getPokits.getPokits(sort = sort, size = perPage, page = currentPageIndex) when (response) { is PokitResult.Success -> { val pokitList = response.result.map { domainPokit -> @@ -122,4 +124,8 @@ class PokitPaging( } } } + + fun changeSort(sort: PokitsSort) { + this.sort = sort + } } diff --git a/feature/search/src/main/java/pokitmons/pokit/search/SearchScreen.kt b/feature/search/src/main/java/pokitmons/pokit/search/SearchScreen.kt index da29626b..3aa7cea7 100644 --- a/feature/search/src/main/java/pokitmons/pokit/search/SearchScreen.kt +++ b/feature/search/src/main/java/pokitmons/pokit/search/SearchScreen.kt @@ -12,8 +12,10 @@ import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp +import coil.compose.rememberAsyncImagePainter import pokitmons.pokit.core.ui.components.atom.loading.LoadingProgress import pokitmons.pokit.core.ui.components.template.bottomsheet.PokitBottomSheet +import pokitmons.pokit.core.ui.components.template.linkdetailbottomsheet.LinkDetailBottomSheet import pokitmons.pokit.core.ui.components.template.modifybottomsheet.ModifyBottomSheetContent import pokitmons.pokit.core.ui.components.template.pokkiempty.EmptyPokki import pokitmons.pokit.core.ui.components.template.pokkierror.ErrorPokki @@ -21,7 +23,6 @@ import pokitmons.pokit.core.ui.components.template.removeItemBottomSheet.TwoButt import pokitmons.pokit.core.ui.theme.PokitTheme import pokitmons.pokit.search.components.filter.FilterArea import pokitmons.pokit.search.components.filterbottomsheet.FilterBottomSheet -import pokitmons.pokit.search.components.linkdetailbottomsheet.LinkDetailBottomSheet import pokitmons.pokit.search.components.recentsearchword.RecentSearchWord import pokitmons.pokit.search.components.searchitemlist.SearchItemList import pokitmons.pokit.search.components.toolbar.Toolbar @@ -47,19 +48,28 @@ fun SearchScreenContainer( val pokitList by viewModel.pokitList.collectAsState() val pokitPagingState by viewModel.pokitPagingState.collectAsState() - LinkDetailBottomSheet( - link = state.currentLink ?: Link(), - onHideBottomSheet = viewModel::hideLinkDetailBottomSheet, - show = state.showLinkDetailBottomSheet, - onClickModifyLink = remember { - { link -> + state.currentLink?.let { link -> + LinkDetailBottomSheet( + title = link.title, + memo = link.memo, + url = link.url, + thumbnailPainter = rememberAsyncImagePainter(link.imageUrl), + bookmark = link.bookmark, + openWebBrowserByClick = true, + linkType = stringResource(id = link.linkType.textResourceId), + dateString = link.dateString, + onHideBottomSheet = viewModel::hideLinkDetailBottomSheet, + show = state.showLinkDetailBottomSheet, + onClickModifyLink = { viewModel.hideLinkDetailBottomSheet() onNavigateToLinkModify(link.id) - } - }, - onClickRemoveLink = viewModel::showLinkRemoveBottomSheet, - onClickBookmark = viewModel::toggleBookmark - ) + }, + onClickRemoveLink = { + viewModel.showLinkRemoveBottomSheet(link) + }, + onClickBookmark = viewModel::toggleBookmark + ) + } FilterBottomSheet( filter = state.filter ?: Filter(), diff --git a/feature/search/src/main/java/pokitmons/pokit/search/components/linkdetailbottomsheet/Link.kt b/feature/search/src/main/java/pokitmons/pokit/search/components/linkdetailbottomsheet/Link.kt deleted file mode 100644 index fed6294f..00000000 --- a/feature/search/src/main/java/pokitmons/pokit/search/components/linkdetailbottomsheet/Link.kt +++ /dev/null @@ -1,79 +0,0 @@ -package pokitmons.pokit.search.components.linkdetailbottomsheet - -import androidx.compose.foundation.Image -import androidx.compose.foundation.border -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.IntrinsicSize -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.foundation.shape.RoundedCornerShape -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip -import androidx.compose.ui.layout.ContentScale -import androidx.compose.ui.platform.LocalUriHandler -import androidx.compose.ui.unit.dp -import coil.compose.rememberAsyncImagePainter -import pokitmons.pokit.core.ui.theme.PokitTheme -import pokitmons.pokit.core.ui.utils.noRippleClickable -import pokitmons.pokit.search.model.Link - -@Composable -internal fun Link( - link: Link, - modifier: Modifier = Modifier, - openWebBrowserByClick: Boolean = true, -) { - val uriHandler = LocalUriHandler.current - - Row( - modifier = modifier - .fillMaxWidth() - .clip(RoundedCornerShape(12.dp)) - .height(IntrinsicSize.Min) - .noRippleClickable { - if (openWebBrowserByClick) { - uriHandler.openUri(link.url) - } - } - .border( - width = 1.dp, - color = PokitTheme.colors.borderTertiary, - shape = RoundedCornerShape(12.dp) - ) - ) { - Image( - painter = rememberAsyncImagePainter(link.imageUrl), - contentDescription = null, - contentScale = ContentScale.Crop, - modifier = Modifier.width(124.dp) - ) - - Column( - modifier = Modifier - .padding(start = 16.dp, end = 20.dp, top = 16.dp, bottom = 16.dp) - .weight(1f) - ) { - Text( - modifier = Modifier.fillMaxWidth(), - text = link.title, - maxLines = 2, - style = PokitTheme.typography.body3Medium.copy(color = PokitTheme.colors.textSecondary) - ) - - Spacer(modifier = Modifier.height(8.dp)) - - Text( - modifier = Modifier.fillMaxWidth(), - text = link.url, - maxLines = 2, - style = PokitTheme.typography.detail2.copy(color = PokitTheme.colors.textTertiary) - ) - } - } -}