// // SubscribeView.swift // wake // // Created by fairclip on 2025/8/19. // import SwiftUI // MARK: - 订阅计划枚举 enum SubscriptionPlan: String, CaseIterable { case free = "Free" case pioneer = "Pioneer" var displayName: String { return self.rawValue } var price: String { switch self { case .free: return "Free" case .pioneer: return "1$/Mon" } } var isPopular: Bool { return self == .pioneer } } // MARK: - 功能特性结构体 struct SubscriptionFeature { let name: String let freeValue: String let proValue: String } struct SubscribeView: View { @State private var selectedPlan: SubscriptionPlan? = .pioneer @State private var isLoading = false @Environment(\.presentationMode) var presentationMode // 功能对比数据 private let features = [ SubscriptionFeature(name: "Mystery Box Purchase:", freeValue: "3 /week", proValue: "Free"), SubscriptionFeature(name: "Material Upload:", freeValue: "50 images and\n5 videos/day", proValue: "Unlimited"), SubscriptionFeature(name: "Free Credits:", freeValue: "200 /day", proValue: "500 /day") ] var body: some View { NavigationView { ScrollView { VStack(spacing: 0) { // 导航栏 navigationHeader // 当前订阅状态卡片 currentSubscriptionCard // 积分信息 creditsSection VStack { // 订阅计划选择 subscriptionPlansSection // 特别优惠提示 specialOfferBanner } .background(Theme.Colors.cardBackground) .cornerRadius(Theme.CornerRadius.medium) .padding(.horizontal, Theme.Spacing.lg) .padding(.vertical, Theme.Spacing.lg) // 功能对比表 featureComparisonTable // 订阅按钮 subscribeButton // 法律链接 legalLinks Spacer(minLength: 100) } } .background(Theme.Colors.background) .navigationBarHidden(true) } } // MARK: - 导航栏 private var navigationHeader: some View { NaviHeader(title: "Subscription") { presentationMode.wrappedValue.dismiss() } } // MARK: - 当前订阅状态卡片 private var currentSubscriptionCard: some View { SubscriptionStatusBar( status: .pioneer(expiryDate: Date()) , onSubscribeTap: { // 订阅操作 handleSubscribe() } ) .padding(.horizontal, Theme.Spacing.xl) } // MARK: - 积分信息 private var creditsSection: some View { VStack(spacing: 16) { CreditsInfoCard( totalCredits: 3290, onInfoTap: { // 显示积分信息说明 }, onDetailTap: { // 跳转到积分详情页面 } ) } .padding(.horizontal, Theme.Spacing.xl) .padding(.top, Theme.Spacing.xl) } // MARK: - 订阅计划选择 private var subscriptionPlansSection: some View { PlanSelector( selectedPlan: $selectedPlan, onPlanSelected: { plan in print("Selected plan: \(plan.displayName)") } ) .padding(.horizontal, Theme.Spacing.xl) .padding(.top, Theme.Spacing.xl) } // MARK: - 特别优惠横幅 private var specialOfferBanner: some View { HStack(spacing: 0) { Text("First") .font(Typography.font(for: .footnote, family: .quicksandRegular)) .foregroundColor(Theme.Colors.textPrimary) Text(" 100") .font(Typography.font(for: .footnote, family: .quicksandBold)) .foregroundColor(Theme.Colors.textPrimary) Text(" users get a special deal: justs") .font(Typography.font(for: .footnote, family: .quicksandRegular)) .foregroundColor(Theme.Colors.textPrimary) Text(" $1") .font(Typography.font(for: .footnote, family: .quicksandBold)) .foregroundColor(Theme.Colors.textPrimary) Text(" for your first month!") .font(Typography.font(for: .footnote, family: .quicksandRegular)) .foregroundColor(Theme.Colors.textPrimary) } .multilineTextAlignment(.center) .padding(.horizontal, Theme.Spacing.lg) .padding(.top, Theme.Spacing.sm) .padding(.bottom, Theme.Spacing.lg) } // MARK: - 功能对比表 private var featureComparisonTable: some View { PlanCompare() .padding(.horizontal, Theme.Spacing.lg) } // MARK: - 订阅按钮 private var subscribeButton: some View { VStack(spacing: 12) { SubscribeButton( title: "Subscribe", isLoading: isLoading, action: handleSubscribe ) } .padding(.horizontal, Theme.Spacing.xl) .padding(.top, Theme.Spacing.lg) } // MARK: - 法律链接 private var legalLinks: some View { HStack(spacing: 8) { Button(action: { // 打开服务条款 }) { Text("Terms of Service") .underline() } Text("|") .foregroundColor(.secondary) Button(action: { // 打开隐私政策 }) { Text("Privacy Policy") .underline() } Text("|") .foregroundColor(.secondary) Button(action: { // 恢复购买 }) { Text("Restore Purchase") .underline() } } .font(Typography.font(for: .caption, family: .quicksandRegular)) .foregroundColor(.secondary) .padding(.top, Theme.Spacing.sm) } // MARK: - 订阅处理 private func handleSubscribe() { isLoading = true // 模拟订阅处理 DispatchQueue.main.asyncAfter(deadline: .now() + 2) { isLoading = false // 处理订阅逻辑 } } } #Preview { SubscribeView() }