Files
Gas-Tank-AR-App/GasTankAR/Views/Leads/Detail/LeadDetailView.swift

69 lines
2.4 KiB
Swift

import SwiftUI
import SwiftData
struct LeadDetailView: View {
let detail: LeadDetail
let model: LeadDetailViewModel
let salesCode: String
let repository: any LeadDetailRepository
let onLogout: () -> Void
@State private var showsARProjects = false
@State private var galleryRevision = 0
var body: some View {
LeadDetailPageLayout {
LeadDetailHeaderView(detail: detail, canStartAR: true, onStartAR: { showsARProjects = true })
} left: {
VStack(spacing: 28) {
LeadContactSection(detail: detail)
LeadLocationSection(name: detail.lead.displayName, address: detail.lead.address)
}
} right: {
VStack(spacing: 28) {
LeadOffersSection(offers: detail.offers, model: model)
LeadPhotoGallerySection(photos: detail.photos, leadID: detail.lead.id,
salesCode: salesCode, repository: repository, onLogout: onLogout,
refreshID: galleryRevision)
}
}
.sheet(isPresented: $showsARProjects, onDismiss: { galleryRevision += 1 }) {
LeadARProjectsSheet(detail: detail)
}
}
}
struct LeadDetailPageLayout<Header: View, Left: View, Right: View>: View {
let header: Header
let left: Left
let right: Right
@Environment(\.dynamicTypeSize) private var dynamicTypeSize
init(@ViewBuilder header: () -> Header, @ViewBuilder left: () -> Left,
@ViewBuilder right: () -> Right) {
self.header = header()
self.left = left()
self.right = right()
}
var body: some View {
GeometryReader { geometry in
ScrollView {
VStack(alignment: .leading, spacing: 28) {
header
if geometry.size.width >= 900 && !dynamicTypeSize.isAccessibilitySize {
HStack(alignment: .top, spacing: 24) {
left.frame(width: (geometry.size.width - 72) * 0.34)
right.frame(maxWidth: .infinity)
}
} else {
left
right
}
}
.padding(24)
}
.background(LeadDetailStyle.background.ignoresSafeArea())
}
}
}