From 7bc9072da1cd7f42fcf122fefa976a15b641fbed Mon Sep 17 00:00:00 2001 From: Bin <17426470+boyan01@users.noreply.github.com> Date: Wed, 14 Aug 2024 23:15:25 +0800 Subject: [PATCH] add new cover data for AppCard (#1637) --- lib/utils/web_view/web_view_mobile.dart | 1 + .../item/action_card/action_card_data.dart | 26 +++++++++++++++++++ .../item/action_card/action_card_data.g.dart | 20 ++++++++++++++ .../item/action_card/actions_card.dart | 26 ++++++++++++++++++- 4 files changed, 72 insertions(+), 1 deletion(-) diff --git a/lib/utils/web_view/web_view_mobile.dart b/lib/utils/web_view/web_view_mobile.dart index aed127d008..e75a96a10b 100644 --- a/lib/utils/web_view/web_view_mobile.dart +++ b/lib/utils/web_view/web_view_mobile.dart @@ -294,6 +294,7 @@ class _ShareMenuItem extends StatelessWidget { true, [], '', + null, ); await context.accountServer.sendAppCardMessage( diff --git a/lib/widgets/message/item/action_card/action_card_data.dart b/lib/widgets/message/item/action_card/action_card_data.dart index 2d0f1cf05d..72646e0453 100644 --- a/lib/widgets/message/item/action_card/action_card_data.dart +++ b/lib/widgets/message/item/action_card/action_card_data.dart @@ -17,6 +17,7 @@ class AppCardData { this.shareable, this.actions, this.coverUrl, + this.cover, ); factory AppCardData.fromJson(Map json) => @@ -28,6 +29,9 @@ class AppCardData { final String iconUrl; @JsonKey(name: 'cover_url', defaultValue: '') final String coverUrl; + + final Cover? cover; + final String title; final String description; @JsonKey(name: 'action', defaultValue: '') @@ -47,6 +51,28 @@ class AppCardData { bool get canShareActions => actions.every((e) => e.isValidSharedAction); } +@JsonSerializable() +class Cover { + const Cover({ + required this.url, + required this.thumbnail, + required this.mimeType, + required this.width, + required this.height, + }); + + factory Cover.fromJson(Map json) => _$CoverFromJson(json); + + final String url; + final String? thumbnail; + @JsonKey(name: 'mime_type') + final String mimeType; + final int width; + final int height; + + Map toJson() => _$CoverToJson(this); +} + extension on ActionData { bool get isValidSharedAction { try { diff --git a/lib/widgets/message/item/action_card/action_card_data.g.dart b/lib/widgets/message/item/action_card/action_card_data.g.dart index 16f4384f60..518b6bab91 100644 --- a/lib/widgets/message/item/action_card/action_card_data.g.dart +++ b/lib/widgets/message/item/action_card/action_card_data.g.dart @@ -19,6 +19,9 @@ AppCardData _$AppCardDataFromJson(Map json) => AppCardData( .toList() ?? [], json['cover_url'] as String? ?? '', + json['cover'] == null + ? null + : Cover.fromJson(json['cover'] as Map), ); Map _$AppCardDataToJson(AppCardData instance) => @@ -26,6 +29,7 @@ Map _$AppCardDataToJson(AppCardData instance) => 'app_id': instance.appId, 'icon_url': instance.iconUrl, 'cover_url': instance.coverUrl, + 'cover': instance.cover?.toJson(), 'title': instance.title, 'description': instance.description, 'action': instance.action, @@ -33,3 +37,19 @@ Map _$AppCardDataToJson(AppCardData instance) => 'updated_at': instance.updatedAt, 'shareable': instance.shareable, }; + +Cover _$CoverFromJson(Map json) => Cover( + url: json['url'] as String, + thumbnail: json['thumbnail'] as String?, + mimeType: json['mime_type'] as String, + width: (json['width'] as num).toInt(), + height: (json['height'] as num).toInt(), + ); + +Map _$CoverToJson(Cover instance) => { + 'url': instance.url, + 'thumbnail': instance.thumbnail, + 'mime_type': instance.mimeType, + 'width': instance.width, + 'height': instance.height, + }; diff --git a/lib/widgets/message/item/action_card/actions_card.dart b/lib/widgets/message/item/action_card/actions_card.dart index 1a33c2ce0a..cb2f9351ef 100644 --- a/lib/widgets/message/item/action_card/actions_card.dart +++ b/lib/widgets/message/item/action_card/actions_card.dart @@ -1,3 +1,5 @@ +import 'dart:math' as math; + import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; @@ -105,7 +107,9 @@ class ActionsCardBody extends StatelessWidget { AspectRatio( aspectRatio: 1, child: CacheImage(data.coverUrl), - ), + ) + else if (data.cover != null) + _CoverWidget(cover: data.cover!), const SizedBox(height: 10), Padding( padding: const EdgeInsets.symmetric(horizontal: 12), @@ -128,6 +132,26 @@ class ActionsCardBody extends StatelessWidget { ); } +class _CoverWidget extends StatelessWidget { + const _CoverWidget({required this.cover}); + + final Cover cover; + + @override + Widget build(BuildContext context) { + var aspect = 1.0; + try { + aspect = math.max(cover.width / cover.height, 1.5); + } catch (err) { + aspect = 1; + } + return AspectRatio( + aspectRatio: aspect, + child: CacheImage(cover.url), + ); + } +} + class _Actions extends StatelessWidget { const _Actions({required this.actions});