Skip to content

Commit e350daf

Browse files
committed
Merge branch 'develop'
2 parents ff0cf8d + 38a6884 commit e350daf

File tree

4 files changed

+132
-14
lines changed

4 files changed

+132
-14
lines changed

packages/stream_chat_v1/lib/channel_list.dart

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,15 @@ class _ChannelList extends State<ChannelList> {
145145
)
146146
: ChannelsBloc(
147147
child: ChannelListView(
148+
onChannelTap: (channel, _) {
149+
Navigator.pushNamed(
150+
context,
151+
Routes.CHANNEL_PAGE,
152+
arguments: ChannelPageArgs(
153+
channel: channel,
154+
),
155+
);
156+
},
148157
onStartChatPressed: () {
149158
Navigator.pushNamed(context, Routes.NEW_CHAT);
150159
},
@@ -154,7 +163,6 @@ class _ChannelList extends State<ChannelList> {
154163
pagination: PaginationParams(
155164
limit: 20,
156165
),
157-
channelWidget: ChannelPage(),
158166
onViewInfoTap: (channel) {
159167
Navigator.pop(context);
160168
if (channel.memberCount == 2 && channel.isDistinct) {

packages/stream_chat_v1/lib/home_page.dart

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,71 @@
1+
import 'dart:async';
2+
3+
import 'package:example/channel_page.dart';
4+
import 'package:example/notifications_service.dart';
15
import 'package:example/routes/app_routes.dart';
26
import 'package:example/routes/routes.dart';
37
import 'package:flutter/foundation.dart';
48
import 'package:flutter/material.dart';
59
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
610

11+
class MyObserver extends NavigatorObserver {
12+
Route? currentRoute;
13+
late final StreamSubscription _subscription;
14+
15+
MyObserver(
16+
StreamChatClient client,
17+
GlobalKey<NavigatorState> navigatorKey,
18+
) {
19+
_subscription = client
20+
.on(
21+
EventType.messageNew,
22+
EventType.notificationMessageNew,
23+
)
24+
.listen((event) {
25+
if (event.message?.user?.id == client.state.currentUser?.id) {
26+
return;
27+
}
28+
final channelId = event.channelId;
29+
if (currentRoute?.settings.name == Routes.CHANNEL_PAGE) {
30+
final args = currentRoute?.settings.arguments as ChannelPageArgs;
31+
if (args.channel?.id == channelId) {
32+
return;
33+
}
34+
}
35+
36+
showLocalNotification(
37+
event,
38+
client.state.currentUser!.id,
39+
navigatorKey.currentState!.context,
40+
);
41+
});
42+
}
43+
44+
@override
45+
void didPop(Route route, Route? previousRoute) {
46+
currentRoute = route;
47+
}
48+
49+
@override
50+
void didPush(Route route, Route? previousRoute) {
51+
currentRoute = route;
52+
}
53+
54+
@override
55+
void didRemove(Route route, Route? previousRoute) {
56+
currentRoute = route;
57+
}
58+
59+
@override
60+
void didReplace({Route? newRoute, Route? oldRoute}) {
61+
currentRoute = newRoute;
62+
}
63+
64+
void dispose() {
65+
_subscription.cancel();
66+
}
67+
}
68+
769
class HomePageArgs {
870
final StreamChatClient chatClient;
971

@@ -24,6 +86,7 @@ class HomePage extends StatefulWidget {
2486

2587
class _HomePageState extends State<HomePage> {
2688
final GlobalKey<NavigatorState> _navigatorKey = GlobalKey();
89+
MyObserver? _observer;
2790

2891
@override
2992
Widget build(BuildContext context) {
@@ -38,8 +101,16 @@ class _HomePageState extends State<HomePage> {
38101
key: _navigatorKey,
39102
onGenerateRoute: AppRoutes.generateRoute,
40103
initialRoute: Routes.CHANNEL_LIST_PAGE,
104+
observers: [_observer!],
41105
),
42106
),
43107
);
44108
}
109+
110+
@override
111+
void didChangeDependencies() {
112+
_observer?.dispose();
113+
_observer = MyObserver(widget.chatClient, _navigatorKey);
114+
super.didChangeDependencies();
115+
}
45116
}

packages/stream_chat_v1/lib/notifications_service.dart

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
1+
import 'package:example/channel_page.dart';
12
import 'package:example/localizations.dart';
3+
import 'package:example/routes/routes.dart';
24
import 'package:flutter/material.dart';
35
import 'package:flutter_local_notifications/flutter_local_notifications.dart'
46
hide Message;
57
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
68

79
void showLocalNotification(
8-
Event event, String currentUserId, BuildContext context) async {
10+
Event event,
11+
String currentUserId,
12+
BuildContext context,
13+
) async {
914
if (![
1015
EventType.messageNew,
1116
EventType.notificationMessageNew,
@@ -22,7 +27,34 @@ void showLocalNotification(
2227
android: initializationSettingsAndroid,
2328
iOS: initializationSettingsIOS,
2429
);
25-
await flutterLocalNotificationsPlugin.initialize(initializationSettings);
30+
await flutterLocalNotificationsPlugin.initialize(
31+
initializationSettings,
32+
onSelectNotification: (channelCid) async {
33+
if (channelCid != null) {
34+
final client = StreamChat.of(context).client;
35+
var channel = client.state.channels[channelCid];
36+
37+
if (channel == null) {
38+
final splits = channelCid.split(':');
39+
final type = splits[0];
40+
final id = splits[1];
41+
channel = client.channel(
42+
type,
43+
id: id,
44+
);
45+
await channel.watch();
46+
}
47+
48+
Navigator.pushNamed(
49+
context,
50+
Routes.CHANNEL_PAGE,
51+
arguments: ChannelPageArgs(
52+
channel: channel,
53+
),
54+
);
55+
}
56+
},
57+
);
2658
await flutterLocalNotificationsPlugin.show(
2759
event.message!.id.hashCode,
2860
event.message!.user!.name,
@@ -37,5 +69,6 @@ void showLocalNotification(
3769
),
3870
iOS: IOSNotificationDetails(),
3971
),
72+
payload: '${event.channelType}:${event.channelId}',
4073
);
4174
}

packages/stream_chat_v1/lib/routes/app_routes.dart

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,13 @@ class AppRoutes {
2121
switch (settings.name) {
2222
case Routes.APP:
2323
return MaterialPageRoute(
24-
settings: const RouteSettings(name: Routes.APP),
24+
settings: RouteSettings(arguments: args, name: Routes.APP),
2525
builder: (_) {
2626
return MyApp();
2727
});
2828
case Routes.HOME:
2929
return MaterialPageRoute(
30-
settings: const RouteSettings(name: Routes.HOME),
30+
settings: RouteSettings(arguments: args, name: Routes.HOME),
3131
builder: (_) {
3232
final homePageArgs = args as HomePageArgs;
3333
return HomePage(
@@ -36,18 +36,19 @@ class AppRoutes {
3636
});
3737
case Routes.CHOOSE_USER:
3838
return MaterialPageRoute(
39-
settings: const RouteSettings(name: Routes.CHOOSE_USER),
39+
settings: RouteSettings(arguments: args, name: Routes.CHOOSE_USER),
4040
builder: (_) {
4141
return ChooseUserPage();
4242
});
4343
case Routes.ADVANCED_OPTIONS:
4444
return MaterialPageRoute(
45-
settings: const RouteSettings(name: Routes.ADVANCED_OPTIONS),
45+
settings:
46+
RouteSettings(arguments: args, name: Routes.ADVANCED_OPTIONS),
4647
builder: (_) => AdvancedOptionsPage(),
4748
);
4849
case Routes.CHANNEL_PAGE:
4950
return MaterialPageRoute(
50-
settings: const RouteSettings(name: Routes.CHANNEL_PAGE),
51+
settings: RouteSettings(arguments: args, name: Routes.CHANNEL_PAGE),
5152
builder: (_) {
5253
final channelPageArgs = args as ChannelPageArgs;
5354
return StreamChannel(
@@ -61,27 +62,30 @@ class AppRoutes {
6162
});
6263
case Routes.NEW_CHAT:
6364
return MaterialPageRoute(
64-
settings: const RouteSettings(name: Routes.NEW_CHAT),
65+
settings: RouteSettings(arguments: args, name: Routes.NEW_CHAT),
6566
builder: (_) {
6667
return NewChatScreen();
6768
});
6869
case Routes.NEW_GROUP_CHAT:
6970
return MaterialPageRoute(
70-
settings: const RouteSettings(name: Routes.NEW_GROUP_CHAT),
71+
settings:
72+
RouteSettings(arguments: args, name: Routes.NEW_GROUP_CHAT),
7173
builder: (_) {
7274
return NewGroupChatScreen();
7375
});
7476
case Routes.NEW_GROUP_CHAT_DETAILS:
7577
return MaterialPageRoute(
76-
settings: const RouteSettings(name: Routes.NEW_GROUP_CHAT_DETAILS),
78+
settings: RouteSettings(
79+
arguments: args, name: Routes.NEW_GROUP_CHAT_DETAILS),
7780
builder: (_) {
7881
return GroupChatDetailsScreen(
7982
selectedUsers: args as List<User>?,
8083
);
8184
});
8285
case Routes.CHAT_INFO_SCREEN:
8386
return MaterialPageRoute(
84-
settings: const RouteSettings(name: Routes.CHAT_INFO_SCREEN),
87+
settings:
88+
RouteSettings(arguments: args, name: Routes.CHAT_INFO_SCREEN),
8589
builder: (context) {
8690
return ChatInfoScreen(
8791
user: args as User?,
@@ -90,15 +94,17 @@ class AppRoutes {
9094
});
9195
case Routes.GROUP_INFO_SCREEN:
9296
return MaterialPageRoute(
93-
settings: const RouteSettings(name: Routes.GROUP_INFO_SCREEN),
97+
settings:
98+
RouteSettings(arguments: args, name: Routes.GROUP_INFO_SCREEN),
9499
builder: (context) {
95100
return GroupInfoScreen(
96101
messageTheme: StreamChatTheme.of(context).ownMessageTheme,
97102
);
98103
});
99104
case Routes.CHANNEL_LIST_PAGE:
100105
return MaterialPageRoute(
101-
settings: const RouteSettings(name: Routes.CHANNEL_LIST_PAGE),
106+
settings:
107+
RouteSettings(arguments: args, name: Routes.CHANNEL_LIST_PAGE),
102108
builder: (context) {
103109
return ChannelListPage();
104110
});

0 commit comments

Comments
 (0)