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: 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()) } } }