< 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:152
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 NFTShape_Internal;
 10using UnityEngine;
 11using Object = UnityEngine.Object;
 12
 13namespace DCL.ECSComponents
 14{
 15    public class ECSNFTShapeComponentHandler : IECSComponentHandler<PBNFTShape>
 16    {
 17        internal INFTShapeFrameFactory factory;
 18
 19        internal INFTInfoRetriever infoRetriever;
 20        internal INFTAssetRetriever assetRetriever;
 21        internal INFTShapeFrame shapeFrame;
 22
 23        private PBNFTShape prevModel;
 24
 25        private string nftLoadedScr = null;
 26        private bool infoRetrieverDisposed = false;
 27        private bool assetRetrieverDisposed = false;
 28        private readonly IInternalECSComponent<InternalRenderers> renderersComponent;
 29
 630        public ECSNFTShapeComponentHandler(INFTShapeFrameFactory factory, INFTInfoRetriever infoRetriever,
 31            INFTAssetRetriever assetRetriever,
 32            IInternalECSComponent<InternalRenderers> renderersComponent)
 33        {
 634            this.factory = factory;
 635            this.infoRetriever = infoRetriever;
 636            this.assetRetriever = assetRetriever;
 637            this.renderersComponent = renderersComponent;
 638        }
 39
 040        public void OnComponentCreated(IParcelScene scene, IDCLEntity entity) { }
 41
 42        public void OnComponentRemoved(IParcelScene scene, IDCLEntity entity)
 43        {
 644            if (!infoRetrieverDisposed)
 45            {
 646                infoRetriever.Dispose();
 47            }
 648            if (!assetRetrieverDisposed)
 49            {
 650                assetRetriever.Dispose();
 51            }
 652            DisposeShapeFrame(scene, entity, shapeFrame, renderersComponent);
 653        }
 54
 55        public void OnComponentModelUpdated(IParcelScene scene, IDCLEntity entity, PBNFTShape model)
 56        {
 957            bool shouldReloadFrame = shapeFrame != null && prevModel.GetStyle() != model.GetStyle();
 58
 59            // destroy previous shape if style does not match
 960            if (shouldReloadFrame)
 61            {
 162                DisposeShapeFrame(scene, entity, shapeFrame, renderersComponent);
 163                shapeFrame = null;
 164                nftLoadedScr = null;
 65            }
 66
 67            // create shape if it does not exist
 968            if (shapeFrame == null)
 69            {
 770                int style = (int)model.GetStyle();
 771                shapeFrame = factory.InstantiateLoaderController(style);
 772                shapeFrame.gameObject.name = "NFT Shape mesh";
 773                shapeFrame.gameObject.transform.SetParent(entity.gameObject.transform);
 774                shapeFrame.gameObject.transform.ResetLocalTRS();
 775                renderersComponent.AddRenderer(scene, entity, shapeFrame.frameRenderer);
 76            }
 77
 978            Color3 modelColor = model.GetColor();
 979            if (prevModel == null || !modelColor.Equals(prevModel.GetColor()))
 80            {
 781                shapeFrame.UpdateBackgroundColor(new Color(modelColor.R, modelColor.G, modelColor.B, 1));
 82            }
 83
 984            if (!string.IsNullOrEmpty(model.Src) && nftLoadedScr != model.Src)
 85            {
 286                if (!infoRetrieverDisposed)
 87                {
 288                    infoRetriever.Dispose();
 289                    infoRetrieverDisposed = true;
 90                }
 291                if (!assetRetrieverDisposed)
 92                {
 293                    assetRetriever.Dispose();
 294                    assetRetrieverDisposed = true;
 95                }
 296                LoadNFT(model.Src);
 97            }
 98
 999            prevModel = model;
 9100        }
 101
 102        private static void DisposeShapeFrame(IParcelScene scene, IDCLEntity entity,
 103            INFTShapeFrame nftFrame, IInternalECSComponent<InternalRenderers> renderersComponent)
 104        {
 7105            if (nftFrame == null)
 0106                return;
 107
 7108            renderersComponent.RemoveRenderer(scene, entity, nftFrame.frameRenderer);
 7109            nftFrame.Dispose();
 7110            Object.Destroy(nftFrame.gameObject);
 7111        }
 112
 113        internal async void LoadNFT(string scr)
 114        {
 115            try
 116            {
 2117                infoRetrieverDisposed = false;
 2118                NFTInfo info = await infoRetriever.FetchNFTInfo(scr);
 119
 2120                if (info == null)
 121                {
 0122                    LoadFailed();
 0123                    return;
 124                }
 125
 2126                assetRetrieverDisposed = false;
 2127                INFTAsset nftAsset = await assetRetriever.LoadNFTAsset(info.previewImageUrl);
 128
 2129                if (nftAsset == null)
 130                {
 0131                    LoadFailed();
 0132                    return;
 133                }
 134
 2135                shapeFrame.SetImage(info.name, info.imageUrl, nftAsset);
 2136                nftLoadedScr = scr;
 2137            }
 0138            catch (TaskCanceledException cancellation) { }
 0139            catch (OperationCanceledException cancellation) { }
 140            catch (Exception exception)
 141            {
 0142                Debug.LogError(exception);
 0143            }
 2144        }
 145
 146        private void LoadFailed()
 147        {
 0148            factory.InstantiateErrorFeedback(shapeFrame.gameObject);
 0149            shapeFrame.FailLoading();
 0150        }
 151    }
 152}