Merge branch 'develop'

This commit is contained in:
Salvatore Giordano
2021-10-06 10:58:39 +02:00
4 changed files with 132 additions and 14 deletions
@@ -145,6 +145,15 @@ class _ChannelList extends State<ChannelList> {
) )
: ChannelsBloc( : ChannelsBloc(
child: ChannelListView( child: ChannelListView(
onChannelTap: (channel, _) {
Navigator.pushNamed(
context,
Routes.CHANNEL_PAGE,
arguments: ChannelPageArgs(
channel: channel,
),
);
},
onStartChatPressed: () { onStartChatPressed: () {
Navigator.pushNamed(context, Routes.NEW_CHAT); Navigator.pushNamed(context, Routes.NEW_CHAT);
}, },
@@ -154,7 +163,6 @@ class _ChannelList extends State<ChannelList> {
pagination: PaginationParams( pagination: PaginationParams(
limit: 20, limit: 20,
), ),
channelWidget: ChannelPage(),
onViewInfoTap: (channel) { onViewInfoTap: (channel) {
Navigator.pop(context); Navigator.pop(context);
if (channel.memberCount == 2 && channel.isDistinct) { if (channel.memberCount == 2 && channel.isDistinct) {
@@ -1,9 +1,71 @@
import 'dart:async';
import 'package:example/channel_page.dart';
import 'package:example/notifications_service.dart';
import 'package:example/routes/app_routes.dart'; import 'package:example/routes/app_routes.dart';
import 'package:example/routes/routes.dart'; import 'package:example/routes/routes.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:stream_chat_flutter/stream_chat_flutter.dart'; import 'package:stream_chat_flutter/stream_chat_flutter.dart';
class MyObserver extends NavigatorObserver {
Route? currentRoute;
late final StreamSubscription _subscription;
MyObserver(
StreamChatClient client,
GlobalKey<NavigatorState> navigatorKey,
) {
_subscription = client
.on(
EventType.messageNew,
EventType.notificationMessageNew,
)
.listen((event) {
if (event.message?.user?.id == client.state.currentUser?.id) {
return;
}
final channelId = event.channelId;
if (currentRoute?.settings.name == Routes.CHANNEL_PAGE) {
final args = currentRoute?.settings.arguments as ChannelPageArgs;
if (args.channel?.id == channelId) {
return;
}
}
showLocalNotification(
event,
client.state.currentUser!.id,
navigatorKey.currentState!.context,
);
});
}
@override
void didPop(Route route, Route? previousRoute) {
currentRoute = route;
}
@override
void didPush(Route route, Route? previousRoute) {
currentRoute = route;
}
@override
void didRemove(Route route, Route? previousRoute) {
currentRoute = route;
}
@override
void didReplace({Route? newRoute, Route? oldRoute}) {
currentRoute = newRoute;
}
void dispose() {
_subscription.cancel();
}
}
class HomePageArgs { class HomePageArgs {
final StreamChatClient chatClient; final StreamChatClient chatClient;
@@ -24,6 +86,7 @@ class HomePage extends StatefulWidget {
class _HomePageState extends State<HomePage> { class _HomePageState extends State<HomePage> {
final GlobalKey<NavigatorState> _navigatorKey = GlobalKey(); final GlobalKey<NavigatorState> _navigatorKey = GlobalKey();
MyObserver? _observer;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@@ -38,8 +101,16 @@ class _HomePageState extends State<HomePage> {
key: _navigatorKey, key: _navigatorKey,
onGenerateRoute: AppRoutes.generateRoute, onGenerateRoute: AppRoutes.generateRoute,
initialRoute: Routes.CHANNEL_LIST_PAGE, initialRoute: Routes.CHANNEL_LIST_PAGE,
observers: [_observer!],
), ),
), ),
); );
} }
@override
void didChangeDependencies() {
_observer?.dispose();
_observer = MyObserver(widget.chatClient, _navigatorKey);
super.didChangeDependencies();
}
} }
@@ -1,11 +1,16 @@
import 'package:example/channel_page.dart';
import 'package:example/localizations.dart'; import 'package:example/localizations.dart';
import 'package:example/routes/routes.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart' import 'package:flutter_local_notifications/flutter_local_notifications.dart'
hide Message; hide Message;
import 'package:stream_chat_flutter/stream_chat_flutter.dart'; import 'package:stream_chat_flutter/stream_chat_flutter.dart';
void showLocalNotification( void showLocalNotification(
Event event, String currentUserId, BuildContext context) async { Event event,
String currentUserId,
BuildContext context,
) async {
if (![ if (![
EventType.messageNew, EventType.messageNew,
EventType.notificationMessageNew, EventType.notificationMessageNew,
@@ -22,7 +27,34 @@ void showLocalNotification(
android: initializationSettingsAndroid, android: initializationSettingsAndroid,
iOS: initializationSettingsIOS, iOS: initializationSettingsIOS,
); );
await flutterLocalNotificationsPlugin.initialize(initializationSettings); await flutterLocalNotificationsPlugin.initialize(
initializationSettings,
onSelectNotification: (channelCid) async {
if (channelCid != null) {
final client = StreamChat.of(context).client;
var channel = client.state.channels[channelCid];
if (channel == null) {
final splits = channelCid.split(':');
final type = splits[0];
final id = splits[1];
channel = client.channel(
type,
id: id,
);
await channel.watch();
}
Navigator.pushNamed(
context,
Routes.CHANNEL_PAGE,
arguments: ChannelPageArgs(
channel: channel,
),
);
}
},
);
await flutterLocalNotificationsPlugin.show( await flutterLocalNotificationsPlugin.show(
event.message!.id.hashCode, event.message!.id.hashCode,
event.message!.user!.name, event.message!.user!.name,
@@ -37,5 +69,6 @@ void showLocalNotification(
), ),
iOS: IOSNotificationDetails(), iOS: IOSNotificationDetails(),
), ),
payload: '${event.channelType}:${event.channelId}',
); );
} }
@@ -21,13 +21,13 @@ class AppRoutes {
switch (settings.name) { switch (settings.name) {
case Routes.APP: case Routes.APP:
return MaterialPageRoute( return MaterialPageRoute(
settings: const RouteSettings(name: Routes.APP), settings: RouteSettings(arguments: args, name: Routes.APP),
builder: (_) { builder: (_) {
return MyApp(); return MyApp();
}); });
case Routes.HOME: case Routes.HOME:
return MaterialPageRoute( return MaterialPageRoute(
settings: const RouteSettings(name: Routes.HOME), settings: RouteSettings(arguments: args, name: Routes.HOME),
builder: (_) { builder: (_) {
final homePageArgs = args as HomePageArgs; final homePageArgs = args as HomePageArgs;
return HomePage( return HomePage(
@@ -36,18 +36,19 @@ class AppRoutes {
}); });
case Routes.CHOOSE_USER: case Routes.CHOOSE_USER:
return MaterialPageRoute( return MaterialPageRoute(
settings: const RouteSettings(name: Routes.CHOOSE_USER), settings: RouteSettings(arguments: args, name: Routes.CHOOSE_USER),
builder: (_) { builder: (_) {
return ChooseUserPage(); return ChooseUserPage();
}); });
case Routes.ADVANCED_OPTIONS: case Routes.ADVANCED_OPTIONS:
return MaterialPageRoute( return MaterialPageRoute(
settings: const RouteSettings(name: Routes.ADVANCED_OPTIONS), settings:
RouteSettings(arguments: args, name: Routes.ADVANCED_OPTIONS),
builder: (_) => AdvancedOptionsPage(), builder: (_) => AdvancedOptionsPage(),
); );
case Routes.CHANNEL_PAGE: case Routes.CHANNEL_PAGE:
return MaterialPageRoute( return MaterialPageRoute(
settings: const RouteSettings(name: Routes.CHANNEL_PAGE), settings: RouteSettings(arguments: args, name: Routes.CHANNEL_PAGE),
builder: (_) { builder: (_) {
final channelPageArgs = args as ChannelPageArgs; final channelPageArgs = args as ChannelPageArgs;
return StreamChannel( return StreamChannel(
@@ -61,19 +62,21 @@ class AppRoutes {
}); });
case Routes.NEW_CHAT: case Routes.NEW_CHAT:
return MaterialPageRoute( return MaterialPageRoute(
settings: const RouteSettings(name: Routes.NEW_CHAT), settings: RouteSettings(arguments: args, name: Routes.NEW_CHAT),
builder: (_) { builder: (_) {
return NewChatScreen(); return NewChatScreen();
}); });
case Routes.NEW_GROUP_CHAT: case Routes.NEW_GROUP_CHAT:
return MaterialPageRoute( return MaterialPageRoute(
settings: const RouteSettings(name: Routes.NEW_GROUP_CHAT), settings:
RouteSettings(arguments: args, name: Routes.NEW_GROUP_CHAT),
builder: (_) { builder: (_) {
return NewGroupChatScreen(); return NewGroupChatScreen();
}); });
case Routes.NEW_GROUP_CHAT_DETAILS: case Routes.NEW_GROUP_CHAT_DETAILS:
return MaterialPageRoute( return MaterialPageRoute(
settings: const RouteSettings(name: Routes.NEW_GROUP_CHAT_DETAILS), settings: RouteSettings(
arguments: args, name: Routes.NEW_GROUP_CHAT_DETAILS),
builder: (_) { builder: (_) {
return GroupChatDetailsScreen( return GroupChatDetailsScreen(
selectedUsers: args as List<User>?, selectedUsers: args as List<User>?,
@@ -81,7 +84,8 @@ class AppRoutes {
}); });
case Routes.CHAT_INFO_SCREEN: case Routes.CHAT_INFO_SCREEN:
return MaterialPageRoute( return MaterialPageRoute(
settings: const RouteSettings(name: Routes.CHAT_INFO_SCREEN), settings:
RouteSettings(arguments: args, name: Routes.CHAT_INFO_SCREEN),
builder: (context) { builder: (context) {
return ChatInfoScreen( return ChatInfoScreen(
user: args as User?, user: args as User?,
@@ -90,7 +94,8 @@ class AppRoutes {
}); });
case Routes.GROUP_INFO_SCREEN: case Routes.GROUP_INFO_SCREEN:
return MaterialPageRoute( return MaterialPageRoute(
settings: const RouteSettings(name: Routes.GROUP_INFO_SCREEN), settings:
RouteSettings(arguments: args, name: Routes.GROUP_INFO_SCREEN),
builder: (context) { builder: (context) {
return GroupInfoScreen( return GroupInfoScreen(
messageTheme: StreamChatTheme.of(context).ownMessageTheme, messageTheme: StreamChatTheme.of(context).ownMessageTheme,
@@ -98,7 +103,8 @@ class AppRoutes {
}); });
case Routes.CHANNEL_LIST_PAGE: case Routes.CHANNEL_LIST_PAGE:
return MaterialPageRoute( return MaterialPageRoute(
settings: const RouteSettings(name: Routes.CHANNEL_LIST_PAGE), settings:
RouteSettings(arguments: args, name: Routes.CHANNEL_LIST_PAGE),
builder: (context) { builder: (context) {
return ChannelListPage(); return ChannelListPage();
}); });