< 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:52
Uncovered lines:13
Coverable lines:65
Total lines:153
Line coverage:80% (52 of 65)
Covered branches:0
Total branches:0

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%16.727041.67%
LoadFailed()0%2100%

File(s)

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

#LineLine coverage
 1using System;
 2using System.Threading.Tasks;
 3using DCL.Controllers;
 4using DCL.ECS7.InternalComponents;
 5using DCL.ECSRuntime;
 6using DCL.Helpers;
 7using DCL.Helpers.NFT;
 8using DCL.Models;
 9using Decentraland.Common;
 10using NFTShape_Internal;
 11using UnityEngine;
 12using Object = UnityEngine.Object;
 13
 14namespace DCL.ECSComponents
 15{
 16    public class ECSNFTShapeComponentHandler : IECSComponentHandler<PBNftShape>
 17    {
 18        internal INFTShapeFrameFactory factory;
 19
 20        internal INFTInfoRetriever infoRetriever;
 21        internal INFTAssetRetriever assetRetriever;
 22        internal INFTShapeFrame shapeFrame;
 23
 24        private PBNftShape prevModel;
 25
 26        private string nftLoadedScr = null;
 27        private bool infoRetrieverDisposed = false;
 28        private bool assetRetrieverDisposed = false;
 29        private readonly IInternalECSComponent<InternalRenderers> renderersComponent;
 30
 631        public ECSNFTShapeComponentHandler(INFTShapeFrameFactory factory, INFTInfoRetriever infoRetriever,
 32            INFTAssetRetriever assetRetriever,
 33            IInternalECSComponent<InternalRenderers> renderersComponent)
 34        {
 635            this.factory = factory;
 636            this.infoRetriever = infoRetriever;
 637            this.assetRetriever = assetRetriever;
 638            this.renderersComponent = renderersComponent;
 639        }
 40
 041        public void OnComponentCreated(IParcelScene scene, IDCLEntity entity) { }
 42
 43        public void OnComponentRemoved(IParcelScene scene, IDCLEntity entity)
 44        {
 645            if (!infoRetrieverDisposed)
 46            {
 647                infoRetriever.Dispose();
 48            }
 649            if (!assetRetrieverDisposed)
 50            {
 651                assetRetriever.Dispose();
 52            }
 653            DisposeShapeFrame(scene, entity, shapeFrame, renderersComponent);
 654        }
 55
 56        public void OnComponentModelUpdated(IParcelScene scene, IDCLEntity entity, PBNftShape model)
 57        {
 958            bool shouldReloadFrame = shapeFrame != null && prevModel.GetStyle() != model.GetStyle();
 59
 60            // destroy previous shape if style does not match
 961            if (shouldReloadFrame)
 62            {
 163                DisposeShapeFrame(scene, entity, shapeFrame, renderersComponent);
 164                shapeFrame = null;
 165                nftLoadedScr = null;
 66            }
 67
 68            // create shape if it does not exist
 969            if (shapeFrame == null)
 70            {
 771                int style = (int)model.GetStyle();
 772                shapeFrame = factory.InstantiateLoaderController(style);
 773                shapeFrame.gameObject.name = "NFT Shape mesh";
 774                shapeFrame.gameObject.transform.SetParent(entity.gameObject.transform);
 775                shapeFrame.gameObject.transform.ResetLocalTRS();
 776                renderersComponent.AddRenderer(scene, entity, shapeFrame.frameRenderer);
 77            }
 78
 979            Color3 modelColor = model.GetColor();
 980            if (prevModel == null || !modelColor.Equals(prevModel.GetColor()))
 81            {
 782                shapeFrame.UpdateBackgroundColor(new Color(modelColor.R, modelColor.G, modelColor.B, 1));
 83            }
 84
 985            if (!string.IsNullOrEmpty(model.Src) && nftLoadedScr != model.Src)
 86            {
 287                if (!infoRetrieverDisposed)
 88                {
 289                    infoRetriever.Dispose();
 290                    infoRetrieverDisposed = true;
 91                }
 292                if (!assetRetrieverDisposed)
 93                {
 294                    assetRetriever.Dispose();
 295                    assetRetrieverDisposed = true;
 96                }
 297                LoadNFT(model.Src);
 98            }
 99
 9100            prevModel = model;
 9101        }
 102
 103        private static void DisposeShapeFrame(IParcelScene scene, IDCLEntity entity,
 104            INFTShapeFrame nftFrame, IInternalECSComponent<InternalRenderers> renderersComponent)
 105        {
 7106            if (nftFrame == null)
 0107                return;
 108
 7109            renderersComponent.RemoveRenderer(scene, entity, nftFrame.frameRenderer);
 7110            nftFrame.Dispose();
 7111            Object.Destroy(nftFrame.gameObject);
 7112        }
 113
 114        internal async void LoadNFT(string scr)
 115        {
 116            try
 117            {
 2118                infoRetrieverDisposed = false;
 2119                NFTInfo info = await infoRetriever.FetchNFTInfo(scr);
 120
 2121                if (info == null)
 122                {
 0123                    LoadFailed();
 0124                    return;
 125                }
 126
 2127                assetRetrieverDisposed = false;
 2128                INFTAsset nftAsset = await assetRetriever.LoadNFTAsset(info.previewImageUrl);
 129
 2130                if (nftAsset == null)
 131                {
 0132                    LoadFailed();
 0133                    return;
 134                }
 135
 2136                shapeFrame.SetImage(info.name, info.imageUrl, nftAsset);
 2137                nftLoadedScr = scr;
 2138            }
 0139            catch (TaskCanceledException cancellation) { }
 0140            catch (OperationCanceledException cancellation) { }
 141            catch (Exception exception)
 142            {
 0143                Debug.LogError(exception);
 0144            }
 2145        }
 146
 147        private void LoadFailed()
 148        {
 0149            factory.InstantiateErrorFeedback(shapeFrame.gameObject);
 0150            shapeFrame.FailLoading();
 0151        }
 152    }
 153}