Jelajahi Sumber

Gate desktop and status bar actions behind premium access.

Made-with: Cursor
huzaifahayat12 3 bulan lalu
induk
melakukan
09a60a1e19

+ 5 - 0
google_apps/AppTileView.swift

@@ -6,6 +6,7 @@ struct AppTileView: View {
     let onTap: () -> Void
     let onHide: (() -> Void)?
 
+    @ObservedObject private var premiumStore = PremiumStore.shared
     @State private var isHovering = false
     @AppStorage("pinnedTileIDsData") private var pinnedTileIDsData = ""
     @AppStorage("statusBarAppIDsData") private var statusBarAppIDsData = ""
@@ -46,8 +47,10 @@ struct AppTileView: View {
                         Button("Remove from StatusBar") { removeFromStatusBar() }
                     } else {
                         Button("Add to StatusBar") { addToStatusBar() }
+                            .disabled(!premiumStore.isPremiumUnlocked)
                     }
                     Button("Add to desktop") { addToDesktop() }
+                        .disabled(!premiumStore.isPremiumUnlocked)
                     Button("Add Widget") { addWidget() }
                     Divider()
                     Button("Remove from View") { onHide?() }
@@ -82,8 +85,10 @@ struct AppTileView: View {
                     Button("Remove from StatusBar") { removeFromStatusBar() }
                 } else {
                     Button("Add to StatusBar") { addToStatusBar() }
+                        .disabled(!premiumStore.isPremiumUnlocked)
                 }
                 Button("Add to desktop") { addToDesktop() }
+                    .disabled(!premiumStore.isPremiumUnlocked)
                 Button("Add Widget") { addWidget() }
                 Divider()
                 Button("Remove from View") { onHide?() }

+ 6 - 1
google_apps/LauncherRootView.swift

@@ -201,7 +201,7 @@ struct LauncherRootView: View {
 
             startupPaywallTask?.cancel()
             startupPaywallTask = Task {
-                try? await Task.sleep(nanoseconds: 5_000_000_000)
+                try? await Task.sleep(nanoseconds: 2_000_000_000)
                 guard !Task.isCancelled else { return }
                 await premiumStore.refreshEntitlements()
                 guard !premiumStore.isPremiumUnlocked else { return }
@@ -587,6 +587,7 @@ private struct PanelAppRowView: View {
     let onMove: (UUID, UUID) -> Void
     let onHideApp: (UUID) -> Void
 
+    @ObservedObject private var premiumStore = PremiumStore.shared
     @AppStorage("pinnedTileIDsData") private var pinnedTileIDsData = ""
     @AppStorage("statusBarAppIDsData") private var statusBarAppIDsData = ""
     @AppStorage("widgetAppIDsData") private var widgetAppIDsData = ""
@@ -653,8 +654,10 @@ private struct PanelAppRowView: View {
                         Button("Remove from StatusBar") { removeFromStatusBar() }
                     } else {
                         Button("Add to StatusBar") { addToStatusBar() }
+                            .disabled(!premiumStore.isPremiumUnlocked)
                     }
                     Button("Add to desktop") { addToDesktop() }
+                        .disabled(!premiumStore.isPremiumUnlocked)
                     Button("Add Widget") { addWidget() }
                     Divider()
                     Button("Remove from View") { onHideApp(app.id) }
@@ -692,8 +695,10 @@ private struct PanelAppRowView: View {
                     Button("Remove from StatusBar") { removeFromStatusBar() }
                 } else {
                     Button("Add to StatusBar") { addToStatusBar() }
+                        .disabled(!premiumStore.isPremiumUnlocked)
                 }
                 Button("Add to desktop") { addToDesktop() }
+                    .disabled(!premiumStore.isPremiumUnlocked)
                 Button("Add Widget") { addWidget() }
                 Divider()
                 Button("Remove from View") { onHideApp(app.id) }

+ 23 - 3
google_apps/Widgets/WidgetsRootView.swift

@@ -10,9 +10,11 @@ struct WidgetsRootView: View {
     @Binding var selectedAppID: UUID?
     @Binding var widgetLibraryIDsData: String
 
+    @ObservedObject private var premiumStore = PremiumStore.shared
     @State private var query = ""
     @State private var toastMessage: String?
     @State private var toastTask: Task<Void, Never>?
+    @State private var showingPremiumScreen = false
 
     private var filteredApps: [LauncherApp] {
         let q = query.trimmingCharacters(in: .whitespacesAndNewlines)
@@ -51,6 +53,11 @@ struct WidgetsRootView: View {
             }
         }
         .animation(.spring(response: 0.28, dampingFraction: 0.9), value: toastMessage != nil)
+        .sheet(isPresented: $showingPremiumScreen) {
+            PremiumFeaturesView()
+                .environmentObject(premiumStore)
+                .frame(minWidth: 560, minHeight: 690)
+        }
     }
 
     private var sidebar: some View {
@@ -121,7 +128,8 @@ struct WidgetsRootView: View {
                         WidgetPreviewAddCard(
                             app: selectedApp,
                             variant: variant,
-                            onAdd: { addToDesktop(app: selectedApp, variant: variant) }
+                            isPremiumUnlocked: premiumStore.isPremiumUnlocked,
+                            onAdd: { handleAddWidgetTap(app: selectedApp, variant: variant) }
                         )
                     }
                     Spacer(minLength: 0)
@@ -195,6 +203,14 @@ struct WidgetsRootView: View {
         showAddedToast(for: app)
     }
 
+    private func handleAddWidgetTap(app: LauncherApp, variant: WidgetVariant) {
+        guard premiumStore.isPremiumUnlocked else {
+            showingPremiumScreen = true
+            return
+        }
+        addToDesktop(app: app, variant: variant)
+    }
+
     private func showAddedToast(for app: LauncherApp) {
         toastTask?.cancel()
         toastMessage = "The \"\(app.name)\" widget has been added to the desktop."
@@ -248,6 +264,7 @@ private struct WidgetSidebarRow: View {
 private struct WidgetPreviewAddCard: View {
     let app: LauncherApp
     let variant: WidgetVariant
+    let isPremiumUnlocked: Bool
     let onAdd: () -> Void
 
     @State private var hovering = false
@@ -258,9 +275,12 @@ private struct WidgetPreviewAddCard: View {
                 Button(action: onAdd) {
                     Image(systemName: "plus")
                         .font(.system(size: 12, weight: .bold))
-                        .foregroundStyle(.black.opacity(0.85))
+                        .foregroundStyle(isPremiumUnlocked ? .black.opacity(0.85) : .white.opacity(0.82))
                         .frame(width: 26, height: 26)
-                        .background(Circle().fill(Color.green.opacity(0.95)))
+                        .background(
+                            Circle()
+                                .fill(isPremiumUnlocked ? Color.green.opacity(0.95) : Color.gray.opacity(0.7))
+                        )
                         .shadow(color: .black.opacity(0.28), radius: 10, x: 0, y: 6)
                 }
                 .buttonStyle(.plain)