From 98e5695f9c77c594a103e9e81128798d41bae46a Mon Sep 17 00:00:00 2001
From: Matthias Nott <mnott@mnsoft.org>
Date: Wed, 01 Apr 2026 18:52:33 +0200
Subject: [PATCH] feat: StoreKit 2 IAP — free tier with 2 sessions and 15min message TTL

---
 lib/main.dart |   18 ++++++++++++++++++
 1 files changed, 18 insertions(+), 0 deletions(-)

diff --git a/lib/main.dart b/lib/main.dart
index 34def81..5bab6bb 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -7,6 +7,7 @@
 import 'theme/app_theme.dart';
 import 'providers/providers.dart';
 import 'services/audio_service.dart';
+import 'services/purchase_service.dart';
 
 void main() async {
   WidgetsFlutterBinding.ensureInitialized();
@@ -23,10 +24,15 @@
   // Initialize audio service
   AudioService.init();
 
+  // Initialize purchase service (loads cached status + starts StoreKit listener)
+  await PurchaseService.instance.initialize();
+
   runApp(
     ProviderScope(
       overrides: [
         themeModeProvider.overrideWith((ref) => themeMode),
+        // Seed isProProvider from StoreKit cache so first frame is correct.
+        isProProvider.overrideWith((ref) => PurchaseService.instance.isPro),
       ],
       child: const PAILotApp(),
     ),
@@ -47,6 +53,18 @@
   void initState() {
     super.initState();
     _router = createRouter();
+    // Keep isProProvider in sync whenever PurchaseService notifies a change.
+    PurchaseService.instance.addListener(_onPurchaseChanged);
+  }
+
+  @override
+  void dispose() {
+    PurchaseService.instance.removeListener(_onPurchaseChanged);
+    super.dispose();
+  }
+
+  void _onPurchaseChanged() {
+    ref.read(isProProvider.notifier).state = PurchaseService.instance.isPro;
   }
 
   @override

--
Gitblit v1.3.1