@@ -3,9 +3,9 @@ import 'package:flutter/material.dart';
3
3
import 'package:media_kit/media_kit.dart' ;
4
4
import 'package:media_kit_video/media_kit_video.dart' ;
5
5
import 'package:photo_view/photo_view.dart' ;
6
- import 'package:stream_chat_flutter/src/context_menu_items/download_menu_item.dart' ;
7
6
import 'package:stream_chat_flutter/src/fullscreen_media/full_screen_media_widget.dart' ;
8
7
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' ;
9
9
import 'package:stream_chat_flutter/src/misc/empty_widget.dart' ;
10
10
import 'package:stream_chat_flutter/stream_chat_flutter.dart' ;
11
11
@@ -123,12 +123,11 @@ class _FullScreenMediaDesktopState extends State<FullScreenMediaDesktop> {
123
123
children: [
124
124
ContextMenuArea (
125
125
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
+ },
132
131
child: _PlaylistPlayer (
133
132
packages: videoPackages.values.toList (),
134
133
autoStart: widget.autoplayVideos,
@@ -360,7 +359,7 @@ class _FullScreenMediaDesktopState extends State<FullScreenMediaDesktop> {
360
359
verticalPadding: 0 ,
361
360
builder: (_) => [
362
361
DownloadMenuItem (
363
- attachment : attachment ,
362
+ mediaAttachment : currentAttachmentPackage ,
364
363
),
365
364
],
366
365
child: Video (
@@ -384,6 +383,45 @@ class _FullScreenMediaDesktopState extends State<FullScreenMediaDesktop> {
384
383
}
385
384
}
386
385
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
+
387
425
/// Class for packaging up things required for videos
388
426
class DesktopVideoPackage {
389
427
/// Constructor for creating [VideoPackage]
0 commit comments