From 75e622cd0b87391689e396eab20629b7119781ea Mon Sep 17 00:00:00 2001 From: "JSHGRAM\\wjdtk" Date: Thu, 28 Mar 2024 19:12:24 +0900 Subject: [PATCH 01/20] =?UTF-8?q?[feat]=20Calender=20=EC=BB=A4=EC=8A=A4?= =?UTF-8?q?=ED=85=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/res/drawable/ic_calender_down.xml | 12 ++ .../src/main/res/drawable/ic_calender_up.xml | 12 ++ .../unifest/android/feature/home/Calendar.kt | 154 +++++++++--------- .../android/feature/home/HomeScreen.kt | 5 + 4 files changed, 108 insertions(+), 75 deletions(-) create mode 100644 core/designsystem/src/main/res/drawable/ic_calender_down.xml create mode 100644 core/designsystem/src/main/res/drawable/ic_calender_up.xml diff --git a/core/designsystem/src/main/res/drawable/ic_calender_down.xml b/core/designsystem/src/main/res/drawable/ic_calender_down.xml new file mode 100644 index 00000000..611e4029 --- /dev/null +++ b/core/designsystem/src/main/res/drawable/ic_calender_down.xml @@ -0,0 +1,12 @@ + + + diff --git a/core/designsystem/src/main/res/drawable/ic_calender_up.xml b/core/designsystem/src/main/res/drawable/ic_calender_up.xml new file mode 100644 index 00000000..f1681b5d --- /dev/null +++ b/core/designsystem/src/main/res/drawable/ic_calender_up.xml @@ -0,0 +1,12 @@ + + + diff --git a/feature/home/src/main/kotlin/com/unifest/android/feature/home/Calendar.kt b/feature/home/src/main/kotlin/com/unifest/android/feature/home/Calendar.kt index fbeb2ca1..39fbf726 100644 --- a/feature/home/src/main/kotlin/com/unifest/android/feature/home/Calendar.kt +++ b/feature/home/src/main/kotlin/com/unifest/android/feature/home/Calendar.kt @@ -15,9 +15,13 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.CalendarViewMonth +import androidx.compose.material.icons.filled.CalendarViewWeek import androidx.compose.material3.Checkbox import androidx.compose.material3.CheckboxDefaults import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -97,7 +101,9 @@ fun Calendar(adjacentMonths: Long = 500) { weekState = weekState, isAnimating = isAnimating, ) + //2024년 3월 CalendarHeader(daysOfWeek = daysOfWeek) + //월화수목금토일 AnimatedVisibility(visible = !isWeekMode) { HorizontalCalendar( state = monthState, @@ -136,29 +142,67 @@ fun Calendar(adjacentMonths: Long = 500) { }, ) } - Spacer(modifier = Modifier.weight(1f)) - WeekModeToggle( - modifier = Modifier.align(Alignment.CenterHorizontally), + + ModeToggleButton( isWeekMode = isWeekMode, - ) { weekMode -> - isAnimating = true - isWeekMode = weekMode - coroutineScope.launch { - if (weekMode) { - val targetDate = monthState.firstVisibleMonth.weekDays.last().last().date - weekState.scrollToWeek(targetDate) - weekState.animateScrollToWeek(targetDate) // Trigger a layout pass for title update - } else { - val targetMonth = weekState.firstVisibleWeek.days.first().date.yearMonth - monthState.scrollToMonth(targetMonth) - monthState.animateScrollToMonth(targetMonth) // Trigger a layout pass for title update - } - isAnimating = false - } + onModeChange = { isWeekMode = it }, + ) + } +} + +@Composable +fun ModeToggleButton( + modifier: Modifier = Modifier, + isWeekMode: Boolean, + onModeChange: (Boolean) -> Unit, +) { + val icon = if (isWeekMode) painterResource(id = R.drawable.ic_calender_down) else painterResource(id = R.drawable.ic_calender_up) + val contentDescription = if (isWeekMode) "Month" else "Week" + + + Box( + modifier = Modifier + .fillMaxWidth() + .then(modifier), + contentAlignment = Alignment.Center, + ) { + IconButton( + onClick = { onModeChange(!isWeekMode) }, + ) { + Icon( + painter = icon, + contentDescription = contentDescription, + tint = Color.Gray + ) } } } +@Composable +private fun CalendarNavigationIcon( + icon: Painter, + contentDescription: String, + onClick: () -> Unit, +) = Box( + modifier = Modifier + .fillMaxHeight() + .aspectRatio(1f) + .clip(shape = CircleShape) + .clickable(role = Role.Button, onClick = onClick), +) { + Icon( + modifier = Modifier + .fillMaxSize() + .padding(4.dp) + .align(Alignment.Center), + painter = icon, + contentDescription = contentDescription, + tint = Color.Gray, + + ) +} + + @Composable fun MonthAndWeekCalendarTitle( isWeekMode: Boolean, @@ -168,7 +212,7 @@ fun MonthAndWeekCalendarTitle( ) { val coroutineScope = rememberCoroutineScope() SimpleCalendarTitle( - modifier = Modifier.padding(vertical = 10.dp, horizontal = 8.dp), + modifier = Modifier.padding(vertical = 10.dp, horizontal = 20.dp), currentMonth = currentMonth, goToPrevious = { coroutineScope.launch { @@ -206,18 +250,21 @@ fun SimpleCalendarTitle( modifier = modifier.height(40.dp), verticalAlignment = Alignment.CenterVertically, ) { + + Text( + modifier = Modifier.weight(1f), + text = currentMonth.displayText(), + fontSize = 14.sp, + textAlign = TextAlign.Start, + fontWeight = FontWeight.Bold, + + ) CalendarNavigationIcon( icon = painterResource(id = R.drawable.ic_chevron_left), contentDescription = "Previous", onClick = goToPrevious, ) - Text( - modifier = Modifier.weight(1f), - text = currentMonth.displayText(), - fontSize = 22.sp, - textAlign = TextAlign.Center, - fontWeight = FontWeight.Medium, - ) + CalendarNavigationIcon( icon = painterResource(id = R.drawable.ic_chevron_right), contentDescription = "Next", @@ -226,27 +273,6 @@ fun SimpleCalendarTitle( } } -@Composable -private fun CalendarNavigationIcon( - icon: Painter, - contentDescription: String, - onClick: () -> Unit, -) = Box( - modifier = Modifier - .fillMaxHeight() - .aspectRatio(1f) - .clip(shape = CircleShape) - .clickable(role = Role.Button, onClick = onClick), -) { - Icon( - modifier = Modifier - .fillMaxSize() - .padding(4.dp) - .align(Alignment.Center), - painter = icon, - contentDescription = contentDescription, - ) -} @Composable private fun CalendarTitle( @@ -258,8 +284,6 @@ private fun CalendarTitle( val visibleMonth = rememberFirstVisibleMonthAfterScroll(monthState) val visibleWeek = rememberFirstVisibleWeekAfterScroll(weekState) val visibleWeekMonth = visibleWeek.days.first().date.yearMonth - // Track animation state to prevent updating the title too early before - // the correct value is available (after the animation). val currentMonth = if (isWeekMode) { if (isAnimating) visibleMonth.yearMonth else visibleWeekMonth } else { @@ -285,7 +309,8 @@ fun CalendarHeader(daysOfWeek: List) { textAlign = TextAlign.Center, fontSize = 15.sp, text = dayOfWeek.displayText(), - fontWeight = FontWeight.Medium, + fontWeight = FontWeight.Bold, + color = Color.Gray, ) } } @@ -303,7 +328,7 @@ fun Day( .aspectRatio(1f) // This is important for square-sizing! .padding(6.dp) .clip(CircleShape) - .background(color = if (isSelected) colorResource(R.color.example_1_selection_color) else Color.Transparent) + .background(color = if (isSelected) Color(0xFFF5687E) else Color.Transparent) .clickable( enabled = isSelectable, showRipple = !isSelected, @@ -320,39 +345,18 @@ fun Day( text = day.dayOfMonth.toString(), color = textColor, fontSize = 14.sp, + fontWeight = FontWeight.Bold, ) } } -@Composable -fun WeekModeToggle( - modifier: Modifier, - isWeekMode: Boolean, - weekModeToggled: (isWeekMode: Boolean) -> Unit, -) { - // We want the entire content to be clickable, not just the checkbox. - Row( - modifier = modifier - .padding(10.dp) - .clip(MaterialTheme.shapes.small) - .clickable { weekModeToggled(!isWeekMode) } - .padding(10.dp), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.spacedBy(6.dp, Alignment.CenterHorizontally), - ) { - Checkbox( - checked = isWeekMode, - onCheckedChange = null, // Check is handled by parent. - colors = CheckboxDefaults.colors(checkedColor = colorResource(R.color.example_1_selection_color)), - ) - Text(text = stringResource(R.string.week_mode)) - } -} @Preview @Composable private fun CalendarPreview() { UnifestTheme { Calendar() + } } + diff --git a/feature/home/src/main/kotlin/com/unifest/android/feature/home/HomeScreen.kt b/feature/home/src/main/kotlin/com/unifest/android/feature/home/HomeScreen.kt index 4d26026e..fc2b80ab 100644 --- a/feature/home/src/main/kotlin/com/unifest/android/feature/home/HomeScreen.kt +++ b/feature/home/src/main/kotlin/com/unifest/android/feature/home/HomeScreen.kt @@ -4,6 +4,7 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding +import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -25,6 +26,7 @@ internal fun HomeRoute( ) } +@OptIn(ExperimentalMaterial3Api::class) @Composable internal fun HomeScreen( padding: PaddingValues, @@ -37,9 +39,11 @@ internal fun HomeScreen( .padding(bottom = padding.calculateBottomPadding()), horizontalAlignment = Alignment.CenterHorizontally, ) { + UnifestTopAppBar( titleRes = R.string.intro_top_app_bar_title, navigationType = TopAppBarNavigationType.None, + ) Calendar() } @@ -55,3 +59,4 @@ fun HomeScreenPreview() { ) } } + From c0acb7fe578bbe5fc999662ba323134f0d8f5b46 Mon Sep 17 00:00:00 2001 From: "DESKTOP-E152GOJ\\aaa" Date: Sun, 31 Mar 2024 20:49:39 +0900 Subject: [PATCH 02/20] =?UTF-8?q?[feat]=20=ED=99=88=20=ED=99=94=EB=A9=B4?= =?UTF-8?q?=20=EA=B8=B0=EB=B3=B8=20UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../unifest/android/feature/home/Calendar.kt | 1 - .../android/feature/home/HomeScreen.kt | 198 ++++++++++++++++-- 2 files changed, 184 insertions(+), 15 deletions(-) diff --git a/feature/home/src/main/kotlin/com/unifest/android/feature/home/Calendar.kt b/feature/home/src/main/kotlin/com/unifest/android/feature/home/Calendar.kt index 39fbf726..f81fd34e 100644 --- a/feature/home/src/main/kotlin/com/unifest/android/feature/home/Calendar.kt +++ b/feature/home/src/main/kotlin/com/unifest/android/feature/home/Calendar.kt @@ -80,7 +80,6 @@ fun Calendar(adjacentMonths: Long = 500) { Column( modifier = Modifier - .fillMaxSize() .background(Color.White), ) { val monthState = rememberCalendarState( diff --git a/feature/home/src/main/kotlin/com/unifest/android/feature/home/HomeScreen.kt b/feature/home/src/main/kotlin/com/unifest/android/feature/home/HomeScreen.kt index fc2b80ab..4eee03ce 100644 --- a/feature/home/src/main/kotlin/com/unifest/android/feature/home/HomeScreen.kt +++ b/feature/home/src/main/kotlin/com/unifest/android/feature/home/HomeScreen.kt @@ -1,17 +1,44 @@ package com.unifest.android.feature.home +import androidx.compose.ui.unit.sp + + +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.LazyRow +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Circle +import androidx.compose.material3.Button +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp -import com.unifest.android.core.designsystem.R -import com.unifest.android.core.designsystem.component.TopAppBarNavigationType -import com.unifest.android.core.designsystem.component.UnifestTopAppBar import com.unifest.android.core.designsystem.theme.UnifestTheme import com.unifest.android.core.ui.DevicePreview @@ -33,19 +60,24 @@ internal fun HomeScreen( @Suppress("unused") onNavigateToIntro: () -> Unit, ) { - Column( - modifier = Modifier - .fillMaxSize() - .padding(bottom = padding.calculateBottomPadding()), - horizontalAlignment = Alignment.CenterHorizontally, - ) { + var selectedEventId by remember { mutableStateOf(-1) } - UnifestTopAppBar( - titleRes = R.string.intro_top_app_bar_title, - navigationType = TopAppBarNavigationType.None, - - ) + Column { Calendar() + LazyColumn( + modifier = Modifier + .weight(1f) + .padding(bottom = padding.calculateBottomPadding()), + ) { + item { FestivalScheduleText() } + items(festivalEvents) { event -> + EventItem(event, selectedEventId) { eventId -> + selectedEventId = if (selectedEventId == eventId) -1 else eventId + } + } + item { IncomingScheduleText() } + item { FestivalEventCard() } + } } } @@ -60,3 +92,141 @@ fun HomeScreenPreview() { } } + +data class FestivalEvent( + val id: Int, + val date: String, + val name: String, + val location: String, + val celebrityImages: List, +) + +val festivalEvents = listOf( + FestivalEvent( + id = 1, + date = "5/21(화)", + name = "녹색지대 DAY 1", + location = "건국대학교 서울캠퍼스", + celebrityImages = listOf(0, 1, 2), + ), + FestivalEvent( + id = 2, + date = "5/21(화)", + name = "녹색지대 DAY 1", + location = "건국대학교 서울캠퍼스", + celebrityImages = listOf(0, 1, 2), + ), + FestivalEvent( + id = 3, + date = "5/21(화)", + name = "녹색지대 DAY 1", + location = "건국대학교 서울캠퍼스", + celebrityImages = listOf(0, 1, 2), + ), + + ) + +@Composable +fun FestivalScheduleText() { + Text( + text = "오늘의 축제 일정", + fontSize = 15.sp, + fontWeight = FontWeight.Bold, + modifier = Modifier.padding(16.dp), + ) +} + +@Composable +fun IncomingScheduleText() { + Text( + text = "다가오는 축제 일정", + fontSize = 15.sp, + fontWeight = FontWeight.Bold, + modifier = Modifier.padding(16.dp), + ) +} + +@Composable +fun EventItem( + event: FestivalEvent, + selectedEventId: Int, + onEventClick: (Int) -> Unit, +) { + Column { + Row( + modifier = Modifier + .fillMaxWidth() + .clickable { onEventClick(event.id) }, + verticalAlignment = Alignment.CenterVertically, + ) { + Column( + modifier = Modifier + .weight(1f) + .padding(16.dp), + ) { + Text(text = event.date, fontSize = 20.sp) + Text(text = event.name, fontWeight = FontWeight.Bold, fontSize = 24.sp) + Text(text = event.location, color = Color.Gray, fontSize = 16.sp) + } + LazyRow { + items(event.celebrityImages) { _ -> + Icon( + imageVector = Icons.Default.Circle, + contentDescription = "Celebrity", + tint = Color.Gray, + modifier = Modifier + .size(52.dp) + .padding(horizontal = 4.dp), + ) + } + } + } + AnimatedVisibility(visible = selectedEventId == event.id) { + Button( + onClick = { /* 관심 축제 추가 */ }, + modifier = Modifier + .fillMaxWidth() + .padding(8.dp), + ) { + Text("관심 축제로 추가") + } + } + } +} + +@Composable +fun FestivalEventCard() { + val imageResource: Painter = painterResource(id = com.unifest.android.core.designsystem.R.drawable.ic_waiting) // 실제 리소스 ID로 변경 필요 + val eventName = "녹색지대" + val eventDates = "05/21(화) - 05/23(목)" + val eventLocation = "건국대학교 서울캠퍼스" + Card( + modifier = Modifier + .padding(8.dp) + .fillMaxWidth(), + shape = RoundedCornerShape(10.dp), + colors = CardDefaults.cardColors(containerColor = Color.White), + border = BorderStroke(1.dp, Color.Gray), + ) { + Row( + modifier = Modifier + .padding(16.dp) + .fillMaxSize(), + verticalAlignment = Alignment.CenterVertically, + ) { + Image( + painter = imageResource, + contentDescription = "Event Logo", + modifier = Modifier.size(48.dp), + ) + Spacer(modifier = Modifier.width(16.dp)) + Column( + modifier = Modifier.fillMaxWidth(), + ) { + Text(text = eventDates) + Text(text = eventName) + Text(text = eventLocation) + } + } + } +} From 04c1c689c365230f2aff93fdea573d35c8d8a344 Mon Sep 17 00:00:00 2001 From: "JSHGRAM\\wjdtk" Date: Mon, 1 Apr 2024 18:11:01 +0900 Subject: [PATCH 03/20] =?UTF-8?q?[feat]=20=EC=BA=98=EB=A6=B0=EB=8D=94=20UI?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit f54535344546230205c9a8e22139b1bec18a31ff) --- .../unifest/android/feature/home/Calendar.kt | 136 +++++++----------- 1 file changed, 54 insertions(+), 82 deletions(-) diff --git a/feature/home/src/main/kotlin/com/unifest/android/feature/home/Calendar.kt b/feature/home/src/main/kotlin/com/unifest/android/feature/home/Calendar.kt index f81fd34e..bb0990a8 100644 --- a/feature/home/src/main/kotlin/com/unifest/android/feature/home/Calendar.kt +++ b/feature/home/src/main/kotlin/com/unifest/android/feature/home/Calendar.kt @@ -1,13 +1,12 @@ package com.unifest.android.feature.home import androidx.compose.animation.AnimatedVisibility +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 import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize @@ -15,18 +14,12 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.shape.CircleShape -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.CalendarViewMonth -import androidx.compose.material.icons.filled.CalendarViewWeek -import androidx.compose.material3.Checkbox -import androidx.compose.material3.CheckboxDefaults import androidx.compose.material3.Icon import androidx.compose.material3.IconButton -import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.MutableState import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateListOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope @@ -36,9 +29,9 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.res.colorResource import androidx.compose.ui.res.painterResource -import androidx.compose.ui.res.stringResource import androidx.compose.ui.semantics.Role import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign @@ -63,20 +56,19 @@ import com.unifest.android.core.designsystem.theme.UnifestTheme import kotlinx.coroutines.launch import java.time.DayOfWeek import java.time.LocalDate +import java.time.Month import java.time.YearMonth @Composable fun Calendar(adjacentMonths: Long = 500) { val currentDate = remember { LocalDate.now() } - val currentMonth = remember(currentDate) { currentDate.yearMonth } - val startMonth = remember(currentDate) { currentMonth.minusMonths(adjacentMonths) } - val endMonth = remember(currentDate) { currentMonth.plusMonths(adjacentMonths) } - val selections = remember { mutableStateListOf() } + val currentYearMonth = remember(currentDate) { currentDate.yearMonth } + val currentMonth = remember(currentDate) { currentYearMonth.month } + val startMonth = remember(currentDate) { currentYearMonth.minusMonths(adjacentMonths) } + val endMonth = remember(currentDate) { currentYearMonth.plusMonths(adjacentMonths) } + val selectedDate = remember { mutableStateOf(LocalDate.now()) } val daysOfWeek = remember { daysOfWeek() } - var isWeekMode by remember { mutableStateOf(false) } - var isAnimating by remember { mutableStateOf(false) } - val coroutineScope = rememberCoroutineScope() Column( modifier = Modifier @@ -85,7 +77,7 @@ fun Calendar(adjacentMonths: Long = 500) { val monthState = rememberCalendarState( startMonth = startMonth, endMonth = endMonth, - firstVisibleMonth = currentMonth, + firstVisibleMonth = currentYearMonth, firstDayOfWeek = daysOfWeek.first(), ) val weekState = rememberWeekCalendarState( @@ -94,13 +86,13 @@ fun Calendar(adjacentMonths: Long = 500) { firstVisibleWeekDate = currentDate, firstDayOfWeek = daysOfWeek.first(), ) - CalendarTitle( + + MonthAndWeekCalendarTitle( isWeekMode = isWeekMode, monthState = monthState, weekState = weekState, - isAnimating = isAnimating, ) - //2024년 3월 + CalendarHeader(daysOfWeek = daysOfWeek) //월화수목금토일 AnimatedVisibility(visible = !isWeekMode) { @@ -110,14 +102,10 @@ fun Calendar(adjacentMonths: Long = 500) { val isSelectable = day.position == DayPosition.MonthDate Day( day.date, - isSelected = isSelectable && selections.contains(day.date), + isSelected = isSelectable && selectedDate.value == day.date, isSelectable = isSelectable, ) { clicked -> - if (selections.contains(clicked)) { - selections.remove(clicked) - } else { - selections.add(clicked) - } + selectedDate.value = clicked } }, ) @@ -129,14 +117,10 @@ fun Calendar(adjacentMonths: Long = 500) { val isSelectable = day.position == WeekDayPosition.RangeDate Day( day.date, - isSelected = isSelectable && selections.contains(day.date), + isSelected = isSelectable && selectedDate.value == day.date, isSelectable = isSelectable, ) { clicked -> - if (selections.contains(clicked)) { - selections.remove(clicked) - } else { - selections.add(clicked) - } + selectedDate.value = clicked } }, ) @@ -151,6 +135,7 @@ fun Calendar(adjacentMonths: Long = 500) { @Composable fun ModeToggleButton( + //캘린더 축소 확대 modifier: Modifier = Modifier, isWeekMode: Boolean, onModeChange: (Boolean) -> Unit, @@ -179,6 +164,7 @@ fun ModeToggleButton( @Composable private fun CalendarNavigationIcon( + //월 이동 화살표 구현 icon: Painter, contentDescription: String, onClick: () -> Unit, @@ -201,47 +187,52 @@ private fun CalendarNavigationIcon( ) } - @Composable fun MonthAndWeekCalendarTitle( + // 현재 보고 있는 월과 달력 이동 기능을 관리하는 함수. 사용자가 이전 또는 다음 월로 이동할 수 있게 함 isWeekMode: Boolean, - currentMonth: YearMonth, monthState: CalendarState, weekState: WeekCalendarState, ) { + val visibleMonth = rememberFirstVisibleMonthAfterScroll(monthState) + val currentMonth = visibleMonth.yearMonth.month + val coroutineScope = rememberCoroutineScope() - SimpleCalendarTitle( - modifier = Modifier.padding(vertical = 10.dp, horizontal = 20.dp), - currentMonth = currentMonth, - goToPrevious = { - coroutineScope.launch { - if (isWeekMode) { - val targetDate = weekState.firstVisibleWeek.days.first().date.minusDays(1) - weekState.animateScrollToWeek(targetDate) - } else { - val targetMonth = monthState.firstVisibleMonth.yearMonth.previousMonth - monthState.animateScrollToMonth(targetMonth) + if (!isWeekMode) { + SimpleCalendarTitle( + modifier = Modifier.padding(vertical = 10.dp, horizontal = 20.dp), + currentMonth = currentMonth, + goToPrevious = { + coroutineScope.launch { + if (isWeekMode) { + val targetDate = weekState.firstVisibleWeek.days.first().date.minusDays(1) + weekState.animateScrollToWeek(targetDate) + } else { + val targetMonth = monthState.firstVisibleMonth.yearMonth.previousMonth + monthState.animateScrollToMonth(targetMonth) + } } - } - }, - goToNext = { - coroutineScope.launch { - if (isWeekMode) { - val targetDate = weekState.firstVisibleWeek.days.last().date.plusDays(1) - weekState.animateScrollToWeek(targetDate) - } else { - val targetMonth = monthState.firstVisibleMonth.yearMonth.nextMonth - monthState.animateScrollToMonth(targetMonth) + }, + goToNext = { + coroutineScope.launch { + if (isWeekMode) { + val targetDate = weekState.firstVisibleWeek.days.last().date.plusDays(1) + weekState.animateScrollToWeek(targetDate) + } else { + val targetMonth = monthState.firstVisibleMonth.yearMonth.nextMonth + monthState.animateScrollToMonth(targetMonth) + } } - } - }, - ) + }, + ) + } } @Composable fun SimpleCalendarTitle( + // 실제로 달력의 상단에 현재 월을 표시하고, 이전/다음 월로 이동할 수 있는 화살표 아이콘을 제공하는 UI 컴포넌트 modifier: Modifier, - currentMonth: YearMonth, + currentMonth: Month, goToPrevious: () -> Unit, goToNext: () -> Unit, ) { @@ -273,31 +264,11 @@ fun SimpleCalendarTitle( } -@Composable -private fun CalendarTitle( - isWeekMode: Boolean, - monthState: CalendarState, - weekState: WeekCalendarState, - isAnimating: Boolean, -) { - val visibleMonth = rememberFirstVisibleMonthAfterScroll(monthState) - val visibleWeek = rememberFirstVisibleWeekAfterScroll(weekState) - val visibleWeekMonth = visibleWeek.days.first().date.yearMonth - val currentMonth = if (isWeekMode) { - if (isAnimating) visibleMonth.yearMonth else visibleWeekMonth - } else { - if (isAnimating) visibleWeekMonth else visibleMonth.yearMonth - } - MonthAndWeekCalendarTitle( - isWeekMode = isWeekMode, - currentMonth = currentMonth, - monthState = monthState, - weekState = weekState, - ) -} + @Composable fun CalendarHeader(daysOfWeek: List) { + //월화수목금토일 Row( modifier = Modifier .fillMaxWidth(), @@ -317,6 +288,7 @@ fun CalendarHeader(daysOfWeek: List) { @Composable fun Day( + //날짜 선택 day: LocalDate, isSelected: Boolean, isSelectable: Boolean, From 6e28f03ac449cb46d894199110a7ca313785289f Mon Sep 17 00:00:00 2001 From: "JSHGRAM\\wjdtk" Date: Mon, 1 Apr 2024 19:01:10 +0900 Subject: [PATCH 04/20] =?UTF-8?q?[feat]=20=ED=99=94=EB=A9=B4=20=EC=83=81?= =?UTF-8?q?=EB=8B=A8=20=ED=8C=A8=EB=94=A9=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/unifest/android/feature/home/HomeScreen.kt | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/feature/home/src/main/kotlin/com/unifest/android/feature/home/HomeScreen.kt b/feature/home/src/main/kotlin/com/unifest/android/feature/home/HomeScreen.kt index 4eee03ce..4d14d940 100644 --- a/feature/home/src/main/kotlin/com/unifest/android/feature/home/HomeScreen.kt +++ b/feature/home/src/main/kotlin/com/unifest/android/feature/home/HomeScreen.kt @@ -36,9 +36,12 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.platform.LocalView import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp +import androidx.core.view.WindowInsetsCompat import com.unifest.android.core.designsystem.theme.UnifestTheme import com.unifest.android.core.ui.DevicePreview @@ -61,8 +64,11 @@ internal fun HomeScreen( onNavigateToIntro: () -> Unit, ) { var selectedEventId by remember { mutableStateOf(-1) } - - Column { + val view = LocalView.current + val insets = with(LocalDensity.current) { + WindowInsetsCompat.toWindowInsetsCompat(view.rootWindowInsets, view).getInsets(WindowInsetsCompat.Type.statusBars()).top.toDp() + } + Column(modifier = Modifier.padding(top = insets)) { Calendar() LazyColumn( modifier = Modifier From 0e64a9aa76e6aaaba21628966f480e5b93412416 Mon Sep 17 00:00:00 2001 From: "JSHGRAM\\wjdtk" Date: Mon, 1 Apr 2024 19:37:49 +0900 Subject: [PATCH 05/20] =?UTF-8?q?[add]=20=ED=8F=B0=ED=8A=B8=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../unifest/android/core/designsystem/theme/Font.kt | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/core/designsystem/src/main/kotlin/com/unifest/android/core/designsystem/theme/Font.kt b/core/designsystem/src/main/kotlin/com/unifest/android/core/designsystem/theme/Font.kt index 9cad6dda..46d76ffd 100644 --- a/core/designsystem/src/main/kotlin/com/unifest/android/core/designsystem/theme/Font.kt +++ b/core/designsystem/src/main/kotlin/com/unifest/android/core/designsystem/theme/Font.kt @@ -116,3 +116,15 @@ val Content4 = TextStyle( fontWeight = FontWeight.Bold, fontSize = 12.sp, ) + +val Content5 = TextStyle( + fontFamily = pretendardFamily, + fontWeight = FontWeight.Medium, + fontSize = 11.sp, +) + +val Content6 = TextStyle( + fontFamily = pretendardFamily, + fontWeight = FontWeight.Medium, + fontSize = 12.sp, +) From 2083713017670a95aee17db6b1ac0153ba144a30 Mon Sep 17 00:00:00 2001 From: JeongSangHoon Date: Mon, 1 Apr 2024 21:54:19 +0900 Subject: [PATCH 06/20] =?UTF-8?q?[style]=20=ED=8F=B0=ED=8A=B8=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../android/feature/home/HomeScreen.kt | 149 ++++++++++-------- 1 file changed, 87 insertions(+), 62 deletions(-) diff --git a/feature/home/src/main/kotlin/com/unifest/android/feature/home/HomeScreen.kt b/feature/home/src/main/kotlin/com/unifest/android/feature/home/HomeScreen.kt index 4d14d940..855db1fc 100644 --- a/feature/home/src/main/kotlin/com/unifest/android/feature/home/HomeScreen.kt +++ b/feature/home/src/main/kotlin/com/unifest/android/feature/home/HomeScreen.kt @@ -12,19 +12,23 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize 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.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyRow import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Circle import androidx.compose.material3.Button import androidx.compose.material3.Card import androidx.compose.material3.CardDefaults +import androidx.compose.material3.Divider import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -42,6 +46,12 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.core.view.WindowInsetsCompat +import com.unifest.android.core.designsystem.theme.BoothLocation +import com.unifest.android.core.designsystem.theme.Content4 +import com.unifest.android.core.designsystem.theme.Content5 +import com.unifest.android.core.designsystem.theme.Content6 +import com.unifest.android.core.designsystem.theme.Title2 +import com.unifest.android.core.designsystem.theme.Title3 import com.unifest.android.core.designsystem.theme.UnifestTheme import com.unifest.android.core.ui.DevicePreview @@ -75,69 +85,39 @@ internal fun HomeScreen( .weight(1f) .padding(bottom = padding.calculateBottomPadding()), ) { - item { FestivalScheduleText() } - items(festivalEvents) { event -> + item { + FestivalScheduleText() + } + itemsIndexed(festivalEvents) { index, event -> EventItem(event, selectedEventId) { eventId -> selectedEventId = if (selectedEventId == eventId) -1 else eventId } + if (index < festivalEvents.size - 1) { + Spacer(modifier = Modifier.height(16.dp)) + Divider( + color = Color(0xFFDFDFDF), + modifier = Modifier + .padding(horizontal = 20.dp), + thickness = 1.dp + ) + } + } + item { + Spacer(modifier = Modifier.height(16.dp)) + IncomingScheduleText() + } + item { + FestivalEventCard() } - item { IncomingScheduleText() } - item { FestivalEventCard() } } } } -@DevicePreview -@Composable -fun HomeScreenPreview() { - UnifestTheme { - HomeScreen( - padding = PaddingValues(0.dp), - onNavigateToIntro = {}, - ) - } -} - - -data class FestivalEvent( - val id: Int, - val date: String, - val name: String, - val location: String, - val celebrityImages: List, -) - -val festivalEvents = listOf( - FestivalEvent( - id = 1, - date = "5/21(화)", - name = "녹색지대 DAY 1", - location = "건국대학교 서울캠퍼스", - celebrityImages = listOf(0, 1, 2), - ), - FestivalEvent( - id = 2, - date = "5/21(화)", - name = "녹색지대 DAY 1", - location = "건국대학교 서울캠퍼스", - celebrityImages = listOf(0, 1, 2), - ), - FestivalEvent( - id = 3, - date = "5/21(화)", - name = "녹색지대 DAY 1", - location = "건국대학교 서울캠퍼스", - celebrityImages = listOf(0, 1, 2), - ), - - ) - @Composable fun FestivalScheduleText() { Text( text = "오늘의 축제 일정", - fontSize = 15.sp, - fontWeight = FontWeight.Bold, + style = Title3, modifier = Modifier.padding(16.dp), ) } @@ -146,9 +126,8 @@ fun FestivalScheduleText() { fun IncomingScheduleText() { Text( text = "다가오는 축제 일정", - fontSize = 15.sp, - fontWeight = FontWeight.Bold, modifier = Modifier.padding(16.dp), + style = Title3, ) } @@ -170,16 +149,17 @@ fun EventItem( .weight(1f) .padding(16.dp), ) { - Text(text = event.date, fontSize = 20.sp) - Text(text = event.name, fontWeight = FontWeight.Bold, fontSize = 24.sp) - Text(text = event.location, color = Color.Gray, fontSize = 16.sp) + Text(text = event.date, style = Content4,modifier = Modifier.padding(5.dp)) + Text(text = event.name, style = Title2,modifier = Modifier.padding(7.dp)) + Text(text = event.location, style = Content5) + //todo: content5 얘기하기 } LazyRow { items(event.celebrityImages) { _ -> Icon( imageVector = Icons.Default.Circle, contentDescription = "Celebrity", - tint = Color.Gray, + tint = Color(0xFFDFDFDF), modifier = Modifier .size(52.dp) .padding(horizontal = 4.dp), @@ -194,7 +174,7 @@ fun EventItem( .fillMaxWidth() .padding(8.dp), ) { - Text("관심 축제로 추가") + Text("관심 축제로 추가", style = BoothLocation) } } } @@ -202,7 +182,7 @@ fun EventItem( @Composable fun FestivalEventCard() { - val imageResource: Painter = painterResource(id = com.unifest.android.core.designsystem.R.drawable.ic_waiting) // 실제 리소스 ID로 변경 필요 + val imageResource: Painter = painterResource(id = com.unifest.android.core.designsystem.R.drawable.ic_waiting) val eventName = "녹색지대" val eventDates = "05/21(화) - 05/23(목)" val eventLocation = "건국대학교 서울캠퍼스" @@ -229,10 +209,55 @@ fun FestivalEventCard() { Column( modifier = Modifier.fillMaxWidth(), ) { - Text(text = eventDates) - Text(text = eventName) - Text(text = eventLocation) + Text(text = eventDates, style = Content6,modifier = Modifier.padding(5.dp)) + Text(text = eventName, style = Content4,modifier = Modifier.padding(5.dp)) + Text(text = eventLocation, style = Content6) + //todo: content6 얘기하기 } } } } + + + +data class FestivalEvent( + val id: Int, + val date: String, + val name: String, + val location: String, + val celebrityImages: List, +) + +val festivalEvents = listOf( + FestivalEvent( + id = 1, + date = "5/21(화)", + name = "녹색지대 DAY 1", + location = "건국대학교 서울캠퍼스", + celebrityImages = listOf(0, 1, 2), + ), + FestivalEvent( + id = 2, + date = "5/21(화)", + name = "녹색지대 DAY 1", + location = "건국대학교 서울캠퍼스", + celebrityImages = listOf(0, 1, 2), + ), + FestivalEvent( + id = 3, + date = "5/21(화)", + name = "녹색지대 DAY 1", + location = "건국대학교 서울캠퍼스", + celebrityImages = listOf(0, 1, 2), + ), +) +@DevicePreview +@Composable +fun HomeScreenPreview() { + UnifestTheme { + HomeScreen( + padding = PaddingValues(0.dp), + onNavigateToIntro = {}, + ) + } +} From 6a94e09a8c5bad4ac3f2c77c82c5b3b3a178b0da Mon Sep 17 00:00:00 2001 From: Jeong Sang Hoon Date: Tue, 2 Apr 2024 18:09:55 +0900 Subject: [PATCH 07/20] =?UTF-8?q?[add]=20Home=ED=99=94=EB=A9=B4=20String?= =?UTF-8?q?=20=EB=A6=AC=EC=86=8C=EC=8A=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/designsystem/src/main/res/values/strings.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/core/designsystem/src/main/res/values/strings.xml b/core/designsystem/src/main/res/values/strings.xml index 5505387e..b65a4b1a 100644 --- a/core/designsystem/src/main/res/values/strings.xml +++ b/core/designsystem/src/main/res/values/strings.xml @@ -24,6 +24,14 @@ 경상도 + + 오늘의 축제 일정 + 오늘은 축제가 열리는 학교가 없어요 + 다가오는 축제 일정 + 관심 축제 추가하기 + 관심 축제로 추가 + + Week mode From 6b5409c88609fafc5b0ed0f46d9925e17a5705a3 Mon Sep 17 00:00:00 2001 From: Jeong Sang Hoon Date: Tue, 2 Apr 2024 18:10:32 +0900 Subject: [PATCH 08/20] =?UTF-8?q?[add]=20=EC=B6=95=EC=A0=9C=20Entity=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../android/core/domain/entity/FestivalEventEntity.kt | 9 +++++++++ .../core/domain/entity/IncomingFestivalEventEntity.kt | 9 +++++++++ 2 files changed, 18 insertions(+) create mode 100644 core/domain/src/main/kotlin/com/unifest/android/core/domain/entity/FestivalEventEntity.kt create mode 100644 core/domain/src/main/kotlin/com/unifest/android/core/domain/entity/IncomingFestivalEventEntity.kt diff --git a/core/domain/src/main/kotlin/com/unifest/android/core/domain/entity/FestivalEventEntity.kt b/core/domain/src/main/kotlin/com/unifest/android/core/domain/entity/FestivalEventEntity.kt new file mode 100644 index 00000000..d8be599a --- /dev/null +++ b/core/domain/src/main/kotlin/com/unifest/android/core/domain/entity/FestivalEventEntity.kt @@ -0,0 +1,9 @@ +package com.unifest.android.core.domain.entity + +data class FestivalEventEntity( + val id: Int, + val date: String, + val name: String, + val location: String, + val celebrityImages: List, +) diff --git a/core/domain/src/main/kotlin/com/unifest/android/core/domain/entity/IncomingFestivalEventEntity.kt b/core/domain/src/main/kotlin/com/unifest/android/core/domain/entity/IncomingFestivalEventEntity.kt new file mode 100644 index 00000000..9e059a78 --- /dev/null +++ b/core/domain/src/main/kotlin/com/unifest/android/core/domain/entity/IncomingFestivalEventEntity.kt @@ -0,0 +1,9 @@ +package com.unifest.android.core.domain.entity + + +data class IncomingFestivalEventEntity( + val imageRes: Int, + val name: String, + val dates: String, + val location: String +) From c73a78c43686ce987f6de9ed91133ec56e1cda50 Mon Sep 17 00:00:00 2001 From: Jeong Sang Hoon Date: Tue, 2 Apr 2024 18:10:47 +0900 Subject: [PATCH 09/20] =?UTF-8?q?[add]=20=EC=9C=84=EC=B9=98=20=EC=95=84?= =?UTF-8?q?=EC=9D=B4=EC=BD=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/res/drawable/ic_location.xml | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 core/designsystem/src/main/res/drawable/ic_location.xml diff --git a/core/designsystem/src/main/res/drawable/ic_location.xml b/core/designsystem/src/main/res/drawable/ic_location.xml new file mode 100644 index 00000000..22777c64 --- /dev/null +++ b/core/designsystem/src/main/res/drawable/ic_location.xml @@ -0,0 +1,13 @@ + + + + From 8677565d890118cc7dd05231b188251e13e09591 Mon Sep 17 00:00:00 2001 From: Jeong Sang Hoon Date: Tue, 2 Apr 2024 18:11:39 +0900 Subject: [PATCH 10/20] =?UTF-8?q?[feat]=20UnifestOutLinedButton=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../designsystem/component/OutLinedButton.kt | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 core/designsystem/src/main/kotlin/com/unifest/android/core/designsystem/component/OutLinedButton.kt diff --git a/core/designsystem/src/main/kotlin/com/unifest/android/core/designsystem/component/OutLinedButton.kt b/core/designsystem/src/main/kotlin/com/unifest/android/core/designsystem/component/OutLinedButton.kt new file mode 100644 index 00000000..9b139b99 --- /dev/null +++ b/core/designsystem/src/main/kotlin/com/unifest/android/core/designsystem/component/OutLinedButton.kt @@ -0,0 +1,47 @@ +package com.unifest.android.core.designsystem.component + +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.RowScope +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.dp +import com.unifest.android.core.designsystem.ComponentPreview + +@Composable +fun UnifestOutlinedButton( + onClick: () -> Unit, + modifier: Modifier = Modifier, + borderColor: Color = Color(0xFFf5678E), + contentColor: Color = Color.White, + enabled: Boolean = true, + content: @Composable RowScope.() -> Unit, +) { + OutlinedButton( + onClick = onClick, + modifier = modifier, + enabled = enabled, + shape = RoundedCornerShape(10.dp), + colors = ButtonDefaults.outlinedButtonColors( + contentColor = contentColor + ), + border = BorderStroke(1.dp, borderColor), + contentPadding = PaddingValues(horizontal = 20.dp, vertical = 12.dp), + content = content, + ) +} + +@ComponentPreview +@Composable +fun UnifestOutlinedButtonPreview() { + UnifestOutlinedButton( + onClick = {}, + ) { + Text("Outlined Button") + } +} From 5579b2629e866eb329990f74cf9ceec0e58737c8 Mon Sep 17 00:00:00 2001 From: Jeong Sang Hoon Date: Tue, 2 Apr 2024 18:12:05 +0900 Subject: [PATCH 11/20] =?UTF-8?q?[style]=20=ED=99=88=20=ED=99=94=EB=A9=B4?= =?UTF-8?q?=20=EB=94=94=EC=9E=90=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../android/feature/home/HomeScreen.kt | 230 ++++++++++++------ 1 file changed, 151 insertions(+), 79 deletions(-) diff --git a/feature/home/src/main/kotlin/com/unifest/android/feature/home/HomeScreen.kt b/feature/home/src/main/kotlin/com/unifest/android/feature/home/HomeScreen.kt index 855db1fc..5ad478bc 100644 --- a/feature/home/src/main/kotlin/com/unifest/android/feature/home/HomeScreen.kt +++ b/feature/home/src/main/kotlin/com/unifest/android/feature/home/HomeScreen.kt @@ -6,10 +6,13 @@ import androidx.compose.ui.unit.sp import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height @@ -24,15 +27,18 @@ import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Circle import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.Card import androidx.compose.material3.CardDefaults import androidx.compose.material3.Divider import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon +import androidx.compose.material3.OutlinedButton import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue @@ -43,9 +49,14 @@ import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalView import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.core.view.WindowInsetsCompat +import com.unifest.android.core.designsystem.R +import com.unifest.android.core.designsystem.component.UnifestButton +import com.unifest.android.core.designsystem.component.UnifestOutlinedButton import com.unifest.android.core.designsystem.theme.BoothLocation import com.unifest.android.core.designsystem.theme.Content4 import com.unifest.android.core.designsystem.theme.Content5 @@ -53,6 +64,8 @@ import com.unifest.android.core.designsystem.theme.Content6 import com.unifest.android.core.designsystem.theme.Title2 import com.unifest.android.core.designsystem.theme.Title3 import com.unifest.android.core.designsystem.theme.UnifestTheme +import com.unifest.android.core.domain.entity.FestivalEventEntity +import com.unifest.android.core.domain.entity.IncomingFestivalEventEntity import com.unifest.android.core.ui.DevicePreview @Composable @@ -66,74 +79,132 @@ internal fun HomeRoute( ) } -@OptIn(ExperimentalMaterial3Api::class) @Composable internal fun HomeScreen( padding: PaddingValues, @Suppress("unused") onNavigateToIntro: () -> Unit, ) { - var selectedEventId by remember { mutableStateOf(-1) } + var selectedEventId by remember { mutableIntStateOf(-1) } val view = LocalView.current val insets = with(LocalDensity.current) { WindowInsetsCompat.toWindowInsetsCompat(view.rootWindowInsets, view).getInsets(WindowInsetsCompat.Type.statusBars()).top.toDp() } + Column(modifier = Modifier.padding(top = insets)) { - Calendar() LazyColumn( modifier = Modifier .weight(1f) .padding(bottom = padding.calculateBottomPadding()), ) { + item { Calendar() } item { FestivalScheduleText() } itemsIndexed(festivalEvents) { index, event -> - EventItem(event, selectedEventId) { eventId -> - selectedEventId = if (selectedEventId == eventId) -1 else eventId + Column { + Spacer(modifier = Modifier.height(16.dp)) + EventItem(event, selectedEventId) { eventId -> + selectedEventId = if (selectedEventId == eventId) -1 else eventId + } } if (index < festivalEvents.size - 1) { Spacer(modifier = Modifier.height(16.dp)) - Divider( + HorizontalDivider( color = Color(0xFFDFDFDF), modifier = Modifier .padding(horizontal = 20.dp), - thickness = 1.dp + thickness = 1.dp, ) } } item { - Spacer(modifier = Modifier.height(16.dp)) - IncomingScheduleText() + UnifestOutlinedButton( + onClick = { /*관심 축제 추가하기 버튼*/ }, + modifier = Modifier + .fillMaxWidth() + .padding(20.dp), + contentColor = Color(0xFF585858), + borderColor = Color(0xFFD2D2D2), + ) { + Text( + text = stringResource(id = R.string.home_add_interest_festival_button), + style = BoothLocation, + ) + } } + item { - FestivalEventCard() + IncomingScheduleText() + } + items(incomingEvents) { event -> + FestivalEventCard(event) + Spacer(modifier = Modifier.height(8.dp)) } } } } @Composable -fun FestivalScheduleText() { - Text( - text = "오늘의 축제 일정", - style = Title3, - modifier = Modifier.padding(16.dp), - ) +fun FestivalEventCard(event: IncomingFestivalEventEntity) { + val imageResource: Painter = painterResource(id = event.imageRes) + Card( + modifier = Modifier + .padding(horizontal = 20.dp) + .fillMaxWidth(), + shape = RoundedCornerShape(10.dp), + colors = CardDefaults.cardColors(containerColor = Color.White), + border = BorderStroke(1.dp, Color(0xFFDEDEDE)), + ) { + Row( + modifier = Modifier + .padding(20.dp) + .fillMaxSize(), + verticalAlignment = Alignment.CenterVertically, + ) { + Image( + painter = imageResource, + contentDescription = "${event.name} Logo", + modifier = Modifier.size(52.dp), + ) + Spacer(modifier = Modifier.width(10.dp)) + Column( + modifier = Modifier.fillMaxWidth(), + ) { + Text(text = event.dates, style = Content6, color = Color(0xFF848484)) + Spacer(modifier = Modifier.height(5.dp)) + Text(text = event.name, style = Content4) + Spacer(modifier = Modifier.height(5.dp)) + Row { + Icon( + painter = painterResource(id = R.drawable.ic_location), + contentDescription = "Location Icon", + modifier = Modifier + .size(10.dp) + .padding(horizontal = 5.dp), + + ) + Text(text = event.location, style = Content6, color = Color(0xFF848484)) + } + + } + } + } } + @Composable -fun IncomingScheduleText() { +fun FestivalScheduleText() { Text( - text = "다가오는 축제 일정", - modifier = Modifier.padding(16.dp), + text = stringResource(id = R.string.home_festival_schedule_text), style = Title3, + modifier = Modifier.padding(start = 20.dp, top = 20.dp), ) } @Composable fun EventItem( - event: FestivalEvent, + event: FestivalEventEntity, selectedEventId: Int, onEventClick: (Int) -> Unit, ) { @@ -141,19 +212,40 @@ fun EventItem( Row( modifier = Modifier .fillMaxWidth() - .clickable { onEventClick(event.id) }, + .clickable { onEventClick(event.id) } + .padding(start = 20.dp), verticalAlignment = Alignment.CenterVertically, ) { + Box( + modifier = Modifier + .width(3.dp) + .fillMaxHeight() + .background(Color(0xFF1FC0BA)) + ) + Spacer(modifier = Modifier.width(8.dp)) Column( modifier = Modifier - .weight(1f) - .padding(16.dp), + .weight(1f), ) { - Text(text = event.date, style = Content4,modifier = Modifier.padding(5.dp)) - Text(text = event.name, style = Title2,modifier = Modifier.padding(7.dp)) - Text(text = event.location, style = Content5) - //todo: content5 얘기하기 + Text(text = event.date, style = Content4, color = Color(0xFFC0C0C0)) + Spacer(modifier = Modifier.height(5.dp)) + Text(text = event.name, style = Title2) + Spacer(modifier = Modifier.height(7.dp)) + Row { + Icon( + painter = painterResource(id = R.drawable.ic_location), + contentDescription = "Location Icon", + modifier = Modifier + .size(10.dp) + .padding(horizontal = 5.dp), + ) + Spacer(modifier = Modifier.width(5.dp)) + Text(text = event.location, style = Content5, color = Color(0xFF848484)) + } + + } + Spacer(modifier = Modifier.width(39.dp)) LazyRow { items(event.celebrityImages) { _ -> Icon( @@ -161,89 +253,68 @@ fun EventItem( contentDescription = "Celebrity", tint = Color(0xFFDFDFDF), modifier = Modifier - .size(52.dp) - .padding(horizontal = 4.dp), + .size(60.dp) + .padding(horizontal = 5.dp), ) } } } AnimatedVisibility(visible = selectedEventId == event.id) { - Button( - onClick = { /* 관심 축제 추가 */ }, + UnifestButton( + onClick = { /*관심 축제 추가 버튼*/ }, modifier = Modifier .fillMaxWidth() - .padding(8.dp), + .padding(20.dp), ) { - Text("관심 축제로 추가", style = BoothLocation) + Text( + text = stringResource(id = R.string.home_add_interest_festival_in_item_button), + style = BoothLocation, + ) } } } } @Composable -fun FestivalEventCard() { - val imageResource: Painter = painterResource(id = com.unifest.android.core.designsystem.R.drawable.ic_waiting) - val eventName = "녹색지대" - val eventDates = "05/21(화) - 05/23(목)" - val eventLocation = "건국대학교 서울캠퍼스" - Card( - modifier = Modifier - .padding(8.dp) - .fillMaxWidth(), - shape = RoundedCornerShape(10.dp), - colors = CardDefaults.cardColors(containerColor = Color.White), - border = BorderStroke(1.dp, Color.Gray), - ) { - Row( - modifier = Modifier - .padding(16.dp) - .fillMaxSize(), - verticalAlignment = Alignment.CenterVertically, - ) { - Image( - painter = imageResource, - contentDescription = "Event Logo", - modifier = Modifier.size(48.dp), - ) - Spacer(modifier = Modifier.width(16.dp)) - Column( - modifier = Modifier.fillMaxWidth(), - ) { - Text(text = eventDates, style = Content6,modifier = Modifier.padding(5.dp)) - Text(text = eventName, style = Content4,modifier = Modifier.padding(5.dp)) - Text(text = eventLocation, style = Content6) - //todo: content6 얘기하기 - } - } - } +fun IncomingScheduleText() { + Text( + text = stringResource(id = R.string.home_incoming_festival_text), + modifier = Modifier.padding(top = 20.dp, start = 20.dp, bottom = 7.dp), + style = Title3, + ) } - -data class FestivalEvent( - val id: Int, - val date: String, - val name: String, - val location: String, - val celebrityImages: List, +val incomingEvents = listOf( + IncomingFestivalEventEntity( + imageRes = R.drawable.ic_waiting, + name = "녹색지대", + dates = "05/21(화) - 05/23(목)", + location = "건국대학교 서울캠퍼스", + ), + IncomingFestivalEventEntity( + imageRes = R.drawable.ic_waiting, + name = "녹색지대", + dates = "05/21(화) - 05/23(목)", + location = "건국대학교 서울캠퍼스", + ), ) - val festivalEvents = listOf( - FestivalEvent( + FestivalEventEntity( id = 1, date = "5/21(화)", name = "녹색지대 DAY 1", location = "건국대학교 서울캠퍼스", celebrityImages = listOf(0, 1, 2), ), - FestivalEvent( + FestivalEventEntity( id = 2, date = "5/21(화)", name = "녹색지대 DAY 1", location = "건국대학교 서울캠퍼스", celebrityImages = listOf(0, 1, 2), ), - FestivalEvent( + FestivalEventEntity( id = 3, date = "5/21(화)", name = "녹색지대 DAY 1", @@ -251,6 +322,7 @@ val festivalEvents = listOf( celebrityImages = listOf(0, 1, 2), ), ) + @DevicePreview @Composable fun HomeScreenPreview() { From 7e29f67e549eb88c81a3823734673a9a0ea51adf Mon Sep 17 00:00:00 2001 From: JeongSangHoon Date: Wed, 3 Apr 2024 19:02:10 +0900 Subject: [PATCH 12/20] =?UTF-8?q?[add]=20calender=5Fbottom=20=EB=A6=AC?= =?UTF-8?q?=EC=86=8C=EC=8A=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/res/drawable/calender_bottom.xml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 core/designsystem/src/main/res/drawable/calender_bottom.xml diff --git a/core/designsystem/src/main/res/drawable/calender_bottom.xml b/core/designsystem/src/main/res/drawable/calender_bottom.xml new file mode 100644 index 00000000..50c22b02 --- /dev/null +++ b/core/designsystem/src/main/res/drawable/calender_bottom.xml @@ -0,0 +1,9 @@ + + + From 2944936033b77b5df3450fcfb7b264a0fc5fd918 Mon Sep 17 00:00:00 2001 From: JeongSangHoon Date: Wed, 3 Apr 2024 19:03:35 +0900 Subject: [PATCH 13/20] =?UTF-8?q?[style]=20UnifestOutlinedButton=20?= =?UTF-8?q?=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EB=94=94=EC=9E=90?= =?UTF-8?q?=EC=9D=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../android/core/designsystem/component/OutLinedButton.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/designsystem/src/main/kotlin/com/unifest/android/core/designsystem/component/OutLinedButton.kt b/core/designsystem/src/main/kotlin/com/unifest/android/core/designsystem/component/OutLinedButton.kt index 9b139b99..b9362279 100644 --- a/core/designsystem/src/main/kotlin/com/unifest/android/core/designsystem/component/OutLinedButton.kt +++ b/core/designsystem/src/main/kotlin/com/unifest/android/core/designsystem/component/OutLinedButton.kt @@ -18,7 +18,7 @@ fun UnifestOutlinedButton( onClick: () -> Unit, modifier: Modifier = Modifier, borderColor: Color = Color(0xFFf5678E), - contentColor: Color = Color.White, + contentColor: Color = Color(0xFFf5678E), enabled: Boolean = true, content: @Composable RowScope.() -> Unit, ) { @@ -31,7 +31,6 @@ fun UnifestOutlinedButton( contentColor = contentColor ), border = BorderStroke(1.dp, borderColor), - contentPadding = PaddingValues(horizontal = 20.dp, vertical = 12.dp), content = content, ) } From 2caec9881f811fec9d98efc3ef76db2666cb9974 Mon Sep 17 00:00:00 2001 From: JeongSangHoon Date: Wed, 3 Apr 2024 19:05:24 +0900 Subject: [PATCH 14/20] =?UTF-8?q?[chore]=20entity=20@Stable=EB=A1=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95,=20=ED=8F=B0=ED=8A=B8=20=EC=B6=94=EA=B0=80,?= =?UTF-8?q?=20=EC=95=84=EC=9D=B4=EC=BD=98=20=EC=83=89=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/unifest/android/core/designsystem/theme/Font.kt | 6 ++++++ core/designsystem/src/main/res/drawable/ic_location.xml | 2 +- .../android/core/domain/entity/FestivalEventEntity.kt | 3 +++ .../core/domain/entity/IncomingFestivalEventEntity.kt | 2 ++ 4 files changed, 12 insertions(+), 1 deletion(-) diff --git a/core/designsystem/src/main/kotlin/com/unifest/android/core/designsystem/theme/Font.kt b/core/designsystem/src/main/kotlin/com/unifest/android/core/designsystem/theme/Font.kt index 46d76ffd..fbd1e3fa 100644 --- a/core/designsystem/src/main/kotlin/com/unifest/android/core/designsystem/theme/Font.kt +++ b/core/designsystem/src/main/kotlin/com/unifest/android/core/designsystem/theme/Font.kt @@ -50,6 +50,12 @@ val Title5 = TextStyle( fontWeight = FontWeight.SemiBold, fontSize = 13.sp, ) +val BoothTitle0 = TextStyle( + fontFamily = pretendardFamily, + fontWeight = FontWeight.Bold, + fontSize = 24.sp, +) + val BoothTitle1 = TextStyle( fontFamily = pretendardFamily, diff --git a/core/designsystem/src/main/res/drawable/ic_location.xml b/core/designsystem/src/main/res/drawable/ic_location.xml index 22777c64..102279a3 100644 --- a/core/designsystem/src/main/res/drawable/ic_location.xml +++ b/core/designsystem/src/main/res/drawable/ic_location.xml @@ -5,7 +5,7 @@ android:viewportHeight="14"> Date: Wed, 3 Apr 2024 19:09:17 +0900 Subject: [PATCH 15/20] =?UTF-8?q?[style]=20Calendar=20=EC=99=80=20Home=20?= =?UTF-8?q?=EB=94=94=EC=9E=90=EC=9D=B8=20=EC=8A=A4=ED=8E=99=EC=97=90=20?= =?UTF-8?q?=EB=A7=9E=EA=B2=8C=20=EB=A0=88=EC=9D=B4=EC=95=84=EC=9B=83=20?= =?UTF-8?q?=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../unifest/android/feature/home/Calendar.kt | 89 +++++++----- .../android/feature/home/HomeScreen.kt | 127 +++++++++--------- 2 files changed, 118 insertions(+), 98 deletions(-) diff --git a/feature/home/src/main/kotlin/com/unifest/android/feature/home/Calendar.kt b/feature/home/src/main/kotlin/com/unifest/android/feature/home/Calendar.kt index bb0990a8..55a46b57 100644 --- a/feature/home/src/main/kotlin/com/unifest/android/feature/home/Calendar.kt +++ b/feature/home/src/main/kotlin/com/unifest/android/feature/home/Calendar.kt @@ -3,6 +3,7 @@ package com.unifest.android.feature.home import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.Image import androidx.compose.foundation.background +import androidx.compose.foundation.border import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -13,6 +14,7 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.requiredHeight import androidx.compose.foundation.shape.CircleShape import androidx.compose.material3.Icon import androidx.compose.material3.IconButton @@ -27,6 +29,7 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip +import androidx.compose.ui.draw.paint import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.layout.ContentScale @@ -52,6 +55,9 @@ import com.kizitonwose.calendar.core.nextMonth import com.kizitonwose.calendar.core.previousMonth import com.kizitonwose.calendar.core.yearMonth import com.unifest.android.core.designsystem.R +import com.unifest.android.core.designsystem.theme.BoothLocation +import com.unifest.android.core.designsystem.theme.BoothTitle0 +import com.unifest.android.core.designsystem.theme.BoothTitle1 import com.unifest.android.core.designsystem.theme.UnifestTheme import kotlinx.coroutines.launch import java.time.DayOfWeek @@ -63,7 +69,6 @@ import java.time.YearMonth fun Calendar(adjacentMonths: Long = 500) { val currentDate = remember { LocalDate.now() } val currentYearMonth = remember(currentDate) { currentDate.yearMonth } - val currentMonth = remember(currentDate) { currentYearMonth.month } val startMonth = remember(currentDate) { currentYearMonth.minusMonths(adjacentMonths) } val endMonth = remember(currentDate) { currentYearMonth.plusMonths(adjacentMonths) } val selectedDate = remember { mutableStateOf(LocalDate.now()) } @@ -142,11 +147,15 @@ fun ModeToggleButton( ) { val icon = if (isWeekMode) painterResource(id = R.drawable.ic_calender_down) else painterResource(id = R.drawable.ic_calender_up) val contentDescription = if (isWeekMode) "Month" else "Week" + val backgroundPainter = painterResource(id = R.drawable.calender_bottom) Box( modifier = Modifier .fillMaxWidth() + .requiredHeight(40.dp) + .paint(painter = backgroundPainter, contentScale = ContentScale.FillBounds) + //todo:리소스 체크 .then(modifier), contentAlignment = Alignment.Center, ) { @@ -156,7 +165,7 @@ fun ModeToggleButton( Icon( painter = icon, contentDescription = contentDescription, - tint = Color.Gray + tint = Color(0xFFD9D9D9), ) } } @@ -200,7 +209,7 @@ fun MonthAndWeekCalendarTitle( val coroutineScope = rememberCoroutineScope() if (!isWeekMode) { SimpleCalendarTitle( - modifier = Modifier.padding(vertical = 10.dp, horizontal = 20.dp), + modifier = Modifier.padding(20.dp),//todo: padding 값 수정 currentMonth = currentMonth, goToPrevious = { coroutineScope.launch { @@ -244,11 +253,9 @@ fun SimpleCalendarTitle( Text( modifier = Modifier.weight(1f), text = currentMonth.displayText(), - fontSize = 14.sp, + style = BoothTitle0, textAlign = TextAlign.Start, - fontWeight = FontWeight.Bold, - - ) + ) CalendarNavigationIcon( icon = painterResource(id = R.drawable.ic_chevron_left), contentDescription = "Previous", @@ -264,8 +271,6 @@ fun SimpleCalendarTitle( } - - @Composable fun CalendarHeader(daysOfWeek: List) { //월화수목금토일 @@ -294,31 +299,51 @@ fun Day( isSelectable: Boolean, onClick: (LocalDate) -> Unit, ) { - Box( - modifier = Modifier - .aspectRatio(1f) // This is important for square-sizing! - .padding(6.dp) - .clip(CircleShape) - .background(color = if (isSelected) Color(0xFFF5687E) else Color.Transparent) - .clickable( - enabled = isSelectable, - showRipple = !isSelected, - onClick = { onClick(day) }, - ), - contentAlignment = Alignment.Center, - ) { - val textColor = when { - isSelected -> Color.White - isSelectable -> Color.Unspecified - else -> colorResource(R.color.inactive_text_color) + val currentDate = LocalDate.now() + val isToday = day == currentDate + + Column { + Box( + modifier = Modifier + .aspectRatio(1f) // This is important for square-sizing! + .padding(12.dp) + .clip(CircleShape) + .background(color = if (isSelected) Color(0xFFF5687E) else Color.Transparent) + .then( + if (day == currentDate) { + Modifier.border(2.dp, Color(0xFFF5687E), CircleShape) + } else Modifier, + ) + .clickable( + enabled = isSelectable, + showRipple = !isSelected, + onClick = { onClick(day) }, + ), + contentAlignment = Alignment.Center, + ) { + val textColor = when { + isSelected -> Color.White + isToday -> Color(0xFFF5687E) + isSelectable -> Color.Unspecified + else -> colorResource(R.color.inactive_text_color) + } + Text( + text = day.dayOfMonth.toString(), + color = textColor, + fontSize = 14.sp, + fontWeight = FontWeight.Bold, + ) } - Text( - text = day.dayOfMonth.toString(), - color = textColor, - fontSize = 14.sp, - fontWeight = FontWeight.Bold, - ) +// Box( +// modifier = Modifier +// .height(15.dp) +// .fillMaxWidth() +// .background(Color(0xFF4CAF50)) +// +// ) + //todo:날짜 선택시 하단에 표시되는 부분 } + } diff --git a/feature/home/src/main/kotlin/com/unifest/android/feature/home/HomeScreen.kt b/feature/home/src/main/kotlin/com/unifest/android/feature/home/HomeScreen.kt index 5ad478bc..8fcb4d32 100644 --- a/feature/home/src/main/kotlin/com/unifest/android/feature/home/HomeScreen.kt +++ b/feature/home/src/main/kotlin/com/unifest/android/feature/home/HomeScreen.kt @@ -1,7 +1,5 @@ package com.unifest.android.feature.home -import androidx.compose.ui.unit.sp - import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.BorderStroke @@ -26,20 +24,14 @@ import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Circle -import androidx.compose.material3.Button -import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.Card import androidx.compose.material3.CardDefaults -import androidx.compose.material3.Divider -import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon -import androidx.compose.material3.OutlinedButton import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf -import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment @@ -50,8 +42,6 @@ import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalView import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.core.view.WindowInsetsCompat import com.unifest.android.core.designsystem.R @@ -104,7 +94,7 @@ internal fun HomeScreen( itemsIndexed(festivalEvents) { index, event -> Column { Spacer(modifier = Modifier.height(16.dp)) - EventItem(event, selectedEventId) { eventId -> + FestivalScheduleItem(event, selectedEventId) { eventId -> selectedEventId = if (selectedEventId == eventId) -1 else eventId } } @@ -135,62 +125,17 @@ internal fun HomeScreen( } item { - IncomingScheduleText() + IncomingFestivalText() } items(incomingEvents) { event -> - FestivalEventCard(event) + IncomingFestivalCard(event) Spacer(modifier = Modifier.height(8.dp)) } } } } -@Composable -fun FestivalEventCard(event: IncomingFestivalEventEntity) { - val imageResource: Painter = painterResource(id = event.imageRes) - Card( - modifier = Modifier - .padding(horizontal = 20.dp) - .fillMaxWidth(), - shape = RoundedCornerShape(10.dp), - colors = CardDefaults.cardColors(containerColor = Color.White), - border = BorderStroke(1.dp, Color(0xFFDEDEDE)), - ) { - Row( - modifier = Modifier - .padding(20.dp) - .fillMaxSize(), - verticalAlignment = Alignment.CenterVertically, - ) { - Image( - painter = imageResource, - contentDescription = "${event.name} Logo", - modifier = Modifier.size(52.dp), - ) - Spacer(modifier = Modifier.width(10.dp)) - Column( - modifier = Modifier.fillMaxWidth(), - ) { - Text(text = event.dates, style = Content6, color = Color(0xFF848484)) - Spacer(modifier = Modifier.height(5.dp)) - Text(text = event.name, style = Content4) - Spacer(modifier = Modifier.height(5.dp)) - Row { - Icon( - painter = painterResource(id = R.drawable.ic_location), - contentDescription = "Location Icon", - modifier = Modifier - .size(10.dp) - .padding(horizontal = 5.dp), - ) - Text(text = event.location, style = Content6, color = Color(0xFF848484)) - } - - } - } - } -} @Composable @@ -203,7 +148,7 @@ fun FestivalScheduleText() { } @Composable -fun EventItem( +fun FestivalScheduleItem( event: FestivalEventEntity, selectedEventId: Int, onEventClick: (Int) -> Unit, @@ -219,8 +164,9 @@ fun EventItem( Box( modifier = Modifier .width(3.dp) - .fillMaxHeight() + .height(72.dp) .background(Color(0xFF1FC0BA)) + .align(Alignment.CenterVertically) ) Spacer(modifier = Modifier.width(8.dp)) Column( @@ -237,7 +183,7 @@ fun EventItem( contentDescription = "Location Icon", modifier = Modifier .size(10.dp) - .padding(horizontal = 5.dp), + .align(Alignment.CenterVertically), ) Spacer(modifier = Modifier.width(5.dp)) Text(text = event.location, style = Content5, color = Color(0xFF848484)) @@ -260,11 +206,12 @@ fun EventItem( } } AnimatedVisibility(visible = selectedEventId == event.id) { - UnifestButton( - onClick = { /*관심 축제 추가 버튼*/ }, + + UnifestOutlinedButton( + onClick = { /*관심 축제 추가하기 버튼*/ }, modifier = Modifier .fillMaxWidth() - .padding(20.dp), + .padding(top = 16.dp, start = 20.dp, end = 20.dp), ) { Text( text = stringResource(id = R.string.home_add_interest_festival_in_item_button), @@ -276,14 +223,62 @@ fun EventItem( } @Composable -fun IncomingScheduleText() { +fun IncomingFestivalText() { Text( text = stringResource(id = R.string.home_incoming_festival_text), - modifier = Modifier.padding(top = 20.dp, start = 20.dp, bottom = 7.dp), + modifier = Modifier.padding(start = 20.dp, bottom = 16.dp), style = Title3, ) } +@Composable +fun IncomingFestivalCard(event: IncomingFestivalEventEntity) { + val imageResource: Painter = painterResource(id = event.imageRes) + Card( + modifier = Modifier + .padding(horizontal = 20.dp) + .fillMaxWidth(), + shape = RoundedCornerShape(10.dp), + colors = CardDefaults.cardColors(containerColor = Color.White), + border = BorderStroke(1.dp, Color(0xFFDEDEDE)), + ) { + Row( + modifier = Modifier + .padding(20.dp) + .fillMaxSize(), + verticalAlignment = Alignment.CenterVertically, + ) { + Image( + painter = imageResource, + contentDescription = "${event.name} Logo", + modifier = Modifier.size(52.dp), + ) + Spacer(modifier = Modifier.width(10.dp)) + Column( + modifier = Modifier.fillMaxWidth(), + ) { + Text(text = event.dates, style = Content6, color = Color(0xFF848484)) + Spacer(modifier = Modifier.height(5.dp)) + Text(text = event.name, style = Content4) + Spacer(modifier = Modifier.height(5.dp)) + Row { + Icon( + painter = painterResource(id = R.drawable.ic_location), + contentDescription = "Location Icon", + modifier = Modifier + .size(10.dp) + .align(Alignment.CenterVertically), + + ) + Spacer(modifier = Modifier.width(5.dp)) + Text(text = event.location, style = Content6, color = Color(0xFF848484)) + } + + } + } + } +} + val incomingEvents = listOf( IncomingFestivalEventEntity( From b70aad10126770537c3affa28321e6e68caa8ccf Mon Sep 17 00:00:00 2001 From: Jeong Sang Hoon Date: Thu, 4 Apr 2024 12:44:10 +0900 Subject: [PATCH 16/20] =?UTF-8?q?[feat]=20=ED=99=88=20UiState,=EB=B7=B0?= =?UTF-8?q?=EB=AA=A8=EB=8D=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../android/feature/home/HomeScreen.kt | 69 ++++--------------- .../feature/home/viewmodel/HomeUiState.kt | 11 +++ .../feature/home/viewmodel/HomeViewModel.kt | 59 +++++++++++++++- 3 files changed, 83 insertions(+), 56 deletions(-) create mode 100644 feature/home/src/main/kotlin/com/unifest/android/feature/home/viewmodel/HomeUiState.kt diff --git a/feature/home/src/main/kotlin/com/unifest/android/feature/home/HomeScreen.kt b/feature/home/src/main/kotlin/com/unifest/android/feature/home/HomeScreen.kt index 8fcb4d32..c6a6c3a9 100644 --- a/feature/home/src/main/kotlin/com/unifest/android/feature/home/HomeScreen.kt +++ b/feature/home/src/main/kotlin/com/unifest/android/feature/home/HomeScreen.kt @@ -1,8 +1,8 @@ package com.unifest.android.feature.home - import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box @@ -32,6 +32,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.mutableStateListOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment @@ -44,6 +45,8 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.core.view.WindowInsetsCompat +import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.unifest.android.core.designsystem.R import com.unifest.android.core.designsystem.component.UnifestButton import com.unifest.android.core.designsystem.component.UnifestOutlinedButton @@ -56,15 +59,20 @@ import com.unifest.android.core.designsystem.theme.Title3 import com.unifest.android.core.designsystem.theme.UnifestTheme import com.unifest.android.core.domain.entity.FestivalEventEntity import com.unifest.android.core.domain.entity.IncomingFestivalEventEntity +import com.unifest.android.core.domain.entity.School import com.unifest.android.core.ui.DevicePreview - +import com.unifest.android.feature.home.viewmodel.HomeUiState +import com.unifest.android.feature.home.viewmodel.HomeViewModel @Composable internal fun HomeRoute( padding: PaddingValues, onNavigateToIntro: () -> Unit, + viewModel: HomeViewModel = hiltViewModel(), ) { + val uiState by viewModel.uiState.collectAsStateWithLifecycle() HomeScreen( padding = padding, + uiState = uiState, onNavigateToIntro = onNavigateToIntro, ) } @@ -72,6 +80,7 @@ internal fun HomeRoute( @Composable internal fun HomeScreen( padding: PaddingValues, + uiState: HomeUiState, @Suppress("unused") onNavigateToIntro: () -> Unit, ) { @@ -91,14 +100,14 @@ internal fun HomeScreen( item { FestivalScheduleText() } - itemsIndexed(festivalEvents) { index, event -> + itemsIndexed(uiState.festivalEvents) { index, event -> Column { Spacer(modifier = Modifier.height(16.dp)) FestivalScheduleItem(event, selectedEventId) { eventId -> selectedEventId = if (selectedEventId == eventId) -1 else eventId } } - if (index < festivalEvents.size - 1) { + if (index < uiState.festivalEvents.size - 1) { Spacer(modifier = Modifier.height(16.dp)) HorizontalDivider( color = Color(0xFFDFDFDF), @@ -127,7 +136,7 @@ internal fun HomeScreen( item { IncomingFestivalText() } - items(incomingEvents) { event -> + items(uiState.incomingEvents) { event -> IncomingFestivalCard(event) Spacer(modifier = Modifier.height(8.dp)) } @@ -278,53 +287,3 @@ fun IncomingFestivalCard(event: IncomingFestivalEventEntity) { } } } - - -val incomingEvents = listOf( - IncomingFestivalEventEntity( - imageRes = R.drawable.ic_waiting, - name = "녹색지대", - dates = "05/21(화) - 05/23(목)", - location = "건국대학교 서울캠퍼스", - ), - IncomingFestivalEventEntity( - imageRes = R.drawable.ic_waiting, - name = "녹색지대", - dates = "05/21(화) - 05/23(목)", - location = "건국대학교 서울캠퍼스", - ), -) -val festivalEvents = listOf( - FestivalEventEntity( - id = 1, - date = "5/21(화)", - name = "녹색지대 DAY 1", - location = "건국대학교 서울캠퍼스", - celebrityImages = listOf(0, 1, 2), - ), - FestivalEventEntity( - id = 2, - date = "5/21(화)", - name = "녹색지대 DAY 1", - location = "건국대학교 서울캠퍼스", - celebrityImages = listOf(0, 1, 2), - ), - FestivalEventEntity( - id = 3, - date = "5/21(화)", - name = "녹색지대 DAY 1", - location = "건국대학교 서울캠퍼스", - celebrityImages = listOf(0, 1, 2), - ), -) - -@DevicePreview -@Composable -fun HomeScreenPreview() { - UnifestTheme { - HomeScreen( - padding = PaddingValues(0.dp), - onNavigateToIntro = {}, - ) - } -} diff --git a/feature/home/src/main/kotlin/com/unifest/android/feature/home/viewmodel/HomeUiState.kt b/feature/home/src/main/kotlin/com/unifest/android/feature/home/viewmodel/HomeUiState.kt new file mode 100644 index 00000000..b57719f7 --- /dev/null +++ b/feature/home/src/main/kotlin/com/unifest/android/feature/home/viewmodel/HomeUiState.kt @@ -0,0 +1,11 @@ +package com.unifest.android.feature.home.viewmodel + +import com.unifest.android.core.domain.entity.FestivalEventEntity +import com.unifest.android.core.domain.entity.IncomingFestivalEventEntity +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.persistentListOf + +data class HomeUiState( + val incomingEvents: ImmutableList = persistentListOf(), + val festivalEvents: ImmutableList = persistentListOf(), +) diff --git a/feature/home/src/main/kotlin/com/unifest/android/feature/home/viewmodel/HomeViewModel.kt b/feature/home/src/main/kotlin/com/unifest/android/feature/home/viewmodel/HomeViewModel.kt index be4b416f..45796ac6 100644 --- a/feature/home/src/main/kotlin/com/unifest/android/feature/home/viewmodel/HomeViewModel.kt +++ b/feature/home/src/main/kotlin/com/unifest/android/feature/home/viewmodel/HomeViewModel.kt @@ -1,8 +1,65 @@ package com.unifest.android.feature.home.viewmodel import androidx.lifecycle.ViewModel +import com.unifest.android.core.designsystem.R +import com.unifest.android.core.domain.entity.FestivalEventEntity +import com.unifest.android.core.domain.entity.IncomingFestivalEventEntity import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.collections.immutable.persistentListOf +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update import javax.inject.Inject @HiltViewModel -class HomeViewModel @Inject constructor() : ViewModel() +class HomeViewModel @Inject constructor() : ViewModel() { + private val _uiState = MutableStateFlow(HomeUiState()) + val uiState: StateFlow = _uiState.asStateFlow() + + init { + _uiState.update { + it.copy( + // 임시 데이터 + incomingEvents = persistentListOf( + IncomingFestivalEventEntity( + imageRes = R.drawable.ic_waiting, + name = "녹색지대", + dates = "05/21(화) - 05/23(목)", + location = "건국대학교 서울캠퍼스", + ), + IncomingFestivalEventEntity( + imageRes = R.drawable.ic_waiting, + name = "녹색지대", + dates = "05/21(화) - 05/23(목)", + location = "건국대학교 서울캠퍼스", + ), + ), + festivalEvents = persistentListOf( + FestivalEventEntity( + id = 1, + date = "5/21(화)", + name = "녹색지대 DAY 1", + location = "건국대학교 서울캠퍼스", + celebrityImages = listOf(0, 1, 2), + ), + FestivalEventEntity( + id = 2, + date = "5/21(화)", + name = "녹색지대 DAY 1", + location = "건국대학교 서울캠퍼스", + celebrityImages = listOf(0, 1, 2), + ), + FestivalEventEntity( + id = 3, + date = "5/21(화)", + name = "녹색지대 DAY 1", + location = "건국대학교 서울캠퍼스", + celebrityImages = listOf(0, 1, 2), + ), + ), + ) + } + } +} + From f12bccaece9fd549bb0b6ece507bcea5658fe64e Mon Sep 17 00:00:00 2001 From: Jeong Sang Hoon Date: Thu, 4 Apr 2024 12:55:53 +0900 Subject: [PATCH 17/20] [chore] style check success --- .../designsystem/component/OutLinedButton.kt | 3 +- .../android/core/designsystem/theme/Font.kt | 1 - .../entity/IncomingFestivalEventEntity.kt | 2 +- .../unifest/android/feature/home/Calendar.kt | 33 ++----------------- .../android/feature/home/HomeScreen.kt | 22 +++---------- .../feature/home/viewmodel/HomeViewModel.kt | 2 -- 6 files changed, 8 insertions(+), 55 deletions(-) diff --git a/core/designsystem/src/main/kotlin/com/unifest/android/core/designsystem/component/OutLinedButton.kt b/core/designsystem/src/main/kotlin/com/unifest/android/core/designsystem/component/OutLinedButton.kt index b9362279..7edce2fc 100644 --- a/core/designsystem/src/main/kotlin/com/unifest/android/core/designsystem/component/OutLinedButton.kt +++ b/core/designsystem/src/main/kotlin/com/unifest/android/core/designsystem/component/OutLinedButton.kt @@ -1,7 +1,6 @@ package com.unifest.android.core.designsystem.component import androidx.compose.foundation.BorderStroke -import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.ButtonDefaults @@ -28,7 +27,7 @@ fun UnifestOutlinedButton( enabled = enabled, shape = RoundedCornerShape(10.dp), colors = ButtonDefaults.outlinedButtonColors( - contentColor = contentColor + contentColor = contentColor, ), border = BorderStroke(1.dp, borderColor), content = content, diff --git a/core/designsystem/src/main/kotlin/com/unifest/android/core/designsystem/theme/Font.kt b/core/designsystem/src/main/kotlin/com/unifest/android/core/designsystem/theme/Font.kt index fbd1e3fa..24b2e456 100644 --- a/core/designsystem/src/main/kotlin/com/unifest/android/core/designsystem/theme/Font.kt +++ b/core/designsystem/src/main/kotlin/com/unifest/android/core/designsystem/theme/Font.kt @@ -56,7 +56,6 @@ val BoothTitle0 = TextStyle( fontSize = 24.sp, ) - val BoothTitle1 = TextStyle( fontFamily = pretendardFamily, fontWeight = FontWeight.Bold, diff --git a/core/domain/src/main/kotlin/com/unifest/android/core/domain/entity/IncomingFestivalEventEntity.kt b/core/domain/src/main/kotlin/com/unifest/android/core/domain/entity/IncomingFestivalEventEntity.kt index 95922e2f..bdd204d3 100644 --- a/core/domain/src/main/kotlin/com/unifest/android/core/domain/entity/IncomingFestivalEventEntity.kt +++ b/core/domain/src/main/kotlin/com/unifest/android/core/domain/entity/IncomingFestivalEventEntity.kt @@ -7,5 +7,5 @@ data class IncomingFestivalEventEntity( val imageRes: Int, val name: String, val dates: String, - val location: String + val location: String, ) diff --git a/feature/home/src/main/kotlin/com/unifest/android/feature/home/Calendar.kt b/feature/home/src/main/kotlin/com/unifest/android/feature/home/Calendar.kt index 55a46b57..586d902a 100644 --- a/feature/home/src/main/kotlin/com/unifest/android/feature/home/Calendar.kt +++ b/feature/home/src/main/kotlin/com/unifest/android/feature/home/Calendar.kt @@ -1,7 +1,6 @@ package com.unifest.android.feature.home import androidx.compose.animation.AnimatedVisibility -import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.clickable @@ -20,7 +19,6 @@ import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.MutableState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -55,15 +53,12 @@ import com.kizitonwose.calendar.core.nextMonth import com.kizitonwose.calendar.core.previousMonth import com.kizitonwose.calendar.core.yearMonth import com.unifest.android.core.designsystem.R -import com.unifest.android.core.designsystem.theme.BoothLocation import com.unifest.android.core.designsystem.theme.BoothTitle0 -import com.unifest.android.core.designsystem.theme.BoothTitle1 import com.unifest.android.core.designsystem.theme.UnifestTheme import kotlinx.coroutines.launch import java.time.DayOfWeek import java.time.LocalDate import java.time.Month -import java.time.YearMonth @Composable fun Calendar(adjacentMonths: Long = 500) { @@ -99,7 +94,6 @@ fun Calendar(adjacentMonths: Long = 500) { ) CalendarHeader(daysOfWeek = daysOfWeek) - //월화수목금토일 AnimatedVisibility(visible = !isWeekMode) { HorizontalCalendar( state = monthState, @@ -140,7 +134,6 @@ fun Calendar(adjacentMonths: Long = 500) { @Composable fun ModeToggleButton( - //캘린더 축소 확대 modifier: Modifier = Modifier, isWeekMode: Boolean, onModeChange: (Boolean) -> Unit, @@ -149,13 +142,11 @@ fun ModeToggleButton( val contentDescription = if (isWeekMode) "Month" else "Week" val backgroundPainter = painterResource(id = R.drawable.calender_bottom) - Box( modifier = Modifier .fillMaxWidth() .requiredHeight(40.dp) .paint(painter = backgroundPainter, contentScale = ContentScale.FillBounds) - //todo:리소스 체크 .then(modifier), contentAlignment = Alignment.Center, ) { @@ -173,7 +164,6 @@ fun ModeToggleButton( @Composable private fun CalendarNavigationIcon( - //월 이동 화살표 구현 icon: Painter, contentDescription: String, onClick: () -> Unit, @@ -192,13 +182,11 @@ private fun CalendarNavigationIcon( painter = icon, contentDescription = contentDescription, tint = Color.Gray, - - ) + ) } @Composable fun MonthAndWeekCalendarTitle( - // 현재 보고 있는 월과 달력 이동 기능을 관리하는 함수. 사용자가 이전 또는 다음 월로 이동할 수 있게 함 isWeekMode: Boolean, monthState: CalendarState, weekState: WeekCalendarState, @@ -209,7 +197,7 @@ fun MonthAndWeekCalendarTitle( val coroutineScope = rememberCoroutineScope() if (!isWeekMode) { SimpleCalendarTitle( - modifier = Modifier.padding(20.dp),//todo: padding 값 수정 + modifier = Modifier.padding(20.dp), currentMonth = currentMonth, goToPrevious = { coroutineScope.launch { @@ -249,7 +237,6 @@ fun SimpleCalendarTitle( modifier = modifier.height(40.dp), verticalAlignment = Alignment.CenterVertically, ) { - Text( modifier = Modifier.weight(1f), text = currentMonth.displayText(), @@ -261,7 +248,6 @@ fun SimpleCalendarTitle( contentDescription = "Previous", onClick = goToPrevious, ) - CalendarNavigationIcon( icon = painterResource(id = R.drawable.ic_chevron_right), contentDescription = "Next", @@ -270,10 +256,8 @@ fun SimpleCalendarTitle( } } - @Composable fun CalendarHeader(daysOfWeek: List) { - //월화수목금토일 Row( modifier = Modifier .fillMaxWidth(), @@ -293,7 +277,6 @@ fun CalendarHeader(daysOfWeek: List) { @Composable fun Day( - //날짜 선택 day: LocalDate, isSelected: Boolean, isSelectable: Boolean, @@ -334,25 +317,13 @@ fun Day( fontWeight = FontWeight.Bold, ) } -// Box( -// modifier = Modifier -// .height(15.dp) -// .fillMaxWidth() -// .background(Color(0xFF4CAF50)) -// -// ) - //todo:날짜 선택시 하단에 표시되는 부분 } - } - @Preview @Composable private fun CalendarPreview() { UnifestTheme { Calendar() - } } - diff --git a/feature/home/src/main/kotlin/com/unifest/android/feature/home/HomeScreen.kt b/feature/home/src/main/kotlin/com/unifest/android/feature/home/HomeScreen.kt index c6a6c3a9..7cfe8a77 100644 --- a/feature/home/src/main/kotlin/com/unifest/android/feature/home/HomeScreen.kt +++ b/feature/home/src/main/kotlin/com/unifest/android/feature/home/HomeScreen.kt @@ -2,7 +2,6 @@ package com.unifest.android.feature.home import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.BorderStroke -import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box @@ -10,7 +9,6 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height @@ -32,7 +30,6 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf -import androidx.compose.runtime.mutableStateListOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment @@ -48,7 +45,6 @@ import androidx.core.view.WindowInsetsCompat import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.unifest.android.core.designsystem.R -import com.unifest.android.core.designsystem.component.UnifestButton import com.unifest.android.core.designsystem.component.UnifestOutlinedButton import com.unifest.android.core.designsystem.theme.BoothLocation import com.unifest.android.core.designsystem.theme.Content4 @@ -56,13 +52,11 @@ import com.unifest.android.core.designsystem.theme.Content5 import com.unifest.android.core.designsystem.theme.Content6 import com.unifest.android.core.designsystem.theme.Title2 import com.unifest.android.core.designsystem.theme.Title3 -import com.unifest.android.core.designsystem.theme.UnifestTheme import com.unifest.android.core.domain.entity.FestivalEventEntity import com.unifest.android.core.domain.entity.IncomingFestivalEventEntity -import com.unifest.android.core.domain.entity.School -import com.unifest.android.core.ui.DevicePreview import com.unifest.android.feature.home.viewmodel.HomeUiState import com.unifest.android.feature.home.viewmodel.HomeViewModel + @Composable internal fun HomeRoute( padding: PaddingValues, @@ -125,7 +119,7 @@ internal fun HomeScreen( .padding(20.dp), contentColor = Color(0xFF585858), borderColor = Color(0xFFD2D2D2), - ) { + ) { Text( text = stringResource(id = R.string.home_add_interest_festival_button), style = BoothLocation, @@ -144,9 +138,6 @@ internal fun HomeScreen( } } - - - @Composable fun FestivalScheduleText() { Text( @@ -175,7 +166,7 @@ fun FestivalScheduleItem( .width(3.dp) .height(72.dp) .background(Color(0xFF1FC0BA)) - .align(Alignment.CenterVertically) + .align(Alignment.CenterVertically), ) Spacer(modifier = Modifier.width(8.dp)) Column( @@ -197,8 +188,6 @@ fun FestivalScheduleItem( Spacer(modifier = Modifier.width(5.dp)) Text(text = event.location, style = Content5, color = Color(0xFF848484)) } - - } Spacer(modifier = Modifier.width(39.dp)) LazyRow { @@ -215,7 +204,6 @@ fun FestivalScheduleItem( } } AnimatedVisibility(visible = selectedEventId == event.id) { - UnifestOutlinedButton( onClick = { /*관심 축제 추가하기 버튼*/ }, modifier = Modifier @@ -277,12 +265,10 @@ fun IncomingFestivalCard(event: IncomingFestivalEventEntity) { modifier = Modifier .size(10.dp) .align(Alignment.CenterVertically), - - ) + ) Spacer(modifier = Modifier.width(5.dp)) Text(text = event.location, style = Content6, color = Color(0xFF848484)) } - } } } diff --git a/feature/home/src/main/kotlin/com/unifest/android/feature/home/viewmodel/HomeViewModel.kt b/feature/home/src/main/kotlin/com/unifest/android/feature/home/viewmodel/HomeViewModel.kt index 45796ac6..f5698964 100644 --- a/feature/home/src/main/kotlin/com/unifest/android/feature/home/viewmodel/HomeViewModel.kt +++ b/feature/home/src/main/kotlin/com/unifest/android/feature/home/viewmodel/HomeViewModel.kt @@ -20,7 +20,6 @@ class HomeViewModel @Inject constructor() : ViewModel() { init { _uiState.update { it.copy( - // 임시 데이터 incomingEvents = persistentListOf( IncomingFestivalEventEntity( imageRes = R.drawable.ic_waiting, @@ -62,4 +61,3 @@ class HomeViewModel @Inject constructor() : ViewModel() { } } } - From ac381dbced2fc4441a6d9f4dbba5547237eb1264 Mon Sep 17 00:00:00 2001 From: Jeong Sang Hoon Date: Thu, 4 Apr 2024 16:51:41 +0900 Subject: [PATCH 18/20] =?UTF-8?q?[feat]=20=EC=B6=95=EC=A0=9C=20=EC=9D=BC?= =?UTF-8?q?=EC=A0=95=20=EC=97=86=EC=9D=84=EB=95=8C=20=ED=99=94=EB=A9=B4=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/res/drawable/ic_schedule.xml | 9 +++ .../src/main/res/values/strings.xml | 2 + .../android/feature/home/HomeScreen.kt | 63 ++++++++++++++----- 3 files changed, 59 insertions(+), 15 deletions(-) create mode 100644 core/designsystem/src/main/res/drawable/ic_schedule.xml diff --git a/core/designsystem/src/main/res/drawable/ic_schedule.xml b/core/designsystem/src/main/res/drawable/ic_schedule.xml new file mode 100644 index 00000000..b50b8a03 --- /dev/null +++ b/core/designsystem/src/main/res/drawable/ic_schedule.xml @@ -0,0 +1,9 @@ + + + diff --git a/core/designsystem/src/main/res/values/strings.xml b/core/designsystem/src/main/res/values/strings.xml index b65a4b1a..294b8cad 100644 --- a/core/designsystem/src/main/res/values/strings.xml +++ b/core/designsystem/src/main/res/values/strings.xml @@ -30,6 +30,8 @@ 다가오는 축제 일정 관심 축제 추가하기 관심 축제로 추가 + 축제 일정 없음 + 오늘은 축제가 열리는 학교가 없어요 diff --git a/feature/home/src/main/kotlin/com/unifest/android/feature/home/HomeScreen.kt b/feature/home/src/main/kotlin/com/unifest/android/feature/home/HomeScreen.kt index 7cfe8a77..919f310b 100644 --- a/feature/home/src/main/kotlin/com/unifest/android/feature/home/HomeScreen.kt +++ b/feature/home/src/main/kotlin/com/unifest/android/feature/home/HomeScreen.kt @@ -40,6 +40,7 @@ import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalView import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.core.view.WindowInsetsCompat import androidx.hilt.navigation.compose.hiltViewModel @@ -94,26 +95,59 @@ internal fun HomeScreen( item { FestivalScheduleText() } - itemsIndexed(uiState.festivalEvents) { index, event -> - Column { - Spacer(modifier = Modifier.height(16.dp)) - FestivalScheduleItem(event, selectedEventId) { eventId -> - selectedEventId = if (selectedEventId == eventId) -1 else eventId + if (uiState.festivalEvents.isEmpty()) { + item { + Box( + contentAlignment = Alignment.Center, + modifier = Modifier + .fillMaxWidth() + .padding(64.dp), + ) { + Column(horizontalAlignment = Alignment.CenterHorizontally) { + Image( + painter = painterResource(id = R.drawable.ic_schedule), + contentDescription = "축제 없음", + modifier = Modifier + .size(23.dp), + ) + Spacer(modifier = Modifier.height(10.dp)) + Text( + text = stringResource(id = R.string.home_empty_festival_text), + style = Title2, + textAlign = TextAlign.Center, + ) + Spacer(modifier = Modifier.height(9.dp)) + Text( + text = stringResource(id = R.string.home_empty_festival_schedule_description_text), + style = Content6, + textAlign = TextAlign.Center, + color = Color(0xFF848484), + ) + } } } - if (index < uiState.festivalEvents.size - 1) { - Spacer(modifier = Modifier.height(16.dp)) - HorizontalDivider( - color = Color(0xFFDFDFDF), - modifier = Modifier - .padding(horizontal = 20.dp), - thickness = 1.dp, - ) + } else { + itemsIndexed(uiState.festivalEvents) { index, event -> + Column { + Spacer(modifier = Modifier.height(16.dp)) + FestivalScheduleItem(event, selectedEventId) { eventId -> + selectedEventId = if (selectedEventId == eventId) -1 else eventId + } + } + if (index < uiState.festivalEvents.size - 1) { + Spacer(modifier = Modifier.height(16.dp)) + HorizontalDivider( + color = Color(0xFFDFDFDF), + modifier = Modifier + .padding(horizontal = 20.dp), + thickness = 1.dp, + ) + } } } item { UnifestOutlinedButton( - onClick = { /*관심 축제 추가하기 버튼*/ }, + onClick = { onNavigateToIntro() }, modifier = Modifier .fillMaxWidth() .padding(20.dp), @@ -126,7 +160,6 @@ internal fun HomeScreen( ) } } - item { IncomingFestivalText() } From 3c680df20ed6d70e74551f8ccdd4c4b78a3de702 Mon Sep 17 00:00:00 2001 From: Jeong Sang Hoon Date: Thu, 4 Apr 2024 20:46:51 +0900 Subject: [PATCH 19/20] =?UTF-8?q?[refactor]=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EB=82=B4=EC=97=AD=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../android/feature/home/HomeScreen.kt | 116 ++++++++++++++---- .../feature/home/viewmodel/HomeViewModel.kt | 2 +- 2 files changed, 96 insertions(+), 22 deletions(-) diff --git a/feature/home/src/main/kotlin/com/unifest/android/feature/home/HomeScreen.kt b/feature/home/src/main/kotlin/com/unifest/android/feature/home/HomeScreen.kt index 919f310b..aec1c8f1 100644 --- a/feature/home/src/main/kotlin/com/unifest/android/feature/home/HomeScreen.kt +++ b/feature/home/src/main/kotlin/com/unifest/android/feature/home/HomeScreen.kt @@ -2,6 +2,7 @@ package com.unifest.android.feature.home import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box @@ -35,11 +36,11 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalView -import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.res.vectorResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.core.view.WindowInsetsCompat @@ -53,10 +54,13 @@ import com.unifest.android.core.designsystem.theme.Content5 import com.unifest.android.core.designsystem.theme.Content6 import com.unifest.android.core.designsystem.theme.Title2 import com.unifest.android.core.designsystem.theme.Title3 +import com.unifest.android.core.designsystem.theme.UnifestTheme import com.unifest.android.core.domain.entity.FestivalEventEntity import com.unifest.android.core.domain.entity.IncomingFestivalEventEntity +import com.unifest.android.core.ui.DevicePreview import com.unifest.android.feature.home.viewmodel.HomeUiState import com.unifest.android.feature.home.viewmodel.HomeViewModel +import kotlinx.collections.immutable.persistentListOf @Composable internal fun HomeRoute( @@ -105,10 +109,9 @@ internal fun HomeScreen( ) { Column(horizontalAlignment = Alignment.CenterHorizontally) { Image( - painter = painterResource(id = R.drawable.ic_schedule), + imageVector = ImageVector.vectorResource(id = R.drawable.ic_schedule), contentDescription = "축제 없음", - modifier = Modifier - .size(23.dp), + modifier = Modifier.size(23.dp), ) Spacer(modifier = Modifier.height(10.dp)) Text( @@ -138,8 +141,7 @@ internal fun HomeScreen( Spacer(modifier = Modifier.height(16.dp)) HorizontalDivider( color = Color(0xFFDFDFDF), - modifier = Modifier - .padding(horizontal = 20.dp), + modifier = Modifier.padding(horizontal = 20.dp), thickness = 1.dp, ) } @@ -202,24 +204,33 @@ fun FestivalScheduleItem( .align(Alignment.CenterVertically), ) Spacer(modifier = Modifier.width(8.dp)) - Column( - modifier = Modifier - .weight(1f), - ) { - Text(text = event.date, style = Content4, color = Color(0xFFC0C0C0)) + Column { + Text( + text = event.date, + style = Content4, + color = Color(0xFFC0C0C0), + ) Spacer(modifier = Modifier.height(5.dp)) - Text(text = event.name, style = Title2) + Text( + text = event.name, + style = Title2, + ) Spacer(modifier = Modifier.height(7.dp)) Row { Icon( - painter = painterResource(id = R.drawable.ic_location), + imageVector = ImageVector.vectorResource(id = R.drawable.ic_location), contentDescription = "Location Icon", modifier = Modifier .size(10.dp) .align(Alignment.CenterVertically), + tint = Color.Unspecified, ) Spacer(modifier = Modifier.width(5.dp)) - Text(text = event.location, style = Content5, color = Color(0xFF848484)) + Text( + text = event.location, + style = Content5, + color = Color(0xFF848484), + ) } } Spacer(modifier = Modifier.width(39.dp)) @@ -263,7 +274,6 @@ fun IncomingFestivalText() { @Composable fun IncomingFestivalCard(event: IncomingFestivalEventEntity) { - val imageResource: Painter = painterResource(id = event.imageRes) Card( modifier = Modifier .padding(horizontal = 20.dp) @@ -279,7 +289,7 @@ fun IncomingFestivalCard(event: IncomingFestivalEventEntity) { verticalAlignment = Alignment.CenterVertically, ) { Image( - painter = imageResource, + imageVector = ImageVector.vectorResource(id = event.imageRes), contentDescription = "${event.name} Logo", modifier = Modifier.size(52.dp), ) @@ -287,22 +297,86 @@ fun IncomingFestivalCard(event: IncomingFestivalEventEntity) { Column( modifier = Modifier.fillMaxWidth(), ) { - Text(text = event.dates, style = Content6, color = Color(0xFF848484)) + Text( + text = event.dates, + style = Content6, + color = Color(0xFF848484), + ) Spacer(modifier = Modifier.height(5.dp)) - Text(text = event.name, style = Content4) + Text( + text = event.name, + style = Content4, + ) Spacer(modifier = Modifier.height(5.dp)) Row { Icon( - painter = painterResource(id = R.drawable.ic_location), + imageVector = ImageVector.vectorResource(id = R.drawable.ic_location), contentDescription = "Location Icon", modifier = Modifier .size(10.dp) .align(Alignment.CenterVertically), + tint = Color.Unspecified, ) Spacer(modifier = Modifier.width(5.dp)) - Text(text = event.location, style = Content6, color = Color(0xFF848484)) + Text( + text = event.location, + style = Content6, + color = Color(0xFF848484), + ) } } } } } + +@OptIn(ExperimentalFoundationApi::class) +@DevicePreview +@Composable +fun PreviewIntroScreen() { + UnifestTheme { + HomeScreen( + uiState = HomeUiState( + festivalEvents = persistentListOf( + FestivalEventEntity( + id = 1, + date = "5/21(화)", + name = "녹색지대 DAY 1", + location = "건국대학교 서울캠퍼스", + celebrityImages = listOf(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15), + ), + FestivalEventEntity( + id = 2, + date = "5/21(화)", + name = "녹색지대 DAY 1", + location = "건국대학교 서울캠퍼스", + celebrityImages = listOf(0, 1, 2), + ), + FestivalEventEntity( + id = 3, + date = "5/21(화)", + name = "녹색지대 DAY 1", + location = "건국대학교 서울캠퍼스", + celebrityImages = listOf(0, 1, 2), + ), + ), + incomingEvents = persistentListOf( + IncomingFestivalEventEntity( + imageRes = R.drawable.ic_waiting, + name = "녹색지대", + dates = "05/21(화) - 05/23(목)", + location = "건국대학교 서울캠퍼스", + ), + IncomingFestivalEventEntity( + imageRes = R.drawable.ic_waiting, + name = "녹색지대", + dates = "05/21(화) - 05/23(목)", + location = "건국대학교 서울캠퍼스", + ), + ), + ), + + padding = PaddingValues(0.dp), + onNavigateToIntro = {}, + ) + } +} diff --git a/feature/home/src/main/kotlin/com/unifest/android/feature/home/viewmodel/HomeViewModel.kt b/feature/home/src/main/kotlin/com/unifest/android/feature/home/viewmodel/HomeViewModel.kt index f5698964..676f1b79 100644 --- a/feature/home/src/main/kotlin/com/unifest/android/feature/home/viewmodel/HomeViewModel.kt +++ b/feature/home/src/main/kotlin/com/unifest/android/feature/home/viewmodel/HomeViewModel.kt @@ -40,7 +40,7 @@ class HomeViewModel @Inject constructor() : ViewModel() { date = "5/21(화)", name = "녹색지대 DAY 1", location = "건국대학교 서울캠퍼스", - celebrityImages = listOf(0, 1, 2), + celebrityImages = listOf(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15), ), FestivalEventEntity( id = 2, From ce63ae13eefacc432cac782aaf60c1fe18ca5407 Mon Sep 17 00:00:00 2001 From: Jeong Sang Hoon Date: Thu, 4 Apr 2024 21:32:11 +0900 Subject: [PATCH 20/20] =?UTF-8?q?[chore]=20Preview=20=EC=9D=B4=EB=A6=84?= =?UTF-8?q?=ED=98=95=EC=8B=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/kotlin/com/unifest/android/feature/home/HomeScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature/home/src/main/kotlin/com/unifest/android/feature/home/HomeScreen.kt b/feature/home/src/main/kotlin/com/unifest/android/feature/home/HomeScreen.kt index aec1c8f1..8c3686c8 100644 --- a/feature/home/src/main/kotlin/com/unifest/android/feature/home/HomeScreen.kt +++ b/feature/home/src/main/kotlin/com/unifest/android/feature/home/HomeScreen.kt @@ -332,7 +332,7 @@ fun IncomingFestivalCard(event: IncomingFestivalEventEntity) { @OptIn(ExperimentalFoundationApi::class) @DevicePreview @Composable -fun PreviewIntroScreen() { +fun HomeScreenPreview() { UnifestTheme { HomeScreen( uiState = HomeUiState(