version bump
This commit is contained in:
@@ -1,3 +1,7 @@
|
||||
## 0.2.0-alpha+11
|
||||
|
||||
- Fix message builder and add messageList to it
|
||||
|
||||
## 0.2.0-alpha+10
|
||||
|
||||
- Add date divider builder
|
||||
|
||||
@@ -91,7 +91,7 @@ class MyApp extends StatelessWidget {
|
||||
return MaterialApp(
|
||||
theme: ThemeData.light(),
|
||||
darkTheme: ThemeData.dark(),
|
||||
themeMode: ThemeMode.dark,
|
||||
themeMode: ThemeMode.system,
|
||||
home: Container(
|
||||
child: StreamChat(
|
||||
client: client,
|
||||
|
||||
@@ -10,7 +10,8 @@ import 'date_divider.dart';
|
||||
import 'message_widget.dart';
|
||||
import 'stream_channel.dart';
|
||||
|
||||
typedef MessageBuilder = Widget Function(BuildContext, Message, int index);
|
||||
typedef MessageBuilder = Widget Function(
|
||||
BuildContext, Message, List<Message>, int index);
|
||||
typedef ParentMessageBuilder = Widget Function(BuildContext, Message);
|
||||
typedef ThreadBuilder = Widget Function(BuildContext context, Message parent);
|
||||
typedef ThreadTapCallback = void Function(Message, Widget);
|
||||
@@ -72,7 +73,6 @@ class MessageListView extends StatefulWidget {
|
||||
this.attachmentBuilders,
|
||||
this.dateDividerBuilder,
|
||||
this.showAvatar = true,
|
||||
this.customClipperBuilder,
|
||||
}) : super(key: key);
|
||||
|
||||
/// Function used to build a custom message widget
|
||||
@@ -115,10 +115,6 @@ class MessageListView extends StatefulWidget {
|
||||
/// if true shows the user avatar
|
||||
final bool showAvatar;
|
||||
|
||||
/// Custom clipper applied to the message bubble
|
||||
final CustomClipper Function(BuildContext, Message, int index)
|
||||
customClipperBuilder;
|
||||
|
||||
@override
|
||||
_MessageListViewState createState() => _MessageListViewState();
|
||||
}
|
||||
@@ -181,13 +177,6 @@ class _MessageListViewState extends State<MessageListView> {
|
||||
onMessageActions: widget.onMessageActions,
|
||||
attachmentBuilders: widget.attachmentBuilders,
|
||||
showAvatar: widget.showAvatar,
|
||||
customClipperBuilder: (message) {
|
||||
return widget.customClipperBuilder(
|
||||
context,
|
||||
message,
|
||||
i,
|
||||
);
|
||||
},
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 32),
|
||||
@@ -237,7 +226,8 @@ class _MessageListViewState extends State<MessageListView> {
|
||||
if (widget.messageBuilder != null) {
|
||||
messageWidget = Builder(
|
||||
key: ValueKey<String>('MESSAGE-${message.id}'),
|
||||
builder: (_) => widget.messageBuilder(context, message, i),
|
||||
builder: (_) =>
|
||||
widget.messageBuilder(context, message, _messages, i),
|
||||
);
|
||||
} else {
|
||||
messageWidget = MessageWidget(
|
||||
@@ -253,11 +243,6 @@ class _MessageListViewState extends State<MessageListView> {
|
||||
onMessageActions: widget.onMessageActions,
|
||||
attachmentBuilders: widget.attachmentBuilders,
|
||||
showAvatar: widget.showAvatar,
|
||||
customClipperBuilder: (message) {
|
||||
if (widget.customClipperBuilder != null) {
|
||||
return widget.customClipperBuilder(context, message, i);
|
||||
}
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -331,8 +316,12 @@ class _MessageListViewState extends State<MessageListView> {
|
||||
if (widget.messageBuilder != null) {
|
||||
messageWidget = Builder(
|
||||
key: ValueKey<String>('MESSAGE-${message.id}'),
|
||||
builder: (_) =>
|
||||
widget.messageBuilder(context, message, _messages.length - 1),
|
||||
builder: (_) => widget.messageBuilder(
|
||||
context,
|
||||
message,
|
||||
_messages,
|
||||
_messages.length - 1,
|
||||
),
|
||||
);
|
||||
} else {
|
||||
messageWidget = MessageWidget(
|
||||
@@ -348,10 +337,6 @@ class _MessageListViewState extends State<MessageListView> {
|
||||
onMessageActions: widget.onMessageActions,
|
||||
attachmentBuilders: widget.attachmentBuilders,
|
||||
showAvatar: widget.showAvatar,
|
||||
customClipperBuilder: (message) {
|
||||
return widget.customClipperBuilder(
|
||||
context, message, _messages.length - 1);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
@@ -378,7 +363,7 @@ class _MessageListViewState extends State<MessageListView> {
|
||||
if (widget.messageBuilder != null) {
|
||||
messageWidget = Builder(
|
||||
key: ValueKey<String>('MESSAGE-${message.id}'),
|
||||
builder: (_) => widget.messageBuilder(context, message, 0),
|
||||
builder: (_) => widget.messageBuilder(context, message, _messages, 0),
|
||||
);
|
||||
} else {
|
||||
messageWidget = MessageWidget(
|
||||
@@ -394,9 +379,6 @@ class _MessageListViewState extends State<MessageListView> {
|
||||
onMessageActions: widget.onMessageActions,
|
||||
attachmentBuilders: widget.attachmentBuilders,
|
||||
showAvatar: widget.showAvatar,
|
||||
customClipperBuilder: (message) {
|
||||
return widget.customClipperBuilder(context, message, 0);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
+54
-61
@@ -1,3 +1,5 @@
|
||||
import 'dart:math';
|
||||
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/widgets.dart';
|
||||
@@ -49,7 +51,6 @@ class MessageWidget extends StatefulWidget {
|
||||
this.showVideoFullScreen = true,
|
||||
this.attachmentBuilders,
|
||||
this.showAvatar = true,
|
||||
this.customClipperBuilder,
|
||||
}) : super(key: key);
|
||||
|
||||
/// Function called on mention tap
|
||||
@@ -88,9 +89,6 @@ class MessageWidget extends StatefulWidget {
|
||||
/// if true shows the user avatar
|
||||
final bool showAvatar;
|
||||
|
||||
/// Custom clipper applied to the message bubble
|
||||
final CustomClipper Function(Message) customClipperBuilder;
|
||||
|
||||
@override
|
||||
_MessageWidgetState createState() => _MessageWidgetState();
|
||||
}
|
||||
@@ -486,57 +484,46 @@ class _MessageWidgetState extends State<MessageWidget>
|
||||
right: _isMyMessage ? 0.0 : 8.0,
|
||||
left: _isMyMessage ? 8.0 : 0.0,
|
||||
),
|
||||
child: ClipPath(
|
||||
clipper: widget.customClipperBuilder != null
|
||||
? widget.customClipperBuilder(widget.message)
|
||||
: null,
|
||||
clipBehavior: Clip.hardEdge,
|
||||
child: Container(
|
||||
decoration:
|
||||
_buildBoxDecoration(_isLastUser || nOfAttachmentWidgets > 0)
|
||||
.copyWith(
|
||||
borderRadius: widget.customClipperBuilder != null
|
||||
? BorderRadius.circular(0)
|
||||
: null),
|
||||
padding: EdgeInsets.all(10),
|
||||
constraints: BoxConstraints.loose(
|
||||
Size.fromWidth(MediaQuery.of(context).size.width * 0.7),
|
||||
),
|
||||
child: _buildSendingError(
|
||||
MarkdownBody(
|
||||
data: text,
|
||||
onTapLink: (link) {
|
||||
if (link.startsWith('@')) {
|
||||
final mentionedUser =
|
||||
widget.message.mentionedUsers.firstWhere(
|
||||
(u) => '@${u.name.replaceAll(' ', '')}' == link,
|
||||
orElse: () => null,
|
||||
);
|
||||
child: Container(
|
||||
decoration:
|
||||
_buildBoxDecoration(_isLastUser || nOfAttachmentWidgets > 0),
|
||||
padding: EdgeInsets.all(10),
|
||||
constraints: BoxConstraints.loose(
|
||||
Size.fromWidth(MediaQuery.of(context).size.width * 0.7),
|
||||
),
|
||||
child: _buildSendingError(
|
||||
MarkdownBody(
|
||||
data: text,
|
||||
onTapLink: (link) {
|
||||
if (link.startsWith('@')) {
|
||||
final mentionedUser = widget.message.mentionedUsers.firstWhere(
|
||||
(u) => '@${u.name.replaceAll(' ', '')}' == link,
|
||||
orElse: () => null,
|
||||
);
|
||||
|
||||
if (widget.onMentionTap != null) {
|
||||
widget.onMentionTap(mentionedUser);
|
||||
} else {
|
||||
print('tap on ${mentionedUser.name}');
|
||||
}
|
||||
if (widget.onMentionTap != null) {
|
||||
widget.onMentionTap(mentionedUser);
|
||||
} else {
|
||||
launchURL(context, link);
|
||||
print('tap on ${mentionedUser.name}');
|
||||
}
|
||||
},
|
||||
styleSheet: MarkdownStyleSheet.fromTheme(
|
||||
Theme.of(context).copyWith(
|
||||
textTheme: Theme.of(context).textTheme.apply(
|
||||
bodyColor: _messageTheme.messageText.color,
|
||||
decoration: _messageTheme.messageText.decoration,
|
||||
decorationColor:
|
||||
_messageTheme.messageText.decorationColor,
|
||||
decorationStyle:
|
||||
_messageTheme.messageText.decorationStyle,
|
||||
fontFamily: _messageTheme.messageText.fontFamily,
|
||||
),
|
||||
),
|
||||
).copyWith(
|
||||
p: _messageTheme.messageText,
|
||||
} else {
|
||||
launchURL(context, link);
|
||||
}
|
||||
},
|
||||
styleSheet: MarkdownStyleSheet.fromTheme(
|
||||
Theme.of(context).copyWith(
|
||||
textTheme: Theme.of(context).textTheme.apply(
|
||||
bodyColor: _messageTheme.messageText.color,
|
||||
decoration: _messageTheme.messageText.decoration,
|
||||
decorationColor:
|
||||
_messageTheme.messageText.decorationColor,
|
||||
decorationStyle:
|
||||
_messageTheme.messageText.decorationStyle,
|
||||
fontFamily: _messageTheme.messageText.fontFamily,
|
||||
),
|
||||
),
|
||||
).copyWith(
|
||||
p: _messageTheme.messageText,
|
||||
),
|
||||
),
|
||||
),
|
||||
@@ -555,14 +542,19 @@ class _MessageWidgetState extends State<MessageWidget>
|
||||
Widget _buildReactionPaint() {
|
||||
return widget.message.reactionCounts?.isNotEmpty == true
|
||||
? Positioned(
|
||||
left: _isMyMessage ? 8 : null,
|
||||
right: !_isMyMessage ? 8 : null,
|
||||
left: _isMyMessage ? 4 : null,
|
||||
right: !_isMyMessage ? 4 : null,
|
||||
top: -6,
|
||||
child: CustomPaint(
|
||||
painter: _ReactionBubblePainter(
|
||||
Theme.of(context).brightness == Brightness.dark
|
||||
? Colors.white
|
||||
: Colors.black,
|
||||
child: Transform(
|
||||
transform:
|
||||
!_isMyMessage ? Matrix4.rotationY(pi) : Matrix4.identity(),
|
||||
alignment: Alignment.center,
|
||||
child: CustomPaint(
|
||||
painter: _ReactionBubblePainter(
|
||||
Theme.of(context).brightness == Brightness.dark
|
||||
? Colors.white
|
||||
: Colors.black,
|
||||
),
|
||||
),
|
||||
),
|
||||
)
|
||||
@@ -895,9 +887,10 @@ class _ReactionBubblePainter extends CustomPainter {
|
||||
void paint(Canvas canvas, Size size) {
|
||||
final paint = Paint()..color = color;
|
||||
final path = Path();
|
||||
path.arcToPoint(Offset(-6, -6));
|
||||
path.arcToPoint(Offset(0, 10));
|
||||
path.arcToPoint(Offset(6, -6));
|
||||
path.lineTo(-2, -6);
|
||||
path.lineTo(0, 10);
|
||||
path.lineTo(10, -6);
|
||||
path.lineTo(-2, -6);
|
||||
canvas.drawPath(path, paint);
|
||||
}
|
||||
|
||||
|
||||
@@ -130,9 +130,6 @@ class ThreadHeader extends StatelessWidget implements PreferredSizeWidget {
|
||||
child: Icon(
|
||||
Icons.close,
|
||||
size: 15,
|
||||
color: Theme.of(context).brightness == Brightness.dark
|
||||
? Colors.white
|
||||
: Colors.black,
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
@@ -7,12 +7,20 @@ export 'src/channel_name.dart';
|
||||
export 'src/channel_preview.dart';
|
||||
export 'src/channels_bloc.dart';
|
||||
export 'src/date_divider.dart';
|
||||
export 'src/deleted_message.dart';
|
||||
export 'src/file_attachment.dart';
|
||||
export 'src/giphy_attachment.dart';
|
||||
export 'src/image_attachment.dart';
|
||||
export 'src/message_input.dart';
|
||||
export 'src/message_list_view.dart';
|
||||
export 'src/message_widget.dart';
|
||||
export 'src/reaction_picker.dart';
|
||||
export 'src/reply_indicator.dart';
|
||||
export 'src/sending_indicator.dart';
|
||||
export 'src/stream_channel.dart';
|
||||
export 'src/stream_chat.dart';
|
||||
export 'src/stream_chat_theme.dart';
|
||||
export 'src/thread_header.dart';
|
||||
export 'src/typing_indicator.dart';
|
||||
export 'src/user_avatar.dart';
|
||||
export 'src/video_attachment.dart';
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
name: stream_chat_flutter
|
||||
homepage: https://github.com/GetStream/stream-chat-flutter
|
||||
description: Stream Chat official Flutter SDK. Build your own chat experience using Dart and Flutter.
|
||||
version: 0.2.0-alpha+10
|
||||
version: 0.2.0-alpha+11
|
||||
|
||||
environment:
|
||||
sdk: ">=2.3.0 <3.0.0"
|
||||
|
||||
Reference in New Issue
Block a user