From d2b9c0dd374d74ed23ce5c8e40a3f649a7c4dd81 Mon Sep 17 00:00:00 2001 From: Giovanni Junseo Kim Date: Sat, 30 Nov 2024 22:55:44 +0900 Subject: [PATCH] Attendance screen configuration (#985) * chore: rename AttendanceType -> AttendanceSession * chore: delete state for components * chore: use immutable collection * chore: remove mock * feat: add AttendanceDayType.kt * feat: implement AttendanceScreen * feat: adjust layout * chore: move background setting to component * chore: merge state class into UiState class * chore: move package * chore: keep convention * chore: separate AttendanceGradientBox * chore: rename ProgressBarState to AttendanceProgressBarPreviewParameter * chore: keep convention --- .../attendance/NewAttendanceViewModel.kt | 14 +- .../attendance/compose/AttendanceRoute.kt | 4 +- .../attendance/compose/AttendanceScreen.kt | 200 +++++++++++++++++- .../{ => component}/AttendanceCodeDialog.kt | 21 +- .../compose/component/AttendanceCountCard.kt | 6 +- .../component/AttendanceGradientBox.kt | 36 ++++ .../component/AttendanceHistoryCard.kt | 17 +- .../component/AttendanceHistoryListCard.kt | 9 +- .../component/AttendanceProgressBar.kt | 59 ++++-- .../compose/component/FinalAttendanceCard.kt | 7 +- .../component/MidtermAttendanceCard.kt | 13 +- .../compose/component/TodayAttendanceCard.kt | 48 ++--- .../component/TodayNoAttendanceCard.kt | 26 +-- .../attendance/model/AttendanceHistory.kt | 7 - .../attendance/model/AttendanceResultType.kt | 8 - .../attendance/model/AttendanceType.kt | 6 - .../attendance/model/AttendanceUiState.kt | 104 ++++++++- .../attendance/model/FinalAttendance.kt | 31 --- .../attendance/model/MidtermAttendance.kt | 28 --- .../model/state/AttendanceProgressBarState.kt | 10 - .../model/state/TodayAttendanceCardState.kt | 13 -- .../model/state/TodayNoAttendanceCardState.kt | 7 - 22 files changed, 454 insertions(+), 220 deletions(-) rename app/src/main/java/org/sopt/official/feature/attendance/compose/{ => component}/AttendanceCodeDialog.kt (91%) create mode 100644 app/src/main/java/org/sopt/official/feature/attendance/compose/component/AttendanceGradientBox.kt delete mode 100644 app/src/main/java/org/sopt/official/feature/attendance/model/AttendanceHistory.kt delete mode 100644 app/src/main/java/org/sopt/official/feature/attendance/model/AttendanceResultType.kt delete mode 100644 app/src/main/java/org/sopt/official/feature/attendance/model/AttendanceType.kt delete mode 100644 app/src/main/java/org/sopt/official/feature/attendance/model/FinalAttendance.kt delete mode 100644 app/src/main/java/org/sopt/official/feature/attendance/model/MidtermAttendance.kt delete mode 100644 app/src/main/java/org/sopt/official/feature/attendance/model/state/AttendanceProgressBarState.kt delete mode 100644 app/src/main/java/org/sopt/official/feature/attendance/model/state/TodayAttendanceCardState.kt delete mode 100644 app/src/main/java/org/sopt/official/feature/attendance/model/state/TodayNoAttendanceCardState.kt diff --git a/app/src/main/java/org/sopt/official/feature/attendance/NewAttendanceViewModel.kt b/app/src/main/java/org/sopt/official/feature/attendance/NewAttendanceViewModel.kt index 2ed6b2d57..1a27461e7 100644 --- a/app/src/main/java/org/sopt/official/feature/attendance/NewAttendanceViewModel.kt +++ b/app/src/main/java/org/sopt/official/feature/attendance/NewAttendanceViewModel.kt @@ -1,34 +1,26 @@ package org.sopt.official.feature.attendance import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.launch import org.sopt.official.domain.repository.attendance.AttendanceRepository import org.sopt.official.feature.attendance.model.AttendanceUiState import javax.inject.Inject @HiltViewModel class NewAttendanceViewModel @Inject constructor( - private val attendanceRepository: AttendanceRepository + private val attendanceRepository: AttendanceRepository, ) : ViewModel() { init { fetchData() } - private val _uiState: MutableStateFlow = MutableStateFlow(AttendanceUiState.Loading) + private val _uiState: MutableStateFlow = + MutableStateFlow(AttendanceUiState.Loading) val uiState: StateFlow = _uiState - private var fakeTitle: String = "" - - fun updateUiState() { - viewModelScope.launch { - _uiState.emit(AttendanceUiState.Success(fakeTitle)) - } - } fun fetchData() { fetchSoptEvent() diff --git a/app/src/main/java/org/sopt/official/feature/attendance/compose/AttendanceRoute.kt b/app/src/main/java/org/sopt/official/feature/attendance/compose/AttendanceRoute.kt index 97e18ea45..30583e37e 100644 --- a/app/src/main/java/org/sopt/official/feature/attendance/compose/AttendanceRoute.kt +++ b/app/src/main/java/org/sopt/official/feature/attendance/compose/AttendanceRoute.kt @@ -5,8 +5,6 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Scaffold -import androidx.compose.material3.Text -import androidx.compose.material3.TopAppBar import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.remember @@ -56,6 +54,6 @@ fun AttendanceRoute(onClickBackIcon: () -> Unit) { @Composable fun NewAttendanceViewModel.rememberAttendanceActions(): AttendanceAction = remember(this) { AttendanceAction( - onFakeClick = this::updateUiState + onFakeClick = {} ) } diff --git a/app/src/main/java/org/sopt/official/feature/attendance/compose/AttendanceScreen.kt b/app/src/main/java/org/sopt/official/feature/attendance/compose/AttendanceScreen.kt index c686dcff4..e74e2b9bf 100644 --- a/app/src/main/java/org/sopt/official/feature/attendance/compose/AttendanceScreen.kt +++ b/app/src/main/java/org/sopt/official/feature/attendance/compose/AttendanceScreen.kt @@ -1,21 +1,209 @@ package org.sopt.official.feature.attendance.compose -import androidx.compose.foundation.layout.Arrangement + +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.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 +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.ButtonColors +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.tooling.preview.PreviewParameter +import androidx.compose.ui.tooling.preview.PreviewParameterProvider +import androidx.compose.ui.unit.dp +import kotlinx.collections.immutable.persistentListOf +import kotlinx.collections.immutable.persistentMapOf +import org.sopt.official.R +import org.sopt.official.designsystem.Black40 +import org.sopt.official.designsystem.Gray60 +import org.sopt.official.designsystem.SoptTheme +import org.sopt.official.feature.attendance.compose.component.AttendanceGradientBox +import org.sopt.official.feature.attendance.compose.component.AttendanceHistoryCard +import org.sopt.official.feature.attendance.compose.component.AttendanceTopAppBar +import org.sopt.official.feature.attendance.compose.component.TodayAttendanceCard +import org.sopt.official.feature.attendance.compose.component.TodayNoAttendanceCard +import org.sopt.official.feature.attendance.compose.component.TodayNoScheduleCard import org.sopt.official.feature.attendance.model.AttendanceAction import org.sopt.official.feature.attendance.model.AttendanceUiState +import org.sopt.official.feature.attendance.model.AttendanceUiState.Success.AttendanceDayType +import org.sopt.official.feature.attendance.model.AttendanceUiState.Success.AttendanceDayType.AttendanceDay.FinalAttendance +import org.sopt.official.feature.attendance.model.AttendanceUiState.Success.AttendanceDayType.AttendanceDay.MidtermAttendance +import org.sopt.official.feature.attendance.model.AttendanceUiState.Success.AttendanceHistory +import org.sopt.official.feature.attendance.model.AttendanceUiState.Success.AttendanceResultType @Composable fun AttendanceScreen(state: AttendanceUiState.Success, action: AttendanceAction) { - Column( - modifier = Modifier.fillMaxSize(), - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Center + val scrollState = rememberScrollState() + Box( + modifier = Modifier + .fillMaxSize() + .padding(horizontal = 20.dp), + contentAlignment = Alignment.BottomCenter ) { - // TODO + Column( + modifier = Modifier.fillMaxHeight(), + horizontalAlignment = Alignment.CenterHorizontally + ) { + Spacer(Modifier.height(16.dp)) + when (state.attendanceDayType) { + is AttendanceDayType.AttendanceDay -> { + TodayAttendanceCard( + modifier = Modifier.fillMaxWidth(), + eventDate = state.attendanceDayType.eventDate, + eventLocation = state.attendanceDayType.eventLocation, + eventName = state.attendanceDayType.eventName, + firstAttendance = state.attendanceDayType.firstAttendance, + secondAttendance = state.attendanceDayType.secondAttendance, + finalAttendance = state.attendanceDayType.finalAttendance, + ) + } + + is AttendanceDayType.Event -> { + TodayNoAttendanceCard( + modifier = Modifier.fillMaxWidth(), + eventDate = state.attendanceDayType.eventDate, + eventLocation = state.attendanceDayType.eventLocation, + eventName = state.attendanceDayType.eventLocation, + ) + } + + AttendanceDayType.None -> { + TodayNoScheduleCard( + modifier = Modifier.fillMaxWidth() + ) + } + } + Spacer(Modifier.height(20.dp)) + AttendanceHistoryCard( + userTitle = state.userTitle, + attendanceScore = state.attendanceScore, + totalAttendanceResult = state.totalAttendanceResult, + attendanceHistoryList = state.attendanceHistoryList, + scrollState = scrollState, + ) + Spacer(Modifier.height(36.dp)) + } + AttendanceGradientBox() + TextButton( + onClick = { /*TODO*/ }, + modifier = Modifier + .fillMaxWidth() + .padding(bottom = 9.dp), + shape = RoundedCornerShape(size = 6.dp), + colors = ButtonColors( + containerColor = SoptTheme.colors.onSurface10, + contentColor = SoptTheme.colors.onSurface950, + disabledContainerColor = Black40, + disabledContentColor = Gray60, + ), + contentPadding = PaddingValues(vertical = 16.dp) + ) { + Text( + text = stringResource(R.string.attendance_dialog_button), + style = SoptTheme.typography.label18SB, + ) + } } } + +@Preview +@Composable +private fun AttendanceScreenPreview(@PreviewParameter(AttendanceScreenPreviewParameterProvider::class) parameter: AttendanceScreenPreviewParameter) { + SoptTheme { + Scaffold( + topBar = { + AttendanceTopAppBar( + onClickBackIcon = { }, + onClickRefreshIcon = { } + ) + } + ) { innerPaddingValues -> + Column( + modifier = Modifier + .fillMaxSize() + .background(color = SoptTheme.colors.background) + .padding(innerPaddingValues) + ) { + AttendanceScreen( + state = AttendanceUiState.Success( + attendanceDayType = parameter.attendanceDayType, + userTitle = "32기 디자인파트 김솝트", + attendanceScore = 1, + totalAttendanceResult = persistentMapOf( + Pair(AttendanceResultType.ALL, 16), + Pair(AttendanceResultType.PRESENT, 10), + Pair(AttendanceResultType.LATE, 4), + Pair(AttendanceResultType.ABSENT, 2) + ), + attendanceHistoryList = persistentListOf( + AttendanceHistory( + status = "출석", eventName = "1차 세미나", date = "00월 00일" + ), + AttendanceHistory( + status = "출석", eventName = "2차 세미나", date = "00월 00일" + ), + AttendanceHistory( + status = "출석", eventName = "3차 세미나", date = "00월 00일" + ), + AttendanceHistory( + status = "출석", eventName = "4차 세미나", date = "00월 00일" + ), + AttendanceHistory( + status = "출석", eventName = "5차 세미나", date = "00월 00일" + ), + AttendanceHistory( + status = "출석", eventName = "6차 세미나", date = "00월 00일" + ), + ), + ), + action = AttendanceAction(onFakeClick = {}) + ) + } + } + } +} + +data class AttendanceScreenPreviewParameter( + val attendanceDayType: AttendanceDayType, +) + + +class AttendanceScreenPreviewParameterProvider() : + PreviewParameterProvider { + + override val values: Sequence = sequenceOf( + AttendanceScreenPreviewParameter( + attendanceDayType = AttendanceDayType.AttendanceDay( + eventDate = "3월 23일 토요일 14:00 - 18:00", + eventLocation = "건국대학교 꽥꽥오리관", + eventName = "2차 세미나", + firstAttendance = MidtermAttendance.Present(attendanceAt = "14:00"), + secondAttendance = MidtermAttendance.Absent, + finalAttendance = FinalAttendance.LATE, + ) + ), AttendanceScreenPreviewParameter( + attendanceDayType = AttendanceDayType.Event( + eventDate = "3월 23일 토요일 14:00 - 18:00", + eventLocation = "건국대학교 꽥꽥오리관", + eventName = "2차 세미나", + ) + ), + AttendanceScreenPreviewParameter( + attendanceDayType = AttendanceDayType.None + ) + ) +} \ No newline at end of file diff --git a/app/src/main/java/org/sopt/official/feature/attendance/compose/AttendanceCodeDialog.kt b/app/src/main/java/org/sopt/official/feature/attendance/compose/component/AttendanceCodeDialog.kt similarity index 91% rename from app/src/main/java/org/sopt/official/feature/attendance/compose/AttendanceCodeDialog.kt rename to app/src/main/java/org/sopt/official/feature/attendance/compose/component/AttendanceCodeDialog.kt index e8ece72ff..00568b876 100644 --- a/app/src/main/java/org/sopt/official/feature/attendance/compose/AttendanceCodeDialog.kt +++ b/app/src/main/java/org/sopt/official/feature/attendance/compose/component/AttendanceCodeDialog.kt @@ -1,4 +1,4 @@ -package org.sopt.official.feature.attendance.compose +package org.sopt.official.feature.attendance.compose.component import androidx.compose.foundation.background import androidx.compose.foundation.clickable @@ -28,14 +28,13 @@ import org.sopt.official.R import org.sopt.official.designsystem.Black40 import org.sopt.official.designsystem.Gray60 import org.sopt.official.designsystem.SoptTheme -import org.sopt.official.feature.attendance.compose.component.AttendanceCodeCardList -import org.sopt.official.feature.attendance.model.AttendanceType +import org.sopt.official.feature.attendance.model.AttendanceUiState.Success.AttendanceDayType.AttendanceDay.MidtermAttendance.NotYet.AttendanceSession @Composable fun AttendanceCodeDialog( codes: ImmutableList, inputCodes: ImmutableList, - attendanceType: AttendanceType, + attendanceSession: AttendanceSession, onDismissRequest: () -> Unit, modifier: Modifier = Modifier, ) { @@ -58,7 +57,7 @@ fun AttendanceCodeDialog( .clickable(onClick = onDismissRequest) ) Text( - text = stringResource(R.string.attendance_do, attendanceType.type), + text = stringResource(R.string.attendance_do, attendanceSession.type), style = SoptTheme.typography.heading18B, color = SoptTheme.colors.onSurface10 ) @@ -114,7 +113,7 @@ private fun AttendanceCodeDialogPreview( AttendanceCodeDialog( codes = parameter.codes, inputCodes = parameter.inputCodes, - attendanceType = parameter.attendanceType, + attendanceSession = parameter.attendanceSession, modifier = Modifier.fillMaxWidth(), onDismissRequest = {} ) @@ -124,7 +123,7 @@ private fun AttendanceCodeDialogPreview( data class AttendanceCodeDialogPreviewParameter( val codes: ImmutableList, val inputCodes: ImmutableList, - val attendanceType: AttendanceType, + val attendanceSession: AttendanceSession, ) class AttendanceCodeDialogPreviewParameterProvider : @@ -134,22 +133,22 @@ class AttendanceCodeDialogPreviewParameterProvider : AttendanceCodeDialogPreviewParameter( codes = persistentListOf("1", "2", "3", "4", "5"), inputCodes = persistentListOf("1", "2", "3", null, null), - AttendanceType.FIRST, + AttendanceSession.FIRST, ), AttendanceCodeDialogPreviewParameter( codes = persistentListOf("1", "2", "3", "4", "5"), inputCodes = persistentListOf("1", "2", "3", "4", "5"), - AttendanceType.FIRST, + AttendanceSession.FIRST, ), AttendanceCodeDialogPreviewParameter( codes = persistentListOf("1", "2", "3", "4", "5"), inputCodes = persistentListOf("1", "2", "3", null, null), - AttendanceType.SECOND, + AttendanceSession.SECOND, ), AttendanceCodeDialogPreviewParameter( codes = persistentListOf("1", "2", "3", "4", "5"), inputCodes = persistentListOf("1", "2", "3", "4", "5"), - AttendanceType.SECOND, + AttendanceSession.SECOND, ), ) } \ No newline at end of file diff --git a/app/src/main/java/org/sopt/official/feature/attendance/compose/component/AttendanceCountCard.kt b/app/src/main/java/org/sopt/official/feature/attendance/compose/component/AttendanceCountCard.kt index 624de66f9..2dc1b69fe 100644 --- a/app/src/main/java/org/sopt/official/feature/attendance/compose/component/AttendanceCountCard.kt +++ b/app/src/main/java/org/sopt/official/feature/attendance/compose/component/AttendanceCountCard.kt @@ -16,7 +16,11 @@ import org.sopt.official.R import org.sopt.official.designsystem.SoptTheme @Composable -fun AttendanceCountCard(resultType: String, count: Int, modifier: Modifier = Modifier) { +fun AttendanceCountCard( + resultType: String, + count: Int, + modifier: Modifier = Modifier +) { Column(modifier = modifier, horizontalAlignment = Alignment.CenterHorizontally) { Text( text = resultType, diff --git a/app/src/main/java/org/sopt/official/feature/attendance/compose/component/AttendanceGradientBox.kt b/app/src/main/java/org/sopt/official/feature/attendance/compose/component/AttendanceGradientBox.kt new file mode 100644 index 000000000..b6b2a1d6a --- /dev/null +++ b/app/src/main/java/org/sopt/official/feature/attendance/compose/component/AttendanceGradientBox.kt @@ -0,0 +1,36 @@ +package org.sopt.official.feature.attendance.compose.component + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp + +@Composable +fun AttendanceGradientBox(modifier: Modifier = Modifier) { + Box( + modifier = modifier + .fillMaxWidth() + .height(148.dp) + .background( + brush = Brush.verticalGradient( + colors = listOf( + Color(0x000F1010), Color(0xFF0F1010) + ) + ) + ) + .padding(bottom = 41.dp) + ) +} + +@Preview +@Composable +private fun AttendanceGradientBoxPreview() { + AttendanceGradientBox() +} \ No newline at end of file diff --git a/app/src/main/java/org/sopt/official/feature/attendance/compose/component/AttendanceHistoryCard.kt b/app/src/main/java/org/sopt/official/feature/attendance/compose/component/AttendanceHistoryCard.kt index b0f71e546..be41474d7 100644 --- a/app/src/main/java/org/sopt/official/feature/attendance/compose/component/AttendanceHistoryCard.kt +++ b/app/src/main/java/org/sopt/official/feature/attendance/compose/component/AttendanceHistoryCard.kt @@ -15,10 +15,11 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.google.common.collect.ImmutableList +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.persistentListOf import org.sopt.official.designsystem.SoptTheme -import org.sopt.official.feature.attendance.model.AttendanceHistory -import org.sopt.official.feature.attendance.model.AttendanceResultType +import org.sopt.official.feature.attendance.model.AttendanceUiState.Success.AttendanceHistory +import org.sopt.official.feature.attendance.model.AttendanceUiState.Success.AttendanceResultType @Composable fun AttendanceHistoryCard( @@ -26,11 +27,15 @@ fun AttendanceHistoryCard( attendanceScore: Int, totalAttendanceResult: Map, attendanceHistoryList: ImmutableList, - scrollState: ScrollState, modifier: Modifier = Modifier + scrollState: ScrollState, + modifier: Modifier = Modifier, ) { Column( modifier = modifier - .background(color = SoptTheme.colors.onSurface800) + .background( + color = SoptTheme.colors.onSurface800, + shape = RoundedCornerShape(16.dp) + ) .padding(all = 32.dp) ) { AttendanceHistoryUserInfoCard( @@ -74,7 +79,7 @@ private fun AttendanceHistoryCardPreview() { Pair(AttendanceResultType.LATE, 0), Pair(AttendanceResultType.ABSENT, 11) ), - attendanceHistoryList = ImmutableList.of( + attendanceHistoryList = persistentListOf( AttendanceHistory( status = "출석", eventName = "1차 세미나", date = "00월 00일" ), diff --git a/app/src/main/java/org/sopt/official/feature/attendance/compose/component/AttendanceHistoryListCard.kt b/app/src/main/java/org/sopt/official/feature/attendance/compose/component/AttendanceHistoryListCard.kt index 737dfb273..126ce0bf5 100644 --- a/app/src/main/java/org/sopt/official/feature/attendance/compose/component/AttendanceHistoryListCard.kt +++ b/app/src/main/java/org/sopt/official/feature/attendance/compose/component/AttendanceHistoryListCard.kt @@ -16,15 +16,16 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.google.common.collect.ImmutableList +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.persistentListOf import org.sopt.official.designsystem.SoptTheme -import org.sopt.official.feature.attendance.model.AttendanceHistory +import org.sopt.official.feature.attendance.model.AttendanceUiState.Success.AttendanceHistory @Composable fun AttendanceHistoryListCard( attendanceHistoryList: ImmutableList, scrollState: ScrollState, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { Column(modifier = modifier) { Text( @@ -74,7 +75,7 @@ fun AttendanceHistoryListCard( private fun AttendanceHistoryListCardPreview() { SoptTheme { AttendanceHistoryListCard( - attendanceHistoryList = ImmutableList.of( + attendanceHistoryList = persistentListOf( AttendanceHistory( status = "출석", eventName = "1차 세미나", date = "00월 00일" ), diff --git a/app/src/main/java/org/sopt/official/feature/attendance/compose/component/AttendanceProgressBar.kt b/app/src/main/java/org/sopt/official/feature/attendance/compose/component/AttendanceProgressBar.kt index 217e21267..4dd011136 100644 --- a/app/src/main/java/org/sopt/official/feature/attendance/compose/component/AttendanceProgressBar.kt +++ b/app/src/main/java/org/sopt/official/feature/attendance/compose/component/AttendanceProgressBar.kt @@ -14,19 +14,23 @@ import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.unit.dp import org.sopt.official.designsystem.SoptTheme -import org.sopt.official.feature.attendance.model.AttendanceType -import org.sopt.official.feature.attendance.model.FinalAttendance -import org.sopt.official.feature.attendance.model.MidtermAttendance -import org.sopt.official.feature.attendance.model.state.AttendanceProgressBarState +import org.sopt.official.feature.attendance.model.AttendanceUiState.Success.AttendanceDayType.AttendanceDay.FinalAttendance +import org.sopt.official.feature.attendance.model.AttendanceUiState.Success.AttendanceDayType.AttendanceDay.MidtermAttendance +import org.sopt.official.feature.attendance.model.AttendanceUiState.Success.AttendanceDayType.AttendanceDay.MidtermAttendance.NotYet.AttendanceSession @Composable -fun AttendanceProgressBar(state: AttendanceProgressBarState, modifier: Modifier = Modifier) { +fun AttendanceProgressBar( + firstAttendance: MidtermAttendance, + secondAttendance: MidtermAttendance, + finalAttendance: FinalAttendance, + modifier: Modifier = Modifier +) { Box(modifier = modifier) { LinearProgressIndicator( progress = { calculateAttendanceProgress( - firstAttendance = state.firstAttendance, - secondAttendance = state.secondAttendance + firstAttendance = firstAttendance, + secondAttendance = secondAttendance ) }, modifier = Modifier @@ -41,13 +45,13 @@ fun AttendanceProgressBar(state: AttendanceProgressBarState, modifier: Modifier horizontalArrangement = Arrangement.SpaceBetween ) { MidtermAttendanceCard( - midtermAttendance = state.firstAttendance, + midtermAttendance = firstAttendance, ) MidtermAttendanceCard( - midtermAttendance = state.secondAttendance, + midtermAttendance = secondAttendance, ) FinalAttendanceCard( - finalAttendance = state.finalAttendance, + finalAttendance = finalAttendance, ) } } @@ -55,7 +59,7 @@ fun AttendanceProgressBar(state: AttendanceProgressBarState, modifier: Modifier fun calculateAttendanceProgress( firstAttendance: MidtermAttendance, - secondAttendance: MidtermAttendance + secondAttendance: MidtermAttendance, ): Float { if (!firstAttendance.isFinished) return 0f if (!secondAttendance.isFinished) { @@ -65,37 +69,48 @@ fun calculateAttendanceProgress( } } + +class AttendanceProgressBarPreviewParameter( + val firstAttendance: MidtermAttendance, + val secondAttendance: MidtermAttendance, + val finalAttendance: FinalAttendance, +) + class AttendanceProgressBarPreviewParameterProvider( - override val values: Sequence = sequenceOf( - AttendanceProgressBarState( - firstAttendance = MidtermAttendance.NotYet(AttendanceType.FIRST), - secondAttendance = MidtermAttendance.NotYet(AttendanceType.SECOND), + override val values: Sequence = sequenceOf( + AttendanceProgressBarPreviewParameter( + firstAttendance = MidtermAttendance.NotYet(AttendanceSession.FIRST), + secondAttendance = MidtermAttendance.NotYet(AttendanceSession.SECOND), finalAttendance = FinalAttendance.NOT_YET, ), - AttendanceProgressBarState( + AttendanceProgressBarPreviewParameter( firstAttendance = MidtermAttendance.Present(attendanceAt = "14:00"), secondAttendance = MidtermAttendance.Absent, finalAttendance = FinalAttendance.LATE, ), - AttendanceProgressBarState( + AttendanceProgressBarPreviewParameter( firstAttendance = MidtermAttendance.Present(attendanceAt = "14:00"), secondAttendance = MidtermAttendance.Present(attendanceAt = "16:00"), finalAttendance = FinalAttendance.PRESENT, ), - AttendanceProgressBarState( + AttendanceProgressBarPreviewParameter( firstAttendance = MidtermAttendance.Absent, secondAttendance = MidtermAttendance.Absent, finalAttendance = FinalAttendance.ABSENT, ), - ) -) : PreviewParameterProvider + ), +) : PreviewParameterProvider @Preview(showBackground = true) @Composable private fun AttendanceProgressBarPreview( - @PreviewParameter(AttendanceProgressBarPreviewParameterProvider::class) attendanceProgressBarState: AttendanceProgressBarState + @PreviewParameter(AttendanceProgressBarPreviewParameterProvider::class) attendanceProgressBarPreviewParameter: AttendanceProgressBarPreviewParameter, ) { SoptTheme { - AttendanceProgressBar(state = attendanceProgressBarState) + AttendanceProgressBar( + firstAttendance = attendanceProgressBarPreviewParameter.firstAttendance, + secondAttendance = attendanceProgressBarPreviewParameter.secondAttendance, + finalAttendance = attendanceProgressBarPreviewParameter.finalAttendance + ) } } diff --git a/app/src/main/java/org/sopt/official/feature/attendance/compose/component/FinalAttendanceCard.kt b/app/src/main/java/org/sopt/official/feature/attendance/compose/component/FinalAttendanceCard.kt index 8260be5dc..4a10415ff 100644 --- a/app/src/main/java/org/sopt/official/feature/attendance/compose/component/FinalAttendanceCard.kt +++ b/app/src/main/java/org/sopt/official/feature/attendance/compose/component/FinalAttendanceCard.kt @@ -14,10 +14,13 @@ import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.unit.dp import org.sopt.official.designsystem.SoptTheme -import org.sopt.official.feature.attendance.model.FinalAttendance +import org.sopt.official.feature.attendance.model.AttendanceUiState.Success.AttendanceDayType.AttendanceDay.FinalAttendance @Composable -fun FinalAttendanceCard(finalAttendance: FinalAttendance, modifier: Modifier = Modifier) { +fun FinalAttendanceCard( + finalAttendance: FinalAttendance, + modifier: Modifier = Modifier +) { Column( modifier = modifier.padding(horizontal = 12.dp), horizontalAlignment = Alignment.CenterHorizontally, diff --git a/app/src/main/java/org/sopt/official/feature/attendance/compose/component/MidtermAttendanceCard.kt b/app/src/main/java/org/sopt/official/feature/attendance/compose/component/MidtermAttendanceCard.kt index 9d93552eb..3c75cfeb0 100644 --- a/app/src/main/java/org/sopt/official/feature/attendance/compose/component/MidtermAttendanceCard.kt +++ b/app/src/main/java/org/sopt/official/feature/attendance/compose/component/MidtermAttendanceCard.kt @@ -13,11 +13,14 @@ import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.unit.dp import org.sopt.official.designsystem.SoptTheme -import org.sopt.official.feature.attendance.model.AttendanceType -import org.sopt.official.feature.attendance.model.MidtermAttendance +import org.sopt.official.feature.attendance.model.AttendanceUiState.Success.AttendanceDayType.AttendanceDay.MidtermAttendance +import org.sopt.official.feature.attendance.model.AttendanceUiState.Success.AttendanceDayType.AttendanceDay.MidtermAttendance.NotYet.AttendanceSession @Composable -fun MidtermAttendanceCard(midtermAttendance: MidtermAttendance, modifier: Modifier = Modifier) { +fun MidtermAttendanceCard( + midtermAttendance: MidtermAttendance, + modifier: Modifier = Modifier, +) { Column( modifier = modifier.padding(horizontal = 12.dp), horizontalAlignment = Alignment.CenterHorizontally, @@ -36,10 +39,10 @@ fun MidtermAttendanceCard(midtermAttendance: MidtermAttendance, modifier: Modifi class MidtermAttendanceCardPreviewParameterProvider( override val values: Sequence = sequenceOf( - MidtermAttendance.NotYet(attendanceType = AttendanceType.FIRST), + MidtermAttendance.NotYet(attendanceSession = AttendanceSession.FIRST), MidtermAttendance.Present(attendanceAt = "14:00"), MidtermAttendance.Absent, - ) + ), ) : PreviewParameterProvider @Preview(showBackground = true) diff --git a/app/src/main/java/org/sopt/official/feature/attendance/compose/component/TodayAttendanceCard.kt b/app/src/main/java/org/sopt/official/feature/attendance/compose/component/TodayAttendanceCard.kt index 1957b5bea..89f8c649b 100644 --- a/app/src/main/java/org/sopt/official/feature/attendance/compose/component/TodayAttendanceCard.kt +++ b/app/src/main/java/org/sopt/official/feature/attendance/compose/component/TodayAttendanceCard.kt @@ -20,21 +20,26 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import org.sopt.official.R import org.sopt.official.designsystem.SoptTheme -import org.sopt.official.feature.attendance.model.FinalAttendance -import org.sopt.official.feature.attendance.model.MidtermAttendance -import org.sopt.official.feature.attendance.model.state.AttendanceProgressBarState -import org.sopt.official.feature.attendance.model.state.TodayAttendanceCardState +import org.sopt.official.feature.attendance.model.AttendanceUiState.Success.AttendanceDayType.AttendanceDay.FinalAttendance +import org.sopt.official.feature.attendance.model.AttendanceUiState.Success.AttendanceDayType.AttendanceDay.MidtermAttendance @Composable -fun TodayAttendanceCard(state: TodayAttendanceCardState, modifier: Modifier = Modifier) { +fun TodayAttendanceCard( + eventDate: String, + eventLocation: String, + eventName: String, + firstAttendance: MidtermAttendance, + secondAttendance: MidtermAttendance, + finalAttendance: FinalAttendance, + modifier: Modifier = Modifier, +) { Column( - modifier = modifier .background( color = SoptTheme.colors.onSurface800, shape = RoundedCornerShape(16.dp) ) - .padding(horizontal = 24.dp, vertical = 32.dp), + .padding(horizontal = 24.dp, vertical = 32.dp) ) { Row(verticalAlignment = Alignment.CenterVertically) { Icon( @@ -44,7 +49,7 @@ fun TodayAttendanceCard(state: TodayAttendanceCardState, modifier: Modifier = Mo ) Spacer(modifier = Modifier.width(4.dp)) Text( - text = state.eventDate, + text = eventDate, color = SoptTheme.colors.onSurface300, style = SoptTheme.typography.body14M ) @@ -58,7 +63,7 @@ fun TodayAttendanceCard(state: TodayAttendanceCardState, modifier: Modifier = Mo ) Spacer(modifier = Modifier.width(4.dp)) Text( - text = state.eventLocation, + text = eventLocation, color = SoptTheme.colors.onSurface300, style = SoptTheme.typography.body14M ) @@ -71,7 +76,7 @@ fun TodayAttendanceCard(state: TodayAttendanceCardState, modifier: Modifier = Mo style = SoptTheme.typography.body18M ) Text( - text = state.eventName, + text = eventName, color = SoptTheme.colors.onSurface10, style = SoptTheme.typography.body18M.copy(fontWeight = FontWeight.ExtraBold) ) @@ -83,11 +88,9 @@ fun TodayAttendanceCard(state: TodayAttendanceCardState, modifier: Modifier = Mo } Spacer(modifier = Modifier.height(12.dp)) AttendanceProgressBar( - state = AttendanceProgressBarState( - firstAttendance = state.firstAttendance, - secondAttendance = state.secondAttendance, - finalAttendance = state.finalAttendance, - ) + firstAttendance = firstAttendance, + secondAttendance = secondAttendance, + finalAttendance = finalAttendance, ) } } @@ -100,15 +103,12 @@ private fun TodayAttendanceCardPreview() { modifier = Modifier.background(color = SoptTheme.colors.background) ) { TodayAttendanceCard( - state = - TodayAttendanceCardState( - eventDate = "3월 23일 토요일 14:00 - 18:00", - eventLocation = "건국대학교 꽥꽥오리관", - eventName = "2차 세미나", - firstAttendance = MidtermAttendance.Present(attendanceAt = "14:00"), - secondAttendance = MidtermAttendance.Absent, - finalAttendance = FinalAttendance.LATE, - ), + eventDate = "3월 23일 토요일 14:00 - 18:00", + eventLocation = "건국대학교 꽥꽥오리관", + eventName = "2차 세미나", + firstAttendance = MidtermAttendance.Present(attendanceAt = "14:00"), + secondAttendance = MidtermAttendance.Absent, + finalAttendance = FinalAttendance.LATE, ) } } diff --git a/app/src/main/java/org/sopt/official/feature/attendance/compose/component/TodayNoAttendanceCard.kt b/app/src/main/java/org/sopt/official/feature/attendance/compose/component/TodayNoAttendanceCard.kt index 448b418fd..f70e09d44 100644 --- a/app/src/main/java/org/sopt/official/feature/attendance/compose/component/TodayNoAttendanceCard.kt +++ b/app/src/main/java/org/sopt/official/feature/attendance/compose/component/TodayNoAttendanceCard.kt @@ -20,13 +20,16 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import org.sopt.official.R import org.sopt.official.designsystem.SoptTheme -import org.sopt.official.feature.attendance.model.state.TodayNoAttendanceCardState @Composable -fun TodayNoAttendanceCard(state: TodayNoAttendanceCardState, modifier: Modifier = Modifier) { +fun TodayNoAttendanceCard( + eventDate: String, + eventLocation: String, + eventName: String, + modifier: Modifier = Modifier, +) { Column( - modifier = - modifier + modifier = modifier .background( color = SoptTheme.colors.onSurface800, shape = RoundedCornerShape(16.dp) @@ -41,7 +44,7 @@ fun TodayNoAttendanceCard(state: TodayNoAttendanceCardState, modifier: Modifier ) Spacer(modifier = Modifier.width(4.dp)) Text( - text = state.eventDate, + text = eventDate, color = SoptTheme.colors.onSurface300, style = SoptTheme.typography.body14M ) @@ -55,7 +58,7 @@ fun TodayNoAttendanceCard(state: TodayNoAttendanceCardState, modifier: Modifier ) Spacer(modifier = Modifier.width(4.dp)) Text( - text = state.eventLocation, + text = eventLocation, color = SoptTheme.colors.onSurface300, style = SoptTheme.typography.body14M ) @@ -68,7 +71,7 @@ fun TodayNoAttendanceCard(state: TodayNoAttendanceCardState, modifier: Modifier style = SoptTheme.typography.body18M ) Text( - text = state.eventName, + text = eventName, color = SoptTheme.colors.onSurface10, style = SoptTheme.typography.body18M.copy(fontWeight = FontWeight.ExtraBold) ) @@ -93,12 +96,9 @@ private fun TodayNoAttendanceCardPreview() { SoptTheme { Column(modifier = Modifier.background(color = SoptTheme.colors.background)) { TodayNoAttendanceCard( - state = - TodayNoAttendanceCardState( - eventDate = "5월 12일 일요일 14:00 - 18:00", - eventLocation = "배달의민족주문~", - eventName = "데모데이", - ), + eventDate = "5월 12일 일요일 14:00 - 18:00", + eventLocation = "배달의민족주문~", + eventName = "데모데이", ) } } diff --git a/app/src/main/java/org/sopt/official/feature/attendance/model/AttendanceHistory.kt b/app/src/main/java/org/sopt/official/feature/attendance/model/AttendanceHistory.kt deleted file mode 100644 index cc4744112..000000000 --- a/app/src/main/java/org/sopt/official/feature/attendance/model/AttendanceHistory.kt +++ /dev/null @@ -1,7 +0,0 @@ -package org.sopt.official.feature.attendance.model - -data class AttendanceHistory( - val status: String, - val eventName: String, - val date: String, -) \ No newline at end of file diff --git a/app/src/main/java/org/sopt/official/feature/attendance/model/AttendanceResultType.kt b/app/src/main/java/org/sopt/official/feature/attendance/model/AttendanceResultType.kt deleted file mode 100644 index 4da216854..000000000 --- a/app/src/main/java/org/sopt/official/feature/attendance/model/AttendanceResultType.kt +++ /dev/null @@ -1,8 +0,0 @@ -package org.sopt.official.feature.attendance.model - -enum class AttendanceResultType(val type: String) { - ALL(type = "전체"), - PRESENT(type = "출석"), - LATE(type = "지각"), - ABSENT(type = "결석"); -} \ No newline at end of file diff --git a/app/src/main/java/org/sopt/official/feature/attendance/model/AttendanceType.kt b/app/src/main/java/org/sopt/official/feature/attendance/model/AttendanceType.kt deleted file mode 100644 index f3fcb23b6..000000000 --- a/app/src/main/java/org/sopt/official/feature/attendance/model/AttendanceType.kt +++ /dev/null @@ -1,6 +0,0 @@ -package org.sopt.official.feature.attendance.model - -enum class AttendanceType(val type: String) { - FIRST("1차 출석"), - SECOND("2차 출석") -} diff --git a/app/src/main/java/org/sopt/official/feature/attendance/model/AttendanceUiState.kt b/app/src/main/java/org/sopt/official/feature/attendance/model/AttendanceUiState.kt index 366dedcde..6527c2c53 100644 --- a/app/src/main/java/org/sopt/official/feature/attendance/model/AttendanceUiState.kt +++ b/app/src/main/java/org/sopt/official/feature/attendance/model/AttendanceUiState.kt @@ -1,10 +1,110 @@ package org.sopt.official.feature.attendance.model +import androidx.annotation.DrawableRes +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.ImmutableMap +import org.sopt.official.R + sealed interface AttendanceUiState { data object Loading : AttendanceUiState data class Success( - val fakeTitle: String - ) : AttendanceUiState + val attendanceDayType: AttendanceDayType, + val userTitle: String, + val attendanceScore: Int, + val totalAttendanceResult: ImmutableMap, + val attendanceHistoryList: ImmutableList, + ) : AttendanceUiState { + sealed interface AttendanceDayType { + /** 출석이 진행되는 날 **/ + data class AttendanceDay( + val eventDate: String, + val eventLocation: String, + val eventName: String, + val firstAttendance: MidtermAttendance, + val secondAttendance: MidtermAttendance, + val finalAttendance: FinalAttendance, + ) : AttendanceDayType { + sealed class MidtermAttendance( + @DrawableRes val imageResId: Int, + val isFinished: Boolean, + val description: String, + ) { + data class NotYet(val attendanceSession: AttendanceSession) : MidtermAttendance( + imageResId = R.drawable.ic_attendance_state_nothing, + isFinished = false, + description = attendanceSession.type + ) { + enum class AttendanceSession(val type: String) { + FIRST("1차 출석"), + SECOND("2차 출석") + } + } + + data class Present(val attendanceAt: String) : MidtermAttendance( + imageResId = R.drawable.ic_attendance_state_yes, + isFinished = true, + description = attendanceAt + ) + + data object Absent : MidtermAttendance( + imageResId = R.drawable.ic_attendance_state_absence_white, + isFinished = true, + description = "-" + ) + } + + enum class FinalAttendance( + @DrawableRes val imageResId: Int, + val isFinished: Boolean, + val result: String, + ) { + NOT_YET( + imageResId = R.drawable.ic_attendance_state_nothing, + isFinished = false, + result = "출석 전" + ), + PRESENT( + imageResId = R.drawable.ic_attendance_state_done, + isFinished = true, + result = "출석완료!" + ), + LATE( + imageResId = R.drawable.ic_attendance_state_late, + isFinished = true, + result = "지각" + ), + ABSENT( + imageResId = R.drawable.ic_attendance_state_absence_black, + isFinished = true, + result = "결석" + ) + } + } + + /** 출석할 필요가 없는 날 **/ + data class Event( + val eventDate: String, + val eventLocation: String, + val eventName: String, + ) : AttendanceDayType + + /** 아무 일정이 없는 날 **/ + data object None : AttendanceDayType + } + + enum class AttendanceResultType(val type: String) { + ALL(type = "전체"), + PRESENT(type = "출석"), + LATE(type = "지각"), + ABSENT(type = "결석"); + } + + data class AttendanceHistory( + val status: String, + val eventName: String, + val date: String, + ) + } data class Failure(val error: Throwable?) : AttendanceUiState data object NetworkError : AttendanceUiState diff --git a/app/src/main/java/org/sopt/official/feature/attendance/model/FinalAttendance.kt b/app/src/main/java/org/sopt/official/feature/attendance/model/FinalAttendance.kt deleted file mode 100644 index 26b21d5c9..000000000 --- a/app/src/main/java/org/sopt/official/feature/attendance/model/FinalAttendance.kt +++ /dev/null @@ -1,31 +0,0 @@ -package org.sopt.official.feature.attendance.model - -import androidx.annotation.DrawableRes -import org.sopt.official.R - -enum class FinalAttendance( - @DrawableRes val imageResId: Int, - val isFinished: Boolean, - val result: String, -) { - NOT_YET( - imageResId = R.drawable.ic_attendance_state_nothing, - isFinished = false, - result = "출석 전" - ), - PRESENT( - imageResId = R.drawable.ic_attendance_state_done, - isFinished = true, - result = "출석완료!" - ), - LATE( - imageResId = R.drawable.ic_attendance_state_late, - isFinished = true, - result = "지각" - ), - ABSENT( - imageResId = R.drawable.ic_attendance_state_absence_black, - isFinished = true, - result = "결석" - ) -} diff --git a/app/src/main/java/org/sopt/official/feature/attendance/model/MidtermAttendance.kt b/app/src/main/java/org/sopt/official/feature/attendance/model/MidtermAttendance.kt deleted file mode 100644 index 699a7b641..000000000 --- a/app/src/main/java/org/sopt/official/feature/attendance/model/MidtermAttendance.kt +++ /dev/null @@ -1,28 +0,0 @@ -package org.sopt.official.feature.attendance.model - -import androidx.annotation.DrawableRes -import org.sopt.official.R - -sealed class MidtermAttendance( - @DrawableRes val imageResId: Int, - val isFinished: Boolean, - val description: String -) { - data class NotYet(val attendanceType: AttendanceType) : MidtermAttendance( - imageResId = R.drawable.ic_attendance_state_nothing, - isFinished = false, - description = attendanceType.type - ) - - data class Present(val attendanceAt: String) : MidtermAttendance( - imageResId = R.drawable.ic_attendance_state_yes, - isFinished = true, - description = attendanceAt - ) - - data object Absent : MidtermAttendance( - imageResId = R.drawable.ic_attendance_state_absence_white, - isFinished = true, - description = "-" - ) -} diff --git a/app/src/main/java/org/sopt/official/feature/attendance/model/state/AttendanceProgressBarState.kt b/app/src/main/java/org/sopt/official/feature/attendance/model/state/AttendanceProgressBarState.kt deleted file mode 100644 index 4c638b06a..000000000 --- a/app/src/main/java/org/sopt/official/feature/attendance/model/state/AttendanceProgressBarState.kt +++ /dev/null @@ -1,10 +0,0 @@ -package org.sopt.official.feature.attendance.model.state - -import org.sopt.official.feature.attendance.model.FinalAttendance -import org.sopt.official.feature.attendance.model.MidtermAttendance - -class AttendanceProgressBarState( - val firstAttendance: MidtermAttendance, - val secondAttendance: MidtermAttendance, - val finalAttendance: FinalAttendance, -) diff --git a/app/src/main/java/org/sopt/official/feature/attendance/model/state/TodayAttendanceCardState.kt b/app/src/main/java/org/sopt/official/feature/attendance/model/state/TodayAttendanceCardState.kt deleted file mode 100644 index 0b2898a08..000000000 --- a/app/src/main/java/org/sopt/official/feature/attendance/model/state/TodayAttendanceCardState.kt +++ /dev/null @@ -1,13 +0,0 @@ -package org.sopt.official.feature.attendance.model.state - -import org.sopt.official.feature.attendance.model.FinalAttendance -import org.sopt.official.feature.attendance.model.MidtermAttendance - -class TodayAttendanceCardState( - val eventDate: String, - val eventLocation: String, - val eventName: String, - val firstAttendance: MidtermAttendance, - val secondAttendance: MidtermAttendance, - val finalAttendance: FinalAttendance, -) diff --git a/app/src/main/java/org/sopt/official/feature/attendance/model/state/TodayNoAttendanceCardState.kt b/app/src/main/java/org/sopt/official/feature/attendance/model/state/TodayNoAttendanceCardState.kt deleted file mode 100644 index 4b1646867..000000000 --- a/app/src/main/java/org/sopt/official/feature/attendance/model/state/TodayNoAttendanceCardState.kt +++ /dev/null @@ -1,7 +0,0 @@ -package org.sopt.official.feature.attendance.model.state - -class TodayNoAttendanceCardState( - val eventDate: String, - val eventLocation: String, - val eventName: String, -)