Files
rely/lib/main.dart
T
Rijad Zuzo f655adfbea feat: add local-first private AI digest workflow
Migrate app code into canonical feature slices, add phone-only AI digest scheduling and review, wire local notification/background task support, and cover the flow with tests.
2026-05-17 00:17:20 +02:00

61 lines
1.8 KiB
Dart

import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:relationship_saver/app/relationship_saver_app.dart';
import 'package:relationship_saver/core/observability/sentry_init.dart';
import 'package:relationship_saver/features/ai_digest/application/llm_digest_background_scheduler.dart';
import 'package:relationship_saver/features/ai_digest/application/llm_digest_orchestrator.dart';
import 'package:workmanager/workmanager.dart';
export 'package:relationship_saver/app/relationship_saver_app.dart';
@pragma('vm:entry-point')
void llmDigestCallbackDispatcher() {
Workmanager().executeTask((
String taskName,
Map<String, dynamic>? inputData,
) async {
if (taskName != llmDigestTaskName &&
taskName != Workmanager.iOSBackgroundTask) {
return true;
}
WidgetsFlutterBinding.ensureInitialized();
final ProviderContainer container = ProviderContainer();
try {
await container.read(llmDigestOrchestratorProvider).runScheduledDigest();
return true;
} finally {
container.dispose();
}
});
}
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
if (_supportsWorkmanagerPlatform()) {
await Workmanager().initialize(llmDigestCallbackDispatcher);
}
final SentryInit sentry = SentryInit();
await sentry.initialize(
appRunner: () {
runApp(
ProviderScope(
overrides: [sentryInitProvider.overrideWithValue(sentry)],
child: const RelationshipSaverApp(),
),
);
},
);
}
bool _supportsWorkmanagerPlatform() {
if (kIsWeb) {
return false;
}
return defaultTargetPlatform == TargetPlatform.iOS ||
defaultTargetPlatform == TargetPlatform.android;
}