diff --git a/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Calendar/CalendarMain/CalendarCellView.swift b/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Calendar/CalendarMain/CalendarCellView.swift index 07b8ea4e..f73d2e2e 100644 --- a/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Calendar/CalendarMain/CalendarCellView.swift +++ b/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Calendar/CalendarMain/CalendarCellView.swift @@ -45,11 +45,7 @@ struct CalendarCellView: View { .padding(.top, 36.adjustedH) } - TypographyText( - "\(value.day)", - style: .body1_r_14, - color: calendarMode == .selectedProcedure && isDDay ? .red700 : .gray1000 - ) + TypographyText("\(value.day)", style: .body1_r_14, color: dayTextColor) if procedureCount > 0 && calendarMode == .none { let displayCount = min(procedureCount, 3) @@ -74,6 +70,16 @@ struct CalendarCellView: View { } } extension CalendarCellView { + private var dayTextColor: Color { + if calendarMode == .selectedProcedure && downtimeState != .none { + return .gray1000 + } + if calendarMode == .selectedProcedure && isDDay { + return .red700 + } + return .gray800 + } + private var scheduleCircle: some View { Circle() .fill(.red700) diff --git a/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Calendar/CalendarMain/CalendarView.swift b/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Calendar/CalendarMain/CalendarView.swift index 75e30f8b..d0c6d3d1 100644 --- a/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Calendar/CalendarMain/CalendarView.swift +++ b/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Calendar/CalendarMain/CalendarView.swift @@ -24,6 +24,7 @@ enum CalendarMode { struct CalendarView: View { @EnvironmentObject private var calendarCoordinator: CalendarCoordinator @StateObject var viewModel: CalendarViewModel + @StateObject var homeCalendarFlowState: HomeCalendarFlowState @State private var topGlobalY: CGFloat = .zero @State private var initialTopGlobalY: CGFloat? = nil @State private var bottomOffsetY: CGFloat = .zero @@ -65,6 +66,18 @@ struct CalendarView: View { } } } + .onChange(of: homeCalendarFlowState.treatmentDate) { date in + if let date = date { + viewModel.updateDate(date: date) + homeCalendarFlowState.treatmentDate = nil + } + } + .onAppear { + if let date = homeCalendarFlowState.treatmentDate { + viewModel.updateDate(date: date) + homeCalendarFlowState.treatmentDate = nil + } + } .background(.gray0) } } diff --git a/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Calendar/CalendarMain/CalendarViewModel.swift b/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Calendar/CalendarMain/CalendarViewModel.swift index d16708d4..3f4e308a 100644 --- a/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Calendar/CalendarMain/CalendarViewModel.swift +++ b/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Calendar/CalendarMain/CalendarViewModel.swift @@ -124,6 +124,29 @@ final class CalendarViewModel: ObservableObject { selectedDowntime = downtimeList mapToDowntimeDays(procedure: downtimeList) } + + func updateDate(date: Date) { + selectedDate = date + + let calendar = Calendar.current + let currentYear = calendar.component(.year, from: currentDate) + let currentMonthVal = calendar.component(.month, from: currentDate) + + let targetYear = calendar.component(.year, from: date) + let targetMonthVal = calendar.component(.month, from: date) + + let monthDiff = (targetYear - currentYear) * 12 + (targetMonthVal - currentMonthVal) + currentMonth = monthDiff + + Task { + do { + try await fetchProcedureCountsOfMonth() + try await fetchTodayProcedureList() + } catch { + CherrishLogger.error(error) + } + } + } } extension CalendarViewModel { diff --git a/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Calendar/Treatment/ViewModel/Treatment/TreatmentViewModel.swift b/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Calendar/Treatment/ViewModel/Treatment/TreatmentViewModel.swift index 3b01522a..e9d90903 100644 --- a/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Calendar/Treatment/ViewModel/Treatment/TreatmentViewModel.swift +++ b/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Calendar/Treatment/ViewModel/Treatment/TreatmentViewModel.swift @@ -78,7 +78,11 @@ final class TreatmentViewModel: ObservableObject{ } do { - try await createUserProcedureUseCase.execute(scheduledDate: scheduledDate.toScheduledAtFormat, recoveryDate: recoverDate.toRecoveryDateFormat, treatments: selectedTreatments) + try await createUserProcedureUseCase.execute( + scheduledDate: scheduledDate.toScheduledAtFormat, + recoveryDate: recoverDate.toRecoveryDateFormat, + treatments: selectedTreatments + ) } catch { CherrishLogger.network(error) } diff --git a/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Home/HomeCalendarFlowState.swift b/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Home/HomeCalendarFlowState.swift new file mode 100644 index 00000000..4df34343 --- /dev/null +++ b/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Home/HomeCalendarFlowState.swift @@ -0,0 +1,12 @@ +// +// HomeCalendarFlowState.swift +// Cherrish-iOS +// +// Created by 이나연 on 1/21/26. +// + +import Foundation + +final class HomeCalendarFlowState: ObservableObject { + @Published var treatmentDate: Date? +} diff --git a/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Home/HomeView.swift b/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Home/HomeView.swift index 68fb0fa1..322cdfc9 100644 --- a/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Home/HomeView.swift +++ b/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Home/HomeView.swift @@ -313,7 +313,6 @@ private struct UpcomingBoxView: View { ) .cherrishShadow() .padding(.horizontal, 24.adjustedW) - } private var upcomingListView: some View { @@ -337,6 +336,10 @@ private struct UpcomingBoxView: View { dDay: item.dDay ) } + .onTapGesture { + viewModel.selectUpcomingDate(item.date) + tabBarCoordinator.switchTab(tab: .calendar) + } } } .padding(.top, 11.adjustedH) diff --git a/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Home/HomeViewModel.swift b/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Home/HomeViewModel.swift index cc694871..1f340b48 100644 --- a/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Home/HomeViewModel.swift +++ b/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Home/HomeViewModel.swift @@ -13,9 +13,14 @@ final class HomeViewModel: ObservableObject { @Published var errorMessage: String? private let fetchDashboardDataUseCase: FetchDashboardData + private let homeCalendarFlowState: HomeCalendarFlowState - init(fetchDashboardDataUseCase: FetchDashboardData) { + init( + fetchDashboardDataUseCase: FetchDashboardData, + homeCalendarFlowState: HomeCalendarFlowState + ) { self.fetchDashboardDataUseCase = fetchDashboardDataUseCase + self.homeCalendarFlowState = homeCalendarFlowState } @MainActor @@ -33,6 +38,14 @@ final class HomeViewModel: ObservableObject { isLoading = false } + func selectUpcomingDate(_ dateString: String) { + let formatter = DateFormatter() + formatter.dateFormat = "yyyy-MM-dd" + if let date = formatter.date(from: dateString) { + homeCalendarFlowState.treatmentDate = date + } + } + var formattedDate: String { guard let date = dashboardData?.date else { return "" } let formatter = DateFormatter() diff --git a/Cherrish-iOS/Cherrish-iOS/Presentation/PresentationDependencyAssembler.swift b/Cherrish-iOS/Cherrish-iOS/Presentation/PresentationDependencyAssembler.swift index 3230a7c9..ad7eba30 100644 --- a/Cherrish-iOS/Cherrish-iOS/Presentation/PresentationDependencyAssembler.swift +++ b/Cherrish-iOS/Cherrish-iOS/Presentation/PresentationDependencyAssembler.swift @@ -17,8 +17,14 @@ final class PresentationDependencyAssembler: DependencyAssembler { func assemble() { preAssembler.assemble() + let calendarTreatmentFlowState = CalendarTreatmentFlowState() DIContainer.shared.register(type: CalendarTreatmentFlowState.self) { - return CalendarTreatmentFlowState() + return calendarTreatmentFlowState + } + + let homeCalendarFlowState = HomeCalendarFlowState() + DIContainer.shared.register(type: HomeCalendarFlowState.self) { + return homeCalendarFlowState } guard let createProfileUseCase = DIContainer.shared.resolve(type: CreateProfileUseCase.self) else { @@ -38,11 +44,6 @@ final class PresentationDependencyAssembler: DependencyAssembler { return } - guard let calendarTreatmentFlowState = DIContainer.shared.resolve(type: CalendarTreatmentFlowState.self) else { - CherrishLogger.error(CherrishError.DIFailedError) - return - } - DIContainer.shared.register(type: CalendarViewModel.self) { return CalendarViewModel( fetchProcedureCountOfMonthUseCase: fetchProcedureCountOfMonthUseCase, @@ -57,7 +58,10 @@ final class PresentationDependencyAssembler: DependencyAssembler { } DIContainer.shared.register(type: HomeViewModel.self) { - return HomeViewModel(fetchDashboardDataUseCase: fetchDashboardData) + return HomeViewModel( + fetchDashboardDataUseCase: fetchDashboardData, + homeCalendarFlowState: homeCalendarFlowState + ) } guard let fetchTreatmentCategoriesUseCase = DIContainer.shared.resolve(type: FetchTreatmentCategoriesUseCase.self) else { diff --git a/Cherrish-iOS/Cherrish-iOS/Presentation/ViewFactory.swift b/Cherrish-iOS/Cherrish-iOS/Presentation/ViewFactory.swift index f1584184..faefeebc 100644 --- a/Cherrish-iOS/Cherrish-iOS/Presentation/ViewFactory.swift +++ b/Cherrish-iOS/Cherrish-iOS/Presentation/ViewFactory.swift @@ -48,10 +48,11 @@ final class ViewFactory: ViewFactoryProtocol { } func makeCalendarView() -> CalendarView { - guard let viewModel = DIContainer.shared.resolve(type: CalendarViewModel.self) else { + guard let viewModel = DIContainer.shared.resolve(type: CalendarViewModel.self), + let homeCalendarFlowState = DIContainer.shared.resolve(type: HomeCalendarFlowState.self) else { fatalError() } - return CalendarView(viewModel: viewModel) + return CalendarView(viewModel: viewModel, homeCalendarFlowState: homeCalendarFlowState) } func makeMyPageView() -> MyPageView {