diff --git a/Packing.xcodeproj/project.pbxproj b/Packing.xcodeproj/project.pbxproj index 36c389d..2bbfb3f 100644 --- a/Packing.xcodeproj/project.pbxproj +++ b/Packing.xcodeproj/project.pbxproj @@ -219,6 +219,14 @@ path = "Preview Content"; sourceTree = ""; }; + C6EFA8002BE4CFB400AA4686 /* Recovered References */ = { + isa = PBXGroup; + children = ( + B8232FB22BE4BB04009CD6FA /* GoogleService-Info.plist */, + ); + name = "Recovered References"; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ diff --git a/Packing/View/AddJourneyView.swift b/Packing/View/AddJourneyView.swift index 52a9d7b..6223bb6 100644 --- a/Packing/View/AddJourneyView.swift +++ b/Packing/View/AddJourneyView.swift @@ -26,155 +26,170 @@ struct AddJourneyView: View { var body: some View { - ZStack{ - LinearGradient(gradient: Gradient(colors: colorScheme == .light ? [Color(hex: "AEC6CF"), Color(hex: "ECECEC"), Color(hex: "FFFDD0")] : [Color(hex: "34495E"), Color(hex: "555555"), Color(hex: "333333")]), startPoint: .topLeading, endPoint: .bottomTrailing) - .ignoresSafeArea() + VStack{ - VStack{ - - // MARK: - Image - - ZStack{ - PhotosPicker(selection: $selectedItem, matching: .images, photoLibrary: .shared()) { - if let image = image { - Image(uiImage: image) - .resizable() + // MARK: - Image + + ZStack{ + PhotosPicker(selection: $selectedItem, matching: .images, photoLibrary: .shared()) { + if let image = image { + Image(uiImage: image) + .resizable() + .clipShape(RoundedRectangle(cornerRadius: 30)) + .frame(minWidth: 200, maxWidth: .infinity, maxHeight: .infinity) + .padding(.top, 60) + .shadow(radius: 3) + } else { + Spacer() + ZStack{ + Rectangle() .clipShape(RoundedRectangle(cornerRadius: 30)) .frame(minWidth: 200, maxWidth: .infinity, maxHeight: .infinity) .padding(.top, 60) .shadow(radius: 3) - } else { - Spacer() - ZStack{ - Rectangle() - .clipShape(RoundedRectangle(cornerRadius: 30)) - .frame(minWidth: 200, maxWidth: .infinity, maxHeight: .infinity) - .padding(.top, 60) - .shadow(radius: 3) - .foregroundStyle(colorScheme == .dark ? Color("DarkColor") : .white) - VStack{ - Image(systemName: "photo.badge.plus") - .resizable() - .aspectRatio(contentMode: .fit) - .frame(width: 100) - .padding(.top, 50) - .foregroundStyle(Color(hex: 0x566375)) - } + .foregroundStyle(colorScheme == .dark ? Color("DarkColor") : .white) + VStack{ + Image(systemName: "photo.badge.plus") + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: 100) + .padding(.top, 50) + .foregroundStyle(Color(hex: 0x566375)) } } - }.onChange(of: selectedItem) { - loadImage() } + }.onChange(of: selectedItem) { + loadImage() } - - - ZStack{ - RoundedRectangle(cornerRadius: 30) - .foregroundStyle(colorScheme == .dark ? Color("DarkColor") : .white) - .frame(minHeight: 550, maxHeight: .infinity) - VStack { - VStack(alignment:.center){ - - // MARK: 여행 목적지 - Text("여행목적지") - .font(.title2) - .fontWeight(.bold) + } + + + ZStack{ + RoundedRectangle(cornerRadius: 30) + .foregroundStyle(colorScheme == .dark ? Color("DarkColor") : .white) + .frame(minHeight: 550, maxHeight: .infinity) + VStack { + VStack(alignment:.center){ + + // MARK: 여행 목적지 + Text("여행목적지") + .font(.title2) + .fontWeight(.bold) + + TextField("여행목적지",text: $testString) + .padding() + .font(.subheadline) + .background(colorScheme == .dark ? Color(hex: 0x1A1A1A) : Color(hex: 0xF3F3F3)) + .clipShape(RoundedRectangle(cornerRadius: 15.0)) + .frame(width: 300) + .padding(.bottom,30) + + // MARK: - 여행 기간 + Text("여행 기간") + .font(.title2) + .fontWeight(.bold) + VStack{ + DatePicker("시작 날짜", selection: $startdate,displayedComponents: [.date]) - TextField("여행목적지",text: $testString) .padding() - .font(.subheadline) - .background(colorScheme == .dark ? Color(hex: 0x1A1A1A) : Color(hex: 0xF3F3F3)) - .clipShape(RoundedRectangle(cornerRadius: 15.0)) - .frame(width: 300) - .padding(.bottom,30) - - // MARK: - 여행 기간 - Text("여행 기간") - .font(.title2) - .fontWeight(.bold) - VStack{ - DatePicker("시작 날짜", selection: $startdate,displayedComponents: [.date]) + DatePicker("종료 날짜", selection: $endDate, displayedComponents: [.date]) + .padding() + } + .bold() + .font(.body) + .frame(width: 300 , alignment: .leading) + .background(colorScheme == .dark ? Color(hex: 0x1A1A1A) : Color(hex: 0xF3F3F3)) + .clipShape(RoundedRectangle(cornerRadius: 15.0)) + .padding() + + //MARK: - 여행 목적 + // Picker("여행 활동", selection: $travelActivitys){ + // ForEach(TravelActivity.allCases, id: \.self) { + // Text($0.rawValue) + // .font(.body) + // } + // } + // .foregroundStyle(colorScheme == .dark ? .white : .black) + // .font(.title3) + // .bold() + // .padding() + // .pickerStyle(.navigationLink) + // .frame(width: 300,height: 60) + // .background(colorScheme == .dark ? Color(hex: 0x1A1A1A) : Color(hex: 0xF3F3F3)) + // .clipShape(RoundedRectangle(cornerRadius: 15.0)) + NavigationLink(destination: MultiSelector(selections: $travelActivitys)) { + HStack{ + Text("여행활동") + .font(.title3) .padding() - DatePicker("종료 날짜", selection: $endDate, displayedComponents: [.date]) - .padding() - } - .bold() - .font(.body) - .frame(width: 300 , alignment: .leading) - .background(colorScheme == .dark ? Color(hex: 0x1A1A1A) : Color(hex: 0xF3F3F3)) - .clipShape(RoundedRectangle(cornerRadius: 15.0)) - .padding() - - //MARK: - 여행 목적 - // Picker("여행 활동", selection: $travelActivitys){ - // ForEach(TravelActivity.allCases, id: \.self) { - // Text($0.rawValue) - // .font(.body) - // } - // } - // .foregroundStyle(colorScheme == .dark ? .white : .black) - // .font(.title3) - // .bold() - // .padding() - // .pickerStyle(.navigationLink) - // .frame(width: 300,height: 60) - // .background(colorScheme == .dark ? Color(hex: 0x1A1A1A) : Color(hex: 0xF3F3F3)) - // .clipShape(RoundedRectangle(cornerRadius: 15.0)) - NavigationLink(destination: MultiSelector(selections: $travelActivitys)) { - HStack{ - - Text("여행활동") - .font(.title3) - .padding() - .bold() - Spacer() - if travelActivitys.isEmpty { - Text("추가") - .foregroundStyle(.gray) - .font(.title3) - .padding() - } - Text("\(travelActivitysString(travelActivitys: travelActivitys))") + .bold() + Spacer() + if travelActivitys.isEmpty { + Text("추가") .foregroundStyle(.gray) + .font(.title3) .padding() - } - .foregroundStyle(.black) - .background(Color(hex: 0xF3F3F3)) - .clipShape(RoundedRectangle(cornerRadius: 15.0)) - .frame(width: 300 , alignment: .leading) - + Text("\(travelActivitysString(travelActivitys: travelActivitys))") + .foregroundStyle(.gray) + .padding() } + .foregroundStyle(.black) + .background(Color(hex: 0xF3F3F3)) + .clipShape(RoundedRectangle(cornerRadius: 15.0)) + .frame(width: 300 , alignment: .leading) } - //MARK: - 확인 버튼 - if isUploading { - ProgressView() - } else { - Button{ - addJourney() - } label: { - Text("확인") - .fontWeight(.bold) - .foregroundStyle(.white) - .padding(.horizontal,50) - .padding(.vertical,20) - .background(testString.isEmpty ? Color(hex: 0x566375).opacity(0.5) : Color(hex: 0x566375)) - .clipShape(RoundedRectangle(cornerRadius: 15.0)) - } - .padding(.top, 30) - .disabled(testString.isEmpty) - } + } + + //MARK: - 확인 버튼 + if isUploading { + ProgressView() + } else { + Button{ + addJourney() + } label: { + Text("확인") + .fontWeight(.bold) + .foregroundStyle(.white) + .padding(.horizontal,50) + .padding(.vertical,20) + .background(testString.isEmpty ? Color(hex: 0x566375).opacity(0.5) : Color(hex: 0x566375)) + .clipShape(RoundedRectangle(cornerRadius: 15.0)) + } + + } - .ignoresSafeArea(.all) + //MARK: - 확인 버튼 + if isUploading { + ProgressView() + } else { + Button{ + addJourney() + } label: { + Text("확인") + .fontWeight(.bold) + .foregroundStyle(.white) + .padding(.horizontal,50) + .padding(.vertical,20) + .background(testString.isEmpty ? Color(hex: 0x566375).opacity(0.5) : Color(hex: 0x566375)) + .clipShape(RoundedRectangle(cornerRadius: 15.0)) + } + .padding(.top, 30) + .disabled(testString.isEmpty) + } } } + .ignoresSafeArea(.all) + + } + .gradientBackground() // MARK: - ALERT .alert("알람", isPresented: $showAlert) { diff --git a/Packing/View/AddPersonalLuggageView.swift b/Packing/View/AddPersonalLuggageView.swift index 76a5f65..b64203b 100644 --- a/Packing/View/AddPersonalLuggageView.swift +++ b/Packing/View/AddPersonalLuggageView.swift @@ -74,8 +74,7 @@ struct AddPersonalLuggageView: View { .font(.title2) .fontWeight(.bold) .scrollContentBackground(.hidden) - .background(RoundedRectangle(cornerRadius: 30) - .fill(LinearGradient(colors: [Color(hex: "AEC6CF"),Color(hex: "ECECEC"),Color(hex: "FFFDD0")], startPoint: .topLeading, endPoint: .bottomTrailing))) + .gradientBackground() .ignoresSafeArea() } } diff --git a/Packing/View/AddShareLuggageView.swift b/Packing/View/AddShareLuggageView.swift index f65c3d4..37505cb 100644 --- a/Packing/View/AddShareLuggageView.swift +++ b/Packing/View/AddShareLuggageView.swift @@ -81,9 +81,9 @@ struct AddShareLuggageView: View { .font(.title2) .fontWeight(.bold) .scrollContentBackground(.hidden) - .background(RoundedRectangle(cornerRadius: 30) - .fill(LinearGradient(colors: [Color(hex: "AEC6CF"),Color(hex: "ECECEC"),Color(hex: "FFFDD0")], startPoint: .topLeading, endPoint: .bottomTrailing))) + .gradientBackground() .ignoresSafeArea() } } } + diff --git a/Packing/View/JourneyListView.swift b/Packing/View/JourneyListView.swift index 91297f2..34470d7 100644 --- a/Packing/View/JourneyListView.swift +++ b/Packing/View/JourneyListView.swift @@ -7,22 +7,41 @@ import SwiftUI +// MARK: - VIEW MODIFIER +struct GradientBackground: ViewModifier { + @Environment(\.colorScheme) var colorScheme + + func body(content: Content) -> some View { + content + .background( + LinearGradient(gradient: Gradient(colors: colorScheme == .light ? + [Color(hex: "AEC6CF"), Color(hex: "D6D6D6"), Color(hex: "F0EAD6")] : + [Color(hex: "34495E"), Color(hex: "4E4E4E"), Color(hex: "2E2E2E")]), + startPoint: .topLeading, endPoint: .bottomTrailing) + ) + } +} + +extension View { + func gradientBackground() -> some View { + modifier(GradientBackground()) + } +} + struct JourneyListView: View { @StateObject private var service: JourneyService = JourneyService() @State private var selectedJourney: Journey? @Environment(\.colorScheme) var colorScheme var body: some View { - ZStack { - BackgroundGradientView(colorScheme: colorScheme) - .ignoresSafeArea() - + VStack { if service.journeys.isEmpty { - EmptyStateView() + EmptyStateView } else { - JourneyList() + JourneyList } } + .gradientBackground() .navigationTitle("Your Journeys") .toolbar { ToolbarItem(placement: .navigationBarTrailing) { @@ -43,13 +62,7 @@ struct JourneyListView: View { .navigationBarBackButtonHidden(true) } - @ViewBuilder - private func BackgroundGradientView(colorScheme: ColorScheme) -> some View { - LinearGradient(gradient: Gradient(colors: colorScheme == .light ? [Color(hex: "AEC6CF"), Color(hex: "ECECEC"), Color(hex: "FFFDD0")] : [Color(hex: "34495E"), Color(hex: "555555"), Color(hex: "333333")]), startPoint: .topLeading, endPoint: .bottomTrailing) - } - - @ViewBuilder - private func EmptyStateView() -> some View { + private var EmptyStateView: some View { VStack { Image(systemName: "airplane") .font(.largeTitle) @@ -59,10 +72,10 @@ struct JourneyListView: View { .multilineTextAlignment(.center) .padding() } + .frame(maxWidth: .infinity, maxHeight: .infinity) } - @ViewBuilder - private func JourneyList() -> some View { + private var JourneyList: some View { List(service.journeys) { journey in Button(action: { self.selectedJourney = journey @@ -113,22 +126,19 @@ struct JourneySummaryView: View { } .padding() .background( - ZStack { - AsyncImage(url: URL(string: journey.image)) { image in + AsyncImage(url: URL(string: journey.image)) { image in + ZStack { image.resizable() - } placeholder: { - EmptyView() + LinearGradient(gradient: Gradient(stops: [ + .init(color: colorScheme == .dark ? Color.black.opacity(0.6) : Color.white.opacity(0.8), location: 0.3), + .init(color: colorScheme == .dark ? Color.black.opacity(0.4) : Color.white.opacity(0.5), location: 0.7), + .init(color: .clear, location: 1) + ]), startPoint: .leading, endPoint: .trailing) } - .scaledToFill() - - LinearGradient(gradient: Gradient(stops: [ - .init(color: colorScheme == .dark ? Color.black.opacity(0.6) : Color.white.opacity(0.8), location: 0.3), - .init(color: colorScheme == .dark ? Color.black.opacity(0.4) : Color.white.opacity(0.5), location: 0.7), - .init(color: .clear, location: 1) - ]), startPoint: .leading, endPoint: .trailing) + } placeholder: { + colorScheme == .dark ? Color("DarkColor") : Color(hex: 0xE2E8F0) } -// .frame(height: 100) -// .clipped() + .scaledToFill() ) .cornerRadius(8) .scaledToFill() @@ -139,8 +149,10 @@ struct JourneySummaryView: View { #Preview { - JourneyListView() - .environmentObject(JourneyService()) + NavigationStack { + JourneyListView() + .environmentObject(JourneyService()) + } } // MARK: - COLOR EXTENSION diff --git a/Packing/View/OnboardingView.swift b/Packing/View/OnboardingView.swift index 097e561..c777996 100644 --- a/Packing/View/OnboardingView.swift +++ b/Packing/View/OnboardingView.swift @@ -16,7 +16,7 @@ struct OnboardingView: View { @AppStorage("hasCompletedOnboarding") var showMainView: Bool = false var body: some View { - NavigationView { +// NavigationView { if showMainView { JourneyListView() } else { @@ -35,10 +35,11 @@ struct OnboardingView: View { NavigationButtons(currentPage: $currentPage, totalPages: 4) } + .navigationBarHidden(true) + .navigationBarBackButtonHidden(true) } - } - .navigationBarHidden(true) - .navigationBarBackButtonHidden(true) +// } + } } diff --git a/Packing/View/PackingListView.swift b/Packing/View/PackingListView.swift index c0565ca..a2dcec5 100644 --- a/Packing/View/PackingListView.swift +++ b/Packing/View/PackingListView.swift @@ -16,7 +16,6 @@ struct PackingListView: View { var journey: Journey @Environment(\.colorScheme) var colorScheme -// @Environment(\.dismiss) var dismiss var body: some View { VStack { @@ -152,7 +151,6 @@ struct PackingListView: View { .scrollContentBackground(.hidden) } -// .navigationBarBackButtonHidden(true) .padding(.top, 90) .ignoresSafeArea() .sheet(isPresented: $isNewSharePresented) { @@ -161,7 +159,7 @@ struct PackingListView: View { .sheet(isPresented: $isNewPersonalPresented) { AddPersonalLuggageView(journey: journey, service: service) } - .background(LinearGradient(gradient: Gradient(colors: colorScheme == .light ? [Color(hex: "AEC6CF"), Color(hex: "ECECEC"), Color(hex: "FFFDD0")] : [Color(hex: "34495E"), Color(hex: "555555"), Color(hex: "333333")]), startPoint: .topLeading, endPoint: .bottomTrailing)) + .gradientBackground() } }