leafittome/lib/app.dart
cschlaefke 52e72c25b1 Push-Erinnerungen: FCM-Registrierung in der App, geplante Function sendDailyReminders
- Function läuft alle 15 Min (europe-west3): prüft Erinnerungszeit pro Nutzer (Zeitzonen-korrekt), berechnet fällige Aufgaben, schickt eine Sammel-Push pro Tag, räumt ungültige Tokens auf
- App registriert Gerät nach Login (Berechtigung, Token, Zeitzone), Erinnerungszeit wird ins Nutzer-Dokument synchronisiert
- Doku Schritt 6 inkl. APNs-Anleitung für iOS (sobald Developer Account da ist)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 13:06:02 +02:00

54 lines
1.9 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'core/firebase/firebase_providers.dart';
import 'core/router/app_router.dart';
import 'core/settings/settings_provider.dart';
import 'core/theme/app_theme.dart';
import 'features/notifications/data/push_registration_service.dart';
import 'l10n/generated/app_localizations.dart';
class LeafItToMeApp extends ConsumerWidget {
const LeafItToMeApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final settings = ref.watch(settingsProvider);
final router = ref.watch(appRouterProvider);
// Nach jedem Login das Gerät für Push-Erinnerungen registrieren.
ref.listen(authStateProvider, (previous, next) {
final user = next.value;
if (user != null) {
ref.read(pushRegistrationServiceProvider).registerDevice(user);
}
});
return MaterialApp.router(
routerConfig: router,
onGenerateTitle: (context) => AppLocalizations.of(context).appTitle,
theme: buildAppTheme(
brightness: Brightness.light,
highContrast: settings.highContrast,
),
darkTheme: buildAppTheme(
brightness: Brightness.dark,
highContrast: settings.highContrast,
),
themeMode: settings.themeMode,
localizationsDelegates: AppLocalizations.localizationsDelegates,
supportedLocales: AppLocalizations.supportedLocales,
builder: (context, child) {
// App-Schriftgröße wird ZUSÄTZLICH zur System-Schriftgröße angewendet,
// damit die Systemeinstellung des Nutzers respektiert bleibt.
final systemScale = MediaQuery.textScalerOf(context).scale(1.0);
return MediaQuery(
data: MediaQuery.of(context).copyWith(
textScaler: TextScaler.linear(systemScale * settings.textSize.factor),
),
child: child!,
);
},
);
}
}