f655adfbea
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.
61 lines
1.8 KiB
Dart
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;
|
|
}
|