chore: migrate and update tests.

Signed-off-by: xsahil03x <[email protected]>
This commit is contained in:
Sahil Kumar
2023-06-20 14:43:13 +05:30
committed by xsahil03x
parent 84b50fc852
commit c6f64fdc96
25 changed files with 311 additions and 412 deletions
@@ -36,7 +36,7 @@ class StreamAttachmentUploadStateBuilder extends StatelessWidget {
@override
Widget build(BuildContext context) {
if (message.status == MessageSendingStatus.sent) {
if (message.state.isCompleted) {
return const Offstage();
}
@@ -216,7 +216,7 @@ class _FailedState extends StatelessWidget {
horizontal: 12,
),
child: Text(
context.translations.uploadErrorLabel,
error ?? 'Failed to upload file',
style: theme.textTheme.footnote.copyWith(
color: theme.colorTheme.barsBg,
),
@@ -236,7 +236,7 @@ class _Trailing extends StatelessWidget {
final channel = StreamChannel.of(context).channel;
final attachmentId = attachment.id;
if (message.status == MessageSendingStatus.sent) {
if (message.state.isCompleted) {
return IconButton(
icon: StreamSvgIcon.cloudDownload(
color: theme.colorTheme.textHighEmphasis,
@@ -30,14 +30,13 @@ class StreamSendingIndicator extends StatelessWidget {
color: StreamChatTheme.of(context).colorTheme.accentPrimary,
);
}
if (message.status == MessageSendingStatus.sent) {
if (message.state.isCompleted) {
return StreamSvgIcon.check(
size: size,
color: StreamChatTheme.of(context).colorTheme.textLowEmphasis,
);
}
if (message.status == MessageSendingStatus.sending ||
message.status == MessageSendingStatus.updating) {
if (message.state.isOutgoing) {
return Icon(
Icons.access_time,
size: size,
@@ -19,7 +19,6 @@ class MessageActionsModal extends StatefulWidget {
this.showDeleteMessage = true,
this.showEditMessage = true,
this.onReplyTap,
this.onConfirmDeleteTap,
this.onThreadReplyTap,
this.showCopyMessage = true,
this.showReplyMessage = true,
@@ -45,9 +44,6 @@ class MessageActionsModal extends StatefulWidget {
/// The action to perform when "reply" is tapped
final OnMessageTap? onReplyTap;
/// The action to perform when delete confirmation button is tapped.
final Future<void> Function(Message)? onConfirmDeleteTap;
/// Message in focus for actions
final Message message;
@@ -98,9 +94,7 @@ class _MessageActionsModalState extends State<MessageActionsModal> {
bool _showActions = true;
@override
Widget build(BuildContext context) => _showMessageOptionsModal();
Widget _showMessageOptionsModal() {
Widget build(BuildContext context) {
final mediaQueryData = MediaQuery.of(context);
final user = StreamChat.of(context).currentUser;
final orientation = mediaQueryData.orientation;
@@ -119,8 +113,7 @@ class _MessageActionsModalState extends State<MessageActionsModal> {
? CrossAxisAlignment.end
: CrossAxisAlignment.start,
children: <Widget>[
if (widget.showReactions &&
(widget.message.status == MessageSendingStatus.sent))
if (widget.showReactions && widget.message.state.isCompleted)
LayoutBuilder(
builder: (context, constraints) {
return Align(
@@ -161,7 +154,7 @@ class _MessageActionsModalState extends State<MessageActionsModal> {
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
if (widget.showReplyMessage &&
widget.message.status == MessageSendingStatus.sent)
widget.message.state.isCompleted)
ReplyButton(
onTap: () {
Navigator.of(context).pop();
@@ -171,8 +164,7 @@ class _MessageActionsModalState extends State<MessageActionsModal> {
},
),
if (widget.showThreadReplyMessage &&
(widget.message.status ==
MessageSendingStatus.sent) &&
(widget.message.state.isCompleted) &&
widget.message.parentId == null)
ThreadReplyButton(
message: widget.message,
@@ -208,8 +200,8 @@ class _MessageActionsModalState extends State<MessageActionsModal> {
),
if (widget.showDeleteMessage)
DeleteMessageButton(
isDeleteFailed: widget.message.status ==
MessageSendingStatus.failed_delete,
isDeleteFailed:
widget.message.state.isDeletingFailed,
onTap: _showDeleteBottomSheet,
),
...widget.customActions
@@ -367,12 +359,7 @@ class _MessageActionsModalState extends State<MessageActionsModal> {
if (answer == true) {
try {
Navigator.of(context).pop();
final onConfirmDeleteTap = widget.onConfirmDeleteTap;
if (onConfirmDeleteTap != null) {
await onConfirmDeleteTap(widget.message);
} else {
await StreamChannel.of(context).channel.deleteMessage(widget.message);
}
await StreamChannel.of(context).channel.deleteMessage(widget.message);
} catch (err) {
_showErrorAlertBottomSheet();
}
@@ -22,16 +22,17 @@ class ResendMessageButton extends StatelessWidget {
@override
Widget build(BuildContext context) {
final isUpdateFailed = message.status == MessageSendingStatus.failed_update;
final isUpdateFailed = message.state.isUpdatingFailed;
final streamChatThemeData = StreamChatTheme.of(context);
return InkWell(
onTap: () {
Navigator.of(context).pop();
if (isUpdateFailed) {
channel.updateMessage(message);
} else {
channel.sendMessage(message);
}
message.state.whenOrNull(failed: (state, error) {
state.whenOrNull(
sendingFailed: () => channel.sendMessage(message),
updatingFailed: () => channel.updateMessage(message),
);
});
},
child: Padding(
padding: const EdgeInsets.symmetric(vertical: 11, horizontal: 16),
@@ -129,7 +129,6 @@ class StreamMessageInput extends StatefulWidget {
this.customAutocompleteTriggers = const [],
this.mentionAllAppUsers = false,
this.sendButtonBuilder,
this.quotedMessageBuilder,
this.shouldKeepFocusAfterMessage,
this.validator = _defaultValidator,
this.restorationId,
@@ -267,9 +266,6 @@ class StreamMessageInput extends StatefulWidget {
/// Builder for creating send button
final MessageRelatedBuilder? sendButtonBuilder;
/// Builder for building quoted message
final Widget Function(BuildContext, Message)? quotedMessageBuilder;
/// Defines if the [StreamMessageInput] loses focuses after a message is sent.
/// The default behaviour keeps focus until a command is enabled.
final bool? shouldKeepFocusAfterMessage;
@@ -370,8 +366,8 @@ class StreamMessageInputState extends State<StreamMessageInput>
bool get _hasQuotedMessage =>
_effectiveController.message.quotedMessage != null;
bool get _isEditing =>
_effectiveController.message.status != MessageSendingStatus.sending;
// TODO:
bool get _isEditing => _effectiveController.message.state.isCompleted;
BoxBorder? _draggingBorder;
@@ -786,6 +782,7 @@ class StreamMessageInputState extends State<StreamMessageInput>
Future<void> _onAttachmentButtonPressed() async {
final attachments = await showStreamAttachmentPickerModalBottomSheet(
context: context,
useRootNavigator: true,
allowedTypes: widget.allowedAttachmentPickerTypes,
initialAttachments: _effectiveController.attachments,
);
@@ -1135,20 +1132,14 @@ class StreamMessageInputState extends State<StreamMessageInput>
if (!_hasQuotedMessage) return const Offstage();
final containsUrl = _effectiveController.message.quotedMessage!.attachments
.any((element) => element.titleLink != null);
return widget.quotedMessageBuilder?.call(
context,
_effectiveController.message.quotedMessage!,
) ??
StreamQuotedMessageWidget(
reverse: true,
showBorder: !containsUrl,
message: _effectiveController.message.quotedMessage!,
messageTheme: _streamChatTheme.otherMessageTheme,
padding: const EdgeInsets.fromLTRB(8, 8, 8, 0),
onQuotedMessageClear: widget.onQuotedMessageCleared,
attachmentThumbnailBuilders: widget.attachmentThumbnailBuilders,
);
return StreamQuotedMessageWidget(
reverse: true,
showBorder: !containsUrl,
message: _effectiveController.message.quotedMessage!,
messageTheme: _streamChatTheme.otherMessageTheme,
padding: const EdgeInsets.fromLTRB(8, 8, 8, 0),
onQuotedMessageClear: widget.onQuotedMessageCleared,
);
}
Widget _buildAttachments() {
@@ -1451,10 +1442,12 @@ class StreamMessageInputState extends State<StreamMessageInput>
skipEnrichUrl: skipEnrichUrl,
);
if (shouldKeepFocus) {
FocusScope.of(context).requestFocus(_effectiveFocusNode);
} else {
FocusScope.of(context).unfocus();
if (mounted) {
if (shouldKeepFocus) {
FocusScope.of(context).requestFocus(_effectiveFocusNode);
} else {
FocusScope.of(context).unfocus();
}
}
}
@@ -61,7 +61,6 @@ class StreamMessageWidget extends StatefulWidget {
this.showInChannelIndicator = false,
this.onReplyTap,
this.onThreadTap,
this.onConfirmDeleteTap,
this.showUsername = true,
this.showTimestamp = true,
this.showReactions = true,
@@ -79,7 +78,6 @@ class StreamMessageWidget extends StatefulWidget {
this.onMessageActions,
this.onShowMessage,
this.userAvatarBuilder,
this.quotedMessageBuilder,
this.editMessageInputBuilder,
this.textBuilder,
@Deprecated('''
@@ -309,11 +307,6 @@ class StreamMessageWidget extends StatefulWidget {
/// {@endtemplate}
final void Function(Message)? onReplyTap;
/// {@template onDeleteTap}
/// The function called when delete confirmation button is tapped.
/// {@endtemplate}
final Future<void> Function(Message)? onConfirmDeleteTap;
/// {@template editMessageInputBuilder}
/// Widget builder for edit message layout
/// {@endtemplate}
@@ -355,11 +348,6 @@ class StreamMessageWidget extends StatefulWidget {
/// {@endtemplate}
final Widget Function(BuildContext, User)? userAvatarBuilder;
/// {@template quotedMessageBuilder}
/// Widget builder for building quoted message
/// {@endtemplate}
final Widget Function(BuildContext, Message)? quotedMessageBuilder;
/// {@template message}
/// The message to display.
/// {@endtemplate}
@@ -580,10 +568,8 @@ class StreamMessageWidget extends StatefulWidget {
void Function(User)? onMentionTap,
void Function(Message)? onThreadTap,
void Function(Message)? onReplyTap,
Future<void> Function(Message)? onConfirmDeleteTap,
Widget Function(BuildContext, Message)? editMessageInputBuilder,
Widget Function(BuildContext, Message)? textBuilder,
Widget Function(BuildContext, Message)? quotedMessageBuilder,
@Deprecated('''
Use [bottomRowBuilderWithDefaultWidget] instead.
Will be removed in the next major version.
@@ -673,11 +659,9 @@ class StreamMessageWidget extends StatefulWidget {
onMentionTap: onMentionTap ?? this.onMentionTap,
onThreadTap: onThreadTap ?? this.onThreadTap,
onReplyTap: onReplyTap ?? this.onReplyTap,
onConfirmDeleteTap: onConfirmDeleteTap ?? this.onConfirmDeleteTap,
editMessageInputBuilder:
editMessageInputBuilder ?? this.editMessageInputBuilder,
textBuilder: textBuilder ?? this.textBuilder,
quotedMessageBuilder: quotedMessageBuilder ?? this.quotedMessageBuilder,
bottomRowBuilderWithDefaultWidget: _bottomRowBuilderWithDefaultWidget,
onMessageActions: onMessageActions ?? this.onMessageActions,
message: message ?? this.message,
@@ -760,13 +744,11 @@ class _StreamMessageWidgetState extends State<StreamMessageWidget>
/// {@endtemplate}
bool get hasQuotedMessage => widget.message.quotedMessage != null;
bool get isSendFailed => widget.message.status == MessageSendingStatus.failed;
bool get isSendFailed => widget.message.state.isSendingFailed;
bool get isUpdateFailed =>
widget.message.status == MessageSendingStatus.failed_update;
bool get isUpdateFailed => widget.message.state.isUpdatingFailed;
bool get isDeleteFailed =>
widget.message.status == MessageSendingStatus.failed_delete;
bool get isDeleteFailed => widget.message.state.isDeletingFailed;
/// {@template isFailedState}
/// Whether the message has failed to be sent, updated, or deleted.
@@ -973,7 +955,6 @@ class _StreamMessageWidgetState extends State<StreamMessageWidget>
borderSide: widget.borderSide,
borderRadiusGeometry: widget.borderRadiusGeometry,
textBuilder: widget.textBuilder,
quotedMessageBuilder: widget.quotedMessageBuilder,
onLinkTap: widget.onLinkTap,
onMentionTap: widget.onMentionTap,
onQuotedMessageTap: widget.onQuotedMessageTap,
@@ -1090,14 +1071,12 @@ class _StreamMessageWidgetState extends State<StreamMessageWidget>
leading: StreamSvgIcon.iconSendMessage(),
title: Text(
context.translations.toggleResendOrResendEditedMessage(
isUpdateFailed:
widget.message.status == MessageSendingStatus.failed,
isUpdateFailed: widget.message.state.isUpdatingFailed,
),
),
onClick: () {
Navigator.of(context, rootNavigator: true).pop();
final isUpdateFailed =
widget.message.status == MessageSendingStatus.failed_update;
final isUpdateFailed = widget.message.state.isUpdatingFailed;
final channel = StreamChannel.of(context).channel;
if (isUpdateFailed) {
channel.updateMessage(widget.message);
@@ -1115,21 +1094,16 @@ class _StreamMessageWidgetState extends State<StreamMessageWidget>
),
onClick: () async {
Navigator.of(context, rootNavigator: true).pop();
final deleted = await showDialog<bool?>(
final deleted = await showDialog(
context: context,
barrierDismissible: false,
builder: (_) => const DeleteMessageDialog(),
);
if (deleted == true) {
if (deleted) {
try {
final onConfirmDeleteTap = widget.onConfirmDeleteTap;
if (onConfirmDeleteTap != null) {
await onConfirmDeleteTap(widget.message);
} else {
await StreamChannel.of(context)
.channel
.deleteMessage(widget.message);
}
await StreamChannel.of(context)
.channel
.deleteMessage(widget.message);
} catch (e) {
showDialog(
context: context,
@@ -1150,8 +1124,7 @@ class _StreamMessageWidgetState extends State<StreamMessageWidget>
}
void onLongPress(BuildContext context) {
if (widget.message.isEphemeral ||
widget.message.status == MessageSendingStatus.sending) {
if (widget.message.isEphemeral || widget.message.state.isOutgoing) {
return;
}
@@ -1187,8 +1160,8 @@ class _StreamMessageWidgetState extends State<StreamMessageWidget>
translateUserAvatar: false,
showSendingIndicator: false,
padding: EdgeInsets.zero,
showReactionPickerIndicator: widget.showReactions &&
(widget.message.status == MessageSendingStatus.sent),
showReactionPickerIndicator:
widget.showReactions && widget.message.state.isCompleted,
showPinHighlight: false,
showUserAvatar:
widget.message.user!.id == channel.client.state.currentUser!.id
@@ -63,7 +63,6 @@ class MessageWidgetContent extends StatelessWidget {
this.onMentionTap,
this.onLinkTap,
this.textBuilder,
this.quotedMessageBuilder,
@Deprecated('''
Use [bottomRowBuilderWithDefaultWidget] instead.
Will be removed in the next major version.
@@ -171,9 +170,6 @@ class MessageWidgetContent extends StatelessWidget {
/// {@macro textBuilder}
final Widget Function(BuildContext, Message)? textBuilder;
/// {@macro quotedMessageBuilder}
final Widget Function(BuildContext, Message)? quotedMessageBuilder;
/// {@macro showReactionPickerIndicator}
final bool showReactionPickerIndicator;
@@ -355,8 +351,6 @@ class MessageWidgetContent extends StatelessWidget {
onMentionTap: onMentionTap,
onLinkTap: onLinkTap,
textBuilder: textBuilder,
quotedMessageBuilder:
quotedMessageBuilder,
borderRadiusGeometry:
borderRadiusGeometry,
borderSide: borderSide,
@@ -458,7 +452,7 @@ class MessageWidgetContent extends StatelessWidget {
showSendingIndicator: false,
padding: EdgeInsets.zero,
showReactionPickerIndicator:
showReactions && (message.status == MessageSendingStatus.sent),
showReactions && message.state.isCompleted,
showPinHighlight: false,
showUserAvatar:
message.user!.id == channel.client.state.currentUser!.id
@@ -57,7 +57,7 @@ class StreamMessageReactionsModal extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
if ((showReactions ?? hasReactionPermission) &&
(message.status == MessageSendingStatus.sent))
message.state.isCompleted)
LayoutBuilder(
builder: (context, constraints) {
return Align(
@@ -42,25 +42,21 @@ class SendingIndicatorBuilder extends StatelessWidget {
final channel = this.channel ?? StreamChannel.of(context).channel;
final memberCount = channel.memberCount ?? 0;
if (hasNonUrlAttachments &&
(message.status == MessageSendingStatus.sending ||
message.status == MessageSendingStatus.updating)) {
if (hasNonUrlAttachments && message.state.isOutgoing) {
final totalAttachments = message.attachments.length;
final uploadRemaining =
message.attachments.where((it) => !it.uploadState.isSuccess).length;
if (uploadRemaining == 0) {
return StreamSvgIcon.check(
size: style!.fontSize,
color: IconTheme.of(context).color!.withOpacity(0.5),
final attachmentsToUpload = message.attachments.where((it) {
return !it.uploadState.isSuccess;
});
if (attachmentsToUpload.isNotEmpty) {
return Text(
context.translations.attachmentsUploadProgressText(
remaining: attachmentsToUpload.length,
total: totalAttachments,
),
style: style,
);
}
return Text(
context.translations.attachmentsUploadProgressText(
remaining: uploadRemaining,
total: totalAttachments,
),
style: style,
);
}
return BetterStreamBuilder<List<Read>>(
@@ -91,7 +91,7 @@ class StreamChannelListTile extends StatelessWidget {
/// The widget builder for the sending indicator.
///
/// `Message` is the last message in the channel, Use it to determine the
/// status using [Message.status].
/// status using [Message.state].
final Widget Function(BuildContext, Message)? sendingIndicatorBuilder;
/// True if the tile is in a selected state.
@@ -40,7 +40,7 @@ void main() {
user: User(
id: 'user-id',
),
status: MessageSendingStatus.sent,
state: MessageState.sent,
),
messageWidget: const Text(
'test',
@@ -211,7 +211,7 @@ void main() {
user: User(
id: 'user-id',
),
status: MessageSendingStatus.sent,
state: MessageState.sent,
),
messageTheme: streamTheme.ownMessageTheme,
),
@@ -262,7 +262,7 @@ void main() {
user: User(
id: 'user-id',
),
status: MessageSendingStatus.sent,
state: MessageState.sent,
),
messageTheme: streamTheme.ownMessageTheme,
),
@@ -460,7 +460,7 @@ void main() {
child: MessageActionsModal(
messageWidget: const Text('test'),
message: Message(
status: MessageSendingStatus.failed,
state: MessageState.sendingFailed,
text: 'test',
user: User(
id: 'user-id',
@@ -510,7 +510,7 @@ void main() {
child: MessageActionsModal(
messageWidget: const Text('test'),
message: Message(
status: MessageSendingStatus.failed_update,
state: MessageState.updatingFailed,
text: 'test',
user: User(
id: 'user-id',