From 0f6d825b02f851ef2e96e44bfdf4790ec8f77dd4 Mon Sep 17 00:00:00 2001 From: kamja0510 Date: Fri, 24 Jan 2025 21:10:48 +0900 Subject: [PATCH] =?UTF-8?q?[feat]=20#67=20=EA=B3=B5=EB=B6=80=EC=A1=B0?= =?UTF-8?q?=EA=B0=81=20api=20=EC=97=B0=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/model/AddStudyData.kt | 1 + .../presentation/model/SplitStudyData.kt | 1 + .../presentation/ui/navigator/MainNavHost.kt | 1 + .../ui/subject/addstudy/AddStudyContract.kt | 3 + .../ui/subject/addstudy/AddStudyNavigation.kt | 2 + .../ui/subject/addstudy/AddStudyRoute.kt | 2 + .../ui/subject/addstudy/AddStudyViewModel.kt | 57 ++++--------------- .../subject/splitstudy/SplitStudyContract.kt | 1 + .../ui/subject/splitstudy/SplitStudyRoute.kt | 1 + .../ui/subject/splitstudy/SplitStudyScreen.kt | 2 + .../subject/splitstudy/SplitStudyViewModel.kt | 2 + .../subjectdetail/SubjectDetailViewModel.kt | 27 ++++----- .../subjectdetail/SubjectDetatilScreen.kt | 1 + .../presentation/util/date/DateFunction.kt | 18 ++++++ 14 files changed, 57 insertions(+), 62 deletions(-) diff --git a/app/src/main/java/org/android/bbangzip/presentation/model/AddStudyData.kt b/app/src/main/java/org/android/bbangzip/presentation/model/AddStudyData.kt index 35d009df..1440c6a1 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/model/AddStudyData.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/model/AddStudyData.kt @@ -7,6 +7,7 @@ import kotlinx.serialization.Serializable @Serializable @Parcelize data class AddStudyData( + val subjectId: Int, val subjectName: String, val pieceNumber: Int, val examDate: String, diff --git a/app/src/main/java/org/android/bbangzip/presentation/model/SplitStudyData.kt b/app/src/main/java/org/android/bbangzip/presentation/model/SplitStudyData.kt index fe4f93e5..15191908 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/model/SplitStudyData.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/model/SplitStudyData.kt @@ -8,6 +8,7 @@ import org.android.bbangzip.presentation.type.AddStudyViewType @Serializable @Parcelize data class SplitStudyData( + val subjectId: Int, val subjectName: String, val pieceNumber: Int, val examDate: String, diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/navigator/MainNavHost.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/navigator/MainNavHost.kt index 877b79ba..c3313e83 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/navigator/MainNavHost.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/navigator/MainNavHost.kt @@ -117,6 +117,7 @@ fun MainNavHost( padding = padding, popBackStack = { navigator.popBackStackIfNotSubject() }, navigateSplitStudy = { navigator.navigateToSplitStudy(it) }, + navigateSubjectDetail = { id, name -> navigator.navigateToSubjectDetail(subjectId = id, subjectName = name)} ) modifySubjectNameNavGraph( diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/addstudy/AddStudyContract.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/addstudy/AddStudyContract.kt index 95ffca1f..f8d21857 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/addstudy/AddStudyContract.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/addstudy/AddStudyContract.kt @@ -12,6 +12,7 @@ import org.android.bbangzip.presentation.util.base.BaseContract class AddStudyContract { @Parcelize data class AddStudyState( + val subjectId: Int = 0, val subjectName: String = "", val examDate: String = "시험 일자 입력", val examName: String = "", @@ -133,6 +134,8 @@ class AddStudyContract { sealed interface AddStudySideEffect : BaseContract.SideEffect { data class NavigateSplitStudy(val addStudyData: AddStudyData) : AddStudySideEffect + data class NavigateSubjectDetail(val subjectId: Int, val subjectName: String) : AddStudySideEffect + data object PopBackStack : AddStudySideEffect } } diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/addstudy/AddStudyNavigation.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/addstudy/AddStudyNavigation.kt index fff7c241..fb5a9600 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/addstudy/AddStudyNavigation.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/addstudy/AddStudyNavigation.kt @@ -26,6 +26,7 @@ fun NavGraphBuilder.addStudyNavGraph( padding: PaddingValues, popBackStack: () -> Unit, navigateSplitStudy: (AddStudyData) -> Unit, + navigateSubjectDetail: (Int, String) ->Unit ) { composable( typeMap = mapOf(typeOf() to SplitStudyDataType), @@ -34,6 +35,7 @@ fun NavGraphBuilder.addStudyNavGraph( padding = padding, popBackStack = popBackStack, navigateSplitStudy = navigateSplitStudy, + navigateSubjectDetail = navigateSubjectDetail, splitStudyData = it.toRoute().splitStudyData, ) } diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/addstudy/AddStudyRoute.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/addstudy/AddStudyRoute.kt index 7b7e3dc2..af64be28 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/addstudy/AddStudyRoute.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/addstudy/AddStudyRoute.kt @@ -17,6 +17,7 @@ fun AddStudyRoute( viewModel: AddStudyViewModel = hiltViewModel(), popBackStack: () -> Unit = {}, navigateSplitStudy: (AddStudyData) -> Unit = {}, + navigateSubjectDetail: (Int, String) -> Unit = {_, _ -> } ) { LaunchedEffect(Unit) { viewModel.setEvent(AddStudyContract.AddStudyEvent.Initialize(splitStudyData = splitStudyData)) @@ -29,6 +30,7 @@ fun AddStudyRoute( navigateSplitStudy(it.addStudyData) } is AddStudyContract.AddStudySideEffect.PopBackStack -> popBackStack() + is AddStudyContract.AddStudySideEffect.NavigateSubjectDetail -> navigateSubjectDetail(it.subjectId, it.subjectName) } } } diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/addstudy/AddStudyViewModel.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/addstudy/AddStudyViewModel.kt index 930ff9e5..3d43af2b 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/addstudy/AddStudyViewModel.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/addstudy/AddStudyViewModel.kt @@ -13,6 +13,8 @@ import org.android.bbangzip.presentation.type.AddStudyViewType import org.android.bbangzip.presentation.ui.subject.addstudy.AddStudyContract.AddStudyReduce import org.android.bbangzip.presentation.util.base.BaseViewModel import org.android.bbangzip.presentation.util.casting.pageToInt +import org.android.bbangzip.presentation.util.date.addLeadingZero +import org.android.bbangzip.presentation.util.date.formatDate import timber.log.Timber import javax.inject.Inject @@ -111,6 +113,7 @@ constructor( AddStudyContract.AddStudySideEffect.NavigateSplitStudy( addStudyData = AddStudyData( + subjectId = currentUiState.subjectId, subjectName = currentUiState.subjectName, pieceNumber = event.pieceNumber, examDate = currentUiState.examDate, @@ -136,29 +139,6 @@ constructor( AddStudyContract.AddStudyEvent.OnClickCancleIcon -> { updateState(AddStudyReduce.ResetStudyContent) } - is AddStudyContract.AddStudyEvent.OnClickPieceNumber -> { - updateState(AddStudyReduce.UpdateAddStudyViewType) - updateState(AddStudyReduce.UpdatePieceNumber(pieceNumber = event.pieceNumber)) - updateState(AddStudyReduce.UpdatePiecePickerBottomSheetState) - Timber.tag("김재민").d("addstudy에서 보내는 값$currentUiState") - setSideEffect( - AddStudyContract.AddStudySideEffect.NavigateSplitStudy( - addStudyData = - AddStudyData( - subjectName = currentUiState.subjectName, - pieceNumber = event.pieceNumber, - examDate = currentUiState.examDate, - studyContent = currentUiState.studyContent ?: "", - startPage = currentUiState.startPage ?: "", - endPage = currentUiState.endPage ?: "", - startPageList = if (currentUiState.addStudyViewType == AddStudyViewType.AGAIN) currentUiState.startPageList else divideRangeIntoInts(currentUiState.startPage!!.filter { it.isDigit() }.toInt(), currentUiState.endPage!!.filter { it.isDigit() }.toInt(), event.pieceNumber).map { it.toString() }.subList(0, event.pieceNumber), - endPageList = if (currentUiState.addStudyViewType == AddStudyViewType.AGAIN) currentUiState.endPageList else divideRangeIntoInts(currentUiState.startPage!!.filter { it.isDigit() }.toInt(), currentUiState.endPage!!.filter { it.isDigit() }.toInt(), event.pieceNumber).map { it.toString() }.subList(1, event.pieceNumber + 1), - examName = currentUiState.examName, - ), - ), - ) - updateState(AddStudyReduce.UpdateIsSuccess) - } AddStudyContract.AddStudyEvent.OnClickSplitBtn -> { updateState(AddStudyReduce.UpdatePiecePickerBottomSheetState) @@ -171,6 +151,7 @@ constructor( AddStudyContract.AddStudySideEffect.NavigateSplitStudy( addStudyData = AddStudyData( + subjectId = currentUiState.subjectId, subjectName = currentUiState.subjectName, pieceNumber = event.pieceNumber, examDate = currentUiState.examDate, @@ -198,6 +179,7 @@ constructor( return when (reduce) { is AddStudyReduce.Initialize -> { state.copy( + subjectId = reduce.splitStudyData.subjectId, subjectName = reduce.splitStudyData.subjectName, pieceNumber = reduce.splitStudyData.pieceNumber, examDate = reduce.splitStudyData.examDate, @@ -212,21 +194,6 @@ constructor( isSuccess = true, ) } - is AddStudyReduce.Initialize -> { - state.copy( - subjectName = reduce.splitStudyData.subjectName, - pieceNumber = reduce.splitStudyData.pieceNumber, - examDate = reduce.splitStudyData.examDate, - studyContent = reduce.splitStudyData.studyContent, - startPage = reduce.splitStudyData.startPage, - endPage = reduce.splitStudyData.endPage, - startPageList = reduce.splitStudyData.startPageList, - endPageList = reduce.splitStudyData.endPageList, - deadLineList = reduce.splitStudyData.deadLineList, - addStudyViewType = reduce.splitStudyData.addStudyViewType, - isSuccess = true, - ) - } AddStudyReduce.UpdateDatePickerBottomSheetState -> { state.copy(datePickerBottomSheetState = !state.datePickerBottomSheetState) @@ -405,15 +372,15 @@ constructor( viewModelScope.launch { postAddStudyUseCase.invoke( AddStudyEntity( - subjectId = 1, - examName = "중간고사", - examDate = currentUiState.examDate, + subjectId = currentUiState.subjectId.toLong(), + examName = currentUiState.examName, + examDate = formatDate(currentUiState.examDate), studyContents = currentUiState.studyContent ?: "", pieceList = currentUiState.startPageList.mapIndexed { index, startPage -> AddStudyEntity.Piece( - startPage = startPage.toIntOrNull() ?: 0, - finishPage = currentUiState.endPageList.getOrNull(index)?.toIntOrNull() ?: 0, - deadline = currentUiState.deadLineList.getOrNull(index) ?: "" + startPage = startPage.filter { it.isDigit() }.toIntOrNull() ?: 0, + finishPage = currentUiState.endPageList[index].filter{it.isDigit()}.toIntOrNull() ?: 0, + deadline = addLeadingZero( currentUiState.deadLineList.getOrNull(index) ?: "") ) } ) @@ -421,7 +388,7 @@ constructor( if (data.badgesList.isNotEmpty()) { } - setSideEffect(AddStudyContract.AddStudySideEffect.PopBackStack) + setSideEffect(AddStudyContract.AddStudySideEffect.NavigateSubjectDetail(currentUiState.subjectId, currentUiState.subjectName)) }.onFailure { Timber.tag("[공부 추가하기]").d(error.toString()) } diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/splitstudy/SplitStudyContract.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/splitstudy/SplitStudyContract.kt index 9a37448b..6ba805d3 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/splitstudy/SplitStudyContract.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/splitstudy/SplitStudyContract.kt @@ -12,6 +12,7 @@ class SplitStudyContract { @Parcelize data class SplitStudyState( val isSuccess: Boolean = false, + val subjectId: Int = 0, val subjectName: String = "경제통계학", val startPage: String = "", val endPage: String = "", diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/splitstudy/SplitStudyRoute.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/splitstudy/SplitStudyRoute.kt index 33d396b3..03502714 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/splitstudy/SplitStudyRoute.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/splitstudy/SplitStudyRoute.kt @@ -37,6 +37,7 @@ fun SplitStudyRoute( if (splitStudyState.isSuccess) { SplitStudyScreen( + subjectId = splitStudyState.subjectId, pieceNumber = splitStudyState.pieceNumber, subjectName = splitStudyState.subjectName, examDate = splitStudyState.examDate, diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/splitstudy/SplitStudyScreen.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/splitstudy/SplitStudyScreen.kt index cc0ee4ea..61968322 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/splitstudy/SplitStudyScreen.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/splitstudy/SplitStudyScreen.kt @@ -48,6 +48,7 @@ import timber.log.Timber @OptIn(ExperimentalFoundationApi::class) @Composable fun SplitStudyScreen( + subjectId: Int = 0, pieceNumber: Int = 0, subjectName: String, startPage: String = "", @@ -289,6 +290,7 @@ fun SplitStudyScreen( endPageList = endPageList, deadLineList = seletedDateList.map { dateToString(it) }, addStudyViewType = AddStudyViewType.AGAIN, + subjectId = subjectId ), ) }, diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/splitstudy/SplitStudyViewModel.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/splitstudy/SplitStudyViewModel.kt index 96dac44b..0aabf23c 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/splitstudy/SplitStudyViewModel.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/splitstudy/SplitStudyViewModel.kt @@ -141,6 +141,7 @@ class SplitStudyViewModel is SplitStudyContract.SplitStudyReduce.InitializeState -> { state.copy( + subjectId = reduce.addStudyData.subjectId, subjectName = reduce.addStudyData.subjectName, startPage = reduce.addStudyData.startPage, examDate = reduce.addStudyData.examDate, @@ -295,6 +296,7 @@ class SplitStudyViewModel SplitStudyContract.SplitStudySideEffect.NavigateAddStudy( splitStudyData = SplitStudyData( + subjectId = event.splitStudyData.subjectId, subjectName = event.splitStudyData.subjectName, pieceNumber = event.splitStudyData.pieceNumber, examDate = event.splitStudyData.examDate, diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetailViewModel.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetailViewModel.kt index 7534ffcc..a8bbf550 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetailViewModel.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetailViewModel.kt @@ -99,22 +99,17 @@ constructor( Timber.tag("김재민").d("되나?") setSideEffect(SubjectDetailContract.SubjectDetailSideEffect.NavigateToAddStudy(splitStudyData = event.splitStudyData)) } - is SubjectDetailContract.SubjectDetailEvent.OnClickModifySubjectName -> { - setSideEffect(SubjectDetailContract.SubjectDetailSideEffect.NavigateToModifySubjectName(subjectId = event.subjectId, subjectName = event.subjectName)) - } - SubjectDetailContract.SubjectDetailEvent.OnDeleteButtonClicked -> {} - is SubjectDetailContract.SubjectDetailEvent.OnPlusIconClicked -> { - Timber.tag("김재민").d("되나?") - setSideEffect(SubjectDetailContract.SubjectDetailSideEffect.NavigateToAddStudy(splitStudyData = event.splitStudyData)) - } - SubjectDetailContract.SubjectDetailEvent.OnClickKebabMenu -> { - updateState(SubjectDetailContract.SubjectDetailReduce.UpdateIsMenuOpen) - } + SubjectDetailContract.SubjectDetailEvent.OnDeleteButtonClicked -> {} + + SubjectDetailContract.SubjectDetailEvent.OnClickKebabMenu -> { + updateState(SubjectDetailContract.SubjectDetailReduce.UpdateIsMenuOpen) + } + + is SubjectDetailContract.SubjectDetailEvent.OnClickTab -> { + updateState(SubjectDetailContract.SubjectDetailReduce.UpdateExamName(event.index)) + } - is SubjectDetailContract.SubjectDetailEvent.OnClickTab -> { - updateState(SubjectDetailContract.SubjectDetailReduce.UpdateExamName(event.index)) - } SubjectDetailContract.SubjectDetailEvent.OnClickKebabMenu -> { updateState(SubjectDetailContract.SubjectDetailReduce.UpdateIsMenuOpen) } @@ -123,8 +118,6 @@ constructor( Timber.tag("[과목 관리]").d("버튼 클릭") viewModelScope.launch { deleteStudyPiece() } } - - is SubjectDetailContract.SubjectDetailEvent.OnPlusIconClicked -> TODO() } } @@ -269,7 +262,7 @@ constructor( private suspend fun initData(subjectId: Int) { getSubjectDetail( subjectId = subjectId, - examName = "fin", + examName = "mid", ) } diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetatilScreen.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetatilScreen.kt index 554f2b05..2dc00f0e 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetatilScreen.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetatilScreen.kt @@ -111,6 +111,7 @@ fun SubjectDetailScreen( var selectedIndex by remember { mutableIntStateOf(0) } val splitStudyData = SplitStudyData( + subjectId = subjectId, subjectName = subjectName, pieceNumber = 0, examDate = "시험 일자 입력", diff --git a/app/src/main/java/org/android/bbangzip/presentation/util/date/DateFunction.kt b/app/src/main/java/org/android/bbangzip/presentation/util/date/DateFunction.kt index a53130b0..b64281eb 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/util/date/DateFunction.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/util/date/DateFunction.kt @@ -29,6 +29,24 @@ fun hyponStringDateToDate(dateString: String): Date { return Date(year.toString(), month.toString(), day.toString()) } +fun formatDate(input: String): String { + val parts = input.split("년", "월", "일").map { it.trim() } + return "${parts[0]}-${parts[1].padStart(2, '0')}-${parts[2].padStart(2, '0')}" + +} + +fun addLeadingZero(date: String): String { + val parts = date.split("-") + if (parts.size == 3) { + val year = parts[0] + val month = parts[1].padStart(2, '0') + val day = parts[2].padStart(2, '0') + return "$year-$month-$day" + } else { + throw IllegalArgumentException("잘못된 날짜 형식입니다: $date") + } +} + fun dateToString(date: Date): String { return "${date.year}-${date.month}-${date.day}" }