Skip to content

Commit a42c738

Browse files
committed
refactor(ui): rewrote message actions and modals
1 parent d16844a commit a42c738

File tree

79 files changed

+3753
-3023
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

79 files changed

+3753
-3023
lines changed

packages/stream_chat_flutter/lib/src/bottom_sheets/edit_message_sheet.dart

+31
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,37 @@
11
import 'package:flutter/material.dart';
22
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
33

4+
/// {@template showEditMessageSheet}
5+
/// Displays an interactive modal bottom sheet to edit a message.
6+
/// {@endtemplate}
7+
Future<T?> showEditMessageSheet<T extends Object?>({
8+
required BuildContext context,
9+
required Message message,
10+
required Channel channel,
11+
EditMessageInputBuilder? editMessageInputBuilder,
12+
}) {
13+
final messageInputTheme = StreamMessageInputTheme.of(context);
14+
15+
return showModalBottomSheet<T>(
16+
context: context,
17+
elevation: 2,
18+
isScrollControlled: true,
19+
clipBehavior: Clip.antiAlias,
20+
backgroundColor: messageInputTheme.inputBackgroundColor,
21+
shape: const RoundedRectangleBorder(
22+
borderRadius: BorderRadius.only(
23+
topLeft: Radius.circular(16),
24+
topRight: Radius.circular(16),
25+
),
26+
),
27+
builder: (context) => EditMessageSheet(
28+
channel: channel,
29+
message: message,
30+
editMessageInputBuilder: editMessageInputBuilder,
31+
),
32+
);
33+
}
34+
435
/// {@template editMessageSheet}
536
/// Allows a user to edit the selected message.
637
/// {@endtemplate}

packages/stream_chat_flutter/lib/src/context_menu_items/context_menu_reaction_picker.dart

-168
This file was deleted.

packages/stream_chat_flutter/lib/src/context_menu_items/download_menu_item.dart

-32
This file was deleted.

packages/stream_chat_flutter/lib/src/context_menu_items/stream_chat_context_menu_item.dart

-51
This file was deleted.

packages/stream_chat_flutter/lib/src/fullscreen_media/full_screen_media_desktop.dart

+46-8
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ import 'package:flutter/material.dart';
33
import 'package:media_kit/media_kit.dart';
44
import 'package:media_kit_video/media_kit_video.dart';
55
import 'package:photo_view/photo_view.dart';
6-
import 'package:stream_chat_flutter/src/context_menu_items/download_menu_item.dart';
76
import 'package:stream_chat_flutter/src/fullscreen_media/full_screen_media_widget.dart';
87
import 'package:stream_chat_flutter/src/fullscreen_media/gallery_navigation_item.dart';
8+
import 'package:stream_chat_flutter/src/message_action/message_action_item.dart';
99
import 'package:stream_chat_flutter/src/misc/empty_widget.dart';
1010
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
1111

@@ -123,12 +123,11 @@ class _FullScreenMediaDesktopState extends State<FullScreenMediaDesktop> {
123123
children: [
124124
ContextMenuArea(
125125
verticalPadding: 0,
126-
builder: (_) => [
127-
DownloadMenuItem(
128-
attachment:
129-
widget.mediaAttachmentPackages[_currentPage.value].attachment,
130-
),
131-
],
126+
builder: (context) {
127+
final index = _currentPage.value;
128+
final mediaAttachment = widget.mediaAttachmentPackages[index];
129+
return [DownloadMenuItem(mediaAttachment: mediaAttachment)];
130+
},
132131
child: _PlaylistPlayer(
133132
packages: videoPackages.values.toList(),
134133
autoStart: widget.autoplayVideos,
@@ -360,7 +359,7 @@ class _FullScreenMediaDesktopState extends State<FullScreenMediaDesktop> {
360359
verticalPadding: 0,
361360
builder: (_) => [
362361
DownloadMenuItem(
363-
attachment: attachment,
362+
mediaAttachment: currentAttachmentPackage,
364363
),
365364
],
366365
child: Video(
@@ -384,6 +383,45 @@ class _FullScreenMediaDesktopState extends State<FullScreenMediaDesktop> {
384383
}
385384
}
386385

386+
/// {@template streamDownloadMenuItem}
387+
/// A context menu item for downloading an attachment from a message.
388+
///
389+
/// This widget displays a download option in a context menu, allowing users to
390+
/// download the attachment associated with a message.
391+
///
392+
/// It uses [StreamMessageActionItem] and [StreamMessageAction] to create a
393+
/// consistent UI with other message actions.
394+
/// {@endtemplate}
395+
class DownloadMenuItem extends StatelessWidget {
396+
/// {@macro streamDownloadMenuItem}
397+
const DownloadMenuItem({
398+
super.key,
399+
required this.mediaAttachment,
400+
});
401+
402+
/// The attachment package containing the message and attachment to download.
403+
final StreamAttachmentPackage mediaAttachment;
404+
405+
@override
406+
Widget build(BuildContext context) {
407+
return StreamMessageActionItem(
408+
message: mediaAttachment.message,
409+
action: StreamMessageAction(
410+
leading: const StreamSvgIcon(icon: StreamSvgIcons.download),
411+
title: Text(context.translations.downloadLabel),
412+
onTap: (_) async {
413+
final popped = await Navigator.of(context).maybePop();
414+
if (popped) {
415+
StreamAttachmentHandler.instance.downloadAttachment(
416+
mediaAttachment.attachment,
417+
);
418+
}
419+
},
420+
),
421+
);
422+
}
423+
}
424+
387425
/// Class for packaging up things required for videos
388426
class DesktopVideoPackage {
389427
/// Constructor for creating [VideoPackage]

0 commit comments

Comments
 (0)