import SwiftUI /// 首页(导购)。不设防(未登录可浏览)。进入时先用默认坐标出券,定位回来再刷新成附近的。 struct HomeView: View { @State private var vm = HomeViewModel() @State private var locationManager = LocationManager() @Environment(\.openURL) private var openURL var body: some View { NavigationStack { content .navigationTitle("傻瓜比价") } .task { await vm.loadFirstPage() // 首屏已出券;定位回来若成功,刷新成附近的(失败则保持默认坐标结果) if let coord = await locationManager.requestOnce() { await vm.updateLocation(longitude: coord.longitude, latitude: coord.latitude) } } } @ViewBuilder private var content: some View { if vm.isLoading && vm.coupons.isEmpty { ProgressView("加载中…") .frame(maxWidth: .infinity, maxHeight: .infinity) } else if vm.coupons.isEmpty { ContentUnavailableView { Label("暂时没有优惠", systemImage: "ticket") } description: { Text(vm.errorMessage ?? "下拉刷新试试") } } else { List { ForEach(vm.coupons) { card in CouponCardView(card: card) { Task { await openCard(card) } } .listRowSeparator(.hidden) } if vm.hasNext { HStack { Spacer() ProgressView() Spacer() } .listRowSeparator(.hidden) .onAppear { Task { await vm.loadNextPage() } } } } .listStyle(.plain) .refreshable { await vm.loadFirstPage() } } } /// 点券:换推广链接 → deeplink 优先唤起美团 App,唤不起用 H5 兜底。 private func openCard(_ card: CouponCard) async { let links = await vm.referralLinks(for: card) if let deeplink = links.deeplink { openURL(deeplink) { accepted in if !accepted, let h5 = links.h5 { openURL(h5) } } } else if let h5 = links.h5 { openURL(h5) } } }