Files
pyramid/lib/widgets/settings/settings_notifications.dart
T
Bernd Steckmeister 5d772389d6 refactor: Gott-Datei settings_modal.dart in 12 Dateien aufgeteilt
Reine Verschiebung per Dart part/part-of (keine Umbenennung, keine
Logikänderung) - settings_modal.dart schrumpft von 5541 auf 270 Zeilen.
Verifiziert per automatisiertem Blockvergleich gegen das Original und
flutter analyze (Baseline unverändert: 1 bekannter Hinweis).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-03 10:56:48 +02:00

169 lines
5.8 KiB
Dart

part of '../settings_modal.dart';
class _NotificationsSection extends ConsumerWidget {
final PyramidTheme pt;
const _NotificationsSection({required this.pt});
@override
Widget build(BuildContext context, WidgetRef ref) {
final desktop = ref.watch(notifDesktopProvider);
final sound = ref.watch(notifSoundProvider);
final preview = ref.watch(notifPreviewProvider);
final dmMentionOnly = ref.watch(notifMentionOnlyDmProvider);
return SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_SectionTitle(
title: 'Benachrichtigungen',
subtitle: 'Bestimme, wann und wie du benachrichtigt wirst.',
pt: pt),
_SettingsGroup(title: 'Desktop', pt: pt, children: [
_SettingsRow(
title: 'Desktop-Benachrichtigungen',
desc: 'Zeige Systembenachrichtigungen bei neuen Nachrichten',
pt: pt,
control: _Toggle(
value: desktop,
pt: pt,
onChanged: (v) => ref.read(notifDesktopProvider.notifier).set(v),
),
),
_Divider(pt: pt),
_SettingsRow(
title: 'Benachrichtigungston',
desc: 'Sound abspielen wenn eine Nachricht eingeht',
pt: pt,
control: _Toggle(
value: sound,
pt: pt,
onChanged: (v) => ref.read(notifSoundProvider.notifier).set(v),
),
),
_Divider(pt: pt),
_SettingsRow(
title: 'Nachrichtenvorschau',
desc: 'Nachrichteninhalt in Benachrichtigung anzeigen',
pt: pt,
control: _Toggle(
value: preview,
pt: pt,
onChanged: (v) => ref.read(notifPreviewProvider.notifier).set(v),
),
),
]),
const SizedBox(height: 20),
_SettingsGroup(title: 'Filter', pt: pt, children: [
_SettingsRow(
title: 'Nur Erwähnungen (DMs)',
desc: 'Benachrichtigung nur bei direkten @Erwähnungen',
pt: pt,
control: _Toggle(
value: dmMentionOnly,
pt: pt,
onChanged: (v) => ref.read(notifMentionOnlyDmProvider.notifier).set(v),
),
),
]),
const SizedBox(height: 20),
Container(
padding: const EdgeInsets.all(12),
decoration: BoxDecoration(
color: pt.bg2,
borderRadius: BorderRadius.circular(10),
border: Border.all(color: pt.border),
),
child: Row(
children: [
Icon(Icons.info_outline_rounded, size: 16, color: pt.fgDim),
const SizedBox(width: 10),
Expanded(
child: Text(
'Push-Benachrichtigungen für Android/iOS sind in Vorbereitung.',
style: TextStyle(color: pt.fgMuted, fontSize: 12),
),
),
],
),
),
],
),
);
}
}
class _NotificationsSettingsGroup extends ConsumerStatefulWidget {
final PyramidTheme pt;
const _NotificationsSettingsGroup({required this.pt});
@override
ConsumerState<_NotificationsSettingsGroup> createState() =>
_NotificationsSettingsGroupState();
}
class _NotificationsSettingsGroupState
extends ConsumerState<_NotificationsSettingsGroup> {
bool _running = false;
String? _result;
bool _retryRunning = false;
String? _retryResult;
Future<void> _runDiag() async {
setState(() { _running = true; _result = null; });
final client = await ref.read(matrixClientProvider.future);
final diag = await fcmDiagnostics(client);
if (mounted) setState(() { _running = false; _result = diag; });
}
Future<void> _runRetry() async {
setState(() { _retryRunning = true; _retryResult = null; });
final client = await ref.read(matrixClientProvider.future);
final result = await retryPusherRegistration(client);
if (mounted) setState(() { _retryRunning = false; _retryResult = result; });
}
@override
Widget build(BuildContext context) {
final pt = widget.pt;
if (!Platform.isAndroid) return const SizedBox.shrink();
return _SettingsGroup(title: 'Push-Benachrichtigungen', pt: pt, children: [
_SettingsRow(
title: 'Akku-Optimierung deaktivieren',
desc: 'Samsung / andere OEMs unterdrücken sonst Benachrichtigungen bei geschlossener App.',
pt: pt,
showArrow: true,
onTap: openBatteryOptimizationSettings,
control: Icon(Icons.battery_saver_outlined, size: 16, color: pt.fgDim),
),
_Divider(pt: pt),
_SettingsRow(
title: 'FCM Diagnose',
desc: _result ?? 'Prüft ob FCM-Token & Pusher korrekt registriert sind.',
pt: pt,
onTap: _running ? null : _runDiag,
control: _running
? SizedBox(
width: 16,
height: 16,
child: CircularProgressIndicator(strokeWidth: 2, color: pt.accent),
)
: Icon(Icons.bug_report_outlined, size: 16, color: pt.fgDim),
),
_Divider(pt: pt),
_SettingsRow(
title: 'Pusher neu registrieren',
desc: _retryResult ?? 'Pusher beim Homeserver erneut anmelden.',
pt: pt,
onTap: _retryRunning ? null : _runRetry,
control: _retryRunning
? SizedBox(
width: 16,
height: 16,
child: CircularProgressIndicator(strokeWidth: 2, color: pt.accent),
)
: Icon(Icons.sync_outlined, size: 16, color: pt.fgDim),
),
]);
}
}