// // GrammarCheckView.swift // AIGrammar // // Created by oscar on 2024/3/27. // import SwiftUI import ToastUI import FirebaseAnalytics fileprivate struct BuyProView: View { var onTryForFree: () -> Void var body: some View { HStack { VStack(alignment: .leading, spacing: 10) { Text("Update to Pro") .font(.headline) Text("Remove Character limits and ads. Use Grammar Check with higher quality.") .font(.subheadline) } Spacer() Button("Try for free") { // 按钮动作 // 触发显示VIP付费界面的事件 onTryForFree() // 记录事件 Analytics.logEvent(globalAnalyticsEvents.eventEnterPurchase, parameters: [ globalAnalyticsEvents.keyPurchaseEntry: globalAnalyticsEvents.valEntryBuyProBtn as NSObject, globalAnalyticsEvents.keyDeviceID: globalEnvironment.deviceID as NSObject ]) } .padding(.vertical, 6) // 调整高度为默认高度的2/3 .padding(.horizontal, 20) .background(Color.green) .foregroundColor(.white) .cornerRadius(5) .font(.headline) // 调整字体大小为标题大小 .alignmentGuide(.bottom) { d in d[.bottom] } // 对齐按钮的底部到 VStack 的底部 } .padding() .background(Color.white) .cornerRadius(5) .padding(5) } } enum ActiveSheet { case camera, share } extension ActiveSheet: Identifiable { var id: Self { self } } struct GrammarCheckView: View { @EnvironmentObject var globalEnv: GlobalEnvironment // 引入环境对象 // 定义变量 @State private var textInput: String @State private var inputResult : String @State private var progressValue: Float = 0 @State private var showKeyboard: Bool = false @State private var showBuyProView: Bool = true @State private var showResult : Bool = false @State var results : [GrammarRes] @State private var showVIPPaymentView: Bool = false // 控制VIP付费界面的显示 // 提交等待,错误提示等 @State private var isLoading = false // 控制加载指示器的显示 @State private var showingToast = false // 控制是否显示toast @State private var toastText = "" @State private var activeSheet: ActiveSheet? @State private var isTextEditorFocused: Bool = false // 这个变量会传递给 InputView // 使用默认文本进行初始化 init() { let demoGrammarData = GrammarData.demoInstance() self.textInput = demoGrammarData.inputText self.inputResult = demoGrammarData.correctText self.results = demoGrammarData.results } var body: some View { NavigationView { ZStack { Color.pink.opacity(0.2).edgesIgnoringSafeArea(.all) // 设置页面背景色 VStack { if showResult { ResultView(textContent: $textInput, results: $results, showResult: $showResult, showKeyboard: $showKeyboard) } else { InputView(textInput: $textInput, progressValue: $progressValue, showKeyboard: $showKeyboard, showBuyProView: $showBuyProView, showResult: $showResult, results: $results, isLoading: $isLoading, showingToast: $showingToast, toastText: $toastText) // .environment(\.isTextEditorFocused, $isTextEditorFocused) // 将焦点状态传递给 InputView } if showBuyProView { BuyProView(onTryForFree: { showVIPPaymentView = true // 显示VIP付费界面 }) //BuyProView() } } .fullScreenCover(isPresented: $showVIPPaymentView) { VIPPaymentView() // 弹出VIP付费界面 } .navigationBarTitleDisplayMode(.inline) .toolbar { ToolbarItem(placement: .principal) { HStack { Text("Grammar & Spell Checker") .font(.headline) // 设置标题字体 if globalEnv.isVip { Image("vipimg") // 示例中使用系统图标 .resizable() // 使图片可调整大小 .scaledToFit() // 保持图片的宽高比 .frame(width: 24, height: 24) // 设置图标的具体尺寸 .foregroundColor(.yellow) .font(.subheadline) // 设置图标字体为比标题小 .offset(y: -1) // 根据需要调整图标的垂直位置 } } } } .foregroundColor(.black) .navigationBarItems(leading: Button(action: { // 相机按钮动作 self.activeSheet = .camera }) { Image(systemName: "camera") }, trailing: Button(action: { // 分享按钮动作 self.activeSheet = .share }) { Image(systemName: "square.and.arrow.up") }) .sheet(item: $activeSheet, onDismiss: { // 如果需要在sheet关闭时执行某些操作,可以在这里添加 }) { item in switch item { case .camera: CameraView(textInput: $textInput) case .share: ShareSheet(itemsToShare: [textInput]) } } .toast(isPresented: $showingToast, dismissAfter: globalEnvironment.toastPresentMsNormal) { HStack { Image(systemName: "exclamationmark.bubble") .foregroundColor(.yellow) Text(toastText) .foregroundColor(.black) } .padding() .background(Color.white) .cornerRadius(8) .shadow(radius: 10) } // 加载指示器 if isLoading { LoadingView() } } } } } // MARK: 预览 struct GrammarCheckView_Previews: PreviewProvider { static var previews: some View { GrammarCheckView() .environmentObject(IAPManager()) // 这里添加 IAPManager .environmentObject(globalEnvironment) // 这里添加 IAPManager } }