From 55ae011bb3bb12281dfb93b51efe576200e56f1b Mon Sep 17 00:00:00 2001 From: DD Liu <liudi08@gmail.com> Date: Wed, 19 Sep 2018 15:32:10 -0400 Subject: [PATCH] fixRepeatDecode (#3174) --- src/containers/sprite-selector-item.jsx | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/containers/sprite-selector-item.jsx b/src/containers/sprite-selector-item.jsx index 01e617c8e..9b154c59b 100644 --- a/src/containers/sprite-selector-item.jsx +++ b/src/containers/sprite-selector-item.jsx @@ -32,7 +32,17 @@ class SpriteSelectorItem extends React.Component { ]); this.svgRenderer = new SVGRenderer(); // Asset ID of the SVG currently in SVGRenderer - this.svgRendererAssetId = null; + this.decodedAssetId = null; + } + shouldComponentUpdate (nextProps) { + // Ignore dragPayload due to https://github.com/LLK/scratch-gui/issues/3172. + // This function should be removed once the issue is fixed. + for (const property in nextProps) { + if (property !== 'dragPayload' && this.props[property] !== nextProps[property]) { + return true; + } + } + return false; } getCostumeUrl () { if (this.props.costumeURL) return this.props.costumeURL; @@ -44,18 +54,20 @@ class SpriteSelectorItem extends React.Component { // Avoid parsing the SVG when possible, since it's expensive. if (asset.assetType === storage.AssetType.ImageVector) { // If the asset ID has not changed, no need to re-parse - if (this.svgRendererAssetId === this.props.assetId) { + if (this.decodedAssetId === this.props.assetId) { + // @todo consider caching more than one URL. return this.cachedUrl; } - + this.decodedAssetId = this.props.assetId; const svgString = this.props.vm.runtime.storage.get(this.props.assetId).decodeText(); if (svgString.match(HAS_FONT_REGEXP)) { - this.svgRendererAssetId = this.props.assetId; this.svgRenderer.loadString(svgString); const svgText = this.svgRenderer.toString(true /* shouldInjectFonts */); this.cachedUrl = `data:image/svg+xml;utf8,${encodeURIComponent(svgText)}`; - return this.cachedUrl; + } else { + this.cachedUrl = this.props.vm.runtime.storage.get(this.props.assetId).encodeDataURI(); } + return this.cachedUrl; } return this.props.vm.runtime.storage.get(this.props.assetId).encodeDataURI(); } -- GitLab