🐛 Fix attachments can't be zoom
This commit is contained in:
		| @@ -249,8 +249,11 @@ class SnNetworkProvider { | |||||||
|     return null; |     return null; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   String getAttachmentUrl(String ky) { |   String getAttachmentUrl(String ky, {bool preview = true}) { | ||||||
|     if (ky.startsWith("http")) return ky; |     if (ky.startsWith("http")) return ky; | ||||||
|  |     if (!preview) { | ||||||
|  |       return '${client.options.baseUrl}/cgi/uc/attachments/$ky?preview=false'; | ||||||
|  |     } | ||||||
|     return '${client.options.baseUrl}/cgi/uc/attachments/$ky'; |     return '${client.options.baseUrl}/cgi/uc/attachments/$ky'; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -22,6 +22,7 @@ abstract class SnAccount with _$SnAccount { | |||||||
|     required String language, |     required String language, | ||||||
|     required SnAccountProfile? profile, |     required SnAccountProfile? profile, | ||||||
|     @Default([]) List<SnAccountBadge> badges, |     @Default([]) List<SnAccountBadge> badges, | ||||||
|  |     @Default([]) List<SnPunishment> punishments, | ||||||
|     required DateTime? suspendedAt, |     required DateTime? suspendedAt, | ||||||
|     required int? affiliatedId, |     required int? affiliatedId, | ||||||
|     required int? affiliatedTo, |     required int? affiliatedTo, | ||||||
|   | |||||||
| @@ -29,6 +29,7 @@ mixin _$SnAccount { | |||||||
|   String get language; |   String get language; | ||||||
|   SnAccountProfile? get profile; |   SnAccountProfile? get profile; | ||||||
|   List<SnAccountBadge> get badges; |   List<SnAccountBadge> get badges; | ||||||
|  |   List<SnPunishment> get punishments; | ||||||
|   DateTime? get suspendedAt; |   DateTime? get suspendedAt; | ||||||
|   int? get affiliatedId; |   int? get affiliatedId; | ||||||
|   int? get affiliatedTo; |   int? get affiliatedTo; | ||||||
| @@ -69,6 +70,8 @@ mixin _$SnAccount { | |||||||
|                 other.language == language) && |                 other.language == language) && | ||||||
|             (identical(other.profile, profile) || other.profile == profile) && |             (identical(other.profile, profile) || other.profile == profile) && | ||||||
|             const DeepCollectionEquality().equals(other.badges, badges) && |             const DeepCollectionEquality().equals(other.badges, badges) && | ||||||
|  |             const DeepCollectionEquality() | ||||||
|  |                 .equals(other.punishments, punishments) && | ||||||
|             (identical(other.suspendedAt, suspendedAt) || |             (identical(other.suspendedAt, suspendedAt) || | ||||||
|                 other.suspendedAt == suspendedAt) && |                 other.suspendedAt == suspendedAt) && | ||||||
|             (identical(other.affiliatedId, affiliatedId) || |             (identical(other.affiliatedId, affiliatedId) || | ||||||
| @@ -99,6 +102,7 @@ mixin _$SnAccount { | |||||||
|         language, |         language, | ||||||
|         profile, |         profile, | ||||||
|         const DeepCollectionEquality().hash(badges), |         const DeepCollectionEquality().hash(badges), | ||||||
|  |         const DeepCollectionEquality().hash(punishments), | ||||||
|         suspendedAt, |         suspendedAt, | ||||||
|         affiliatedId, |         affiliatedId, | ||||||
|         affiliatedTo, |         affiliatedTo, | ||||||
| @@ -108,7 +112,7 @@ mixin _$SnAccount { | |||||||
|  |  | ||||||
|   @override |   @override | ||||||
|   String toString() { |   String toString() { | ||||||
|     return 'SnAccount(id: $id, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt, confirmedAt: $confirmedAt, contacts: $contacts, avatar: $avatar, banner: $banner, name: $name, nick: $nick, permNodes: $permNodes, language: $language, profile: $profile, badges: $badges, suspendedAt: $suspendedAt, affiliatedId: $affiliatedId, affiliatedTo: $affiliatedTo, automatedBy: $automatedBy, automatedId: $automatedId)'; |     return 'SnAccount(id: $id, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt, confirmedAt: $confirmedAt, contacts: $contacts, avatar: $avatar, banner: $banner, name: $name, nick: $nick, permNodes: $permNodes, language: $language, profile: $profile, badges: $badges, punishments: $punishments, suspendedAt: $suspendedAt, affiliatedId: $affiliatedId, affiliatedTo: $affiliatedTo, automatedBy: $automatedBy, automatedId: $automatedId)'; | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -132,6 +136,7 @@ abstract mixin class $SnAccountCopyWith<$Res> { | |||||||
|       String language, |       String language, | ||||||
|       SnAccountProfile? profile, |       SnAccountProfile? profile, | ||||||
|       List<SnAccountBadge> badges, |       List<SnAccountBadge> badges, | ||||||
|  |       List<SnPunishment> punishments, | ||||||
|       DateTime? suspendedAt, |       DateTime? suspendedAt, | ||||||
|       int? affiliatedId, |       int? affiliatedId, | ||||||
|       int? affiliatedTo, |       int? affiliatedTo, | ||||||
| @@ -167,6 +172,7 @@ class _$SnAccountCopyWithImpl<$Res> implements $SnAccountCopyWith<$Res> { | |||||||
|     Object? language = null, |     Object? language = null, | ||||||
|     Object? profile = freezed, |     Object? profile = freezed, | ||||||
|     Object? badges = null, |     Object? badges = null, | ||||||
|  |     Object? punishments = null, | ||||||
|     Object? suspendedAt = freezed, |     Object? suspendedAt = freezed, | ||||||
|     Object? affiliatedId = freezed, |     Object? affiliatedId = freezed, | ||||||
|     Object? affiliatedTo = freezed, |     Object? affiliatedTo = freezed, | ||||||
| @@ -230,6 +236,10 @@ class _$SnAccountCopyWithImpl<$Res> implements $SnAccountCopyWith<$Res> { | |||||||
|           ? _self.badges |           ? _self.badges | ||||||
|           : badges // ignore: cast_nullable_to_non_nullable |           : badges // ignore: cast_nullable_to_non_nullable | ||||||
|               as List<SnAccountBadge>, |               as List<SnAccountBadge>, | ||||||
|  |       punishments: null == punishments | ||||||
|  |           ? _self.punishments | ||||||
|  |           : punishments // ignore: cast_nullable_to_non_nullable | ||||||
|  |               as List<SnPunishment>, | ||||||
|       suspendedAt: freezed == suspendedAt |       suspendedAt: freezed == suspendedAt | ||||||
|           ? _self.suspendedAt |           ? _self.suspendedAt | ||||||
|           : suspendedAt // ignore: cast_nullable_to_non_nullable |           : suspendedAt // ignore: cast_nullable_to_non_nullable | ||||||
| @@ -286,6 +296,7 @@ class _SnAccount extends SnAccount { | |||||||
|       required this.language, |       required this.language, | ||||||
|       required this.profile, |       required this.profile, | ||||||
|       final List<SnAccountBadge> badges = const [], |       final List<SnAccountBadge> badges = const [], | ||||||
|  |       final List<SnPunishment> punishments = const [], | ||||||
|       required this.suspendedAt, |       required this.suspendedAt, | ||||||
|       required this.affiliatedId, |       required this.affiliatedId, | ||||||
|       required this.affiliatedTo, |       required this.affiliatedTo, | ||||||
| @@ -294,6 +305,7 @@ class _SnAccount extends SnAccount { | |||||||
|       : _contacts = contacts, |       : _contacts = contacts, | ||||||
|         _permNodes = permNodes, |         _permNodes = permNodes, | ||||||
|         _badges = badges, |         _badges = badges, | ||||||
|  |         _punishments = punishments, | ||||||
|         super._(); |         super._(); | ||||||
|   factory _SnAccount.fromJson(Map<String, dynamic> json) => |   factory _SnAccount.fromJson(Map<String, dynamic> json) => | ||||||
|       _$SnAccountFromJson(json); |       _$SnAccountFromJson(json); | ||||||
| @@ -350,6 +362,15 @@ class _SnAccount extends SnAccount { | |||||||
|     return EqualUnmodifiableListView(_badges); |     return EqualUnmodifiableListView(_badges); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   final List<SnPunishment> _punishments; | ||||||
|  |   @override | ||||||
|  |   @JsonKey() | ||||||
|  |   List<SnPunishment> get punishments { | ||||||
|  |     if (_punishments is EqualUnmodifiableListView) return _punishments; | ||||||
|  |     // ignore: implicit_dynamic_type | ||||||
|  |     return EqualUnmodifiableListView(_punishments); | ||||||
|  |   } | ||||||
|  |  | ||||||
|   @override |   @override | ||||||
|   final DateTime? suspendedAt; |   final DateTime? suspendedAt; | ||||||
|   @override |   @override | ||||||
| @@ -401,6 +422,8 @@ class _SnAccount extends SnAccount { | |||||||
|                 other.language == language) && |                 other.language == language) && | ||||||
|             (identical(other.profile, profile) || other.profile == profile) && |             (identical(other.profile, profile) || other.profile == profile) && | ||||||
|             const DeepCollectionEquality().equals(other._badges, _badges) && |             const DeepCollectionEquality().equals(other._badges, _badges) && | ||||||
|  |             const DeepCollectionEquality() | ||||||
|  |                 .equals(other._punishments, _punishments) && | ||||||
|             (identical(other.suspendedAt, suspendedAt) || |             (identical(other.suspendedAt, suspendedAt) || | ||||||
|                 other.suspendedAt == suspendedAt) && |                 other.suspendedAt == suspendedAt) && | ||||||
|             (identical(other.affiliatedId, affiliatedId) || |             (identical(other.affiliatedId, affiliatedId) || | ||||||
| @@ -431,6 +454,7 @@ class _SnAccount extends SnAccount { | |||||||
|         language, |         language, | ||||||
|         profile, |         profile, | ||||||
|         const DeepCollectionEquality().hash(_badges), |         const DeepCollectionEquality().hash(_badges), | ||||||
|  |         const DeepCollectionEquality().hash(_punishments), | ||||||
|         suspendedAt, |         suspendedAt, | ||||||
|         affiliatedId, |         affiliatedId, | ||||||
|         affiliatedTo, |         affiliatedTo, | ||||||
| @@ -440,7 +464,7 @@ class _SnAccount extends SnAccount { | |||||||
|  |  | ||||||
|   @override |   @override | ||||||
|   String toString() { |   String toString() { | ||||||
|     return 'SnAccount(id: $id, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt, confirmedAt: $confirmedAt, contacts: $contacts, avatar: $avatar, banner: $banner, name: $name, nick: $nick, permNodes: $permNodes, language: $language, profile: $profile, badges: $badges, suspendedAt: $suspendedAt, affiliatedId: $affiliatedId, affiliatedTo: $affiliatedTo, automatedBy: $automatedBy, automatedId: $automatedId)'; |     return 'SnAccount(id: $id, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt, confirmedAt: $confirmedAt, contacts: $contacts, avatar: $avatar, banner: $banner, name: $name, nick: $nick, permNodes: $permNodes, language: $language, profile: $profile, badges: $badges, punishments: $punishments, suspendedAt: $suspendedAt, affiliatedId: $affiliatedId, affiliatedTo: $affiliatedTo, automatedBy: $automatedBy, automatedId: $automatedId)'; | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -467,6 +491,7 @@ abstract mixin class _$SnAccountCopyWith<$Res> | |||||||
|       String language, |       String language, | ||||||
|       SnAccountProfile? profile, |       SnAccountProfile? profile, | ||||||
|       List<SnAccountBadge> badges, |       List<SnAccountBadge> badges, | ||||||
|  |       List<SnPunishment> punishments, | ||||||
|       DateTime? suspendedAt, |       DateTime? suspendedAt, | ||||||
|       int? affiliatedId, |       int? affiliatedId, | ||||||
|       int? affiliatedTo, |       int? affiliatedTo, | ||||||
| @@ -503,6 +528,7 @@ class __$SnAccountCopyWithImpl<$Res> implements _$SnAccountCopyWith<$Res> { | |||||||
|     Object? language = null, |     Object? language = null, | ||||||
|     Object? profile = freezed, |     Object? profile = freezed, | ||||||
|     Object? badges = null, |     Object? badges = null, | ||||||
|  |     Object? punishments = null, | ||||||
|     Object? suspendedAt = freezed, |     Object? suspendedAt = freezed, | ||||||
|     Object? affiliatedId = freezed, |     Object? affiliatedId = freezed, | ||||||
|     Object? affiliatedTo = freezed, |     Object? affiliatedTo = freezed, | ||||||
| @@ -566,6 +592,10 @@ class __$SnAccountCopyWithImpl<$Res> implements _$SnAccountCopyWith<$Res> { | |||||||
|           ? _self._badges |           ? _self._badges | ||||||
|           : badges // ignore: cast_nullable_to_non_nullable |           : badges // ignore: cast_nullable_to_non_nullable | ||||||
|               as List<SnAccountBadge>, |               as List<SnAccountBadge>, | ||||||
|  |       punishments: null == punishments | ||||||
|  |           ? _self._punishments | ||||||
|  |           : punishments // ignore: cast_nullable_to_non_nullable | ||||||
|  |               as List<SnPunishment>, | ||||||
|       suspendedAt: freezed == suspendedAt |       suspendedAt: freezed == suspendedAt | ||||||
|           ? _self.suspendedAt |           ? _self.suspendedAt | ||||||
|           : suspendedAt // ignore: cast_nullable_to_non_nullable |           : suspendedAt // ignore: cast_nullable_to_non_nullable | ||||||
|   | |||||||
| @@ -32,6 +32,10 @@ _SnAccount _$SnAccountFromJson(Map<String, dynamic> json) => _SnAccount( | |||||||
|               ?.map((e) => SnAccountBadge.fromJson(e as Map<String, dynamic>)) |               ?.map((e) => SnAccountBadge.fromJson(e as Map<String, dynamic>)) | ||||||
|               .toList() ?? |               .toList() ?? | ||||||
|           const [], |           const [], | ||||||
|  |       punishments: (json['punishments'] as List<dynamic>?) | ||||||
|  |               ?.map((e) => SnPunishment.fromJson(e as Map<String, dynamic>)) | ||||||
|  |               .toList() ?? | ||||||
|  |           const [], | ||||||
|       suspendedAt: json['suspended_at'] == null |       suspendedAt: json['suspended_at'] == null | ||||||
|           ? null |           ? null | ||||||
|           : DateTime.parse(json['suspended_at'] as String), |           : DateTime.parse(json['suspended_at'] as String), | ||||||
| @@ -57,6 +61,7 @@ Map<String, dynamic> _$SnAccountToJson(_SnAccount instance) => | |||||||
|       'language': instance.language, |       'language': instance.language, | ||||||
|       'profile': instance.profile?.toJson(), |       'profile': instance.profile?.toJson(), | ||||||
|       'badges': instance.badges.map((e) => e.toJson()).toList(), |       'badges': instance.badges.map((e) => e.toJson()).toList(), | ||||||
|  |       'punishments': instance.punishments.map((e) => e.toJson()).toList(), | ||||||
|       'suspended_at': instance.suspendedAt?.toIso8601String(), |       'suspended_at': instance.suspendedAt?.toIso8601String(), | ||||||
|       'affiliated_id': instance.affiliatedId, |       'affiliated_id': instance.affiliatedId, | ||||||
|       'affiliated_to': instance.affiliatedTo, |       'affiliated_to': instance.affiliatedTo, | ||||||
|   | |||||||
| @@ -22,12 +22,14 @@ class AccountPopoverCard extends StatelessWidget { | |||||||
|   Widget build(BuildContext context) { |   Widget build(BuildContext context) { | ||||||
|     final sn = context.read<SnNetworkProvider>(); |     final sn = context.read<SnNetworkProvider>(); | ||||||
|  |  | ||||||
|     return Column( |     return SingleChildScrollView( | ||||||
|  |       child: Column( | ||||||
|         crossAxisAlignment: CrossAxisAlignment.start, |         crossAxisAlignment: CrossAxisAlignment.start, | ||||||
|       mainAxisSize: MainAxisSize.min, |  | ||||||
|         children: [ |         children: [ | ||||||
|           if (data.banner.isNotEmpty) |           if (data.banner.isNotEmpty) | ||||||
|           Container( |             ClipRRect( | ||||||
|  |               borderRadius: BorderRadius.circular(16), | ||||||
|  |               child: Container( | ||||||
|                 color: Theme.of(context).colorScheme.surfaceContainer, |                 color: Theme.of(context).colorScheme.surfaceContainer, | ||||||
|                 child: AspectRatio( |                 child: AspectRatio( | ||||||
|                   aspectRatio: 16 / 7, |                   aspectRatio: 16 / 7, | ||||||
| @@ -37,8 +39,8 @@ class AccountPopoverCard extends StatelessWidget { | |||||||
|                   ), |                   ), | ||||||
|                 ), |                 ), | ||||||
|               ), |               ), | ||||||
|  |             ).padding(all: 16), | ||||||
|           // Top padding |           // Top padding | ||||||
|         Gap(16), |  | ||||||
|           Row( |           Row( | ||||||
|             crossAxisAlignment: CrossAxisAlignment.start, |             crossAxisAlignment: CrossAxisAlignment.start, | ||||||
|             children: [ |             children: [ | ||||||
| @@ -67,7 +69,8 @@ class AccountPopoverCard extends StatelessWidget { | |||||||
|                 }, |                 }, | ||||||
|                 icon: const Icon(Symbols.chevron_right), |                 icon: const Icon(Symbols.chevron_right), | ||||||
|                 padding: EdgeInsets.zero, |                 padding: EdgeInsets.zero, | ||||||
|               visualDensity: const VisualDensity(horizontal: -4, vertical: -4), |                 visualDensity: | ||||||
|  |                     const VisualDensity(horizontal: -4, vertical: -4), | ||||||
|               ), |               ), | ||||||
|               const Gap(8) |               const Gap(8) | ||||||
|             ], |             ], | ||||||
| @@ -104,7 +107,8 @@ class AccountPopoverCard extends StatelessWidget { | |||||||
|                 child: LinearProgressIndicator( |                 child: LinearProgressIndicator( | ||||||
|                   value: calcLevelUpProgress(data.profile?.experience ?? 0), |                   value: calcLevelUpProgress(data.profile?.experience ?? 0), | ||||||
|                   borderRadius: BorderRadius.circular(8), |                   borderRadius: BorderRadius.circular(8), | ||||||
|                 backgroundColor: Theme.of(context).colorScheme.surfaceContainer, |                   backgroundColor: | ||||||
|  |                       Theme.of(context).colorScheme.surfaceContainer, | ||||||
|                 ).alignment(Alignment.centerLeft), |                 ).alignment(Alignment.centerLeft), | ||||||
|               ), |               ), | ||||||
|             ], |             ], | ||||||
| @@ -156,8 +160,9 @@ class AccountPopoverCard extends StatelessWidget { | |||||||
|             }, |             }, | ||||||
|           ), |           ), | ||||||
|           // Bottom padding |           // Bottom padding | ||||||
|         const Gap(16), |           const Gap(64), | ||||||
|         ], |         ], | ||||||
|  |       ), | ||||||
|     ); |     ); | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -170,8 +170,7 @@ class _AttachmentListState extends State<AttachmentList> { | |||||||
|               child: Column( |               child: Column( | ||||||
|                 children: widget.data |                 children: widget.data | ||||||
|                     .mapIndexed( |                     .mapIndexed( | ||||||
|                       (idx, ele) => GestureDetector( |                       (idx, ele) => AspectRatio( | ||||||
|                         child: AspectRatio( |  | ||||||
|                         aspectRatio: ele?.data['ratio']?.toDouble() ?? 1, |                         aspectRatio: ele?.data['ratio']?.toDouble() ?? 1, | ||||||
|                         child: Container( |                         child: Container( | ||||||
|                           constraints: constraints, |                           constraints: constraints, | ||||||
| @@ -180,7 +179,21 @@ class _AttachmentListState extends State<AttachmentList> { | |||||||
|                             heroTag: heroTags[idx], |                             heroTag: heroTags[idx], | ||||||
|                             fit: BoxFit.cover, |                             fit: BoxFit.cover, | ||||||
|                             filterQuality: widget.filterQuality, |                             filterQuality: widget.filterQuality, | ||||||
|  |                             onZoom: () { | ||||||
|  |                               context.pushTransparentRoute( | ||||||
|  |                                 AttachmentZoomView( | ||||||
|  |                                   data: widget.data | ||||||
|  |                                       .where((ele) => | ||||||
|  |                                           ele != null && | ||||||
|  |                                           ele.mediaType == SnMediaType.image) | ||||||
|  |                                       .cast(), | ||||||
|  |                                   initialIndex: idx, | ||||||
|  |                                   heroTags: heroTags, | ||||||
|                                 ), |                                 ), | ||||||
|  |                                 backgroundColor: Colors.black.withOpacity(0.7), | ||||||
|  |                                 rootNavigator: true, | ||||||
|  |                               ); | ||||||
|  |                             }, | ||||||
|                           ), |                           ), | ||||||
|                         ), |                         ), | ||||||
|                       ), |                       ), | ||||||
| @@ -211,26 +224,6 @@ class _AttachmentListState extends State<AttachmentList> { | |||||||
|                     child: AspectRatio( |                     child: AspectRatio( | ||||||
|                       aspectRatio: |                       aspectRatio: | ||||||
|                           (widget.data[idx]?.data['ratio'] ?? 1).toDouble(), |                           (widget.data[idx]?.data['ratio'] ?? 1).toDouble(), | ||||||
|                       child: GestureDetector( |  | ||||||
|                         onTap: () { |  | ||||||
|                           if (widget.data[idx]?.mediaType != |  | ||||||
|                               SnMediaType.image) { |  | ||||||
|                             return; |  | ||||||
|                           } |  | ||||||
|                           context.pushTransparentRoute( |  | ||||||
|                             AttachmentZoomView( |  | ||||||
|                               data: widget.data |  | ||||||
|                                   .where((ele) => |  | ||||||
|                                       ele != null && |  | ||||||
|                                       ele.mediaType == SnMediaType.image) |  | ||||||
|                                   .cast(), |  | ||||||
|                               initialIndex: idx, |  | ||||||
|                               heroTags: heroTags, |  | ||||||
|                             ), |  | ||||||
|                             backgroundColor: Colors.black.withOpacity(0.7), |  | ||||||
|                             rootNavigator: true, |  | ||||||
|                           ); |  | ||||||
|                         }, |  | ||||||
|                       child: Stack( |                       child: Stack( | ||||||
|                         fit: StackFit.expand, |                         fit: StackFit.expand, | ||||||
|                         children: [ |                         children: [ | ||||||
| @@ -249,6 +242,23 @@ class _AttachmentListState extends State<AttachmentList> { | |||||||
|                                 data: widget.data[idx], |                                 data: widget.data[idx], | ||||||
|                                 heroTag: heroTags[idx], |                                 heroTag: heroTags[idx], | ||||||
|                                 filterQuality: widget.filterQuality, |                                 filterQuality: widget.filterQuality, | ||||||
|  |                                 onZoom: () { | ||||||
|  |                                   context.pushTransparentRoute( | ||||||
|  |                                     AttachmentZoomView( | ||||||
|  |                                       data: widget.data | ||||||
|  |                                           .where((ele) => | ||||||
|  |                                               ele != null && | ||||||
|  |                                               ele.mediaType == | ||||||
|  |                                                   SnMediaType.image) | ||||||
|  |                                           .cast(), | ||||||
|  |                                       initialIndex: idx, | ||||||
|  |                                       heroTags: heroTags, | ||||||
|  |                                     ), | ||||||
|  |                                     backgroundColor: | ||||||
|  |                                         Colors.black.withOpacity(0.7), | ||||||
|  |                                     rootNavigator: true, | ||||||
|  |                                   ); | ||||||
|  |                                 }, | ||||||
|                               ), |                               ), | ||||||
|                             ), |                             ), | ||||||
|                           ), |                           ), | ||||||
| @@ -262,7 +272,6 @@ class _AttachmentListState extends State<AttachmentList> { | |||||||
|                         ], |                         ], | ||||||
|                       ), |                       ), | ||||||
|                     ), |                     ), | ||||||
|                     ), |  | ||||||
|                   ); |                   ); | ||||||
|                 }, |                 }, | ||||||
|                 separatorBuilder: (context, index) => const Gap(8), |                 separatorBuilder: (context, index) => const Gap(8), | ||||||
|   | |||||||
| @@ -181,7 +181,10 @@ class _AttachmentZoomViewState extends State<AttachmentZoomView> { | |||||||
|                             scaleState == PhotoViewScaleState.initial); |                             scaleState == PhotoViewScaleState.initial); | ||||||
|                       }, |                       }, | ||||||
|                       imageProvider: UniversalImage.provider( |                       imageProvider: UniversalImage.provider( | ||||||
|                         sn.getAttachmentUrl(widget.data.first.rid), |                         sn.getAttachmentUrl( | ||||||
|  |                           widget.data.first.rid, | ||||||
|  |                           preview: false, | ||||||
|  |                         ), | ||||||
|                       ), |                       ), | ||||||
|                     ), |                     ), | ||||||
|                   ); |                   ); | ||||||
| @@ -199,7 +202,10 @@ class _AttachmentZoomViewState extends State<AttachmentZoomView> { | |||||||
|                         widget.heroTags?.elementAt(idx) ?? uuid.v4(); |                         widget.heroTags?.elementAt(idx) ?? uuid.v4(); | ||||||
|                     return PhotoViewGalleryPageOptions( |                     return PhotoViewGalleryPageOptions( | ||||||
|                       imageProvider: UniversalImage.provider( |                       imageProvider: UniversalImage.provider( | ||||||
|                         sn.getAttachmentUrl(widget.data.elementAt(idx).rid), |                         sn.getAttachmentUrl( | ||||||
|  |                           widget.data.elementAt(idx).rid, | ||||||
|  |                           preview: false, | ||||||
|  |                         ), | ||||||
|                       ), |                       ), | ||||||
|                       heroAttributes: PhotoViewHeroAttributes( |                       heroAttributes: PhotoViewHeroAttributes( | ||||||
|                         tag: 'attachment-${widget.data.first.rid}-$heroTag', |                         tag: 'attachment-${widget.data.first.rid}-$heroTag', | ||||||
|   | |||||||
| @@ -1,11 +1,8 @@ | |||||||
| import 'dart:math' as math; |  | ||||||
|  |  | ||||||
| import 'package:easy_localization/easy_localization.dart'; | import 'package:easy_localization/easy_localization.dart'; | ||||||
| import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||||
| import 'package:flutter_context_menu/flutter_context_menu.dart'; | import 'package:flutter_context_menu/flutter_context_menu.dart'; | ||||||
| import 'package:gap/gap.dart'; | import 'package:gap/gap.dart'; | ||||||
| import 'package:material_symbols_icons/symbols.dart'; | import 'package:material_symbols_icons/symbols.dart'; | ||||||
| import 'package:popover/popover.dart'; |  | ||||||
| import 'package:provider/provider.dart'; | import 'package:provider/provider.dart'; | ||||||
| import 'package:styled_widget/styled_widget.dart'; | import 'package:styled_widget/styled_widget.dart'; | ||||||
| import 'package:surface/providers/config.dart'; | import 'package:surface/providers/config.dart'; | ||||||
| @@ -120,20 +117,9 @@ class ChatMessage extends StatelessWidget { | |||||||
|                       ), |                       ), | ||||||
|                       onTap: () { |                       onTap: () { | ||||||
|                         if (user == null) return; |                         if (user == null) return; | ||||||
|                         showPopover( |                         showModalBottomSheet( | ||||||
|                           backgroundColor: |  | ||||||
|                               Theme.of(context).colorScheme.surface, |  | ||||||
|                           context: context, |                           context: context, | ||||||
|                           transition: PopoverTransition.other, |                           builder: (context) => AccountPopoverCard(data: user), | ||||||
|                           bodyBuilder: (context) => SizedBox( |  | ||||||
|                             width: math.min( |  | ||||||
|                                 400, MediaQuery.of(context).size.width - 10), |  | ||||||
|                             child: AccountPopoverCard(data: user), |  | ||||||
|                           ), |  | ||||||
|                           direction: PopoverDirection.bottom, |  | ||||||
|                           arrowHeight: 5, |  | ||||||
|                           arrowWidth: 15, |  | ||||||
|                           arrowDxOffset: -190, |  | ||||||
|                         ); |                         ); | ||||||
|                       }, |                       }, | ||||||
|                     ) |                     ) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user