< Summary

Class:DCL.ECSComponents.ECSNFTShapeComponentHandler
Assembly:DCL.ECSComponents.NFTShape
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/ECS7/ECSComponents/NFTShape/Handler/ECSNFTShapeComponentHandler.cs
Covered lines:54
Uncovered lines:13
Coverable lines:67
Total lines:155
Line coverage:80.5% (54 of 67)
Covered branches:0
Total branches:0
Covered methods:5
Total methods:7
Method coverage:71.4% (5 of 7)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
ECSNFTShapeComponentHandler(...)0%110100%
OnComponentCreated(...)0%2100%
OnComponentRemoved(...)0%330100%
OnComponentModelUpdated(...)0%10100100%
DisposeShapeFrame(...)0%2.022083.33%
LoadNFT()0%14.657046.15%
LoadFailed()0%2100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/ECS7/ECSComponents/NFTShape/Handler/ECSNFTShapeComponentHandler.cs

#LineLine coverage
 1using DCL.Controllers;
 2using DCL.ECS7.InternalComponents;
 3using DCL.ECSRuntime;
 4using DCL.Helpers;
 5using DCL.Helpers.NFT;
 6using DCL.Models;
 7using Decentraland.Common;
 8using MainScripts.DCL.ServiceProviders.OpenSea.Interfaces;
 9using NFTShape_Internal;
 10using System;
 11using System.Threading.Tasks;
 12using UnityEngine;
 13using Object = UnityEngine.Object;
 14
 15namespace DCL.ECSComponents
 16{
 17    public class ECSNFTShapeComponentHandler : IECSComponentHandler<PBNftShape>
 18    {
 19        internal INFTShapeFrameFactory factory;
 20
 21        internal INFTInfoRetriever infoRetriever;
 22        internal INFTAssetRetriever assetRetriever;
 23        internal INFTShapeFrame shapeFrame;
 24
 25        private PBNftShape prevModel;
 26
 27        private string nftLoadedScr = null;
 28        private bool infoRetrieverDisposed = false;
 29        private bool assetRetrieverDisposed = false;
 30        private readonly IInternalECSComponent<InternalRenderers> renderersComponent;
 31
 632        public ECSNFTShapeComponentHandler(INFTShapeFrameFactory factory, INFTInfoRetriever infoRetriever,
 33            INFTAssetRetriever assetRetriever,
 34            IInternalECSComponent<InternalRenderers> renderersComponent)
 35        {
 636            this.factory = factory;
 637            this.infoRetriever = infoRetriever;
 638            this.assetRetriever = assetRetriever;
 639            this.renderersComponent = renderersComponent;
 640        }
 41
 042        public void OnComponentCreated(IParcelScene scene, IDCLEntity entity) { }
 43
 44        public void OnComponentRemoved(IParcelScene scene, IDCLEntity entity)
 45        {
 646            if (!infoRetrieverDisposed)
 47            {
 648                infoRetriever.Dispose();
 49            }
 650            if (!assetRetrieverDisposed)
 51            {
 652                assetRetriever.Dispose();
 53            }
 654            DisposeShapeFrame(scene, entity, shapeFrame, renderersComponent);
 655        }
 56
 57        public void OnComponentModelUpdated(IParcelScene scene, IDCLEntity entity, PBNftShape model)
 58        {
 959            bool shouldReloadFrame = shapeFrame != null && prevModel.GetStyle() != model.GetStyle();
 60
 61            // destroy previous shape if style does not match
 962            if (shouldReloadFrame)
 63            {
 164                DisposeShapeFrame(scene, entity, shapeFrame, renderersComponent);
 165                shapeFrame = null;
 166                nftLoadedScr = null;
 67            }
 68
 69            // create shape if it does not exist
 970            if (shapeFrame == null)
 71            {
 772                int style = (int)model.GetStyle();
 773                shapeFrame = factory.InstantiateLoaderController(style);
 774                shapeFrame.gameObject.name = "NFT Shape mesh";
 775                shapeFrame.gameObject.transform.SetParent(entity.gameObject.transform);
 776                shapeFrame.gameObject.transform.ResetLocalTRS();
 777                renderersComponent.AddRenderer(scene, entity, shapeFrame.frameRenderer);
 78            }
 79
 980            Color3 modelColor = model.GetColor();
 981            if (prevModel == null || !modelColor.Equals(prevModel.GetColor()))
 82            {
 783                shapeFrame.UpdateBackgroundColor(new Color(modelColor.R, modelColor.G, modelColor.B, 1));
 84            }
 85
 986            if (!string.IsNullOrEmpty(model.Urn) && nftLoadedScr != model.Urn)
 87            {
 288                if (!infoRetrieverDisposed)
 89                {
 290                    infoRetriever.Dispose();
 291                    infoRetrieverDisposed = true;
 92                }
 293                if (!assetRetrieverDisposed)
 94                {
 295                    assetRetriever.Dispose();
 296                    assetRetrieverDisposed = true;
 97                }
 298                LoadNFT(model.Urn);
 99            }
 100
 9101            prevModel = model;
 9102        }
 103
 104        private static void DisposeShapeFrame(IParcelScene scene, IDCLEntity entity,
 105            INFTShapeFrame nftFrame, IInternalECSComponent<InternalRenderers> renderersComponent)
 106        {
 7107            if (nftFrame == null)
 0108                return;
 109
 7110            renderersComponent.RemoveRenderer(scene, entity, nftFrame.frameRenderer);
 7111            nftFrame.Dispose();
 7112            Object.Destroy(nftFrame.gameObject);
 7113        }
 114
 115        internal async void LoadNFT(string urn)
 116        {
 117            try
 118            {
 2119                infoRetrieverDisposed = false;
 2120                NFTUtils.TryParseUrn(urn, out string chain, out string contractAddress, out string tokenId);
 2121                NFTInfo? info = await infoRetriever.FetchNFTInfoAsync(chain, contractAddress, tokenId);
 122
 2123                if (!info.HasValue)
 124                {
 0125                    LoadFailed();
 0126                    return;
 127                }
 128
 2129                assetRetrieverDisposed = false;
 2130                NFTInfo nftInfo = info.Value;
 2131                INFTAsset nftAsset = await assetRetriever.LoadNFTAsset(nftInfo.previewImageUrl);
 132
 2133                if (nftAsset == null)
 134                {
 0135                    LoadFailed();
 0136                    return;
 137                }
 2138                shapeFrame.SetImage(nftInfo.name, nftInfo.imageUrl, nftAsset);
 2139                nftLoadedScr = urn;
 2140            }
 0141            catch (TaskCanceledException) { }
 0142            catch (OperationCanceledException) { }
 143            catch (Exception exception)
 144            {
 0145                Debug.LogError(exception);
 0146            }
 2147        }
 148
 149        private void LoadFailed()
 150        {
 0151            factory.InstantiateErrorFeedback(shapeFrame.gameObject);
 0152            shapeFrame.FailLoading();
 0153        }
 154    }
 155}