242 lines
6.9 KiB
Swift
242 lines
6.9 KiB
Swift
//
|
|
// 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()
|
|
}
|