From b1e113b1bfff0833bfba189953df7a0c9321b61d Mon Sep 17 00:00:00 2001 From: JSPark <48265129+pknujsp@users.noreply.github.com> Date: Thu, 1 Jun 2023 00:00:39 +0900 Subject: [PATCH] =?UTF-8?q?#91=20HomeFragment=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=ED=9A=8C=EC=88=98=ED=8F=90=EA=B8=B0=20=EC=95=84=EC=9D=B4?= =?UTF-8?q?=ED=85=9C=20=ED=81=B4=EB=A6=AD=20=EC=8B=9C=20NewsScreen?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=9D=B4=EB=8F=99=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84=20=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/model/build.gradle.kts | 1 + .../model/local/navargs/RecallDisposalArgs.kt | 5 +++ .../adminaction/AdminActionListItemDto.kt | 6 ++-- .../mediproject/feature/news/NewsFragment.kt | 15 +++++++-- .../mediproject/feature/news/NewsScreen.kt | 18 ++++++++--- .../adminaction/DetailAdminActionScreen.kt | 31 +++++++++++++++---- .../recentpenaltylist/PenaltyListAdapter.kt | 4 +-- .../RecentPenaltyListFragment.kt | 11 +++++++ .../RecentPenaltyListViewModel.kt | 21 ++++++------- 9 files changed, 83 insertions(+), 29 deletions(-) create mode 100644 core/model/src/main/java/com/android/mediproject/core/model/local/navargs/RecallDisposalArgs.kt diff --git a/core/model/build.gradle.kts b/core/model/build.gradle.kts index 361c9336d..9c77af1e2 100644 --- a/core/model/build.gradle.kts +++ b/core/model/build.gradle.kts @@ -2,6 +2,7 @@ plugins { id("mediproject.android.library") id(libs.plugins.kotlin.serialization.get().pluginId) id(libs.plugins.nav.safeargs.kotlin.get().pluginId) + alias(libs.plugins.kotlin.parcelize) } android { diff --git a/core/model/src/main/java/com/android/mediproject/core/model/local/navargs/RecallDisposalArgs.kt b/core/model/src/main/java/com/android/mediproject/core/model/local/navargs/RecallDisposalArgs.kt new file mode 100644 index 000000000..552245209 --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/local/navargs/RecallDisposalArgs.kt @@ -0,0 +1,5 @@ +package com.android.mediproject.core.model.local.navargs + +data class RecallDisposalArgs( + val product: String, +) : BaseNavArgs(RecallDisposalArgs::class.java.name) \ No newline at end of file diff --git a/core/model/src/main/java/com/android/mediproject/core/model/remote/adminaction/AdminActionListItemDto.kt b/core/model/src/main/java/com/android/mediproject/core/model/remote/adminaction/AdminActionListItemDto.kt index 0c8988f94..ac9fdc15e 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/remote/adminaction/AdminActionListItemDto.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/remote/adminaction/AdminActionListItemDto.kt @@ -1,10 +1,12 @@ package com.android.mediproject.core.model.remote.adminaction +import android.os.Parcelable +import kotlinx.parcelize.Parcelize import java.time.LocalDate import java.time.format.DateTimeFormatter - +@Parcelize /** * 행정처분 목록 별 데이터 클래스 * @@ -36,7 +38,7 @@ data class AdminActionListItemDto( val lastSettleDate: LocalDate, // 20230526 val publicEndDate: LocalDate, // 20230910 var onClick: (() -> Unit)? = null -) +) : Parcelable fun AdminActionListResponse.Body.Item.toDto(): AdminActionListItemDto { return AdminActionListItemDto( diff --git a/feature/news/src/main/java/com/android/mediproject/feature/news/NewsFragment.kt b/feature/news/src/main/java/com/android/mediproject/feature/news/NewsFragment.kt index b6eee7e30..c09ed1427 100644 --- a/feature/news/src/main/java/com/android/mediproject/feature/news/NewsFragment.kt +++ b/feature/news/src/main/java/com/android/mediproject/feature/news/NewsFragment.kt @@ -3,21 +3,32 @@ package com.android.mediproject.feature.news import android.os.Bundle import android.view.View import androidx.fragment.app.viewModels +import androidx.navigation.fragment.navArgs +import com.android.mediproject.core.model.local.navargs.RecallDisposalArgs import com.android.mediproject.core.ui.base.BaseFragment import com.android.mediproject.feature.news.databinding.FragmentNewsBinding import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint -class NewsFragment : BaseFragment(FragmentNewsBinding::inflate) { +class NewsFragment : + BaseFragment(FragmentNewsBinding::inflate) { override val fragmentViewModel: NewsViewModel by viewModels() + private val recallDisposalArgs: RecallDisposalArgs by lazy { + try { + navArgs().value + } catch (e: Exception) { + RecallDisposalArgs("") + } + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) binding.apply { lifecycleOwner = viewLifecycleOwner composeView.setContent { - NewsNavHost() + NewsNavHost(arguments = recallDisposalArgs) } } } diff --git a/feature/news/src/main/java/com/android/mediproject/feature/news/NewsScreen.kt b/feature/news/src/main/java/com/android/mediproject/feature/news/NewsScreen.kt index 528d9ccb1..6098b3c45 100644 --- a/feature/news/src/main/java/com/android/mediproject/feature/news/NewsScreen.kt +++ b/feature/news/src/main/java/com/android/mediproject/feature/news/NewsScreen.kt @@ -32,6 +32,7 @@ import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController import androidx.navigation.navArgument +import com.android.mediproject.core.model.local.navargs.RecallDisposalArgs import com.android.mediproject.feature.news.adminaction.AdminActionScreen import com.android.mediproject.feature.news.adminaction.DetailAdminActionScreen import com.android.mediproject.feature.news.recallsuspension.DetailRecallDisposalScreen @@ -51,20 +52,24 @@ enum class ChipType : Parcelable { */ @Composable fun NewsNavHost( - navController: NavHostController = rememberNavController(), startDestination: String = "news" + navController: NavHostController = rememberNavController(), arguments: RecallDisposalArgs ) { val viewModelStoreOwner = checkNotNull(LocalViewModelStoreOwner.current) { "" } - NavHost(navController = navController, startDestination = startDestination) { + val start = if (arguments.product.isNotEmpty()) "detailRecallSuspension" + else "news" + + NavHost(navController = navController, startDestination = start) { composable("news") { CompositionLocalProvider(LocalViewModelStoreOwner provides viewModelStoreOwner) { NewsScreen(navController) } } composable( - "detailRecallSuspension/{product}", arguments = listOf(navArgument("product") { type = NavType.StringType }) + "detailRecallSuspension/{product}", + arguments = listOf(navArgument("product") { type = NavType.StringType }) ) { DetailRecallDisposalScreen() } @@ -107,7 +112,8 @@ fun NewsScreen(navController: NavController) { @Composable fun ChipGroup(selectedChip: ChipType, onChipSelected: (ChipType) -> Unit) { Row( - verticalAlignment = Alignment.CenterVertically, modifier = Modifier.padding(top = 16.dp, bottom = 8.dp, start = 24.dp, end = 24.dp) + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.padding(top = 16.dp, bottom = 8.dp, start = 24.dp, end = 24.dp) ) { CustomFilterChip( title = stringResource(id = R.string.recallSuspension), @@ -132,7 +138,9 @@ fun ChipGroup(selectedChip: ChipType, onChipSelected: (ChipType) -> Unit) { */ @OptIn(ExperimentalMaterial3Api::class) @Composable -fun CustomFilterChip(type: ChipType, title: String, isSelected: Boolean, onClick: (ChipType) -> Unit) { +fun CustomFilterChip( + type: ChipType, title: String, isSelected: Boolean, onClick: (ChipType) -> Unit +) { FilterChip( selected = isSelected, onClick = { onClick.invoke(type) }, diff --git a/feature/news/src/main/java/com/android/mediproject/feature/news/adminaction/DetailAdminActionScreen.kt b/feature/news/src/main/java/com/android/mediproject/feature/news/adminaction/DetailAdminActionScreen.kt index 2d2571830..4cf3daf23 100644 --- a/feature/news/src/main/java/com/android/mediproject/feature/news/adminaction/DetailAdminActionScreen.kt +++ b/feature/news/src/main/java/com/android/mediproject/feature/news/adminaction/DetailAdminActionScreen.kt @@ -40,17 +40,36 @@ fun Item(item: AdminActionListItemDto) { Column( modifier = Modifier.fillMaxWidth() ) { - Text(text = item.entpName, style = MaterialTheme.typography.titleLarge, modifier = Modifier.padding(bottom = 8.dp)) - Text(text = item.itemName, style = MaterialTheme.typography.titleLarge, modifier = Modifier.padding(bottom = 8.dp)) + Text( + text = item.entpName, + style = MaterialTheme.typography.titleLarge, + modifier = Modifier.padding(bottom = 8.dp) + ) + Text( + text = item.itemName, + style = MaterialTheme.typography.titleLarge, + modifier = Modifier.padding(bottom = 8.dp) + ) Text( text = item.lastSettleDate.format(DateTimeFormatter.ISO_LOCAL_DATE), style = MaterialTheme.typography.bodyMedium, modifier = Modifier.padding(bottom = 8.dp) ) - Text(text = item.disposition, style = MaterialTheme.typography.bodyMedium, modifier = Modifier.padding(bottom = 12.dp)) - Text(text = item.violation, style = MaterialTheme.typography.bodyMedium, modifier = Modifier.padding(bottom = 12.dp)) - Text(text = item.applyLaw, style = MaterialTheme.typography.bodyMedium, modifier = Modifier.padding(bottom = 12.dp)) - + Text( + text = item.disposition, + style = MaterialTheme.typography.bodyMedium, + modifier = Modifier.padding(bottom = 12.dp) + ) + Text( + text = item.violation, + style = MaterialTheme.typography.bodyMedium, + modifier = Modifier.padding(bottom = 12.dp) + ) + Text( + text = item.applyLaw, + style = MaterialTheme.typography.bodyMedium, + modifier = Modifier.padding(bottom = 12.dp) + ) } } } \ No newline at end of file diff --git a/feature/penalties/src/main/java/com/android/mediproject/feature/penalties/recentpenaltylist/PenaltyListAdapter.kt b/feature/penalties/src/main/java/com/android/mediproject/feature/penalties/recentpenaltylist/PenaltyListAdapter.kt index 279435dab..d2bcc785d 100644 --- a/feature/penalties/src/main/java/com/android/mediproject/feature/penalties/recentpenaltylist/PenaltyListAdapter.kt +++ b/feature/penalties/src/main/java/com/android/mediproject/feature/penalties/recentpenaltylist/PenaltyListAdapter.kt @@ -23,8 +23,6 @@ class PenaltyListAdapter : class PenaltyViewHolder(private val view: SimpleListItemView) : RecyclerView.ViewHolder(view) { - private var item: RecallSuspensionListItemDto? = null - init { view.setTitleColor(view.context.resources.getColor(R.color.newsChipColor, null)) view.setContentTextColor(view.context.resources.getColor(R.color.newsChipColor, null)) @@ -38,7 +36,7 @@ class PenaltyListAdapter : } fun bind(data: RecallSuspensionListItemDto) { - item = data + view.data = data view.setTitle(data.product) view.setContent(data.rtrvlResn) } diff --git a/feature/penalties/src/main/java/com/android/mediproject/feature/penalties/recentpenaltylist/RecentPenaltyListFragment.kt b/feature/penalties/src/main/java/com/android/mediproject/feature/penalties/recentpenaltylist/RecentPenaltyListFragment.kt index f6b124e0a..eb34a289c 100644 --- a/feature/penalties/src/main/java/com/android/mediproject/feature/penalties/recentpenaltylist/RecentPenaltyListFragment.kt +++ b/feature/penalties/src/main/java/com/android/mediproject/feature/penalties/recentpenaltylist/RecentPenaltyListFragment.kt @@ -5,7 +5,9 @@ import android.view.View import androidx.core.net.toUri import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController +import com.android.mediproject.core.common.util.navigateByDeepLink import com.android.mediproject.core.common.viewmodel.UiState +import com.android.mediproject.core.model.local.navargs.RecallDisposalArgs import com.android.mediproject.core.ui.base.BaseFragment import com.android.mediproject.core.ui.base.view.stateAsCollect import com.android.mediproject.feature.penalties.databinding.FragmentRecentPenaltyListBinding @@ -52,6 +54,15 @@ class RecentPenaltyListFragment : is UiState.Loading -> {} is UiState.Success -> { + + uiState.data.forEach { itemDto -> + itemDto.onClick = { + findNavController().navigateByDeepLink( + "medilens://main/news_nav", RecallDisposalArgs(it.product) + ) + } + } + penaltyListAdapter.submitList(uiState.data) } } diff --git a/feature/penalties/src/main/java/com/android/mediproject/feature/penalties/recentpenaltylist/RecentPenaltyListViewModel.kt b/feature/penalties/src/main/java/com/android/mediproject/feature/penalties/recentpenaltylist/RecentPenaltyListViewModel.kt index cde83e905..8db9bb6f8 100644 --- a/feature/penalties/src/main/java/com/android/mediproject/feature/penalties/recentpenaltylist/RecentPenaltyListViewModel.kt +++ b/feature/penalties/src/main/java/com/android/mediproject/feature/penalties/recentpenaltylist/RecentPenaltyListViewModel.kt @@ -12,9 +12,11 @@ import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel -class RecentPenaltyListViewModel @Inject constructor(getRecallSuspensionInfoUseCase: GetRecallSuspensionInfoUseCase) : BaseViewModel() { +class RecentPenaltyListViewModel @Inject constructor(getRecallSuspensionInfoUseCase: GetRecallSuspensionInfoUseCase) : + BaseViewModel() { - private val _recallDisposalList = MutableStateFlow>>(UiState.Initial) + private val _recallDisposalList = + MutableStateFlow>>(UiState.Initial) val recallDisposalList get() = _recallDisposalList.asStateFlow() /** @@ -22,16 +24,13 @@ class RecentPenaltyListViewModel @Inject constructor(getRecallSuspensionInfoUseC */ init { viewModelScope.launch { - getRecallSuspensionInfoUseCase.getRecentRecallDisposalList(numOfRows = 5).fold(onSuccess = { - _recallDisposalList.value = UiState.Success(it) - }, onFailure = { - _recallDisposalList.value = UiState.Error(it.message ?: "failed") - }) + getRecallSuspensionInfoUseCase.getRecentRecallDisposalList(numOfRows = 5) + .fold(onSuccess = { + _recallDisposalList.value = UiState.Success(it) + }, onFailure = { + _recallDisposalList.value = UiState.Error(it.message ?: "failed") + }) } } - private fun openDetail(item: RecallSuspensionListItemDto) { - - } - } \ No newline at end of file