add message_reaction_modal_test
This commit is contained in:
@@ -69,7 +69,6 @@ class MessageActionsModal extends StatelessWidget {
|
|||||||
message.status == null))
|
message.status == null))
|
||||||
Center(
|
Center(
|
||||||
child: ReactionPicker(
|
child: ReactionPicker(
|
||||||
channel: channel,
|
|
||||||
message: message,
|
message: message,
|
||||||
messageTheme: messageTheme,
|
messageTheme: messageTheme,
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:stream_chat/stream_chat.dart';
|
import 'package:stream_chat/stream_chat.dart';
|
||||||
import 'package:stream_chat_flutter/src/reaction_bubble.dart';
|
import 'package:stream_chat_flutter/src/reaction_bubble.dart';
|
||||||
import 'package:stream_chat_flutter/src/reaction_picker.dart';
|
import 'package:stream_chat_flutter/src/reaction_picker.dart';
|
||||||
import 'package:stream_chat_flutter/src/stream_channel.dart';
|
|
||||||
import 'package:stream_chat_flutter/src/stream_chat.dart';
|
import 'package:stream_chat_flutter/src/stream_chat.dart';
|
||||||
import 'package:stream_chat_flutter/src/user_avatar.dart';
|
import 'package:stream_chat_flutter/src/user_avatar.dart';
|
||||||
|
|
||||||
@@ -28,20 +27,19 @@ class MessageReactionsModal extends StatelessWidget {
|
|||||||
Key key,
|
Key key,
|
||||||
@required this.message,
|
@required this.message,
|
||||||
@required this.messageTheme,
|
@required this.messageTheme,
|
||||||
this.showReactions,
|
this.showReactions = true,
|
||||||
this.showDeleteMessage,
|
this.showDeleteMessage,
|
||||||
this.showEditMessage,
|
this.showEditMessage,
|
||||||
this.onThreadTap,
|
this.onThreadTap,
|
||||||
this.showReply,
|
this.showReply,
|
||||||
this.editMessageInputBuilder,
|
this.editMessageInputBuilder,
|
||||||
this.messageShape,
|
this.messageShape,
|
||||||
this.reverse,
|
this.reverse = false,
|
||||||
this.onUserAvatarTap,
|
this.onUserAvatarTap,
|
||||||
}) : super(key: key);
|
}) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final channel = StreamChannel.of(context).channel;
|
|
||||||
return Stack(
|
return Stack(
|
||||||
children: [
|
children: [
|
||||||
Positioned.fill(
|
Positioned.fill(
|
||||||
@@ -70,7 +68,6 @@ class MessageReactionsModal extends StatelessWidget {
|
|||||||
message.status == null))
|
message.status == null))
|
||||||
Center(
|
Center(
|
||||||
child: ReactionPicker(
|
child: ReactionPicker(
|
||||||
channel: channel,
|
|
||||||
message: message,
|
message: message,
|
||||||
messageTheme: messageTheme,
|
messageTheme: messageTheme,
|
||||||
),
|
),
|
||||||
@@ -91,7 +88,7 @@ class MessageReactionsModal extends StatelessWidget {
|
|||||||
SizedBox(
|
SizedBox(
|
||||||
height: 16,
|
height: 16,
|
||||||
),
|
),
|
||||||
if (message.latestReactions.isNotEmpty)
|
if (message.latestReactions?.isNotEmpty == true)
|
||||||
Container(
|
Container(
|
||||||
constraints: BoxConstraints.loose(Size.fromHeight(400)),
|
constraints: BoxConstraints.loose(Size.fromHeight(400)),
|
||||||
child: _buildReactionCard(context),
|
child: _buildReactionCard(context),
|
||||||
|
|||||||
@@ -519,8 +519,9 @@ class _MessageWidgetState extends State<MessageWidget> {
|
|||||||
|
|
||||||
List<Widget> _parseAttachments(BuildContext context) {
|
List<Widget> _parseAttachments(BuildContext context) {
|
||||||
final images = widget.message.attachments
|
final images = widget.message.attachments
|
||||||
.where((element) => element.type == 'image')
|
?.where((element) => element.type == 'image')
|
||||||
.toList();
|
?.toList() ??
|
||||||
|
[];
|
||||||
|
|
||||||
if (images.length > 1) {
|
if (images.length > 1) {
|
||||||
return [
|
return [
|
||||||
|
|||||||
@@ -13,13 +13,11 @@ class ReactionPicker extends StatelessWidget {
|
|||||||
const ReactionPicker({
|
const ReactionPicker({
|
||||||
Key key,
|
Key key,
|
||||||
@required this.message,
|
@required this.message,
|
||||||
@required this.channel,
|
|
||||||
@required this.messageTheme,
|
@required this.messageTheme,
|
||||||
}) : super(key: key);
|
}) : super(key: key);
|
||||||
|
|
||||||
final Message message;
|
final Message message;
|
||||||
final MessageTheme messageTheme;
|
final MessageTheme messageTheme;
|
||||||
final Channel channel;
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
@@ -83,13 +81,13 @@ class ReactionPicker extends StatelessWidget {
|
|||||||
|
|
||||||
/// Add a reaction to the message
|
/// Add a reaction to the message
|
||||||
void sendReaction(BuildContext context, String reactionType) {
|
void sendReaction(BuildContext context, String reactionType) {
|
||||||
channel.sendReaction(message, reactionType);
|
StreamChannel.of(context).channel.sendReaction(message, reactionType);
|
||||||
Navigator.of(context).pop();
|
Navigator.of(context).pop();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Remove a reaction from the message
|
/// Remove a reaction from the message
|
||||||
void removeReaction(BuildContext context, Reaction reaction) {
|
void removeReaction(BuildContext context, Reaction reaction) {
|
||||||
channel.deleteReaction(message, reaction);
|
StreamChannel.of(context).channel.deleteReaction(message, reaction);
|
||||||
Navigator.of(context).pop();
|
Navigator.of(context).pop();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ class UserAvatar extends StatelessWidget {
|
|||||||
: StreamChatTheme.of(context).defaultUserImage(context, user),
|
: StreamChatTheme.of(context).defaultUserImage(context, user),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
if (showOnlineStatus && user.online)
|
if (showOnlineStatus && user.online == true)
|
||||||
Positioned(
|
Positioned(
|
||||||
top: 0,
|
top: 0,
|
||||||
right: 0,
|
right: 0,
|
||||||
|
|||||||
@@ -3,13 +3,7 @@ import 'package:flutter_test/flutter_test.dart';
|
|||||||
import 'package:mockito/mockito.dart';
|
import 'package:mockito/mockito.dart';
|
||||||
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
|
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
|
||||||
|
|
||||||
class MockClient extends Mock implements Client {}
|
import 'mocks.dart';
|
||||||
|
|
||||||
class MockClientState extends Mock implements ClientState {}
|
|
||||||
|
|
||||||
class MockChannel extends Mock implements Channel {}
|
|
||||||
|
|
||||||
class MockChannelState extends Mock implements ChannelClientState {}
|
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
testWidgets(
|
testWidgets(
|
||||||
|
|||||||
@@ -0,0 +1,87 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
|
import 'package:mockito/mockito.dart';
|
||||||
|
import 'package:stream_chat_flutter/src/message_reactions_modal.dart';
|
||||||
|
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
|
||||||
|
|
||||||
|
import 'mocks.dart';
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
testWidgets(
|
||||||
|
'it should show one thumbs from the picker',
|
||||||
|
(WidgetTester tester) async {
|
||||||
|
final themeData = ThemeData();
|
||||||
|
final streamTheme = StreamChatThemeData.getDefaultTheme(themeData);
|
||||||
|
await tester.pumpWidget(
|
||||||
|
MaterialApp(
|
||||||
|
theme: themeData,
|
||||||
|
home: StreamChatTheme(
|
||||||
|
data: streamTheme,
|
||||||
|
child: Container(
|
||||||
|
child: MessageReactionsModal(
|
||||||
|
message: Message(
|
||||||
|
text: 'test',
|
||||||
|
user: User(
|
||||||
|
id: 'test-user',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
messageTheme: streamTheme.ownMessageTheme,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(find.byIcon(StreamIcons.thumbs_up_reaction), findsOneWidget);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
testWidgets(
|
||||||
|
'it should show two reactions',
|
||||||
|
(WidgetTester tester) async {
|
||||||
|
final client = MockClient();
|
||||||
|
final clientState = MockClientState();
|
||||||
|
|
||||||
|
when(client.state).thenReturn(clientState);
|
||||||
|
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
|
||||||
|
|
||||||
|
final themeData = ThemeData();
|
||||||
|
final streamTheme = StreamChatThemeData.getDefaultTheme(themeData);
|
||||||
|
await tester.pumpWidget(
|
||||||
|
MaterialApp(
|
||||||
|
theme: themeData,
|
||||||
|
home: StreamChat(
|
||||||
|
streamChatThemeData: streamTheme,
|
||||||
|
client: client,
|
||||||
|
child: Container(
|
||||||
|
child: MessageReactionsModal(
|
||||||
|
message: Message(
|
||||||
|
text: 'test',
|
||||||
|
user: User(
|
||||||
|
id: 'test-user',
|
||||||
|
),
|
||||||
|
latestReactions: [
|
||||||
|
Reaction(
|
||||||
|
type: 'thumbs_up',
|
||||||
|
user: User(id: 'test'),
|
||||||
|
),
|
||||||
|
Reaction(
|
||||||
|
type: 'love',
|
||||||
|
user: User(id: 'test'),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
messageTheme: streamTheme.ownMessageTheme,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
await tester.pump();
|
||||||
|
|
||||||
|
expect(find.byIcon(StreamIcons.thumbs_up_reaction), findsNWidgets(2));
|
||||||
|
expect(find.byIcon(StreamIcons.love_reaction), findsNWidgets(2));
|
||||||
|
expect(find.text('test'), findsNWidgets(2));
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
import 'package:mockito/mockito.dart';
|
||||||
|
import 'package:stream_chat/stream_chat.dart';
|
||||||
|
|
||||||
|
class MockClient extends Mock implements Client {}
|
||||||
|
|
||||||
|
class MockClientState extends Mock implements ClientState {}
|
||||||
|
|
||||||
|
class MockChannel extends Mock implements Channel {}
|
||||||
|
|
||||||
|
class MockChannelState extends Mock implements ChannelClientState {}
|
||||||
Reference in New Issue
Block a user