69 lines
2.4 KiB
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())
|
|
}
|
|
}
|
|
}
|