♻️ Improve the attachment item gesture
This commit is contained in:
		| @@ -25,6 +25,7 @@ class AttachmentItem extends StatelessWidget { | ||||
|   final String? heroTag; | ||||
|   final BoxFit fit; | ||||
|   final FilterQuality? filterQuality; | ||||
|   final Function? onZoom; | ||||
|  | ||||
|   const AttachmentItem({ | ||||
|     super.key, | ||||
| @@ -32,6 +33,7 @@ class AttachmentItem extends StatelessWidget { | ||||
|     required this.data, | ||||
|     required this.heroTag, | ||||
|     this.filterQuality, | ||||
|     this.onZoom, | ||||
|   }); | ||||
|  | ||||
|   Widget _buildContent(BuildContext context) { | ||||
| @@ -94,7 +96,14 @@ class AttachmentItem extends StatelessWidget { | ||||
|       }); | ||||
|     } | ||||
|  | ||||
|     return _buildContent(context); | ||||
|     return GestureDetector( | ||||
|       child: _buildContent(context), | ||||
|       onTap: () { | ||||
|         if (data?.mimetype.startsWith('image') ?? false) { | ||||
|           onZoom?.call(); | ||||
|         } | ||||
|       }, | ||||
|     ); | ||||
|   } | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -74,40 +74,35 @@ class _AttachmentListState extends State<AttachmentList> { | ||||
|           return Container( | ||||
|             padding: widget.padding ?? EdgeInsets.zero, | ||||
|             constraints: constraints, | ||||
|             child: GestureDetector( | ||||
|               child: AspectRatio( | ||||
|                 aspectRatio: singleAspectRatio, | ||||
|                 child: Container( | ||||
|                   decoration: BoxDecoration( | ||||
|                     color: backgroundColor, | ||||
|                     border: Border.fromBorderSide(borderSide), | ||||
|                     borderRadius: AttachmentList.kDefaultRadius, | ||||
|                   ), | ||||
|                   child: ClipRRect( | ||||
|                     borderRadius: AttachmentList.kDefaultRadius, | ||||
|                     child: AttachmentItem( | ||||
|                       data: widget.data[0], | ||||
|                       heroTag: heroTags[0], | ||||
|                       fit: widget.fit, | ||||
|                       filterQuality: widget.filterQuality, | ||||
|                     ), | ||||
|             child: AspectRatio( | ||||
|               aspectRatio: singleAspectRatio, | ||||
|               child: Container( | ||||
|                 decoration: BoxDecoration( | ||||
|                   color: backgroundColor, | ||||
|                   border: Border.fromBorderSide(borderSide), | ||||
|                   borderRadius: AttachmentList.kDefaultRadius, | ||||
|                 ), | ||||
|                 child: ClipRRect( | ||||
|                   borderRadius: AttachmentList.kDefaultRadius, | ||||
|                   child: AttachmentItem( | ||||
|                     data: widget.data[0], | ||||
|                     heroTag: heroTags[0], | ||||
|                     fit: widget.fit, | ||||
|                     filterQuality: widget.filterQuality, | ||||
|                     onZoom: () { | ||||
|                       context.pushTransparentRoute( | ||||
|                         AttachmentZoomView( | ||||
|                           data: widget.data.where((ele) => ele != null).cast(), | ||||
|                           initialIndex: 0, | ||||
|                           heroTags: heroTags, | ||||
|                         ), | ||||
|                         backgroundColor: Colors.black.withOpacity(0.7), | ||||
|                         rootNavigator: true, | ||||
|                       ); | ||||
|                     }, | ||||
|                   ), | ||||
|                 ), | ||||
|               ), | ||||
|               onTap: () { | ||||
|                 if (widget.data.firstOrNull?.mediaType != SnMediaType.image) { | ||||
|                   return; | ||||
|                 } | ||||
|                 context.pushTransparentRoute( | ||||
|                   AttachmentZoomView( | ||||
|                     data: widget.data.where((ele) => ele != null).cast(), | ||||
|                     initialIndex: 0, | ||||
|                     heroTags: heroTags, | ||||
|                   ), | ||||
|                   backgroundColor: Colors.black.withOpacity(0.7), | ||||
|                   rootNavigator: true, | ||||
|                 ); | ||||
|               }, | ||||
|             ), | ||||
|           ); | ||||
|         } | ||||
| @@ -133,33 +128,27 @@ class _AttachmentListState extends State<AttachmentList> { | ||||
|                 mainAxisSpacing: 4, | ||||
|                 children: widget.data | ||||
|                     .mapIndexed( | ||||
|                       (idx, ele) => GestureDetector( | ||||
|                         child: Container( | ||||
|                           constraints: constraints, | ||||
|                           child: AttachmentItem( | ||||
|                             data: ele, | ||||
|                             heroTag: heroTags[idx], | ||||
|                             fit: BoxFit.cover, | ||||
|                             filterQuality: widget.filterQuality, | ||||
|                           ), | ||||
|                       (idx, ele) => Container( | ||||
|                         constraints: constraints, | ||||
|                         child: AttachmentItem( | ||||
|                           data: ele, | ||||
|                           heroTag: heroTags[idx], | ||||
|                           fit: BoxFit.cover, | ||||
|                           filterQuality: widget.filterQuality, | ||||
|                           onZoom: () { | ||||
|                             context.pushTransparentRoute( | ||||
|                               AttachmentZoomView( | ||||
|                                 data: widget.data | ||||
|                                     .where((ele) => ele != null) | ||||
|                                     .cast(), | ||||
|                                 initialIndex: idx, | ||||
|                                 heroTags: heroTags, | ||||
|                               ), | ||||
|                               backgroundColor: Colors.black.withOpacity(0.7), | ||||
|                               rootNavigator: true, | ||||
|                             ); | ||||
|                           }, | ||||
|                         ), | ||||
|                         onTap: () { | ||||
|                           if (widget.data[idx]!.mediaType != | ||||
|                               SnMediaType.image) { | ||||
|                             return; | ||||
|                           } | ||||
|                           context.pushTransparentRoute( | ||||
|                             AttachmentZoomView( | ||||
|                               data: widget.data | ||||
|                                   .where((ele) => ele != null) | ||||
|                                   .cast(), | ||||
|                               initialIndex: idx, | ||||
|                               heroTags: heroTags, | ||||
|                             ), | ||||
|                             backgroundColor: Colors.black.withOpacity(0.7), | ||||
|                             rootNavigator: true, | ||||
|                           ); | ||||
|                         }, | ||||
|                       ), | ||||
|                     ) | ||||
|                     .toList(), | ||||
|   | ||||
		Reference in New Issue
	
	Block a user