relatica/lib/screens/notifications_screen.dart

102 lines
3.4 KiB
Dart

import 'package:flutter/material.dart';
import 'package:logging/logging.dart';
import 'package:provider/provider.dart';
import '../controls/app_bottom_nav_bar.dart';
import '../controls/notifications_control.dart';
import '../controls/standard_appbar.dart';
import '../globals.dart';
import '../services/network_status_service.dart';
import '../services/notifications_manager.dart';
import '../utils/snackbar_builder.dart';
class NotificationsScreen extends StatelessWidget {
static final _logger = Logger('$NotificationsScreen');
const NotificationsScreen({super.key});
@override
Widget build(BuildContext context) {
_logger.finest('Building');
final nss = getIt<NetworkStatusService>();
final manager = context.watch<NotificationsManager>();
final notifications = manager.notifications;
late final String title;
late final Widget body;
if (notifications.isEmpty) {
manager.updateNotifications();
title = 'Notifications';
body = Center(
child: Column(
children: [
const Center(child: Text('No notifications')),
],
));
} else {
final unreadCount = notifications.where((e) => !e.dismissed).length;
title = 'Notifications ($unreadCount)';
body = ListView.separated(
itemBuilder: (context, index) {
return NotificationControl(notification: notifications[index]);
},
separatorBuilder: (context, index) {
return const Divider(
color: Colors.black54,
height: 0.0,
);
},
itemCount: notifications.length + 1);
}
return Scaffold(
appBar: StandardAppBar.build(
context,
title,
actions: [
ValueListenableBuilder(
valueListenable: nss.notificationsUpdateStatus,
builder: (context2, executing, _) {
if (executing) {
final theme = Theme.of(context);
final size = theme.appBarTheme.actionsIconTheme?.size ??
theme.iconTheme.size ??
24;
return Center(
child: SizedBox(
width: size,
height: size,
child: CircularProgressIndicator(
color: theme.canvasColor,
),
),
);
}
return IconButton(
onPressed: () async => await manager.updateNotifications(),
icon: const Icon(Icons.refresh));
}),
IconButton(
onPressed: () async => _clearAllNotifications(context, manager),
icon: const Icon(Icons.cleaning_services),
),
],
),
body: body,
bottomNavigationBar: const AppBottomNavBar(
currentButton: NavBarButtons.notifications,
),
);
}
Future<void> _clearAllNotifications(
BuildContext context, NotificationsManager manager) async {
final confirmed =
await showYesNoDialog(context, 'Clear all notifications?');
if (confirmed == true) {
final message = (await manager.markAllAsRead()).fold(
onSuccess: (_) => 'Marked all notifications as read',
onError: (error) => 'Error marking notifications: $error');
buildSnackbar(context, message);
}
}
}