Преглед на файлове

Update Settings and paywall footer links to website, privacy, terms, and support.

Centralize external URLs in AppLinks and remove the version row from Settings About.

Co-authored-by: Cursor <cursoragent@cursor.com>
AhtashamShahzad1 преди 1 месец
родител
ревизия
b32244f9e1
променени са 4 файла, в които са добавени 33 реда и са изтрити 49 реда
  1. 13 0
      gramora/Utilities/AppLinks.swift
  2. 0 6
      gramora/ViewModels/SettingsViewModel.swift
  3. 11 10
      gramora/Views/PaywallView.swift
  4. 9 33
      gramora/Views/SettingsView.swift

+ 13 - 0
gramora/Utilities/AppLinks.swift

@@ -0,0 +1,13 @@
+import AppKit
+import Foundation
+
+enum AppLinks {
+    static let website = URL(string: "https://gramora.app")!
+    static let privacy = URL(string: "https://gramora.app/privacy")!
+    static let terms = URL(string: "https://gramora.app/terms")!
+    static let support = URL(string: "https://gramora.app/support")!
+
+    static func open(_ url: URL) {
+        NSWorkspace.shared.open(url)
+    }
+}

+ 0 - 6
gramora/ViewModels/SettingsViewModel.swift

@@ -30,12 +30,6 @@ final class SettingsViewModel: ObservableObject {
             .store(in: &cancellables)
     }
 
-    var appVersion: String {
-        let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "1.0"
-        let build = Bundle.main.infoDictionary?["CFBundleVersion"] as? String ?? "1"
-        return "\(version) (\(build))"
-    }
-
     func refreshDataCounts() {
         historyEntryCount = historyStorage.loadEntries().count
         dictionarySearchCount = defaults.stringArray(forKey: Self.dictionaryRecentSearchesKey)?.count ?? 0

+ 11 - 10
gramora/Views/PaywallView.swift

@@ -212,17 +212,18 @@ struct PaywallView: View {
                     title: isPremium ? "Manage Subscription" : "Continue with free plan",
                     action: isPremium ? subscriptions.openSubscriptionManagement : onClose
                 )
-                PaywallFooterLinkView(title: "Restore Purchases") {
-                    Task {
-                        await subscriptions.restorePurchases()
-                        if subscriptions.hasPremiumAccess {
-                            onClose()
-                        }
-                    }
+                PaywallFooterLinkView(title: "Website") {
+                    AppLinks.open(AppLinks.website)
+                }
+                PaywallFooterLinkView(title: "Privacy") {
+                    AppLinks.open(AppLinks.privacy)
+                }
+                PaywallFooterLinkView(title: "Terms and Conditions") {
+                    AppLinks.open(AppLinks.terms)
+                }
+                PaywallFooterLinkView(title: "Support") {
+                    AppLinks.open(AppLinks.support)
                 }
-                .disabled(buttonsBusy)
-                PaywallFooterLinkView(title: "Privacy Policy")
-                PaywallFooterLinkView(title: "Terms of Services")
             }
             .frame(height: 44)
             .frame(maxWidth: .infinity)

+ 9 - 33
gramora/Views/SettingsView.swift

@@ -118,17 +118,13 @@ struct SettingsView: View {
     private var aboutSection: some View {
         SettingsSectionCard(title: "About", iconName: "info.circle.fill") {
             VStack(spacing: 0) {
-                SettingsInfoRow(
-                    iconName: "app.badge.fill",
-                    title: "Version",
-                    value: viewModel.appVersion
-                )
-
+                SettingsLinkRow(iconName: "globe", title: "Website", url: AppLinks.website)
                 SettingsRowDivider()
-
-                SettingsLinkRow(iconName: "hand.raised.fill", title: "Privacy Policy")
+                SettingsLinkRow(iconName: "hand.raised.fill", title: "Privacy", url: AppLinks.privacy)
                 SettingsRowDivider()
-                SettingsLinkRow(iconName: "doc.text.fill", title: "Terms of Service")
+                SettingsLinkRow(iconName: "doc.text.fill", title: "Terms and Conditions", url: AppLinks.terms)
+                SettingsRowDivider()
+                SettingsLinkRow(iconName: "questionmark.circle.fill", title: "Support", url: AppLinks.support)
             }
         }
     }
@@ -257,37 +253,17 @@ private struct SettingsActionRow: View {
     }
 }
 
-private struct SettingsInfoRow: View {
-    let iconName: String
-    let title: String
-    let value: String
-
-    var body: some View {
-        HStack(spacing: 12) {
-            SettingsRowIcon(systemName: iconName)
-
-            Text(title)
-                .font(.system(size: 14, weight: .semibold))
-                .foregroundStyle(AppTheme.textPrimary)
-
-            Spacer()
-
-            Text(value)
-                .font(.system(size: 13, weight: .medium))
-                .foregroundStyle(AppTheme.textMuted)
-        }
-        .padding(.vertical, 4)
-    }
-}
-
 private struct SettingsLinkRow: View {
     let iconName: String
     let title: String
+    let url: URL
 
     @State private var isHovered = false
 
     var body: some View {
-        Button {} label: {
+        Button {
+            AppLinks.open(url)
+        } label: {
             HStack(spacing: 12) {
                 SettingsRowIcon(systemName: iconName)