diff --git a/assets/testFile.glb b/assets/testFile.glb new file mode 100644 index 000000000..ccfe32cb2 Binary files /dev/null and b/assets/testFile.glb differ diff --git a/lib/dashboard/home/tab_bar/nft/cubit/nft_cubit.dart b/lib/dashboard/home/tab_bar/nft/cubit/nft_cubit.dart index 1738fa3a0..f40b002fa 100644 --- a/lib/dashboard/home/tab_bar/nft/cubit/nft_cubit.dart +++ b/lib/dashboard/home/tab_bar/nft/cubit/nft_cubit.dart @@ -203,7 +203,7 @@ class NftCubit extends Cubit { 'token.metadata.null': false, 'sort.desc': 'firstLevel', 'select': - 'token.tokenId as tokenId,token.id as id,token.metadata.name as name,token.metadata.displayUri as displayUri,balance,token.metadata.thumbnailUri as thumbnailUri,token.metadata.description as description,token.standard as standard,token.metadata.symbol as symbol,token.contract.address as contractAddress,token.metadata.identifier as identifier,token.metadata.creators as creators,token.metadata.publishers as publishers,token.metadata.date as date,token.metadata.is_transferable as isTransferable,firstTime', // ignore: lines_longer_than_80_chars + 'token.tokenId as tokenId,token.id as id,token.metadata.name as name,token.metadata.displayUri as displayUri,balance,token.metadata.thumbnailUri as thumbnailUri,token.metadata.description as description,token.standard as standard,token.metadata.symbol as symbol,token.contract.address as contractAddress,token.metadata.identifier as identifier,token.metadata.creators as creators,token.metadata.publishers as publishers,token.metadata.date as date,token.metadata.is_transferable as isTransferable,firstTime,token.metadata.artifactUri as artifactUri', // ignore: lines_longer_than_80_chars 'offset': offset, 'limit': limit, }, diff --git a/lib/dashboard/home/tab_bar/nft/models/nft_model.dart b/lib/dashboard/home/tab_bar/nft/models/nft_model.dart index 08eb972c0..d93941b51 100644 --- a/lib/dashboard/home/tab_bar/nft/models/nft_model.dart +++ b/lib/dashboard/home/tab_bar/nft/models/nft_model.dart @@ -18,6 +18,7 @@ class NftModel extends Equatable { this.displayUri, this.thumbnailUri, this.isTransferable = true, + this.artifactUri = '', }); factory NftModel.fromJson(Map json) => @@ -35,6 +36,8 @@ class NftModel extends Equatable { final String balance; @JsonKey(defaultValue: true) final bool isTransferable; + @JsonKey(defaultValue: '') + final String artifactUri; String? get displayUrl { if (displayUri?.isEmpty ?? true) { @@ -56,6 +59,16 @@ class NftModel extends Equatable { ); } + String? get artifactUrl { + if (artifactUri == '') { + return null; + } + return artifactUri.replaceAll( + 'ipfs://', + Urls.talaoIpfsGateway, + ); + } + Map toJson() => _$NftModelToJson(this); @override diff --git a/lib/dashboard/home/tab_bar/nft/models/tezos_nft_model.dart b/lib/dashboard/home/tab_bar/nft/models/tezos_nft_model.dart index 6a7f80016..640950421 100644 --- a/lib/dashboard/home/tab_bar/nft/models/tezos_nft_model.dart +++ b/lib/dashboard/home/tab_bar/nft/models/tezos_nft_model.dart @@ -26,6 +26,7 @@ class TezosNftModel extends NftModel { this.mPublishers, this.date, this.firstTime, + super.artifactUri, }); factory TezosNftModel.fromJson(Map json) => @@ -105,5 +106,6 @@ class TezosNftModel extends NftModel { date, isTransferable, firstTime, + artifactUri, ]; } diff --git a/lib/dashboard/home/tab_bar/nft/view/nft_details_page.dart b/lib/dashboard/home/tab_bar/nft/view/nft_details_page.dart index 06a99b0dc..6707d88f7 100644 --- a/lib/dashboard/home/tab_bar/nft/view/nft_details_page.dart +++ b/lib/dashboard/home/tab_bar/nft/view/nft_details_page.dart @@ -6,6 +6,7 @@ import 'package:altme/wallet/cubit/wallet_cubit.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_html/flutter_html.dart'; +import 'package:model_viewer_plus/model_viewer_plus.dart'; class NftDetailsPage extends StatelessWidget { const NftDetailsPage({ @@ -87,15 +88,7 @@ class _NftDetailsViewState extends State { children: [ AspectRatio( aspectRatio: 1.1, - child: CachedImageFromNetwork( - widget.nftModel.displayUrl ?? - (widget.nftModel.thumbnailUrl ?? ''), - fit: BoxFit.contain, - errorMessage: l10n.nftTooBigToLoad, - borderRadius: const BorderRadius.all( - Radius.circular(Sizes.largeRadius), - ), - ), + child: NftPicture(widget: widget, l10n: l10n), ), const SizedBox( height: Sizes.spaceSmall, @@ -358,6 +351,44 @@ class _NftDetailsViewState extends State { } } +class NftPicture extends StatelessWidget { + const NftPicture({ + super.key, + required this.widget, + required this.l10n, + }); + + final NftDetailsView widget; + final AppLocalizations l10n; + + @override + Widget build(BuildContext context) { + if (widget.nftModel.artifactUri == '') { + return CachedImageFromNetwork( + widget.nftModel.displayUrl ?? (widget.nftModel.thumbnailUrl ?? ''), + fit: BoxFit.contain, + errorMessage: l10n.nftTooBigToLoad, + borderRadius: const BorderRadius.all( + Radius.circular(Sizes.largeRadius), + ), + ); + } + return const ClipRRect( + borderRadius: BorderRadius.all( + Radius.circular(Sizes.largeRadius), + ), + child: ModelViewer( + backgroundColor: Color.fromARGB(0xFF, 0xEE, 0xEE, 0xEE), + src: 'assets/testFile.glb', + alt: '', + ar: false, + autoRotate: false, + disableZoom: true, + ), + ); + } +} + class SendButton extends StatelessWidget { const SendButton({ super.key,