Untitled
unknown
swift
2 years ago
52 kB
6
Indexable
// // BookingDetailsView.swift // Garageworks-iOS-Revamp // // Created by DigitalFlake Kapil Dongre on 07/01/23. // import SwiftUI import Razorpay import Foundation struct BookingDetailsView: View { @Environment(\.presentationMode) var presentationMode var custId: String? = "" var bookId: String? = "" @State var isBookingDetailsOpen: Bool = false @State var isJobCardOpen: Bool = false @State var isBookingTrackingOpen: Bool = false @State var isPaymentDetailsOpen: Bool = false @State var isServiceDetailsOpen: Bool = false @State var isReccomendationOpen: Bool = false @State var isComplaintOpen: Bool = false @StateObject var razorPayObserver: RazorPayObserver = RazorPayObserver() @Binding var price: String? @State var isLinkActive = false @State private var showWebView = false @State var isJobCardApprovalLinkActive = false @StateObject var bookingDataObserver = BookingDatasetObserver() @StateObject var serviceReport = ServiceReportObserver() @StateObject var bookingDetailObserver: BookingDetailModelObserver = BookingDetailModelObserver(booking_id: (UserDefaults.standard.string(forKey: "booking_id")!), customer_id: (UserDefaults.standard.string(forKey: "customer_id")!)) @State var callImageDetailView: Int? = nil @StateObject var jobCardObserver = JobCardDetailObserver() //= JobCardDetailObserver(booking_id: (UserDefaults.standard.string(forKey: "booking_id")!)) @State private var showJobcardText: String = "" @State var showProgress : Bool = true @Binding var is_reschedule : Int @Binding var bookingID : String var body: some View { GeometryReader{geometry in //NavigationView{ VStack{ HStack(spacing:20){ Image("Vector 1") .resizable() .frame(width: 8, height: 15) .padding(.leading,15) .foregroundColor(Color.init(hex: Colors.color_gr2)) Text("Booking Details") .font(Font.custom(Fonts.product_regular, size: 16)) .foregroundColor(Color.init(hex: Colors.color_gr2)) Spacer() } .frame(width:geometry.size.width,height:geometry.size.height * 0.10,alignment: .center) .background(.white) .onTapGesture { bookingID = bookingDataObserver.bookingDatasetObserver?.booking_id ?? "" is_reschedule = bookingDataObserver.bookingDatasetObserver?.is_reschedule ?? -1 self.presentationMode.wrappedValue.dismiss() } VStack(spacing: 20){ VStack{ VStack(alignment: .leading,spacing: 20){ HStack{ VStack(alignment: .leading,spacing: 5){ Text("\(bookingDataObserver.bookingDatasetObserver?.vehicle_make ?? "") \(bookingDataObserver.bookingDatasetObserver?.vehicle_model ?? "")") .bold() .font(Font.custom(Fonts.inter, size: 12)) .foregroundColor(Color.init(hex: Colors.color_or)) Text("#\(bookingDataObserver.bookingDatasetObserver?.booking_id ?? "")") .font(Font.custom(Fonts.product_bold, size: 20)) .foregroundColor(.black) } Spacer() VStack(alignment: .leading,spacing: 5){ Text("\(bookingDataObserver.bookingDatasetObserver?.custom_status ?? "")") .foregroundColor(.white) .font(Font.custom(Fonts.product_bold, size: 12)) .padding([.leading, .trailing], 12) .padding([.top, .bottom], 5) .background(Color(hex: "\(bookingDataObserver.bookingDatasetObserver?.custom_status_color ?? "")")) .cornerRadius(10) } } .frame(width: geometry.size.width * 0.8) .padding(.top) .padding(.leading, 15) HStack{ VStack(alignment: .leading,spacing: 5){ Text("Date") .font(Font.custom(Fonts.product_regular, size: 12)) .foregroundColor(Color.init(hex: Colors.color_light_gr)) Text("\(bookingDataObserver.bookingDatasetObserver?.service_date ?? "" )") .font(Font.custom(Fonts.product_regular, size: 16)) .foregroundColor(.black) } .frame(width: geometry.size.width * 0.43,alignment: .leading) // Spacer() VStack(alignment: .leading,spacing: 5){ Text("Time") .font(Font.custom(Fonts.product_regular, size: 12)) .foregroundColor(Color.init(hex: Colors.color_light_gr)) Text("\(bookingDataObserver.bookingDatasetObserver?.time_slot ?? "" )") .font(Font.custom(Fonts.product_regular, size: 16)) .foregroundColor(.black) } .frame(width: geometry.size.width * 0.47,alignment: .leading) } // .background(.red) .frame(width: geometry.size.width * 0.9,alignment: .leading) .padding(.horizontal) VStack(alignment: .leading){ HStack{ VStack(alignment: .leading,spacing: 5){ Text("Est. Amount") .font(Font.custom(Fonts.product_regular, size: 12)) .foregroundColor(Color.init(hex: Colors.color_light_gr)) Text("₹ \(bookingDataObserver.bookingDatasetObserver?.estimated_amount ?? "")") .font(Font.custom(Fonts.product_regular, size: 16)) .foregroundColor(.black) } .frame(width: geometry.size.width * 0.43,alignment: .leading) VStack{ BookingDetailsButtonView() .padding(.bottom,20) .environmentObject(bookingDataObserver) } .frame(width: geometry.size.width * 0.47, alignment: .top) .padding(.bottom,20) .onAppear{ bookingID = UserDefaults.standard.string(forKey: "booking_id")! is_reschedule = bookingDataObserver.bookingDatasetObserver?.is_reschedule ?? -1 } } .frame(width: geometry.size.width * 0.9,alignment: .leading) .padding(.horizontal) .padding(.bottom) } }.frame(width: geometry.size.width * 0.9,height: geometry.size.height * 0.2, alignment: .leading) .padding([.top, .bottom]) .background() .cornerRadius(10) } .padding(.top, 20) VStack(alignment: .leading){ ScrollView{ //MARK: Booking Details VStack{ Button(){ self.isBookingDetailsOpen.toggle() self.isJobCardOpen = false self.isBookingTrackingOpen = false self.isPaymentDetailsOpen = false self.isServiceDetailsOpen = false self.isReccomendationOpen = false }label: { HStack{ Text("Booking Details") .font(Font.custom(Fonts.product_medium, size: 15)) .foregroundColor(.black) Spacer() if isBookingDetailsOpen == false{ Image("openList") .resizable() .frame(width: 12, height: 7) }else{ Image("closeList") .resizable() .frame(width: 12, height: 7) } } .frame(width: geometry.size.width * 0.8) } .padding([.leading, .trailing, .top], 10) Divider() .padding(.top, 10) //Content of booking Details if isBookingDetailsOpen{ VStack(alignment: .leading ,spacing: 10){ HStack{ Text("Name :") .font(Font.custom(Fonts.product_regular, size: 14)) .foregroundColor(Color.init(hex: Colors.color_F6)) Spacer() Text("\(bookingDataObserver.bookingDatasetObserver?.customer_name ?? " ")") .font(Font.custom(Fonts.product_regular, size: 14)) } HStack{ Text("Mobile :") .font(Font.custom(Fonts.product_regular, size: 14)) .foregroundColor(Color.init(hex: Colors.color_F6)) Spacer() Text("\(bookingDataObserver.bookingDatasetObserver?.customer_mobile ?? " ")") .font(Font.custom(Fonts.product_regular, size: 14)) } if bookingDataObserver.bookingDatasetObserver?.customer_email != ""{ HStack{ Text("Email :") .font(Font.custom(Fonts.product_regular, size: 14)) .foregroundColor(Color.init(hex: Colors.color_F6)) Spacer() Text("\(bookingDataObserver.bookingDatasetObserver?.customer_email ?? " ")") .font(Font.custom(Fonts.product_regular, size: 14)) } } HStack{ Text("Address :") .font(Font.custom(Fonts.product_regular, size: 14)) .foregroundColor(Color.init(hex: Colors.color_F6)) Spacer() Text("\(bookingDataObserver.bookingDatasetObserver?.customer_address ?? " ")") .font(Font.custom(Fonts.product_regular, size: 14)) } HStack{ Text("Area :") .font(Font.custom(Fonts.product_regular, size: 14)) .foregroundColor(Color.init(hex: Colors.color_F6)) Spacer() Text("\(bookingDataObserver.bookingDatasetObserver?.customer_area ?? " ")") .font(Font.custom(Fonts.product_regular, size: 14)) } HStack{ Text("Pincode :") .font(Font.custom(Fonts.product_regular, size: 14)) .foregroundColor(Color.init(hex: Colors.color_F6)) Spacer() Text("\(bookingDataObserver.bookingDatasetObserver?.customer_pincode ?? " ")") .font(Font.custom(Fonts.product_regular, size: 14)) } HStack{ Text("City :") .font(Font.custom(Fonts.product_regular, size: 14)) .foregroundColor(Color.init(hex: Colors.color_F6)) Spacer() Text("\(bookingDataObserver.bookingDatasetObserver?.customer_city ?? " ")") .font(Font.custom(Fonts.product_regular, size: 14)) } } .padding() Divider() } } //MARK: Recommendation if bookingDataObserver.bookingDatasetObserver?.is_autojobcard == "1"{ VStack{ Button(){ self.isReccomendationOpen.toggle() self.isBookingDetailsOpen = false self.isJobCardOpen = false self.isBookingTrackingOpen = false self.isPaymentDetailsOpen = false self.isServiceDetailsOpen = false //self.isReccomendationOpen = false }label: { HStack{ Text("Service Report Details / Recommendation") .font(Font.custom(Fonts.product_medium, size: 15)) .foregroundColor(.black) Spacer() if isReccomendationOpen == false{ Image("openList") .resizable() .frame(width: 12, height: 7) }else{ Image("closeList") .resizable() .frame(width: 12, height: 7) } } .frame(width: geometry.size.width * 0.8) } .padding([.leading, .trailing, .top], 10) Divider() .padding(.top, 10) } if isReccomendationOpen{ VStack{ HStack(spacing: 10){ NavigationLink(destination: ImageDetailView(displayImage: "extendImage").navigationBarHidden(true), tag: 1, selection: $callImageDetailView){ Image("extendImage") .resizable() .frame(width: 70, height: 70) .onTapGesture { self.callImageDetailView = 1 } } // Image("reccomendDemo") // .resizable() // .frame(width: 70, height: 70) VStack(alignment: .leading, spacing: 5){ Text("Comments") .foregroundColor(.gray) .font(.system(size: 14, weight: .regular)) Text("\(bookingDataObserver.bookingDatasetObserver?.specific_complaints ?? "") \(bookingDataObserver.bookingDatasetObserver?.specific_services ?? "") \(bookingDataObserver.bookingDatasetObserver?.specific_repairs ?? "")") .multilineTextAlignment(.leading) .font(.system(size: 15, weight: .regular)) .foregroundColor(.gray) } } .frame(width: geometry.size.width * 0.8) .padding(.leading) List{ HStack(spacing: 10){ Image("reccomendDemo") .resizable() .frame(width: 70, height: 70) VStack(alignment: .leading, spacing: 5){ Text("Comments") .font(Font.custom(Fonts.product_medium, size: 13)) .foregroundColor(Color.init(hex: Colors.color_F6)) Text("\(bookingDataObserver.bookingDatasetObserver?.specific_complaints ?? "") \(bookingDataObserver.bookingDatasetObserver?.specific_services ?? "") \(bookingDataObserver.bookingDatasetObserver?.specific_repairs ?? "")") .multilineTextAlignment(.leading) .font(Font.custom(Fonts.product_medium, size: 13)) .foregroundColor(Color.init(hex: Colors.color_F6)) } Spacer() } .frame(width: geometry.size.width * 0.8) // Spacer() } } } } //MARK: Jobcard Details else{ VStack{ Button(){ jobCardObserver.getJobCardDetail(booking_id: (UserDefaults.standard.string(forKey: "booking_id")!)) if !jobCardObserver.store.isEmpty{ self.isJobCardOpen.toggle() } self.isBookingDetailsOpen = false //self.isJobCardOpen = false self.isBookingTrackingOpen = false self.isPaymentDetailsOpen = false self.isServiceDetailsOpen = false self.isReccomendationOpen = false if jobCardObserver.store.isEmpty{ // if response null self.showJobcardText = "Jobcard Not Created" } }label: { HStack{ Text("Jobcard Details") .font(Font.custom(Fonts.product_medium, size: 15)) .foregroundColor(.black) Spacer() if isJobCardOpen == false{ Image("openList") .resizable() .frame(width: 12, height: 7) }else{ Image("closeList") .resizable() .frame(width: 12, height: 7) } } .frame(width: geometry.size.width * 0.8) } .padding([.leading, .trailing, .top], 10) Divider() .padding(.top, 10) if isJobCardOpen{ HStack{ Text("Name") .font(Font.custom(Fonts.product_medium, size: 12)) .foregroundColor(.black) .frame(width: 127, alignment: .leading) Text("Qty") .font(Font.custom(Fonts.product_medium, size: 12)) .frame(width: 27) Text("Spares") .font(Font.custom(Fonts.product_medium, size: 12)) .frame(width: 44) Text("Labour") .font(Font.custom(Fonts.product_medium, size: 12)) .frame(width: 44) Text("Total") .font(Font.custom(Fonts.product_medium, size: 12)) .frame(width: 40) } .padding([.top, .bottom], 5) .padding([.leading, .trailing], 15) .background(Color(red: 0.906, green: 0.91, blue: 0.914)) .cornerRadius(10) ForEach(jobCardObserver.store, id: \.self) { content in // Text("\(content.item_id)") VStack(alignment: .leading, spacing: 10){ HStack(spacing: 10){ Text("\(content.item ?? " ")") .font(Font.custom(Fonts.product_medium, size: 13)) .foregroundColor(Color.init(hex: Colors.color_F5)) .frame(width: 145, alignment: .leading) //.background(.red) Text("\(content.qty ?? " ")") .font(Font.custom(Fonts.product_medium, size: 12)) .foregroundColor(Color.init(hex: Colors.color_F5)) .frame(width: 20, alignment: .leading) //.background(.yellow) Text("\(rsUnicode) \(content.spares_rate ?? " ")") .font(Font.custom(Fonts.product_medium, size: 12)) .foregroundColor(Color.init(hex: Colors.color_F5)) .frame(width: 44, alignment: .leading) // .background(.orange) Text("\(rsUnicode) \(content.labour_rate ?? " " )") .font(Font.custom(Fonts.product_medium, size: 12)) .foregroundColor(Color.init(hex: Colors.color_F5)) .frame(width: 44, alignment: .leading) // .background(.cyan) Text("\(rsUnicode) \(content.amount ?? " ")") .font(Font.custom(Fonts.product_medium, size: 12)) .foregroundColor(Color.init(hex: Colors.color_F5)) .frame(width: 44, alignment: .leading) // .background(.yellow) } }.frame(width: geometry.size.width * 0.9, alignment: .leading) //.background(.red) .padding(.leading, 20) } } } } // MARK: Booking Tracking VStack{ Button(){ self.isBookingTrackingOpen.toggle() self.isBookingDetailsOpen = false self.isJobCardOpen = false //self.isBookingTrackingOpen = false self.isPaymentDetailsOpen = false self.isServiceDetailsOpen = false self.isReccomendationOpen = false }label: { HStack{ Text("Booking Tracking") .font(Font.custom(Fonts.product_medium, size: 15)) .foregroundColor(.black) Spacer() if isBookingTrackingOpen == false{ Image("openList") .resizable() .frame(width: 12, height: 7) }else{ Image("closeList") .resizable() .frame(width: 12, height: 7) } } .frame(width: geometry.size.width * 0.8) } .padding([.leading, .trailing, .top], 10) Divider() .padding(.top, 10) //Booking tracking content if isBookingTrackingOpen{ VStack{ VStack(spacing: 0){ ForEach(bookingDetailObserver.bookingDetailModelObserver?.service_tracker ?? [], id: \.self){ trackService in VStack(alignment: HorizontalAlignment.leading, spacing: 0) { HStack { if trackService.action == "completed" && trackService.active == "0"{ Image("completedRadioButton").frame(width: 30) } else if trackService.action == "completed" && trackService.active == "1"{ Image("ongoingRadioButton").frame(width: 30) } else{ Image("pendingRadioButton").frame(width: 30) } Text("\(trackService.title ?? "")") .font(Font.custom(Fonts.product_medium, size: 15)) Spacer() } HStack{ if trackService.details == ""{ //if textIsHidden{ if trackService.action == "completed" && trackService.active == "0"{ if trackService.title != "Booking Completed"{ Rectangle().fill(Color.blue).frame(width: 2, height: 15, alignment: .center).padding(.leading, 14) } } else{ if trackService.title != "Booking Completed"{ Rectangle().fill(Color.gray).frame(width: 2, height: 15, alignment: .center).padding(.leading, 14) } } Text("\(trackService.details ?? "")") .foregroundColor(Color.init(hex: Colors.color_F5)) .font(Font.custom(Fonts.product_regular, size: 12)) .padding(.leading) .frame(width: geometry.size.width * 0.8, alignment: .topLeading) } else{ if trackService.action == "completed" && trackService.active == "0"{if trackService.title != "Booking Completed"{ Rectangle().fill(Color.blue).frame(width: 2, height: 29, alignment: .center).padding(.leading, 14) } }else{ if trackService.title != "Booking Completed"{ Rectangle().fill(Color.gray).frame(width: 2, height: 29, alignment: .center).padding(.leading, 14) } } Text("\(trackService.details ?? "")") .foregroundColor(Color.init(hex: Colors.color_F5)) .font(Font.custom(Fonts.product_regular, size: 12)) .padding(.leading) .padding(.bottom) .frame(width: geometry.size.width * 0.8, alignment: .topLeading) } } } //.background() } } .padding() .background() } } } //MARK: Payment Details VStack{ Button(){ self.isPaymentDetailsOpen.toggle() self.isBookingDetailsOpen = false self.isJobCardOpen = false self.isBookingTrackingOpen = false //self.isPaymentDetailsOpen = false self.isServiceDetailsOpen = false self.isReccomendationOpen = false }label: { HStack{ Text("Payment Details") .font(Font.custom(Fonts.product_medium, size: 15)) .foregroundColor(.black) Spacer() if isPaymentDetailsOpen == false{ Image("openList") .resizable() .frame(width: 12, height: 7) }else{ Image("closeList") .resizable() .frame(width: 12, height: 7) } } .frame(width: geometry.size.width * 0.8) } .padding([.leading, .trailing, .top], 10) Divider() .padding(.top, 10) //Content of Payment Details if isPaymentDetailsOpen{ VStack(alignment: .leading ,spacing: 10){ HStack{ Text("Estimated Amount :") .foregroundColor(Color.init(hex: Colors.color_F6)) .font(Font.custom(Fonts.product_medium, size: 13)) Spacer() Text("\(rsUnicode) \(bookingDataObserver.bookingDatasetObserver?.payment_details?.estimated_amount ?? "0")") .foregroundColor(Color.init(hex: Colors.color_F6)) .font(Font.custom(Fonts.product_medium, size: 13)) } HStack{ Text("Additional :") .foregroundColor(Color.init(hex: Colors.color_F6)) .font(Font.custom(Fonts.product_medium, size: 13)) Spacer() Text("\(rsUnicode) \(bookingDataObserver.bookingDatasetObserver?.payment_details?.discount ?? "0")") .foregroundColor(Color.init(hex: Colors.color_F6)) .font(Font.custom(Fonts.product_medium, size: 13)) } HStack{ Text("Booking Fee Paid Total :") .foregroundColor(Color.init(hex: Colors.color_F6)) .font(Font.custom(Fonts.product_medium, size: 13)) Spacer() Text("\(rsUnicode) \(bookingDataObserver.bookingDatasetObserver?.payment_details?.booking_fee ?? "")") .foregroundColor(Color.init(hex: Colors.color_F6)) .font(Font.custom(Fonts.product_medium, size: 13)) } HStack{ Text("Wallet Used :") .foregroundColor(Color.init(hex: Colors.color_F6)) .font(Font.custom(Fonts.product_medium, size: 13)) Spacer() Text("\(rsUnicode) \(bookingDataObserver.bookingDatasetObserver?.payment_details?.wallet_used ?? "")") .foregroundColor(Color.init(hex: Colors.color_F6)) .font(Font.custom(Fonts.product_medium, size: 13)) } HStack{ Text("Payable Amount :") .foregroundColor(Color.init(hex: Colors.color_F6)) .font(Font.custom(Fonts.product_medium, size: 13)) Spacer() Text("\(rsUnicode) \(bookingDataObserver.bookingDatasetObserver?.payment_details?.payable_amount ?? "")") .foregroundColor(Color.init(hex: Colors.color_F6)) .font(Font.custom(Fonts.product_medium, size: 13)) } } .padding() Divider() } } //MARK: Service details VStack{ Button(){ self.isServiceDetailsOpen.toggle() self.isBookingDetailsOpen = false self.isJobCardOpen = false self.isBookingTrackingOpen = false self.isPaymentDetailsOpen = false //self.isServiceDetailsOpen = false self.isReccomendationOpen = false }label: { HStack{ Text("Service Details") .font(Font.custom(Fonts.product_medium, size: 15)) .foregroundColor(.black) Spacer() if isServiceDetailsOpen == false{ Image("openList") .resizable() .frame(width: 12, height: 7) }else{ Image("closeList") .resizable() .frame(width: 12, height: 7) } } .frame(width: geometry.size.width * 0.8) } .padding([.leading, .trailing, .top], 10) Divider() .padding(.top, 10) //content of Service details if isServiceDetailsOpen{ VStack(alignment: .leading ,spacing: 10){ HStack{ Text("Name :") .font(Font.custom(Fonts.product_medium, size: 13)) .foregroundColor(Color.init(hex: Colors.color_F6)) Spacer() Text("Standard Service") .font(Font.custom(Fonts.product_medium, size: 13)) } if bookingDataObserver.bookingDatasetObserver?.payment_details?.coupon_code == ""{ HStack{ Text("Coupon :") .font(Font.custom(Fonts.product_medium, size: 13)) .foregroundColor(Color.init(hex: Colors.color_F6)) Spacer() Text(bookingDataObserver.bookingDatasetObserver?.payment_details?.coupon_code ?? "") .font(Font.custom(Fonts.product_medium, size: 13)) } } VStack{ HStack{ Button(){ self.isComplaintOpen.toggle() }label: { Text("Complaint: ") .font(Font.custom(Fonts.product_medium, size: 13)) .foregroundColor(Color.init(hex: Colors.color_F6)) Spacer() if isComplaintOpen == false{ Image("openList") .resizable() .frame(width: 12, height: 7) }else{ Image("closeList") .resizable() .frame(width: 12, height: 7) } } } if isComplaintOpen{ VStack{ Text("\(bookingDataObserver.bookingDatasetObserver?.specific_complaints ?? "") \(bookingDataObserver.bookingDatasetObserver?.specific_services ?? "") \(bookingDataObserver.bookingDatasetObserver?.specific_repairs ?? "")") .font(Font.custom(Fonts.product_medium, size: 13)) .foregroundColor(Color.init(hex: Colors.color_F6)) .multilineTextAlignment(.leading) } } } } .padding() Divider() } } } .padding(.top) } .frame(width: geometry.size.width * 0.9) .background() .cornerRadius(20) // Spacer() }.frame(width:geometry.size.width, height:geometry.size.height * 0.97,alignment: .top) .background(Color.init(hex: Colors.color_gr)) .cornerRadius(30, corners: [.topLeft, .topRight]) // .edgesIgnoringSafeArea(.bottom) //.padding() } .showToast(text: $showJobcardText) .showProgressView(showProgress: $showProgress) .onAppear(){ bookingDataObserver.getBookingDataSet(customer_id: (UserDefaults.standard.string(forKey: "customer_id")!), booking_id: (UserDefaults.standard.string(forKey: "booking_id")!)) serviceReport.getServiceReport(booking_id: (UserDefaults.standard.string(forKey: "booking_id")!)) showProgress = false bookingID = bookingDataObserver.bookingDatasetObserver?.booking_id ?? "" is_reschedule = bookingDataObserver.bookingDatasetObserver?.is_reschedule ?? -1 } //} } } } //struct BookingDetailsView_Previews: PreviewProvider { // static var previews: some View { // BookingDetailsView(price: .constant("")) // } //}
Editor is loading...