Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion assets/l10n/intl_en.arb
Original file line number Diff line number Diff line change
Expand Up @@ -3482,5 +3482,6 @@
"placeholders": {
"count": {}
}
}
},
"tapToRetry": "Tap to retry"
}
2 changes: 1 addition & 1 deletion lib/data/network/media/media_api.dart
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ class MediaAPI {
.postToGetBody(
HomeserverEndpoint.uploadMediaServicePath
.generateHomeserverMediaEndpoint(),
data: file.readStream ?? file.bytes,
data: file.readStream ?? Stream.value(file.bytes ?? List<int>.empty()),
queryParameters: {
'fileName': file.name,
},
Expand Down
2 changes: 2 additions & 0 deletions lib/pages/chat/chat.dart
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ import 'package:fluffychat/presentation/mixins/handle_clipboard_action_mixin.dar
import 'package:fluffychat/presentation/mixins/leave_chat_mixin.dart';
import 'package:fluffychat/presentation/mixins/media_picker_mixin.dart';
import 'package:fluffychat/presentation/mixins/paste_image_mixin.dart';
import 'package:fluffychat/presentation/mixins/retry_text_message_mixin.dart';
import 'package:fluffychat/presentation/mixins/save_file_to_twake_downloads_folder_mixin.dart';
import 'package:fluffychat/presentation/mixins/save_media_to_gallery_android_mixin.dart';
import 'package:fluffychat/presentation/mixins/send_files_mixin.dart';
Expand Down Expand Up @@ -141,6 +142,7 @@ class ChatController extends State<Chat>
LeaveChatMixin,
DeleteEventMixin,
UnblockUserMixin,
RetryTextMessageMixin,
AudioMixin {
final NetworkConnectionService networkConnectionService =
getIt.get<NetworkConnectionService>();
Expand Down
1 change: 1 addition & 0 deletions lib/pages/chat/chat_event_list_item.dart
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@ class ChatEventListItem extends StatelessWidget {
},
recentEmojiFuture: controller.getRecentReactionsInteractor.execute(),
onReport: controller.reportEventAction,
onRetryTextMessage: controller.retryTextMessage,
),
);
}
Expand Down
4 changes: 3 additions & 1 deletion lib/pages/chat/chat_pinned_events/pinned_messages.dart
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import 'package:fluffychat/pages/chat/chat_pinned_events/pinned_messages_style.d
import 'package:fluffychat/pages/chat/context_item_chat_action.dart';
import 'package:fluffychat/presentation/extensions/event_update_extension.dart';
import 'package:fluffychat/presentation/mixins/delete_event_mixin.dart';
import 'package:fluffychat/presentation/mixins/retry_text_message_mixin.dart';
import 'package:fluffychat/presentation/model/forward/forward_argument.dart';
import 'package:fluffychat/resource/image_paths.dart';
import 'package:fluffychat/utils/adaptive_bottom_sheet.dart';
Expand Down Expand Up @@ -53,7 +54,8 @@ class PinnedMessagesController extends State<PinnedMessages>
PopupContextMenuActionMixin,
PopupMenuWidgetMixin,
TwakeContextMenuMixin,
DeleteEventMixin {
DeleteEventMixin,
RetryTextMessageMixin {
ValueNotifier<List<Event?>> eventsNotifier = ValueNotifier([]);

final ValueNotifier<String?> isHoverNotifier = ValueNotifier(null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,8 @@ class PinnedMessagesScreen extends StatelessWidget {
context,
event,
),
onRetryTextMessage:
controller.retryTextMessage,
);
},
);
Expand Down
100 changes: 73 additions & 27 deletions lib/pages/chat/events/images_builder/sending_image_info_widget.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import 'package:fluffychat/widgets/mixins/upload_file_mixin.dart';
import 'package:flutter/material.dart';
import 'package:flutter_blurhash/flutter_blurhash.dart';
import 'package:linagora_design_flutter/colors/linagora_ref_colors.dart';
import 'package:linagora_design_flutter/colors/linagora_sys_colors.dart';
import 'package:matrix/matrix.dart' hide Visibility;

class SendingImageInfoWidget extends StatefulWidget {
Expand Down Expand Up @@ -68,44 +69,55 @@ class _SendingImageInfoWidgetState extends State<SendingImageInfoWidget>

@override
Widget build(BuildContext context) {
final sysColor = LinagoraSysColors.material();
if (widget.event.status == EventStatus.sent ||
widget.event.status == EventStatus.synced) {
sendingFileProgressNotifier.value = 1;
}

return Hero(
tag: widget.event.eventId,
child: ValueListenableBuilder<double>(
key: ValueKey(widget.event.eventId),
valueListenable: sendingFileProgressNotifier,
builder: (context, value, child) {
child: _SendingImageInfoOverlay(
sendingFileProgressNotifier: sendingFileProgressNotifier,
uploadFileStateNotifier: uploadFileStateNotifier,
builder: (progress, uploadState, child) {
final hasError = uploadState is UploadFileFailedUIState;
return Stack(
alignment: Alignment.center,
children: [
child!,
if (sendingFileProgressNotifier.value != 1) ...[
CircularProgressIndicator(
strokeWidth: 2,
color: LinagoraRefColors.material().primary[100],
),
ValueListenableBuilder(
valueListenable: uploadFileStateNotifier,
builder: (context, state, child) {
if (state is UploadFileSuccessUIState) {
return child!;
}
return InkWell(
child: Icon(
Icons.close,
color: LinagoraRefColors.material().primary[100],
),
onTap: () {
uploadManager.cancelUpload(widget.event);
},
);
},
child: const SizedBox.shrink(),
),
if (progress != 1) ...[
if (!hasError)
CircularProgressIndicator(
strokeWidth: 2,
color: LinagoraRefColors.material().primary[100],
),
if (hasError)
IconButton(
onPressed: () {
uploadManager.retryUpload(widget.event.eventId);
},
icon: Icon(
Icons.refresh,
color: sysColor.primary,
size: 24,
),
padding: const EdgeInsets.all(4),
style: IconButton.styleFrom(
backgroundColor: sysColor.onPrimary,
shape: const CircleBorder(),
),
)
else if (uploadState is! UploadFileSuccessUIState)
InkWell(
child: Icon(
Icons.close,
color: LinagoraRefColors.material().primary[100],
),
onTap: () {
uploadManager.cancelUpload(widget.event);
},
),
],
],
);
Expand Down Expand Up @@ -167,3 +179,37 @@ class _SendingImageInfoWidgetState extends State<SendingImageInfoWidget>
);
}
}

class _SendingImageInfoOverlay extends StatelessWidget {
const _SendingImageInfoOverlay({
required this.sendingFileProgressNotifier,
required this.uploadFileStateNotifier,
required this.builder,
required this.child,
});

final ValueNotifier<double> sendingFileProgressNotifier;
final ValueNotifier<UploadFileUIState> uploadFileStateNotifier;
final Widget Function(
double progress,
UploadFileUIState uploadState,
Widget? child,
) builder;
final Widget? child;

@override
Widget build(BuildContext context) {
return ValueListenableBuilder(
valueListenable: sendingFileProgressNotifier,
builder: (context, progress, child) {
return ValueListenableBuilder(
valueListenable: uploadFileStateNotifier,
builder: (context, uploadState, child) {
return builder(progress, uploadState, child);
},
child: this.child,
);
},
);
}
}
3 changes: 3 additions & 0 deletions lib/pages/chat/events/message/message.dart
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@ class Message extends StatefulWidget {
final void Function(BuildContext context, Event, TapDownDetails, double)?
onTapMoreButton;
final Future<Category?>? recentEmojiFuture;
final Future<void> Function(Event)? onRetryTextMessage;

const Message(
this.event, {
Expand Down Expand Up @@ -140,6 +141,7 @@ class Message extends StatefulWidget {
this.onSaveToGallery,
this.onTapMoreButton,
this.recentEmojiFuture,
this.onRetryTextMessage,
});

/// Indicates wheither the user may use a mouse instead
Expand Down Expand Up @@ -293,6 +295,7 @@ class _MessageState extends State<Message>
saveToGallery: widget.onSaveToGallery,
onTapMoreButton: widget.onTapMoreButton,
recentEmojiFuture: widget.recentEmojiFuture,
onRetryTextMessage: widget.onRetryTextMessage,
),
),
];
Expand Down
8 changes: 8 additions & 0 deletions lib/pages/chat/events/message/message_content_builder.dart
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ class MessageContentBuilder extends StatelessWidget
final void Function(Event)? onSelect;
final Event? nextEvent;
final bool selectMode;
final Future<void> Function(Event)? onRetryTextMessage;

const MessageContentBuilder({
super.key,
Expand All @@ -29,6 +30,7 @@ class MessageContentBuilder extends StatelessWidget
this.nextEvent,
this.scrollToEventId,
this.selectMode = true,
this.onRetryTextMessage,
});

@override
Expand Down Expand Up @@ -59,6 +61,8 @@ class MessageContentBuilder extends StatelessWidget
);
final stepWidth = sizeMessageBubble?.totalMessageWidth;
final isNeedAddNewLine = sizeMessageBubble?.isNeedAddNewLine ?? false;
final isTextMessageError =
event.status.isError && event.messageType == MessageTypes.Text;

return OptionalPadding(
padding: const EdgeInsets.only(bottom: 8),
Expand Down Expand Up @@ -94,6 +98,7 @@ class MessageContentBuilder extends StatelessWidget
showSeenIcon: event.isOwnMessage,
timeline: timeline,
room: event.room,
onRetryTextMessage: onRetryTextMessage,
),
),
onTapSelectMode: () => selectMode
Expand All @@ -119,6 +124,7 @@ class MessageContentBuilder extends StatelessWidget
showSeenIcon: event.isOwnMessage,
timeline: timeline,
room: event.room,
onRetryTextMessage: onRetryTextMessage,
),
),
),
Expand All @@ -127,6 +133,7 @@ class MessageContentBuilder extends StatelessWidget
],
),
if (isNeedAddNewLine ||
isTextMessageError ||
isContainsTagName(event) ||
isContainsSpecialHTMLTag(event))
OptionalSelectionContainerDisabled(
Expand All @@ -145,6 +152,7 @@ class MessageContentBuilder extends StatelessWidget
showSeenIcon: event.isOwnMessage,
timeline: timeline,
room: event.room,
onRetryTextMessage: onRetryTextMessage,
),
),
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ class MessageContentWithTimestampBuilder extends StatefulWidget {
final void Function(BuildContext context, Event, TapDownDetails, double)?
onTapMoreButton;
final Future<Category?>? recentEmojiFuture;
final Future<void> Function(Event)? onRetryTextMessage;

const MessageContentWithTimestampBuilder({
super.key,
Expand Down Expand Up @@ -104,6 +105,7 @@ class MessageContentWithTimestampBuilder extends StatefulWidget {
this.saveToGallery,
this.onTapMoreButton,
this.recentEmojiFuture,
this.onRetryTextMessage,
});

@override
Expand Down Expand Up @@ -683,22 +685,22 @@ class _MessageContentWithTimestampBuilderState
nextEvent: widget.nextEvent,
scrollToEventId: widget.scrollToEventId,
selectMode: widget.selectMode,
onRetryTextMessage: widget.onRetryTextMessage,
),
Positioned(
child: OptionalSelectionContainerDisabled(
isEnabled: PlatformInfos.isWeb,
child: Padding(
padding: MessageStyle.paddingMessageTime,
child: Text.rich(
WidgetSpan(
child: MessageTime(
timelineOverlayMessage:
widget.event.timelineOverlayMessage,
room: widget.event.room,
event: widget.event,
showSeenIcon: widget.event.isOwnMessage,
timeline: widget.timeline,
),
OptionalSelectionContainerDisabled(
isEnabled: PlatformInfos.isWeb,
child: Padding(
padding: MessageStyle.paddingMessageTime,
child: Text.rich(
WidgetSpan(
child: MessageTime(
timelineOverlayMessage:
widget.event.timelineOverlayMessage,
room: widget.event.room,
event: widget.event,
showSeenIcon: widget.event.isOwnMessage,
timeline: widget.timeline,
onRetryTextMessage: widget.onRetryTextMessage,
),
),
),
Expand Down
7 changes: 7 additions & 0 deletions lib/pages/chat/events/message_content.dart
Original file line number Diff line number Diff line change
Expand Up @@ -448,6 +448,13 @@ class _MessageVideoBuilder extends StatelessWidget {
height: displayImageInfo.size.height,
);
}
if (event.status == EventStatus.error) {
return MessageVideoUploadContentWeb(
event: event,
width: displayImageInfo.size.width,
height: displayImageInfo.size.height,
);
}
return MessageVideoDownloadContent(
event: event,
width: displayImageInfo.size.width,
Expand Down
7 changes: 7 additions & 0 deletions lib/pages/chat/events/message_time.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'package:fluffychat/pages/chat/events/message/message_style.dart';
import 'package:fluffychat/pages/chat/events/message_time_style.dart';
import 'package:fluffychat/pages/chat/events/text_message_retry_button.dart';
import 'package:fluffychat/pages/chat/seen_by_row.dart';
import 'package:fluffychat/utils/matrix_sdk_extensions/event_extension.dart';
import 'package:fluffychat/widgets/twake_components/twake_icon_button.dart';
Expand All @@ -19,13 +20,15 @@ class MessageTime extends StatelessWidget {
required this.timeline,
required this.timelineOverlayMessage,
required this.room,
this.onRetryTextMessage,
});

final Event event;
final bool showSeenIcon;
final bool timelineOverlayMessage;
final Timeline timeline;
final Room room;
final Future<void> Function(Event)? onRetryTextMessage;

@override
Widget build(BuildContext context) {
Expand Down Expand Up @@ -88,6 +91,10 @@ class MessageTime extends StatelessWidget {
),
),
),
TextMessageRetryButton(
event: event,
onRetry: onRetryTextMessage,
),
if (showSeenIcon) ...[
SizedBox(width: MessageTimeStyle.paddingTimeAndIcon),
SeenByRow(
Expand Down
Loading