Matthias Nott
2026-04-01 98e5695f9c77c594a103e9e81128798d41bae46a
lib/screens/chat_screen.dart
....@@ -23,9 +23,11 @@
2323 import '../services/navigate_notifier.dart';
2424 import '../services/push_service.dart';
2525 import '../theme/app_theme.dart';
26
+import '../services/purchase_service.dart';
2627 import '../widgets/command_bar.dart';
2728 import '../widgets/input_bar.dart';
2829 import '../widgets/message_bubble.dart';
30
+import '../widgets/paywall_banner.dart';
2931 import '../widgets/session_drawer.dart';
3032 import '../widgets/status_dot.dart';
3133 import '../widgets/toast_overlay.dart';
....@@ -1332,6 +1334,11 @@
13321334 _sendCommand('create');
13331335 }
13341336
1337
+ /// Called when the user taps an upgrade CTA in the drawer or paywall banner.
1338
+ Future<void> _handleUpgrade() async {
1339
+ await PurchaseService.instance.purchaseFullAccess();
1340
+ }
1341
+
13351342 void _handleSessionRename(Session session, String newName) {
13361343 _sendCommand('rename', {'sessionId': session.id, 'name': newName});
13371344 final sessions = ref.read(sessionsProvider);
....@@ -1385,7 +1392,17 @@
13851392
13861393 @override
13871394 Widget build(BuildContext context) {
1388
- final messages = ref.watch(messagesProvider);
1395
+ final allMessages = ref.watch(messagesProvider);
1396
+ final isPro = ref.watch(isProProvider);
1397
+ // Free tier: filter out messages older than 15 minutes on display.
1398
+ // Storage is unchanged — messages reappear if the user later upgrades.
1399
+ final messages = isPro
1400
+ ? allMessages
1401
+ : allMessages.where((m) {
1402
+ final ts = DateTime.fromMillisecondsSinceEpoch(m.timestamp);
1403
+ final age = DateTime.now().difference(ts);
1404
+ return age <= kFreeTierMessageTtl;
1405
+ }).toList();
13891406 final wsStatus = ref.watch(wsStatusProvider);
13901407 final isTyping = ref.watch(isTypingProvider);
13911408 final connectionDetail = ref.watch(connectionDetailProvider);
....@@ -1452,15 +1469,18 @@
14521469 sessions: sessions,
14531470 activeSessionId: activeSession?.id,
14541471 unreadCounts: unreadCounts,
1472
+ isPro: ref.watch(isProProvider),
14551473 onSelect: (s) => _switchSession(s.id),
14561474 onRemove: _handleSessionRemove,
14571475 onRename: _handleSessionRename,
14581476 onReorder: _handleSessionReorder,
14591477 onNewSession: _handleNewSession,
14601478 onRefresh: _refreshSessions,
1479
+ onUpgrade: _handleUpgrade,
14611480 ),
14621481 body: Column(
14631482 children: [
1483
+ const PaywallBanner(),
14641484 Expanded(
14651485 child: ListView.builder(
14661486 controller: _scrollController,