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">
-
-
-
-
-
-
-
-
-
-