diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 0afca452..d937323f 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -245,7 +245,7 @@ PODS: - PromisesObjC (= 2.4.0) - receive_sharing_intent (1.8.1): - Flutter - - record_ios (1.0.0): + - record_ios (1.1.0): - Flutter - SAMKeychain (1.5.3) - SDWebImage (5.21.1): @@ -510,7 +510,7 @@ SPEC CHECKSUMS: PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 PromisesSwift: 9d77319bbe72ebf6d872900551f7eeba9bce2851 receive_sharing_intent: 222384f00ffe7e952bbfabaa9e3967cb87e5fe00 - record_ios: fee1c924aa4879b882ebca2b4bce6011bcfc3d8b + record_ios: f75fa1d57f840012775c0e93a38a7f3ceea1a374 SAMKeychain: 483e1c9f32984d50ca961e26818a534283b4cd5c SDWebImage: f29024626962457f3470184232766516dee8dfea share_plus: 50da8cb520a8f0f65671c6c6a99b3617ed10a58a diff --git a/lib/screens/notification.dart b/lib/screens/notification.dart index 3e6ced3f..5ce0e17c 100644 --- a/lib/screens/notification.dart +++ b/lib/screens/notification.dart @@ -3,14 +3,17 @@ import 'dart:math' as math; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; +import 'package:gap/gap.dart'; import 'package:go_router/go_router.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:island/models/account.dart'; import 'package:island/pods/network.dart'; import 'package:island/pods/websocket.dart'; import 'package:island/route.dart'; +import 'package:island/widgets/alert.dart'; import 'package:island/widgets/app_scaffold.dart'; import 'package:island/widgets/content/markdown.dart'; +import 'package:material_symbols_icons/material_symbols_icons.dart'; import 'package:relative_time/relative_time.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:riverpod_paging_utils/riverpod_paging_utils.dart'; @@ -62,6 +65,10 @@ class NotificationUnreadCountNotifier final current = await future; state = AsyncData(math.max(current - count, 0)); } + + void clear() async { + state = AsyncData(0); + } } @riverpod @@ -111,8 +118,27 @@ class NotificationScreen extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + Future markAllRead() async { + showLoadingModal(context); + final apiClient = ref.watch(apiClientProvider); + await apiClient.post('/pusher/notifications/all/read'); + if (!context.mounted) return; + hideLoadingModal(context); + ref.invalidate(notificationListNotifierProvider); + ref.watch(notificationUnreadCountNotifierProvider.notifier).clear(); + } + return AppScaffold( - appBar: AppBar(title: const Text('notifications').tr()), + appBar: AppBar( + title: const Text('notifications').tr(), + actions: [ + IconButton( + onPressed: markAllRead, + icon: const Icon(Symbols.mark_as_unread), + ), + const Gap(8), + ], + ), body: PagingHelperView( provider: notificationListNotifierProvider, futureRefreshable: notificationListNotifierProvider.future,