Skip to content

Commit 49647d7

Browse files
Merge pull request #2153 from nextcloud/refactor/neon_notifications/remove-app-matching
2 parents 88774d9 + 73636c0 commit 49647d7

File tree

8 files changed

+18
-96
lines changed

8 files changed

+18
-96
lines changed
Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
{
22
"@@locale": "en",
3-
"notificationsDismissAll": "Dismiss all notifications",
4-
"notificationAppNotImplementedYet": "Sorry, this Nextcloud app has not been implemented yet"
3+
"notificationsDismissAll": "Dismiss all notifications"
54
}

packages/neon/neon_notifications/lib/l10n/localizations.dart

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -94,12 +94,6 @@ abstract class NotificationsLocalizations {
9494
/// In en, this message translates to:
9595
/// **'Dismiss all notifications'**
9696
String get notificationsDismissAll;
97-
98-
/// No description provided for @notificationAppNotImplementedYet.
99-
///
100-
/// In en, this message translates to:
101-
/// **'Sorry, this Nextcloud app has not been implemented yet'**
102-
String get notificationAppNotImplementedYet;
10397
}
10498

10599
class _NotificationsLocalizationsDelegate extends LocalizationsDelegate<NotificationsLocalizations> {

packages/neon/neon_notifications/lib/l10n/localizations_en.dart

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,4 @@ class NotificationsLocalizationsEn extends NotificationsLocalizations {
66

77
@override
88
String get notificationsDismissAll => 'Dismiss all notifications';
9-
10-
@override
11-
String get notificationAppNotImplementedYet => 'Sorry, this Nextcloud app has not been implemented yet';
129
}

packages/neon/neon_notifications/lib/src/widgets/notification.dart

Lines changed: 8 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
1-
import 'package:built_collection/built_collection.dart';
21
import 'package:flutter/material.dart';
2+
import 'package:go_router/go_router.dart';
33
import 'package:intersperse/intersperse.dart';
4-
import 'package:neon_framework/blocs.dart';
54
import 'package:neon_framework/models.dart';
65
import 'package:neon_framework/theme.dart';
76
import 'package:neon_framework/utils.dart';
87
import 'package:neon_framework/widgets.dart';
9-
import 'package:neon_notifications/l10n/localizations.dart';
108
import 'package:neon_notifications/src/widgets/action.dart';
11-
import 'package:nextcloud/ids.dart';
129
import 'package:nextcloud/notifications.dart' as notifications;
1310
import 'package:timezone/timezone.dart' as tz;
1411

@@ -25,19 +22,6 @@ class NotificationsNotification extends StatelessWidget {
2522

2623
@override
2724
Widget build(BuildContext context) {
28-
final app = NeonProvider.of<BuiltSet<AppImplementation>>(context).tryFind(notification.app);
29-
30-
final icon = app?.buildIcon(size: largeIconSize) ??
31-
SizedBox.fromSize(
32-
size: const Size.square(largeIconSize),
33-
child: NeonUriImage(
34-
account: NeonProvider.of<Account>(context),
35-
uri: Uri.parse(notification.icon!),
36-
size: const Size.square(largeIconSize),
37-
svgColorFilter: ColorFilter.mode(Theme.of(context).colorScheme.primary, BlendMode.srcIn),
38-
),
39-
);
40-
4125
return ListTile(
4226
title: Text(notification.subject),
4327
subtitle: Column(
@@ -69,21 +53,13 @@ class NotificationsNotification extends StatelessWidget {
6953
)
7054
.toList(),
7155
),
72-
leading: icon,
73-
onTap: () async {
74-
if (notification.app == AppIDs.notifications) {
75-
return;
76-
}
77-
if (app != null) {
78-
// TODO: use go_router once implemented
79-
NeonProvider.of<AppsBloc>(context).setActiveApp(app.id);
80-
} else {
81-
await showUnimplementedDialog(
82-
context: context,
83-
title: NotificationsLocalizations.of(context).notificationAppNotImplementedYet,
84-
);
85-
}
86-
},
56+
leading: NeonUriImage(
57+
account: NeonProvider.of<Account>(context),
58+
uri: Uri.parse(notification.icon!),
59+
size: const Size.square(largeIconSize),
60+
svgColorFilter: ColorFilter.mode(Theme.of(context).colorScheme.primary, BlendMode.srcIn),
61+
),
62+
onTap: notification.link.isNotEmpty ? () => context.go(notification.link) : null,
8763
onLongPress: onDelete,
8864
);
8965
}
Binary file not shown.

packages/neon/neon_notifications/test/main_page_test.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ void main() {
102102
when(() => notification.datetime).thenReturn(tz.TZDateTime.now(tz.UTC).toIso8601String());
103103
when(() => notification.actions).thenReturn(BuiltList());
104104
when(() => notification.icon).thenReturn('');
105+
when(() => notification.link).thenReturn('/link');
105106

106107
return notification;
107108
}),
Lines changed: 8 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,10 @@
11
import 'package:built_collection/built_collection.dart';
2-
import 'package:flutter/cupertino.dart';
32
import 'package:flutter_test/flutter_test.dart';
43
import 'package:mocktail/mocktail.dart';
5-
import 'package:neon_framework/blocs.dart';
64
import 'package:neon_framework/models.dart';
75
import 'package:neon_framework/testing.dart';
8-
import 'package:neon_framework/utils.dart';
96
import 'package:neon_framework/widgets.dart';
107
import 'package:neon_notifications/l10n/localizations.dart';
11-
import 'package:neon_notifications/l10n/localizations_en.dart';
128
import 'package:neon_notifications/src/widgets/action.dart';
139
import 'package:neon_notifications/src/widgets/notification.dart';
1410
import 'package:nextcloud/nextcloud.dart';
@@ -45,14 +41,17 @@ void main() {
4541
when(() => notification.datetime).thenReturn(tz.TZDateTime.now(tz.UTC).toIso8601String());
4642
when(() => notification.actions).thenReturn(BuiltList([primaryAction, secondaryAction]));
4743
when(() => notification.icon).thenReturn('');
44+
when(() => notification.link).thenReturn('/link');
4845

4946
callback = MockCallbackFunction<void>().call;
5047

5148
account = MockAccount();
5249
when(() => account.client).thenReturn(NextcloudClient(Uri.parse('')));
5350
});
5451

55-
testWidgets('Without matching app', (tester) async {
52+
testWidgets('Notification', (tester) async {
53+
final router = MockGoRouter();
54+
5655
await tester.pumpWidgetWithAccessibility(
5756
TestApp(
5857
localizationsDelegates: NotificationsLocalizations.localizationsDelegates,
@@ -61,6 +60,7 @@ void main() {
6160
Provider<BuiltSet<AppImplementation>>.value(value: BuiltSet()),
6261
Provider<Account>.value(value: account),
6362
],
63+
router: router,
6464
child: NotificationsNotification(
6565
notification: notification,
6666
onDelete: callback,
@@ -73,58 +73,13 @@ void main() {
7373
expect(find.text('subject'), findsOne);
7474
expect(find.text('now'), findsOne);
7575
expect(find.byType(NotificationsAction), findsExactly(2));
76-
await expectLater(find.byType(TestApp), matchesGoldenFile('goldens/notification_without_matching_app.png'));
77-
78-
await tester.longPress(find.byType(NotificationsNotification));
79-
verify(callback.call).called(1);
80-
81-
await tester.runAsync(() async {
82-
await tester.tap(find.byType(NotificationsNotification));
83-
await tester.pumpAndSettle();
84-
85-
expect(find.byType(NeonDialog), findsOne);
86-
expect(find.text(NotificationsLocalizationsEn().notificationAppNotImplementedYet), findsOne);
87-
});
88-
});
89-
90-
testWidgets('With matching app', (tester) async {
91-
final appsBloc = MockAppsBloc();
92-
93-
final app = MockAppImplementation();
94-
when(() => app.id).thenReturn('app');
95-
when(() => app.buildIcon(size: any(named: 'size'))).thenReturn(const SizedBox());
96-
97-
await tester.pumpWidgetWithAccessibility(
98-
TestApp(
99-
localizationsDelegates: NotificationsLocalizations.localizationsDelegates,
100-
supportedLocales: NotificationsLocalizations.supportedLocales,
101-
providers: [
102-
Provider<BuiltSet<AppImplementation>>.value(value: BuiltSet({app})),
103-
Provider<Account>.value(value: account),
104-
NeonProvider<AppsBloc>.value(value: appsBloc),
105-
],
106-
child: NotificationsNotification(
107-
notification: notification,
108-
onDelete: callback,
109-
),
110-
),
111-
);
112-
113-
expect(find.byType(NeonUriImage), findsNothing);
114-
expect(find.text('message'), findsOne);
115-
expect(find.text('subject'), findsOne);
116-
expect(find.text('now'), findsOne);
117-
expect(find.byType(NotificationsAction), findsExactly(2));
118-
await expectLater(find.byType(TestApp), matchesGoldenFile('goldens/notification_with_matching_app.png'));
76+
await expectLater(find.byType(TestApp), matchesGoldenFile('goldens/notification.png'));
11977

12078
await tester.longPress(find.byType(NotificationsNotification));
12179
verify(callback.call).called(1);
12280

123-
await tester.runAsync(() async {
124-
await tester.tap(find.byType(NotificationsNotification));
125-
await tester.pumpAndSettle();
81+
await tester.tap(find.byType(NotificationsNotification));
12682

127-
verify(() => appsBloc.setActiveApp('app')).called(1);
128-
});
83+
verify(() => router.go('/link')).called(1);
12984
});
13085
}

0 commit comments

Comments
 (0)