diff --git a/app/src/main/java/com/hrhn/presentation/ui/screen/main/today/TodayFragment.kt b/app/src/main/java/com/hrhn/presentation/ui/screen/main/today/TodayFragment.kt index d6fc43e..23080cf 100644 --- a/app/src/main/java/com/hrhn/presentation/ui/screen/main/today/TodayFragment.kt +++ b/app/src/main/java/com/hrhn/presentation/ui/screen/main/today/TodayFragment.kt @@ -28,7 +28,7 @@ class TodayFragment : Fragment() { savedInstanceState: Bundle? ): View { _binding = FragmentTodayBinding.inflate(inflater).apply { - titleSection.setContent { + composeView.setContent { TodayScreen(viewModel) } } diff --git a/app/src/main/java/com/hrhn/presentation/ui/screen/main/today/TodayScreen.kt b/app/src/main/java/com/hrhn/presentation/ui/screen/main/today/TodayScreen.kt index 02f2410..1bc8adc 100644 --- a/app/src/main/java/com/hrhn/presentation/ui/screen/main/today/TodayScreen.kt +++ b/app/src/main/java/com/hrhn/presentation/ui/screen/main/today/TodayScreen.kt @@ -1,8 +1,14 @@ package com.hrhn.presentation.ui.screen.main.today +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.derivedStateOf @@ -10,14 +16,20 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.hrhn.R +import com.hrhn.domain.model.Challenge +import com.hrhn.presentation.ui.theme.CellFill +import com.hrhn.presentation.ui.theme.CellLabel +import com.hrhn.presentation.ui.theme.Gray54 import com.hrhn.presentation.ui.theme.Red02 import com.hrhn.presentation.ui.theme.SecondaryLabel import com.hrhn.presentation.ui.theme.Typography +import com.hrhn.presentation.ui.theme.White import com.hrhn.presentation.util.formatDateWithYearString @Composable @@ -26,12 +38,26 @@ fun TodayScreen(viewModel: TodayViewModel) { val todayString by remember(today) { derivedStateOf { today.formatDateWithYearString() } } + val todayChallenge by viewModel.todayChallengeFlow.collectAsStateWithLifecycle() - TodayHeader(today = todayString) + Column( + modifier = Modifier.fillMaxSize(), + horizontalAlignment = Alignment.CenterHorizontally + ) { + TodayHeader(today = todayString) + TodayCard( + modifier = Modifier + .weight(1f) + .padding(start = 40.dp, end = 40.dp, top = 16.dp, bottom = 40.dp), + challenge = todayChallenge, + onCardClick = viewModel::editTodayChallenge, + onAddClick = viewModel::addTodayChallenge, + ) + } } @Composable -fun TodayHeader(today: String) { +private fun TodayHeader(today: String) { Column( horizontalAlignment = Alignment.CenterHorizontally, ) { @@ -49,8 +75,64 @@ fun TodayHeader(today: String) { } } +@Composable +private fun TodayCard( + modifier: Modifier = Modifier, + challenge: Challenge?, + onCardClick: () -> Unit, + onAddClick: () -> Unit, +) { + Column( + modifier = modifier + .fillMaxSize() + .clip(RoundedCornerShape(size = 16.dp)) + .background(color = CellFill) + .clickable( + enabled = challenge != null, + onClick = onCardClick, + ), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally, + ) { + if (challenge == null) { + Text( + text = stringResource(id = R.string.message_no_challenge), + style = Typography.labelSmall, + color = Gray54, + ) + Spacer(modifier = Modifier.height(16.dp)) + Text( + modifier = Modifier + .clip(RoundedCornerShape(50.dp)) + .background(Red02) + .clickable(onClick = onAddClick) + .padding(horizontal = 24.dp, vertical = 12.dp), + text = stringResource(id = R.string.button_add_challenge), + style = Typography.labelSmall, + color = White, + ) + } else { + Text( + text = challenge.content, + style = Typography.titleLarge, + color = CellLabel, + ) + } + } +} + @Preview(showBackground = true) @Composable -fun TodayHeaderPreview() { +private fun TodayHeaderPreview() { TodayHeader(today = "2025.01.15") } + +@Preview(showBackground = true) +@Composable +private fun TodayCardPreview() { + TodayCard( + challenge = Challenge(content = "빨래널기"), + onCardClick = {}, + onAddClick = {}, + ) +} diff --git a/app/src/main/java/com/hrhn/presentation/ui/theme/Color.kt b/app/src/main/java/com/hrhn/presentation/ui/theme/Color.kt index bd31879..3aa1226 100644 --- a/app/src/main/java/com/hrhn/presentation/ui/theme/Color.kt +++ b/app/src/main/java/com/hrhn/presentation/ui/theme/Color.kt @@ -52,5 +52,5 @@ val HeaderLabel = Black //val dim = Gray54 //val background = White //val setting_icon_fill = GrayC5 -//val cell_fill = GrayFB -//val cell_label = Gray4A +val CellFill = GrayFB +val CellLabel = Gray4A diff --git a/app/src/main/res/layout/fragment_today.xml b/app/src/main/res/layout/fragment_today.xml index 67c84ed..8a6044d 100644 --- a/app/src/main/res/layout/fragment_today.xml +++ b/app/src/main/res/layout/fragment_today.xml @@ -25,76 +25,12 @@ android:layout_height="match_parent"> - - - - - - - - - -