diff --git a/Cherrish-iOS/Cherrish-iOS/Data/Network/EndPoint/HomeAPI.swift b/Cherrish-iOS/Cherrish-iOS/Data/Network/EndPoint/HomeAPI.swift index 4e6a9754..3f554c7b 100644 --- a/Cherrish-iOS/Cherrish-iOS/Data/Network/EndPoint/HomeAPI.swift +++ b/Cherrish-iOS/Cherrish-iOS/Data/Network/EndPoint/HomeAPI.swift @@ -14,6 +14,7 @@ enum HomeAPI { } extension HomeAPI: EndPoint { + var basePath: String { "/api" } diff --git a/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Calendar/Treatment/Model/TreatmentInputWarning.swift b/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Calendar/Treatment/Model/TreatmentInputWarning.swift new file mode 100644 index 00000000..2d7879a3 --- /dev/null +++ b/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Calendar/Treatment/Model/TreatmentInputWarning.swift @@ -0,0 +1,28 @@ +// +// TreatmentInputWarning.swift +// Cherrish-iOS +// +// Created by 어재선 on 1/21/26. +// + +import Foundation + +enum TreatmentInputWarning { + case none + case pastDate + case invalidFormat + case beforeProcedureDate + + var message: String { + switch self { + case .none: + return "" + case .pastDate: + return "이미 지난 날짜는 입력할 수 없어요." + case .invalidFormat: + return "올바른 날짜 형식이 아니에요." + case .beforeProcedureDate: + return "목표일은 시술 날짜 이후로만 설정할 수 있어요." + } + } +} diff --git a/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Calendar/Treatment/View/NoTreatment/NoTreatmentView.swift b/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Calendar/Treatment/View/NoTreatment/NoTreatmentView.swift index 9b6ba0d7..a0331911 100644 --- a/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Calendar/Treatment/View/NoTreatment/NoTreatmentView.swift +++ b/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Calendar/Treatment/View/NoTreatment/NoTreatmentView.swift @@ -72,7 +72,8 @@ struct NoTreatmentView: View { dDayState: $viewModel.dDay, year: $viewModel.year, month: $viewModel.month, - day: $viewModel.day + day: $viewModel.day, + warningMessage: .constant(viewModel.warning.message) ) .id(String(describing: viewModel.state)) diff --git a/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Calendar/Treatment/View/TargetDdaySettingView.swift b/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Calendar/Treatment/View/TargetDdaySettingView.swift index 17af9bc4..1d4f0871 100644 --- a/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Calendar/Treatment/View/TargetDdaySettingView.swift +++ b/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Calendar/Treatment/View/TargetDdaySettingView.swift @@ -28,7 +28,7 @@ struct TargetDdaySettingView: View { @Binding var year: String @Binding var month: String @Binding var day: String - + @Binding var warningMessage: String var body: some View { ScrollView(.vertical, showsIndicators: false) { VStack { @@ -92,7 +92,8 @@ struct TargetDdaySettingView: View { .frame(height: 24.adjustedH) DateTextBox(year: $year, month: $month, day: $day) - .padding(.bottom, 20.adjustedH) + .padding(.bottom, 12.adjustedH) + TreatmentWarningMessgeView(text: warningMessage) Spacer() } } diff --git a/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Calendar/Treatment/View/Treatment/TreatmentView.swift b/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Calendar/Treatment/View/Treatment/TreatmentView.swift index e6302211..79d8c920 100644 --- a/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Calendar/Treatment/View/Treatment/TreatmentView.swift +++ b/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Calendar/Treatment/View/Treatment/TreatmentView.swift @@ -65,7 +65,8 @@ struct TreatmentView: View { dDayState: $viewModel.dDay, year: $viewModel.year, month: $viewModel.month, - day: $viewModel.day + day: $viewModel.day, + warningMessage: .constant(viewModel.warning.message) ) diff --git a/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Calendar/Treatment/View/TreatmentWarningMessgeView.swift b/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Calendar/Treatment/View/TreatmentWarningMessgeView.swift new file mode 100644 index 00000000..0e160841 --- /dev/null +++ b/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Calendar/Treatment/View/TreatmentWarningMessgeView.swift @@ -0,0 +1,20 @@ +// +// TreatmentWarningMessgeView.swift +// Cherrish-iOS +// +// Created by 어재선 on 1/21/26. +// + +import SwiftUI + +struct TreatmentWarningMessgeView: View { + let text: String + var body: some View { + HStack(spacing: 0) { + TypographyText(text, style: .body1_r_14, color: .red700) + .frame(height: 20.adjustedH) + Spacer() + } + + } +} diff --git a/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Calendar/Treatment/ViewModel/NoTreatment/NoTreatmentViewModel.swift b/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Calendar/Treatment/ViewModel/NoTreatment/NoTreatmentViewModel.swift index a154d906..2bfabc21 100644 --- a/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Calendar/Treatment/ViewModel/NoTreatment/NoTreatmentViewModel.swift +++ b/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Calendar/Treatment/ViewModel/NoTreatment/NoTreatmentViewModel.swift @@ -17,6 +17,7 @@ final class NoTreatmentViewModel: ObservableObject{ @Published var year: String = "" @Published var month: String = "" @Published var day: String = "" + @Published private(set) var warning: TreatmentInputWarning = .none private let fetchCategoriesUseCase: FetchTreatmentCategoriesUseCase private let fetchTreatmentsUseCase: FetchTreatmentsUseCase @@ -113,25 +114,42 @@ final class NoTreatmentViewModel: ObservableObject{ func isDateTextFieldNotEmpty() -> Bool { guard !year.isEmpty, !month.isEmpty, !day.isEmpty else { + Task { @MainActor in + updateWarning(state: .none) + } return false } - guard let yearInt = Int(year), yearInt >= 2020, - let monthInt = Int(month), (1...12).contains(monthInt), - let dayInt = Int(day), (1...31).contains(dayInt) else { + guard let y = Int(year), let m = Int(month), let d = Int(day) else { + updateWarning(state: .invalidFormat) return false } - - let components = DateComponents(year: yearInt, month: monthInt, day: dayInt) + + let components = DateComponents(year: y, month: m, day: d) guard let date = Calendar.current.date(from: components), Calendar.current.dateComponents([.year, .month, .day], from: date) == components else { + updateWarning(state: .invalidFormat) + return false + } + + let today = Calendar.current.startOfDay(for: Date()) + if date < today { + updateWarning(state: .pastDate) return false } + updateWarning(state: .none) return true } + + private func updateWarning(state: TreatmentInputWarning) { + Task { @MainActor in + warning = state + } + } + } 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..736d8375 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 @@ -17,6 +17,7 @@ final class TreatmentViewModel: ObservableObject{ @Published var month: String = "" @Published var day: String = "" @Published var searchText = "" + @Published private(set) var warning: TreatmentInputWarning = .none private let fetchTreatmentsUseCase: FetchTreatmentsUseCase private let createUserProcedureUseCase: CreateUserProcedureUseCase @@ -58,6 +59,8 @@ final class TreatmentViewModel: ObservableObject{ } } + + @MainActor func fetchTreatments() async throws { do { @@ -98,24 +101,42 @@ final class TreatmentViewModel: ObservableObject{ func isDateTextFieldNotEmpty() -> Bool { guard !year.isEmpty, !month.isEmpty, !day.isEmpty else { + Task { @MainActor in + updateWarning(state: .none) + } return false } - guard let yearInt = Int(year), yearInt >= 2020, - let monthInt = Int(month), (1...12).contains(monthInt), - let dayInt = Int(day), (1...31).contains(dayInt) else { + guard let y = Int(year), let m = Int(month), let d = Int(day) else { + updateWarning(state: .invalidFormat) return false } - - let components = DateComponents(year: yearInt, month: monthInt, day: dayInt) + + let components = DateComponents(year: y, month: m, day: d) guard let date = Calendar.current.date(from: components), Calendar.current.dateComponents([.year, .month, .day], from: date) == components else { + updateWarning(state: .invalidFormat) + return false + } + + let today = Calendar.current.startOfDay(for: Date()) + if date < today { + updateWarning(state: .pastDate) return false } + updateWarning(state: .none) return true } + + + private func updateWarning(state: TreatmentInputWarning) { + Task { @MainActor in + warning = state + } + } + }