@dcl/wearable-preview 1.0.0-2157195817.commit-5065de7 → 1.0.0-2157234427.commit-a328568

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,20 +1,20 @@
1
1
  {
2
2
  "files": {
3
- "main.css": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2157195817.commit-5065de7/static/css/main.bcd9c703.chunk.css",
4
- "main.js": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2157195817.commit-5065de7/static/js/main.8cd65464.chunk.js",
5
- "main.js.map": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2157195817.commit-5065de7/static/js/main.8cd65464.chunk.js.map",
6
- "runtime-main.js": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2157195817.commit-5065de7/static/js/runtime-main.bb3996d2.js",
7
- "runtime-main.js.map": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2157195817.commit-5065de7/static/js/runtime-main.bb3996d2.js.map",
8
- "static/js/2.d0cd41cf.chunk.js": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2157195817.commit-5065de7/static/js/2.d0cd41cf.chunk.js",
9
- "static/js/2.d0cd41cf.chunk.js.map": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2157195817.commit-5065de7/static/js/2.d0cd41cf.chunk.js.map",
10
- "index.html": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2157195817.commit-5065de7/index.html",
11
- "static/css/main.bcd9c703.chunk.css.map": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2157195817.commit-5065de7/static/css/main.bcd9c703.chunk.css.map",
12
- "static/js/2.d0cd41cf.chunk.js.LICENSE.txt": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2157195817.commit-5065de7/static/js/2.d0cd41cf.chunk.js.LICENSE.txt"
3
+ "main.css": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2157234427.commit-a328568/static/css/main.bcd9c703.chunk.css",
4
+ "main.js": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2157234427.commit-a328568/static/js/main.0f2e7470.chunk.js",
5
+ "main.js.map": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2157234427.commit-a328568/static/js/main.0f2e7470.chunk.js.map",
6
+ "runtime-main.js": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2157234427.commit-a328568/static/js/runtime-main.9dc757c1.js",
7
+ "runtime-main.js.map": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2157234427.commit-a328568/static/js/runtime-main.9dc757c1.js.map",
8
+ "static/js/2.d0cd41cf.chunk.js": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2157234427.commit-a328568/static/js/2.d0cd41cf.chunk.js",
9
+ "static/js/2.d0cd41cf.chunk.js.map": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2157234427.commit-a328568/static/js/2.d0cd41cf.chunk.js.map",
10
+ "index.html": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2157234427.commit-a328568/index.html",
11
+ "static/css/main.bcd9c703.chunk.css.map": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2157234427.commit-a328568/static/css/main.bcd9c703.chunk.css.map",
12
+ "static/js/2.d0cd41cf.chunk.js.LICENSE.txt": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2157234427.commit-a328568/static/js/2.d0cd41cf.chunk.js.LICENSE.txt"
13
13
  },
14
14
  "entrypoints": [
15
- "static/js/runtime-main.bb3996d2.js",
15
+ "static/js/runtime-main.9dc757c1.js",
16
16
  "static/js/2.d0cd41cf.chunk.js",
17
17
  "static/css/main.bcd9c703.chunk.css",
18
- "static/js/main.8cd65464.chunk.js"
18
+ "static/js/main.0f2e7470.chunk.js"
19
19
  ]
20
20
  }
package/index.html CHANGED
@@ -1 +1 @@
1
- <!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2157195817.commit-5065de7/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="Preview wearables from Decentraland"/><link rel="apple-touch-icon" href="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2157195817.commit-5065de7/logo192.png"/><link rel="manifest" href="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2157195817.commit-5065de7/manifest.json"/><title>Decentraland | Wearable Preview</title><link href="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2157195817.commit-5065de7/static/css/main.bcd9c703.chunk.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script>!function(e){function r(r){for(var n,u,a=r[0],i=r[1],c=r[2],f=0,s=[];f<a.length;f++)u=a[f],Object.prototype.hasOwnProperty.call(o,u)&&o[u]&&s.push(o[u][0]),o[u]=0;for(n in i)Object.prototype.hasOwnProperty.call(i,n)&&(e[n]=i[n]);for(p&&p(r);s.length;)s.shift()();return l.push.apply(l,c||[]),t()}function t(){for(var e,r=0;r<l.length;r++){for(var t=l[r],n=!0,a=1;a<t.length;a++){var i=t[a];0!==o[i]&&(n=!1)}n&&(l.splice(r--,1),e=u(u.s=t[0]))}return e}var n={},o={1:0},l=[];function u(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,u),t.l=!0,t.exports}u.m=e,u.c=n,u.d=function(e,r,t){u.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},u.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},u.t=function(e,r){if(1&r&&(e=u(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(u.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)u.d(t,n,function(r){return e[r]}.bind(null,n));return t},u.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return u.d(r,"a",r),r},u.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},u.p="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2157195817.commit-5065de7/";var a=this["webpackJsonp@dcl/wearable-preview"]=this["webpackJsonp@dcl/wearable-preview"]||[],i=a.push.bind(a);a.push=r,a=a.slice();for(var c=0;c<a.length;c++)r(a[c]);var p=i;t()}([])</script><script src="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2157195817.commit-5065de7/static/js/2.d0cd41cf.chunk.js"></script><script src="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2157195817.commit-5065de7/static/js/main.8cd65464.chunk.js"></script></body></html>
1
+ <!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2157234427.commit-a328568/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="Preview wearables from Decentraland"/><link rel="apple-touch-icon" href="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2157234427.commit-a328568/logo192.png"/><link rel="manifest" href="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2157234427.commit-a328568/manifest.json"/><title>Decentraland | Wearable Preview</title><link href="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2157234427.commit-a328568/static/css/main.bcd9c703.chunk.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script>!function(e){function r(r){for(var n,a,u=r[0],i=r[1],c=r[2],f=0,s=[];f<u.length;f++)a=u[f],Object.prototype.hasOwnProperty.call(o,a)&&o[a]&&s.push(o[a][0]),o[a]=0;for(n in i)Object.prototype.hasOwnProperty.call(i,n)&&(e[n]=i[n]);for(p&&p(r);s.length;)s.shift()();return l.push.apply(l,c||[]),t()}function t(){for(var e,r=0;r<l.length;r++){for(var t=l[r],n=!0,u=1;u<t.length;u++){var i=t[u];0!==o[i]&&(n=!1)}n&&(l.splice(r--,1),e=a(a.s=t[0]))}return e}var n={},o={1:0},l=[];function a(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,a),t.l=!0,t.exports}a.m=e,a.c=n,a.d=function(e,r,t){a.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},a.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},a.t=function(e,r){if(1&r&&(e=a(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(a.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)a.d(t,n,function(r){return e[r]}.bind(null,n));return t},a.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(r,"a",r),r},a.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},a.p="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2157234427.commit-a328568/";var u=this["webpackJsonp@dcl/wearable-preview"]=this["webpackJsonp@dcl/wearable-preview"]||[],i=u.push.bind(u);u.push=r,u=u.slice();for(var c=0;c<u.length;c++)r(u[c]);var p=i;t()}([])</script><script src="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2157234427.commit-a328568/static/js/2.d0cd41cf.chunk.js"></script><script src="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2157234427.commit-a328568/static/js/main.0f2e7470.chunk.js"></script></body></html>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dcl/wearable-preview",
3
- "version": "1.0.0-2157195817.commit-5065de7",
3
+ "version": "1.0.0-2157234427.commit-a328568",
4
4
  "description": "Static website for the wearable preview",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -9,6 +9,6 @@
9
9
  "keywords": [],
10
10
  "author": "",
11
11
  "license": "Apache-2.0",
12
- "homepage": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2157195817.commit-5065de7",
13
- "commit": "5065de7035e439599098c112e27a2a86afc76525"
12
+ "homepage": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2157234427.commit-a328568",
13
+ "commit": "a328568dea430820eb2e35cd4955c5bf21d6990e"
14
14
  }
@@ -1,2 +1,2 @@
1
- (this["webpackJsonp@dcl/wearable-preview"]=this["webpackJsonp@dcl/wearable-preview"]||[]).push([[0],{284:function(e,t,r){},378:function(e,t,r){},381:function(e,t,r){"use strict";r.r(t);var a=r(111),n=r(50),o=r.n(n),c=r(278),i=r.n(c),u=(r(284),r(56)),s=r(221),f=r.n(s),l=r(21);var d,p=r(61),b=r(97),h=r(32),v=r.n(h),w=r(41),y=r(218),m=r(219);function g(e){return O.apply(this,arguments)}function O(){return(O=Object(w.a)(v.a.mark((function e(t){return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",new Promise((function(e){return setTimeout(e,t)})));case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function E(e){return k.apply(this,arguments)}function k(){return k=Object(w.a)(v.a.mark((function e(t){var r,a,n=arguments;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=n.length>1&&void 0!==n[1]?n[1]:3,e.prev=1,e.next=4,fetch(t);case 4:if((a=e.sent).ok){e.next=11;break}return e.t0=Error,e.next=9,a.text();case 9:throw e.t1=e.sent,new e.t0(e.t1);case 11:return e.abrupt("return",a.json());case 14:if(e.prev=14,e.t2=e.catch(1),!(r>0)){e.next=22;break}return e.next=19,g(100);case 19:return e.abrupt("return",E(t,r-1));case 22:throw e.t2;case 23:case"end":return e.stop()}}),e,null,[[1,14]])}))),k.apply(this,arguments)}var j,x=(d={},Object(a.a)(d,l.PreviewEnv.DEV,"https://nft-api.decentraland.io"),Object(a.a)(d,l.PreviewEnv.PROD,"https://nft-api.decentraland.org"),d),W=function(){function e(){Object(y.a)(this,e)}return Object(m.a)(e,[{key:"fetchItem",value:function(){var e=Object(w.a)(v.a.mark((function e(t,r,a){var n,o;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,E("".concat(x[a],"/v1/items?contractAddress=").concat(t,"&itemId=").concat(r));case 2:if(n=e.sent,0!==(o=n.data).length){e.next=6;break}throw new Error('Item not found for contractAddress="'.concat(t,'" itemId="').concat(r,'"'));case 6:return e.abrupt("return",o[0]);case 7:case"end":return e.stop()}}),e)})));return function(t,r,a){return e.apply(this,arguments)}}()},{key:"fetchNFT",value:function(){var e=Object(w.a)(v.a.mark((function e(t,r,a){var n,o;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,E("".concat(x[a],"/v1/nfts?contractAddress=").concat(t,"&tokenId=").concat(r));case 2:if(n=e.sent,0!==(o=n.data).length){e.next=6;break}throw new Error('NFT not found for contractAddress="'.concat(t,'" tokenId="').concat(r,'"'));case 6:return e.abrupt("return",o[0].nft);case 7:case"end":return e.stop()}}),e)})));return function(t,r,a){return e.apply(this,arguments)}}()}]),e}(),S=new W,A=(j={},Object(a.a)(j,l.PreviewEnv.DEV,"https://peer.decentraland.zone"),Object(a.a)(j,l.PreviewEnv.PROD,"https://peer.decentraland.org"),j),C=function(){function e(){Object(y.a)(this,e)}return Object(m.a)(e,[{key:"fetchWearables",value:function(){var e=Object(w.a)(v.a.mark((function e(t,r){var a,n;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(0!==t.length){e.next=2;break}return e.abrupt("return",[]);case 2:return e.next=4,E("".concat(A[r],"/lambdas/collections/wearables?").concat(t.map((function(e){return"wearableId=".concat(e)})).join("&")));case 4:if(a=e.sent,0!==(n=a.wearables).length){e.next=8;break}throw new Error('Wearables not found for urns="'.concat(t,'"'));case 8:return e.abrupt("return",n);case 9:case"end":return e.stop()}}),e)})));return function(t,r){return e.apply(this,arguments)}}()},{key:"fetchProfile",value:function(){var e=Object(w.a)(v.a.mark((function e(t,r){var a;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,E("".concat(A[r],"/lambdas/profiles?id=").concat(t));case 2:return a=e.sent,e.abrupt("return",a.length>0?a[0]:null);case 4:case"end":return e.stop()}}),e)})));return function(t,r){return e.apply(this,arguments)}}()}]),e}(),P=new C;function B(){var e={};return{memo:function(){var t=Object(w.a)(v.a.mark((function t(r,a){var n,o,c,i=arguments;return v.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(!(r in e)){for(n=i.length,o=new Array(n>2?n-2:0),c=2;c<n;c++)o[c-2]=i[c];e[r]=a.apply(void 0,o)}return t.abrupt("return",e[r]);case 3:case"end":return t.stop()}}),t)})));return function(e,r){return t.apply(this,arguments)}}(),reset:function(){for(var t in e)delete e[t]}}}var R=r(39);function L(e){return e.startsWith("#")?e:"#"+e}function T(e){return("0"+(255*e|0).toString(16)).slice(-2)}function I(e){return T(e.r)+T(e.g)+T(e.b)}function M(e){var t=function(e){return e.startsWith("#")?e.slice(1):e}(e);return new R.e(parseInt(t.slice(0,2),16)/256,parseInt(t.slice(2,4),16)/256,parseInt(t.slice(4,6),16)/256)}function _(e,t){return e.bodyShapes.includes(t)}function D(e){return _(e,l.WearableBodyShape.MALE)}function F(e){return _(e,l.WearableBodyShape.FEMALE)}function N(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:l.WearableBodyShape.MALE;switch(t){case l.WearableBodyShape.FEMALE:if(!e.data.representations.some(F))throw new Error('Could not find a BaseFemale representation for wearable="'.concat(e.id,'"'));return e.data.representations.find(F);case l.WearableBodyShape.MALE:if(!e.data.representations.some(D))throw new Error('Could not find a BaseMale representation for wearable="'.concat(e.id,'"'));return e.data.representations.find(D)}}function Y(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:l.WearableBodyShape.MALE;if(U(e,t))return N(e,t);if(e.data.representations.length>0)return e.data.representations[0];throw new Error('The wearable="'.concat(e.id,'" has no representation'))}function U(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:l.WearableBodyShape.MALE;try{return N(e,t),!0}catch(r){return!1}}function H(e){var t=e.contents.find((function(t){return t.key===e.mainFile}));if(!t)throw new Error("Could not find main file");return t.url}function V(e){return e.mainFile.endsWith("png")}function z(e,t){return e.find((function(e){return e.data.category===t}))||null}function X(e){switch(e){case l.WearableBodyShape.MALE:case l.WearableBodyShape.FEMALE:return[l.WearableCategory.EYEBROWS,l.WearableCategory.MOUTH,l.WearableCategory.EYES,l.WearableCategory.HAIR,l.WearableCategory.UPPER_BODY,l.WearableCategory.LOWER_BODY,l.WearableCategory.FEET]}}function G(e,t){switch(e){case l.WearableCategory.EYEBROWS:return t===l.WearableBodyShape.MALE?"urn:decentraland:off-chain:base-avatars:eyebrows_00":"urn:decentraland:off-chain:base-avatars:f_eyebrows_00";case l.WearableCategory.MOUTH:return t===l.WearableBodyShape.MALE?"urn:decentraland:off-chain:base-avatars:mouth_00":"urn:decentraland:off-chain:base-avatars:f_mouth_00";case l.WearableCategory.EYES:return t===l.WearableBodyShape.MALE?"urn:decentraland:off-chain:base-avatars:eyes_00":"urn:decentraland:off-chain:base-avatars:f_eyes_00";case l.WearableCategory.HAIR:return t===l.WearableBodyShape.MALE?"urn:decentraland:off-chain:base-avatars:casual_hair_01":"urn:decentraland:off-chain:base-avatars:standard_hair";case l.WearableCategory.UPPER_BODY:return t===l.WearableBodyShape.MALE?"urn:decentraland:off-chain:base-avatars:green_hoodie":"urn:decentraland:off-chain:base-avatars:f_sweater";case l.WearableCategory.LOWER_BODY:return t===l.WearableBodyShape.MALE?"urn:decentraland:off-chain:base-avatars:brown_pants":"urn:decentraland:off-chain:base-avatars:f_jeans";case l.WearableCategory.FEET:return t===l.WearableBodyShape.MALE?"urn:decentraland:off-chain:base-avatars:sneakers":"urn:decentraland:off-chain:base-avatars:bun_shoes";default:throw new Error('There is no default wearable for category="'.concat(e,'"'))}}function Z(e){var t=[l.WearableBodyShape.MALE,l.WearableBodyShape.FEMALE];return t.find((function(t){return e.data.representations.some((function(e){return e.bodyShapes.includes(t)}))}))||t[0]}function J(e){return!!e&&"emoteDataV0"in e}function K(e){var t=e?parseFloat(e):null;return null===t||isNaN(t)?null:1.8*Math.min(Math.max(t,0),100)/100+1}function q(e){switch(null===e||void 0===e?void 0:e.data.category){case l.WearableCategory.UPPER_BODY:return 2;case l.WearableCategory.SKIN:return 1.75;default:return 1.25}}var Q="default";function $(e,t){return ee.apply(this,arguments)}function ee(){return(ee=Object(w.a)(v.a.mark((function e(t,r){var a;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,te([t],r);case 2:if(1===(a=e.sent).length){e.next=5;break}throw new Error('Could not find wearable for urn="'.concat(t,'"'));case 5:return e.abrupt("return",a[0]);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}B();function te(e,t){return re.apply(this,arguments)}function re(){return(re=Object(w.a)(v.a.mark((function e(t,r){return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",P.fetchWearables(t,r));case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}var ae=B();function ne(e,t){return oe.apply(this,arguments)}function oe(){return(oe=Object(w.a)(v.a.mark((function e(t,r){return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",ae.memo(t,Object(w.a)(v.a.mark((function e(){var a;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t!==Q){e.next=2;break}return e.abrupt("return",null);case 2:return e.next=4,P.fetchProfile(t,r).then((function(e){return e&&e.avatars.length>0?e.avatars[0]:null})).catch((function(e){return console.log('Failed to load profile="'.concat(t,'"'),e)}));case 4:return a=e.sent,e.abrupt("return",a||null);case 6:case"end":return e.stop()}}),e)})))));case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ce(e){return ie.apply(this,arguments)}function ie(){return(ie=Object(w.a)(v.a.mark((function e(t){var r,a,n,o,c,i,u;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(r=t.contractAddress,a=t.itemId,n=t.tokenId,o=t.env,a||n){e.next=3;break}throw new Error("You need to provide an itemId or a tokenId");case 3:if(c=o===l.PreviewEnv.PROD?"matic":"mumbai",i="urn:decentraland:".concat(c,":collections-v2:").concat(r,":").concat(a),a||n){e.next=9;break}throw new Error("You must provide either tokenId or itemId");case 9:if(a||!n){e.next=14;break}return e.next=12,S.fetchNFT(r,n,o);case 12:u=e.sent,i=u.network!==l.Network.ETHEREUM?"urn:decentraland:".concat(c,":collections-v2:").concat(r,":").concat(u.itemId):u.image.split("contents/")[1].split("/thumbnail")[0];case 14:return e.abrupt("return",$(i,o));case 15:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ue(e,t,r){return se.apply(this,arguments)}function se(){return(se=Object(w.a)(v.a.mark((function e(t,r,a){var n,o,c,i,u,s,f;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,te([r].concat(Object(b.a)(t)),a);case 2:n=(n=e.sent).filter((function(e){return U(e,r)})),o=[],c=Object(p.a)(X(r)),e.prev=6,c.s();case 8:if((i=c.n()).done){e.next=20;break}if(u=i.value,z(n,u)){e.next=18;break}if(!(s=G(u,r))){e.next=17;break}o.push(s),e.next=18;break;case 17:throw new Error('Could not get default URN for category="'.concat(u,'"'));case 18:e.next=8;break;case 20:e.next=25;break;case 22:e.prev=22,e.t0=e.catch(6),c.e(e.t0);case 25:return e.prev=25,c.f(),e.finish(25);case 28:if(!(o.length>0)){e.next=33;break}return e.next=31,te(o,a);case 31:f=e.sent,n=[].concat(Object(b.a)(n),Object(b.a)(f));case 33:return e.abrupt("return",n);case 34:case"end":return e.stop()}}),e,null,[[6,22,25,28]])})))).apply(this,arguments)}function fe(){return fe=Object(w.a)(v.a.mark((function e(){var t,r,a,n,o,c,i,s,f,d,p,h,w,y,m,g,O,E,k,j,x,W,S,A,C,P,B,R,T=arguments;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=T.length>0&&void 0!==T[0]?T[0]:{},r=t.contractAddress,a=t.tokenId,n=t.itemId,o=t.env||l.PreviewEnv.PROD,c=Promise.resolve(),r&&(c=ce({contractAddress:r,tokenId:a,itemId:n,env:o})),i=t.profile?ne(t.profile,o):Promise.resolve(null),e.next=8,Promise.all([c,i]);case 8:if(s=e.sent,f=Object(u.a)(s,2),d=f[0],p=f[1],h=t.bodyShape||p&&p.avatar.bodyShape||(d?Z(d):l.WearableBodyShape.MALE),w=L(t.skin||p&&I(p.avatar.skin.color)||"cc9b76"),y=L(t.hair||p&&I(p.avatar.hair.color)||"000000"),m=L(t.eyes||p&&I(p.avatar.eyes.color)||"000000"),g=[].concat(Object(b.a)(p?p.avatar.wearables:[]),Object(b.a)(t.urns||[])),O=[],E=1.75,k=l.PreviewType.WEARABLE,j={gradient:t.transparentBackground?void 0:"radial-gradient(#676370, #18141b)"},!(g.length>0||d&&J(d)||t.profile===Q)){e.next=26;break}return k=l.PreviewType.AVATAR,e.next=25,ue(g,h,o);case 25:O=e.sent;case 26:return d&&(E=O.length>0?E:q(d),V(Y(d))&&k!==l.PreviewType.AVATAR&&(k=l.PreviewType.TEXTURE),x=l.Rarity.getGradient(d.rarity),W=Object(u.a)(x,2),S=W[0],A=W[1],C="radial-gradient(".concat(S,", ").concat(A,")"),j={image:d.thumbnail,gradient:C}),P=l.PreviewEmote.IDLE,t.emote&&Object.values(l.PreviewEmote).includes(t.emote)&&(P=t.emote),B=l.PreviewCamera.INTERACTIVE,t.camera&&Object.values(l.PreviewCamera).includes(t.camera)&&(B=t.camera),R="number"!==typeof t.autoRotateSpeed||isNaN(t.autoRotateSpeed)?.2:t.autoRotateSpeed,e.abrupt("return",{wearable:null!==d&&void 0!==d?d:void 0,wearables:O,bodyShape:h,skin:w,hair:y,eyes:m,type:k,background:j,emote:P,camera:B,autoRotateSpeed:R,offsetX:t.offsetX||0,offsetY:t.offsetY||0,offsetZ:t.offsetZ||0,zoom:t.zoom||E});case 33:case"end":return e.stop()}}),e)}))),fe.apply(this,arguments)}var le,de=r(279);function pe(e,t){var r=JSON.stringify({type:e,message:t});window.parent&&window.parent.postMessage(r,"*")}!function(e){e.LOAD="load",e.ERROR="error",e.UPDATE="update"}(le||(le={}));var be=function(){var e=Object(n.useState)(window.location.search.toString()),t=Object(u.a)(e,1)[0],r=Object(n.useMemo)((function(){var e=new URLSearchParams(t),r=e.get("autoRotateSpeed"),a=e.get("offsetX"),n=e.get("offsetY"),o=e.get("offsetZ"),c=e.get("bodyShape");return{contractAddress:e.get("contract"),tokenId:e.get("token"),itemId:e.get("item"),skin:e.get("skin"),hair:e.get("hair"),eyes:e.get("eyes"),emote:e.get("emote"),camera:e.get("camera"),transparentBackground:e.has("transparentBackground"),autoRotateSpeed:r?parseFloat(r):null,offsetX:a?parseFloat(a):null,offsetY:n?parseFloat(n):null,offsetZ:o?parseFloat(o):null,zoom:K(e.get("zoom")),bodyShape:"female"===c?l.WearableBodyShape.FEMALE:"male"===c?l.WearableBodyShape.MALE:null,urns:e.getAll("urn"),profile:e.get("profile"),env:Object.values(l.PreviewEnv).filter((function(e){return"string"===typeof e})).reduce((function(t,r){return r===e.get("env")?r:t}),l.PreviewEnv.PROD)}}),[t]),a=function(){var e=Object(n.useState)({}),t=Object(u.a)(e,2),r=t[0],a=t[1];return Object(n.useEffect)((function(){var e=window.onmessage;return window.onmessage=function(e){if(e.data&&e.data.type===le.UPDATE){var t=e.data;t.options&&"object"===typeof t.options&&a(t.options)}},function(){window.onmessage=e}}),[]),r}();return Object(n.useMemo)((function(){var e=Object.keys(a).filter((function(e){return"undefined"!==typeof a[e]&&null!==a[e]}));if(r&&e.length>0){var t,n=Object(de.a)({},r),o=Object(p.a)(e);try{for(o.s();!(t=o.n()).done;){var c=t.value,i=a[c];i&&(n[c]=i)}}catch(u){o.e(u)}finally{o.f()}return n}return r}),[r,a])};function he(){var e=be(),t=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],r=Object(n.useState)(!1),a=Object(u.a)(r,2),o=a[0],c=a[1],i=Object(n.useState)(null),s=Object(u.a)(i,2),f=s[0],l=s[1],d=Object(n.useState)(""),p=Object(u.a)(d,2),b=p[0],h=p[1];return Object(n.useEffect)((function(){c(!0),e().then((function(e){return l(e)})).catch((function(e){return h(e.message)})).finally((function(){return c(!1)}))}),t),[f,o,b]}((function(){return function(){return fe.apply(this,arguments)}(e)}),[e]),r=Object(u.a)(t,3);return[r[0],r[1],r[2]]}function ve(e){return function(t){return t.data.category===e}}function we(e){return function(t){return t.wearable.data.category===e||(t.wearable.data.hides||[]).includes(e)||(t.wearable.data.replaces||[]).includes(e)}}function ye(e){return!!e}function me(e){return!V(Y(e))}function ge(e){return!me(e)}function Oe(e){var t=e.find((function(e){return"body_shape"===e.wearable.data.category}));if(!t)throw new Error("Could not find a bodyShape when trying to hide base body parts");var r,a=e.some((function(e){return e.wearable.data.category===l.WearableCategory.SKIN})),n=a||e.some(we(l.WearableCategory.UPPER_BODY)),o=a||e.some(we(l.WearableCategory.LOWER_BODY)),c=a||e.some(we(l.WearableCategory.FEET)),i=a||e.some(we("head")),u=Object(p.a)(t.container.meshes);try{for(u.s();!(r=u.n()).done;){var s=r.value,f=s.name.toLowerCase();f.endsWith("ubody_basemesh")&&n&&s.setEnabled(!1),f.endsWith("lbody_basemesh")&&o&&s.setEnabled(!1),f.endsWith("feet_basemesh")&&c&&s.setEnabled(!1),f.endsWith("head")&&i&&s.setEnabled(!1),f.endsWith("head_basemesh")&&i&&s.setEnabled(!1),f.endsWith("mask_eyes")&&i&&s.setEnabled(!1),f.endsWith("mask_eyebrows")&&i&&s.setEnabled(!1),f.endsWith("mask_mouth")&&i&&s.setEnabled(!1)}}catch(d){u.e(d)}finally{u.f()}return t}var Ee=[l.WearableCategory.HELMET,l.WearableCategory.HAIR,l.WearableCategory.FACIAL_HAIR,l.WearableCategory.MOUTH,l.WearableCategory.EYEBROWS,l.WearableCategory.EYES,l.WearableCategory.UPPER_BODY,l.WearableCategory.LOWER_BODY,l.WearableCategory.FEET];function ke(e){var t=new Map,r=e.wearables.filter((function(e){return!J(e)}));e.wearable&&!J(e.wearable)&&(r=e.wearables.filter((function(t){if(e.wearable){var r=e.wearable.data,a=r.category,n=r.hides,o=r.replaces;if("skin"===t.data.category){if(Ee.includes(a))return!1;if(n&&n.includes("head"))return!1;if(o&&o.includes("head"))return!1}if(t.data.hides&&t.data.hides.includes(a))return!1;if(t.data.replaces&&t.data.replaces.includes(a))return!1}return!0})),r.push(e.wearable));var a,n=Object(p.a)(r);try{for(n.s();!(a=n.n()).done;){var o=a.value,c=o.data.category;U(o,e.bodyShape)&&t.set(c,o)}}catch(x){n.e(x)}finally{n.f()}var i=!1;r=r.filter((function(e){return t.get(e.data.category)===e})).reverse();var u,s=new Set,f=Object(p.a)(r);try{for(f.s();!(u=f.n()).done;){var d=u.value,h=d.data.category;if(!s.has(h)){for(var v=d.data.replaces||[],w=d.data.hides||[],y=Array.from(new Set([].concat(Object(b.a)(v),Object(b.a)(w)))),m=0,g=y;m<g.length;m++){var O=g[m];O!==h&&(t.delete(O),s.add(O))}d.data.category===l.WearableCategory.SKIN&&(i=!0)}}}catch(x){f.e(x)}finally{f.f()}if(i){var E,k=Object(p.a)(Ee);try{for(k.s();!(E=k.n()).done;){var j=E.value;t.delete(j)}}catch(x){k.e(x)}finally{k.f()}}return t}function je(e,t){e&&(e.useAutoRotationBehavior=!0,e.autoRotationBehavior&&(e.autoRotationBehavior.idleRotationSpeed=t.autoRotateSpeed))}var xe;r(380);function We(e,t){return Se.apply(this,arguments)}function Se(){return(Se=Object(w.a)(v.a.mark((function e(t,r){var a,n,o;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:xe&&xe.dispose(),xe=new R.h(t,!0,{preserveDrawingBuffer:!0,stencil:!0,antialias:!0}),(a=new R.m(xe)).autoClear=!0,a.clearColor=new R.f(0,0,0,0),a.preventDefaultOnPointerDown=!1,(n=new R.b("camera",0,0,0,new R.r(0,0,0),a)).mode=R.d.PERSPECTIVE_CAMERA,e.t0=r.camera,e.next=e.t0===l.PreviewCamera.INTERACTIVE?11:e.t0===l.PreviewCamera.STATIC?22:24;break;case 11:e.t1=r.type,e.next=e.t1===l.PreviewType.WEARABLE?14:e.t1===l.PreviewType.AVATAR?17:19;break;case 14:return je(n,r),n.position=new R.r(-2,2,2),e.abrupt("break",20);case 17:return n.position=new R.r(0,1,3.5),e.abrupt("break",20);case 19:console.warn('Unexpected preview.type="'.concat(r.type,'"'));case 20:return n.attachControl(t,!0),e.abrupt("break",24);case 22:return n.position=new R.r(0,1,3.5),e.abrupt("break",24);case 24:return o=new R.r(r.offsetX,r.offsetY,r.offsetZ),n.position.addInPlace(o),n.setTarget(o),n.lowerRadiusLimit=n.upperRadiusLimit=n.radius/r.zoom,new R.g("directional",new R.r(0,0,1),a).intensity=1,new R.i("top",new R.r(0,-1,0),a).intensity=1,new R.i("bottom",new R.r(0,1,0),a).intensity=1,new R.o("spot",new R.r(-2,2,2),new R.r(2,-2,-2),Math.PI/2,1e3,a).intensity=1,xe.runRenderLoop((function(){return a.render()})),e.abrupt("return",a);case 38:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Ae(e,t,r){return Ce.apply(this,arguments)}function Ce(){return(Ce=Object(w.a)(v.a.mark((function e(t,r,a){var n,o,c;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=r.id,o=N(r,a),!(c=o.contents.find((function(e){return e.key.toLowerCase().endsWith("_mask.png")})))){e.next=5;break}return e.abrupt("return",new Promise((function(e,r){var a=new R.q(n,c.url,!0,!1);a.onError=function(){return r(a.errorObject)},a.onSuccess=function(){e(a.texture)},a.run(t,(function(){return e(a.texture)}),r)})));case 5:return e.abrupt("return",null);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Pe(e,t,r){return Be.apply(this,arguments)}function Be(){return(Be=Object(w.a)(v.a.mark((function e(t,r,a){var n,o,c;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=r.id,o=N(r,a),!(c=o.contents.find((function(e){return e.key.toLowerCase().endsWith(".png")&&!e.key.toLowerCase().endsWith("_mask.png")})))){e.next=5;break}return e.abrupt("return",new Promise((function(e,r){var a=new R.q(n,c.url,!0,!1);a.onError=function(){return r(a.errorObject)},a.onSuccess=function(){e(a.texture)},a.run(t,(function(){return e(a.texture)}),r)})));case 5:return e.abrupt("return",null);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Re(e,t){return Le.apply(this,arguments)}function Le(){return Le=Object(w.a)(v.a.mark((function e(t,r){var a;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return a=function(){var e=Object(w.a)(v.a.mark((function e(r,a){return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",R.n.LoadAssetContainerAsync(r,"",t,null,a));case 1:case"end":return e.stop()}}),e)})));return function(t,r){return e.apply(this,arguments)}}(),e.prev=1,e.next=4,a(r,".glb");case 4:case 11:return e.abrupt("return",e.sent);case 7:return e.prev=7,e.t0=e.catch(1),e.next=11,a(r,".gltf");case 12:case"end":return e.stop()}}),e,null,[[1,7]])}))),Le.apply(this,arguments)}var Te=["hair_mat"],Ie=["avatarskin_mat","skin-f","skin_f"];function Me(e,t){return _e.apply(this,arguments)}function _e(){return _e=Object(w.a)(v.a.mark((function e(t,r){var a,n,o,c,i,u,s,f,d,b,h,w,y=arguments;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a=y.length>2&&void 0!==y[2]?y[2]:l.WearableBodyShape.MALE,n=y.length>3?y[3]:void 0,o=y.length>4?y[4]:void 0,!V(c=N(r,a))){e.next=6;break}throw new Error('The wearable="'.concat(r.id,'" is a texture'));case 6:return i=H(c),e.next=9,Re(t,i);case 9:u=e.sent,s=Object(p.a)(u.materials);try{for(d=function(){var e=f.value;if(Te.some((function(t){return e.name.toLowerCase().includes(t)})))if(o){var r=e;r.albedoColor=R.e.FromHexString(o),r.alpha=1}else e.alpha=0,t.removeMaterial(e);if(Ie.some((function(t){return e.name.toLowerCase().includes(t)})))if(n){var a=e;a.albedoColor=R.e.FromHexString(n),a.alpha=1}else e.alpha=0,t.removeMaterial(e)},s.s();!(f=s.n()).done;)d()}catch(v){s.e(v)}finally{s.f()}b=Object(p.a)(u.animationGroups);try{for(b.s();!(h=b.n()).done;)(w=h.value).stop(),w.reset(),w.dispose()}catch(v){b.e(v)}finally{b.f()}return e.abrupt("return",{container:u,wearable:r});case 15:case"end":return e.stop()}}),e)}))),_e.apply(this,arguments)}function De(e){var t,r=new R.j("parent",e),a=Object(p.a)(e.meshes);try{for(a.s();!(t=a.n()).done;){var n=t.value;n!==r&&n.setParent(r)}}catch(u){a.e(u)}finally{a.f()}!function(e){var t=e.getChildren().filter((function(e){return"__root__"!==e.id}));if(t.length>0){for(var r=t[0],a=r.getBoundingInfo(),n=a.boundingBox.minimumWorld.add(r.position),o=a.boundingBox.maximumWorld.add(r.position),c=1;c<t.length;c++){var i=t[c],u=(a=i.getBoundingInfo()).boundingBox.minimumWorld.add(i.position),s=a.boundingBox.maximumWorld.add(i.position);n=R.r.Minimize(n,u),o=R.r.Maximize(o,s)}e.setBoundingInfo(new R.c(n,o))}}(r);var o=r.getBoundingInfo().boundingBox.extendSize.length(),c=new R.r(1/o,1/o,1/o);r.scaling=c;var i=r.getBoundingInfo().boundingBox.center.multiply(c);r.position.subtractInPlace(i)}var Fe=[l.PreviewEmote.IDLE,l.PreviewEmote.MONEY,l.PreviewEmote.CLAP];function Ne(e){return Fe.includes(e)}function Ye(e){var t="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2157195817.commit-5065de7";t.endsWith("/")||(t+="/");var r="./emotes/".concat(e,".glb");return t.startsWith("http")?new URL(r,t).href:r}function Ue(e,t){return He.apply(this,arguments)}function He(){return(He=Object(w.a)(v.a.mark((function e(t,r){var a;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Re(t,r);case 2:if(0!==(a=e.sent).animationGroups.length){e.next=5;break}throw new Error("No animation groups found for emote with url=".concat(r));case 5:return e.abrupt("return",a);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Ve(e,t,r){return ze.apply(this,arguments)}function ze(){return(ze=Object(w.a)(v.a.mark((function e(t,r,a){var n,o;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=N(r,a.bodyShape),o=n.contents.find((function(e){return e.key===n.mainFile}))){e.next=4;break}throw new Error("Could not find a valid content in representation for wearable=".concat(r.id," and bodyShape=").concat(a.bodyShape));case 4:return e.abrupt("return",Ue(t,o.url));case 5:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Xe(e,t,r){return Ge.apply(this,arguments)}function Ge(){return Ge=Object(w.a)(v.a.mark((function e(t,r,a){var n,o,c,i,u,s,f,d,b,h,y,m,g,O,E,k,j,x,W,S;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(s=function(){return(s=Object(w.a)(v.a.mark((function e(){return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:a.camera!==l.PreviewCamera.STATIC&&je(t.cameras[0],a),o&&Xe(t,r,a);case 2:case"end":return e.stop()}}),e)})))).apply(this,arguments)},u=function(){return s.apply(this,arguments)},o=Ne(a.emote),!a.wearable||!J(a.wearable)){e.next=14;break}return e.prev=4,e.next=7,Ve(t,a.wearable,a);case 7:n=e.sent,o=!!(null===(c=a.wearable.emoteDataV0)||void 0===c?void 0:c.loop),e.next=14;break;case 11:e.prev=11,e.t0=e.catch(4),console.warn("Could not load emote=".concat(a.wearable.id));case 14:if(n){e.next=19;break}return i=Ye(a.emote),e.next=18,Ue(t,i);case 18:n=e.sent;case 19:e.prev=19,f=new R.a("emote",t),d=Object(p.a)(r),e.prev=22,d.s();case 24:if((b=d.n()).done){e.next=35;break}if(h=b.value,y=h.container.transformNodes.reduce((function(e,t){var r=e.get(t.id)||[];return r.push(t),e.set(t.id,r)}),new Map),!(n.animationGroups.length>0)){e.next=32;break}m=Object(p.a)(n.animationGroups[0].targetedAnimations);try{for(m.s();!(g=m.n()).done;)if(O=g.value,E=O.animation,k=O.target,(j=y.get(k.id))&&j.length>0){x=Object(p.a)(j);try{for(x.s();!(W=x.n()).done;)S=W.value,f.addTargetedAnimation(E,S)}catch(A){x.e(A)}finally{x.f()}}}catch(A){m.e(A)}finally{m.f()}e.next=33;break;case 32:throw new Error("No animationGroups found");case 33:e.next=24;break;case 35:e.next=40;break;case 37:e.prev=37,e.t1=e.catch(22),d.e(e.t1);case 40:return e.prev=40,d.f(),e.finish(40);case 43:f.play(),f.onAnimationEndObservable.addOnce(u),e.next=50;break;case 47:e.prev=47,e.t2=e.catch(19),console.warn("Could not play emote=".concat(a.emote),e.t2);case 50:case"end":return e.stop()}}),e,null,[[4,11],[19,47],[22,37,40,43]])}))),Ge.apply(this,arguments)}function Ze(e,t,r){return function(){var a=Object(w.a)(v.a.mark((function a(n){var o;return v.a.wrap((function(a){for(;;)switch(a.prev=a.next){case 0:if(!(o=t.find(ve(n)))){a.next=3;break}return a.abrupt("return",Promise.all([Pe(e,o,r),Ae(e,o,r)]));case 3:return a.abrupt("return",[null,null]);case 4:case"end":return a.stop()}}),a)})));return function(e){return a.apply(this,arguments)}}()}function Je(e,t,r){return Ke.apply(this,arguments)}function Ke(){return(Ke=Object(w.a)(v.a.mark((function e(t,r,a){var n,o,c,i,s,f;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=Ze(t,r,a),e.next=3,Promise.all([n(l.WearableCategory.EYES),n(l.WearableCategory.EYEBROWS),n(l.WearableCategory.MOUTH)]);case 3:return o=e.sent,c=Object(u.a)(o,3),i=c[0],s=c[1],f=c[2],e.abrupt("return",{eyes:i,eyebrows:s,mouth:f});case 9:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function qe(e,t,r,a,n,o){return Qe.apply(this,arguments)}function Qe(){return(Qe=Object(w.a)(v.a.mark((function e(t,r,a,n,o,c){var i,s,f,l,d,b,h,w,y,m,g,O;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:i=Object(p.a)(r.container.meshes);try{for(i.s();!(s=i.n()).done;)(f=s.value).name.toLowerCase().endsWith("mask_eyes")&&(l=Object(u.a)(a,2),d=l[0],b=l[1],d&&$e(t,"eyes",f,d,c.eyes,b,"#ffffff")),f.name.toLowerCase().endsWith("mask_eyebrows")&&(h=Object(u.a)(n,2),w=h[0],y=h[1],w&&$e(t,"eyebrows",f,w,c.hair,y,c.hair)),f.name.toLowerCase().endsWith("mask_mouth")&&(m=Object(u.a)(o,2),g=m[0],O=m[1],g&&$e(t,"mouth",f,g,c.skin,O,c.skin))}catch(v){i.e(v)}finally{i.f()}case 2:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function $e(e,t,r,a,n,o,c){var i=new R.p("".concat(t,"_standard_material"),e);i.alphaMode=R.l.PBRMATERIAL_ALPHABLEND,i.backFaceCulling=!0,a.hasAlpha=!0,i.sideOrientation=R.k.CW,i.diffuseTexture=a,i.diffuseColor=o?R.e.Black():M(c),o&&(i.emissiveTexture=o,i.emissiveColor=M(n)),r.material=i}function et(e){var t=function(e){var t,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:l.WearableBodyShape.MALE,a={},n=Object(p.a)(e);try{for(n.s();!(t=n.n()).done;){var o=t.value;try{var c,i=N(o,r),u=Object(p.a)(i.contents);try{for(u.s();!(c=u.n()).done;){var s=c.value;a[s.key]=s.url}}catch(f){u.e(f)}finally{u.f()}}catch(d){console.warn('Skipping generation of mappings for wearable="'.concat(o.id,'" since it lacks a representation for bodyShape="').concat(r,'"'));continue}}}catch(f){n.e(f)}finally{n.f()}return a}(e.wearable?[e.wearable].concat(Object(b.a)(e.wearables)):e.wearables,e.bodyShape);R.n.OnPluginActivatedObservable.add((function(e){"gltf"===e.name&&(e.preprocessUrlAsync=function(){var e=Object(w.a)(v.a.mark((function e(r){var a;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return"/content/contents/",a=r.split("/content/contents/"),e.abrupt("return",a.length>0&&a[1]?t[a[1]]:r);case 3:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}())}))}function tt(){return(tt=Object(w.a)(v.a.mark((function e(t,r){var a,n,o,c,i,u,s,f,d,b,h,w,y,m,g,O,E,k;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,We(t,r);case 2:if(a=e.sent,et(r),n=[],r.type!==l.PreviewType.AVATAR){e.next=28;break}o=ke(r),c=Array.from(o.values()),i=Object(p.a)(c.filter(me));try{for(i.s();!(u=i.n()).done;)s=u.value,f=Me(a,s,r.bodyShape,r.skin,r.hair).catch((function(e){console.warn(e.message)})),n.push(f)}catch(v){i.e(v)}finally{i.f()}return e.next=12,Promise.all(n);case 12:d=e.sent.filter(ye),b=Object(p.a)(d);try{for(b.s();!(h=b.n()).done;)h.value.container.addAllToScene()}catch(v){b.e(v)}finally{b.f()}return w=Oe(d),y=c.filter(ge),e.next=19,Je(a,y,r.bodyShape);case 19:return m=e.sent,g=m.eyes,O=m.eyebrows,E=m.mouth,qe(a,w,g,O,E,r),e.next=26,Xe(a,d,r);case 26:e.next=44;break;case 28:if(r.wearable){e.next=30;break}throw new Error("No wearable to render");case 30:return k=r.wearable,e.prev=31,e.next=34,Me(a,k,r.bodyShape,r.skin,r.hair);case 34:e.sent.container.addAllToScene(),e.next=44;break;case 38:return e.prev=38,e.t0=e.catch(31),e.next=42,Me(a,k,r.bodyShape===l.WearableBodyShape.MALE?l.WearableBodyShape.FEMALE:l.WearableBodyShape.MALE,r.skin,r.hair);case 42:e.sent.container.addAllToScene();case 44:De(a);case 45:case"end":return e.stop()}}),e,null,[[31,38]])})))).apply(this,arguments)}r(378);var rt=r(124),at=function(){var e=Object(n.useState)(""),t=Object(u.a)(e,2),r=t[0],a=t[1],o=function(){var e=Object(n.useState)({width:void 0,height:void 0}),t=Object(u.a)(e,2),r=t[0],a=t[1];return Object(n.useEffect)((function(){function e(){a({width:window.innerWidth,height:window.innerHeight})}return window.addEventListener("resize",e),e(),function(){return window.removeEventListener("resize",e)}}),[]),r}(),c=o.width,i=o.height,s=Object(n.useState)({}),d=Object(u.a)(s,2),p=d[0],b=d[1],h=Object(n.useState)(!1),v=Object(u.a)(h,2),w=v[0],y=v[1],m=Object(n.useState)(!0),g=Object(u.a)(m,2),O=g[0],E=g[1],k=Object(n.useState)(!1),j=Object(u.a)(k,2),x=j[0],W=j[1],S=Object(n.useRef)(null),A=he(),C=Object(u.a)(A,3),P=C[0],B=C[1],R=C[2],L=Object(n.useState)(""),T=Object(u.a)(L,2),I=T[0],M=T[1],_=Object(n.useState)(!0),D=Object(u.a)(_,2),F=D[0],N=D[1],Y=Object(n.useState)(!1),U=Object(u.a)(Y,2),H=U[0],V=U[1],z=r||R,X=(O||B)&&!z,G=!!I&&!F&&!X,Z=F&&!X;return Object(n.useEffect)((function(){S.current&&P&&(b({backgroundImage:P.background.gradient?P.background.gradient:void 0,opacity:1}),P.background.image&&M(P.background.image),P.type===l.PreviewType.TEXTURE?(N(!1),E(!1),W(!0)):function(e,t){return tt.apply(this,arguments)}(S.current,P).catch((function(e){return a(e.message)})).finally((function(){E(!1),W(!0)})))}),[S.current,P]),Object(n.useEffect)((function(){H||(x?(pe(le.LOAD),V(!0)):z&&(pe(le.ERROR,z),V(!0)))}),[x,z,H]),Object(n.useEffect)((function(){if(B){var e=!1;O||(E(!0),e=!0),H&&(V(!1),e=!0),e&&x&&W(!1)}}),[B,O,H,x]),Object(rt.jsxs)("div",{className:f()("Preview",{"is-dragging":w,"is-loading":X,"is-loaded":x,"is-3d":F&&(null===P||void 0===P?void 0:P.camera)===l.PreviewCamera.INTERACTIVE,"has-error":!!z}),style:p,children:[Object(rt.jsx)("img",{src:I,className:f()("thumbnail",{"is-visible":G}),alt:"preview"}),Object(rt.jsx)("canvas",{id:"wearable-preview",className:f()({"is-visible":Z}),width:c,height:i,ref:S,onMouseDown:function(){return y(F&&!z)},onMouseUp:function(){return y(!1)}}),z&&Object(rt.jsx)("div",{className:"error",children:z})]})},nt=o.a.memo(at);i.a.render(Object(rt.jsx)(o.a.StrictMode,{children:Object(rt.jsx)(nt,{})}),document.getElementById("root")),window.update=function(e,t){window.postMessage({type:"update",options:Object(a.a)({},e,t)})}}},[[381,1,2]]]);
2
- //# sourceMappingURL=main.8cd65464.chunk.js.map
1
+ (this["webpackJsonp@dcl/wearable-preview"]=this["webpackJsonp@dcl/wearable-preview"]||[]).push([[0],{284:function(e,t,r){},378:function(e,t,r){},381:function(e,t,r){"use strict";r.r(t);var a=r(111),n=r(50),o=r.n(n),c=r(278),i=r.n(c),u=(r(284),r(56)),s=r(221),f=r.n(s),l=r(21);var d,p=r(61),b=r(97),h=r(32),v=r.n(h),w=r(41),y=r(218),m=r(219);function g(e){return O.apply(this,arguments)}function O(){return(O=Object(w.a)(v.a.mark((function e(t){return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",new Promise((function(e){return setTimeout(e,t)})));case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function E(e){return k.apply(this,arguments)}function k(){return k=Object(w.a)(v.a.mark((function e(t){var r,a,n=arguments;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=n.length>1&&void 0!==n[1]?n[1]:3,e.prev=1,e.next=4,fetch(t);case 4:if((a=e.sent).ok){e.next=11;break}return e.t0=Error,e.next=9,a.text();case 9:throw e.t1=e.sent,new e.t0(e.t1);case 11:return e.abrupt("return",a.json());case 14:if(e.prev=14,e.t2=e.catch(1),!(r>0)){e.next=22;break}return e.next=19,g(100);case 19:return e.abrupt("return",E(t,r-1));case 22:throw e.t2;case 23:case"end":return e.stop()}}),e,null,[[1,14]])}))),k.apply(this,arguments)}var j,x=(d={},Object(a.a)(d,l.PreviewEnv.DEV,"https://nft-api.decentraland.io"),Object(a.a)(d,l.PreviewEnv.PROD,"https://nft-api.decentraland.org"),d),W=function(){function e(){Object(y.a)(this,e)}return Object(m.a)(e,[{key:"fetchItem",value:function(){var e=Object(w.a)(v.a.mark((function e(t,r,a){var n,o;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,E("".concat(x[a],"/v1/items?contractAddress=").concat(t,"&itemId=").concat(r));case 2:if(n=e.sent,0!==(o=n.data).length){e.next=6;break}throw new Error('Item not found for contractAddress="'.concat(t,'" itemId="').concat(r,'"'));case 6:return e.abrupt("return",o[0]);case 7:case"end":return e.stop()}}),e)})));return function(t,r,a){return e.apply(this,arguments)}}()},{key:"fetchNFT",value:function(){var e=Object(w.a)(v.a.mark((function e(t,r,a){var n,o;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,E("".concat(x[a],"/v1/nfts?contractAddress=").concat(t,"&tokenId=").concat(r));case 2:if(n=e.sent,0!==(o=n.data).length){e.next=6;break}throw new Error('NFT not found for contractAddress="'.concat(t,'" tokenId="').concat(r,'"'));case 6:return e.abrupt("return",o[0].nft);case 7:case"end":return e.stop()}}),e)})));return function(t,r,a){return e.apply(this,arguments)}}()}]),e}(),S=new W,A=(j={},Object(a.a)(j,l.PreviewEnv.DEV,"https://peer.decentraland.zone"),Object(a.a)(j,l.PreviewEnv.PROD,"https://peer.decentraland.org"),j),C=function(){function e(){Object(y.a)(this,e)}return Object(m.a)(e,[{key:"fetchWearables",value:function(){var e=Object(w.a)(v.a.mark((function e(t,r){var a,n;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(0!==t.length){e.next=2;break}return e.abrupt("return",[]);case 2:return e.next=4,E("".concat(A[r],"/lambdas/collections/wearables?").concat(t.map((function(e){return"wearableId=".concat(e)})).join("&")));case 4:if(a=e.sent,0!==(n=a.wearables).length){e.next=8;break}throw new Error('Wearables not found for urns="'.concat(t,'"'));case 8:return e.abrupt("return",n);case 9:case"end":return e.stop()}}),e)})));return function(t,r){return e.apply(this,arguments)}}()},{key:"fetchProfile",value:function(){var e=Object(w.a)(v.a.mark((function e(t,r){var a;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,E("".concat(A[r],"/lambdas/profiles?id=").concat(t));case 2:return a=e.sent,e.abrupt("return",a.length>0?a[0]:null);case 4:case"end":return e.stop()}}),e)})));return function(t,r){return e.apply(this,arguments)}}()}]),e}(),P=new C;function B(){var e={};return{memo:function(){var t=Object(w.a)(v.a.mark((function t(r,a){var n,o,c,i=arguments;return v.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(!(r in e)){for(n=i.length,o=new Array(n>2?n-2:0),c=2;c<n;c++)o[c-2]=i[c];e[r]=a.apply(void 0,o)}return t.abrupt("return",e[r]);case 3:case"end":return t.stop()}}),t)})));return function(e,r){return t.apply(this,arguments)}}(),reset:function(){for(var t in e)delete e[t]}}}var R=r(39);function L(e){return e.startsWith("#")?e:"#"+e}function T(e){return("0"+(255*e|0).toString(16)).slice(-2)}function I(e){return T(e.r)+T(e.g)+T(e.b)}function M(e){var t=function(e){return e.startsWith("#")?e.slice(1):e}(e);return new R.e(parseInt(t.slice(0,2),16)/256,parseInt(t.slice(2,4),16)/256,parseInt(t.slice(4,6),16)/256)}function _(e,t){return e.bodyShapes.includes(t)}function D(e){return _(e,l.WearableBodyShape.MALE)}function F(e){return _(e,l.WearableBodyShape.FEMALE)}function N(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:l.WearableBodyShape.MALE;switch(t){case l.WearableBodyShape.FEMALE:if(!e.data.representations.some(F))throw new Error('Could not find a BaseFemale representation for wearable="'.concat(e.id,'"'));return e.data.representations.find(F);case l.WearableBodyShape.MALE:if(!e.data.representations.some(D))throw new Error('Could not find a BaseMale representation for wearable="'.concat(e.id,'"'));return e.data.representations.find(D)}}function Y(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:l.WearableBodyShape.MALE;if(U(e,t))return N(e,t);if(e.data.representations.length>0)return e.data.representations[0];throw new Error('The wearable="'.concat(e.id,'" has no representation'))}function U(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:l.WearableBodyShape.MALE;try{return N(e,t),!0}catch(r){return!1}}function H(e){var t=e.contents.find((function(t){return t.key===e.mainFile}));if(!t)throw new Error("Could not find main file");return t.url}function V(e){return e.mainFile.endsWith("png")}function z(e,t){return e.find((function(e){return e.data.category===t}))||null}function X(e){switch(e){case l.WearableBodyShape.MALE:case l.WearableBodyShape.FEMALE:return[l.WearableCategory.EYEBROWS,l.WearableCategory.MOUTH,l.WearableCategory.EYES,l.WearableCategory.HAIR,l.WearableCategory.UPPER_BODY,l.WearableCategory.LOWER_BODY,l.WearableCategory.FEET]}}function G(e,t){switch(e){case l.WearableCategory.EYEBROWS:return t===l.WearableBodyShape.MALE?"urn:decentraland:off-chain:base-avatars:eyebrows_00":"urn:decentraland:off-chain:base-avatars:f_eyebrows_00";case l.WearableCategory.MOUTH:return t===l.WearableBodyShape.MALE?"urn:decentraland:off-chain:base-avatars:mouth_00":"urn:decentraland:off-chain:base-avatars:f_mouth_00";case l.WearableCategory.EYES:return t===l.WearableBodyShape.MALE?"urn:decentraland:off-chain:base-avatars:eyes_00":"urn:decentraland:off-chain:base-avatars:f_eyes_00";case l.WearableCategory.HAIR:return t===l.WearableBodyShape.MALE?"urn:decentraland:off-chain:base-avatars:casual_hair_01":"urn:decentraland:off-chain:base-avatars:standard_hair";case l.WearableCategory.UPPER_BODY:return t===l.WearableBodyShape.MALE?"urn:decentraland:off-chain:base-avatars:green_hoodie":"urn:decentraland:off-chain:base-avatars:f_sweater";case l.WearableCategory.LOWER_BODY:return t===l.WearableBodyShape.MALE?"urn:decentraland:off-chain:base-avatars:brown_pants":"urn:decentraland:off-chain:base-avatars:f_jeans";case l.WearableCategory.FEET:return t===l.WearableBodyShape.MALE?"urn:decentraland:off-chain:base-avatars:sneakers":"urn:decentraland:off-chain:base-avatars:bun_shoes";default:throw new Error('There is no default wearable for category="'.concat(e,'"'))}}function Z(e){var t=[l.WearableBodyShape.MALE,l.WearableBodyShape.FEMALE];return t.find((function(t){return e.data.representations.some((function(e){return e.bodyShapes.includes(t)}))}))||t[0]}function J(e){return!!e&&"emoteDataV0"in e}function K(e){var t=e?parseFloat(e):null;return null===t||isNaN(t)?null:1.8*Math.min(Math.max(t,0),100)/100+1}function q(e){switch(null===e||void 0===e?void 0:e.data.category){case l.WearableCategory.UPPER_BODY:return 2;case l.WearableCategory.SKIN:return 1.75;default:return 1.25}}var Q="default";function $(e,t){return ee.apply(this,arguments)}function ee(){return(ee=Object(w.a)(v.a.mark((function e(t,r){var a;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,te([t],r);case 2:if(1===(a=e.sent).length){e.next=5;break}throw new Error('Could not find wearable for urn="'.concat(t,'"'));case 5:return e.abrupt("return",a[0]);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}B();function te(e,t){return re.apply(this,arguments)}function re(){return(re=Object(w.a)(v.a.mark((function e(t,r){return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",P.fetchWearables(t,r));case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}var ae=B();function ne(e,t){return oe.apply(this,arguments)}function oe(){return(oe=Object(w.a)(v.a.mark((function e(t,r){return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",ae.memo(t,Object(w.a)(v.a.mark((function e(){var a;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t!==Q){e.next=2;break}return e.abrupt("return",null);case 2:return e.next=4,P.fetchProfile(t,r).then((function(e){return e&&e.avatars.length>0?e.avatars[0]:null})).catch((function(e){return console.log('Failed to load profile="'.concat(t,'"'),e)}));case 4:return a=e.sent,e.abrupt("return",a||null);case 6:case"end":return e.stop()}}),e)})))));case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ce(e){return ie.apply(this,arguments)}function ie(){return(ie=Object(w.a)(v.a.mark((function e(t){var r,a,n,o,c,i,u;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(r=t.contractAddress,a=t.itemId,n=t.tokenId,o=t.env,a||n){e.next=3;break}throw new Error("You need to provide an itemId or a tokenId");case 3:if(c=o===l.PreviewEnv.PROD?"matic":"mumbai",i="urn:decentraland:".concat(c,":collections-v2:").concat(r,":").concat(a),a||n){e.next=9;break}throw new Error("You must provide either tokenId or itemId");case 9:if(a||!n){e.next=14;break}return e.next=12,S.fetchNFT(r,n,o);case 12:u=e.sent,i=u.network!==l.Network.ETHEREUM?"urn:decentraland:".concat(c,":collections-v2:").concat(r,":").concat(u.itemId):u.image.split("contents/")[1].split("/thumbnail")[0];case 14:return e.abrupt("return",$(i,o));case 15:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ue(e,t,r){return se.apply(this,arguments)}function se(){return(se=Object(w.a)(v.a.mark((function e(t,r,a){var n,o,c,i,u,s,f;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,te([r].concat(Object(b.a)(t)),a);case 2:n=(n=e.sent).filter((function(e){return U(e,r)})),o=[],c=Object(p.a)(X(r)),e.prev=6,c.s();case 8:if((i=c.n()).done){e.next=20;break}if(u=i.value,z(n,u)){e.next=18;break}if(!(s=G(u,r))){e.next=17;break}o.push(s),e.next=18;break;case 17:throw new Error('Could not get default URN for category="'.concat(u,'"'));case 18:e.next=8;break;case 20:e.next=25;break;case 22:e.prev=22,e.t0=e.catch(6),c.e(e.t0);case 25:return e.prev=25,c.f(),e.finish(25);case 28:if(!(o.length>0)){e.next=33;break}return e.next=31,te(o,a);case 31:f=e.sent,n=[].concat(Object(b.a)(n),Object(b.a)(f));case 33:return e.abrupt("return",n);case 34:case"end":return e.stop()}}),e,null,[[6,22,25,28]])})))).apply(this,arguments)}function fe(){return fe=Object(w.a)(v.a.mark((function e(){var t,r,a,n,o,c,i,s,f,d,p,h,w,y,m,g,O,E,k,j,x,W,S,A,C,P,B,R,T=arguments;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=T.length>0&&void 0!==T[0]?T[0]:{},r=t.contractAddress,a=t.tokenId,n=t.itemId,o=t.env||l.PreviewEnv.PROD,c=Promise.resolve(),r&&(c=ce({contractAddress:r,tokenId:a,itemId:n,env:o})),i=t.profile?ne(t.profile,o):Promise.resolve(null),e.next=8,Promise.all([c,i]);case 8:if(s=e.sent,f=Object(u.a)(s,2),d=f[0],p=f[1],h=t.bodyShape||p&&p.avatar.bodyShape||(d?Z(d):l.WearableBodyShape.MALE),w=L(t.skin||p&&I(p.avatar.skin.color)||"cc9b76"),y=L(t.hair||p&&I(p.avatar.hair.color)||"000000"),m=L(t.eyes||p&&I(p.avatar.eyes.color)||"000000"),g=[].concat(Object(b.a)(p?p.avatar.wearables:[]),Object(b.a)(t.urns||[])),O=[],E=1.75,k=l.PreviewType.WEARABLE,j={gradient:t.transparentBackground?void 0:"radial-gradient(#676370, #18141b)"},!(g.length>0||d&&J(d)||t.profile===Q)){e.next=26;break}return k=l.PreviewType.AVATAR,e.next=25,ue(g,h,o);case 25:O=e.sent;case 26:return d&&(E=O.length>0?E:q(d),V(Y(d))&&k!==l.PreviewType.AVATAR&&(k=l.PreviewType.TEXTURE),x=l.Rarity.getGradient(d.rarity),W=Object(u.a)(x,2),S=W[0],A=W[1],C="radial-gradient(".concat(S,", ").concat(A,")"),j={image:d.thumbnail,gradient:C}),P=l.PreviewEmote.IDLE,t.emote&&Object.values(l.PreviewEmote).includes(t.emote)&&(P=t.emote),B=l.PreviewCamera.INTERACTIVE,t.camera&&Object.values(l.PreviewCamera).includes(t.camera)&&(B=t.camera),R="number"!==typeof t.autoRotateSpeed||isNaN(t.autoRotateSpeed)?.2:t.autoRotateSpeed,e.abrupt("return",{wearable:null!==d&&void 0!==d?d:void 0,wearables:O,bodyShape:h,skin:w,hair:y,eyes:m,type:k,background:j,emote:P,camera:B,autoRotateSpeed:R,offsetX:t.offsetX||0,offsetY:t.offsetY||0,offsetZ:t.offsetZ||0,zoom:t.zoom||E});case 33:case"end":return e.stop()}}),e)}))),fe.apply(this,arguments)}var le,de=r(279);function pe(e,t){var r=JSON.stringify({type:e,message:t});window.parent&&window.parent.postMessage(r,"*")}!function(e){e.LOAD="load",e.ERROR="error",e.UPDATE="update"}(le||(le={}));var be=function(){var e=Object(n.useState)(window.location.search.toString()),t=Object(u.a)(e,1)[0],r=Object(n.useMemo)((function(){var e=new URLSearchParams(t),r=e.get("autoRotateSpeed"),a=e.get("offsetX"),n=e.get("offsetY"),o=e.get("offsetZ"),c=e.get("bodyShape");return{contractAddress:e.get("contract"),tokenId:e.get("token"),itemId:e.get("item"),skin:e.get("skin"),hair:e.get("hair"),eyes:e.get("eyes"),emote:e.get("emote"),camera:e.get("camera"),transparentBackground:e.has("transparentBackground"),autoRotateSpeed:r?parseFloat(r):null,offsetX:a?parseFloat(a):null,offsetY:n?parseFloat(n):null,offsetZ:o?parseFloat(o):null,zoom:K(e.get("zoom")),bodyShape:"female"===c?l.WearableBodyShape.FEMALE:"male"===c?l.WearableBodyShape.MALE:null,urns:e.getAll("urn"),profile:e.get("profile"),env:Object.values(l.PreviewEnv).filter((function(e){return"string"===typeof e})).reduce((function(t,r){return r===e.get("env")?r:t}),l.PreviewEnv.PROD)}}),[t]),a=function(){var e=Object(n.useState)({}),t=Object(u.a)(e,2),r=t[0],a=t[1];return Object(n.useEffect)((function(){var e=window.onmessage;return window.onmessage=function(e){if(e.data&&e.data.type===le.UPDATE){var t=e.data;t.options&&"object"===typeof t.options&&a(t.options)}},function(){window.onmessage=e}}),[]),r}();return Object(n.useMemo)((function(){var e=Object.keys(a).filter((function(e){return"undefined"!==typeof a[e]&&null!==a[e]}));if(r&&e.length>0){var t,n=Object(de.a)({},r),o=Object(p.a)(e);try{for(o.s();!(t=o.n()).done;){var c=t.value,i=a[c];i&&(n[c]=i)}}catch(u){o.e(u)}finally{o.f()}return n}return r}),[r,a])};function he(){var e=be(),t=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],r=Object(n.useState)(!1),a=Object(u.a)(r,2),o=a[0],c=a[1],i=Object(n.useState)(null),s=Object(u.a)(i,2),f=s[0],l=s[1],d=Object(n.useState)(""),p=Object(u.a)(d,2),b=p[0],h=p[1];return Object(n.useEffect)((function(){c(!0),e().then((function(e){return l(e)})).catch((function(e){return h(e.message)})).finally((function(){return c(!1)}))}),t),[f,o,b]}((function(){return function(){return fe.apply(this,arguments)}(e)}),[e]),r=Object(u.a)(t,3);return[r[0],r[1],r[2]]}function ve(e){return function(t){return t.data.category===e}}function we(e){return function(t){return t.wearable.data.category===e||(t.wearable.data.hides||[]).includes(e)||(t.wearable.data.replaces||[]).includes(e)}}function ye(e){return!!e}function me(e){return!V(Y(e))}function ge(e){return!me(e)}function Oe(e){var t=e.find((function(e){return"body_shape"===e.wearable.data.category}));if(!t)throw new Error("Could not find a bodyShape when trying to hide base body parts");var r,a=e.some((function(e){return e.wearable.data.category===l.WearableCategory.SKIN})),n=a||e.some(we(l.WearableCategory.UPPER_BODY)),o=a||e.some(we(l.WearableCategory.LOWER_BODY)),c=a||e.some(we(l.WearableCategory.FEET)),i=a||e.some(we("head")),u=Object(p.a)(t.container.meshes);try{for(u.s();!(r=u.n()).done;){var s=r.value,f=s.name.toLowerCase();f.endsWith("ubody_basemesh")&&n&&s.setEnabled(!1),f.endsWith("lbody_basemesh")&&o&&s.setEnabled(!1),f.endsWith("feet_basemesh")&&c&&s.setEnabled(!1),f.endsWith("head")&&i&&s.setEnabled(!1),f.endsWith("head_basemesh")&&i&&s.setEnabled(!1),f.endsWith("mask_eyes")&&i&&s.setEnabled(!1),f.endsWith("mask_eyebrows")&&i&&s.setEnabled(!1),f.endsWith("mask_mouth")&&i&&s.setEnabled(!1)}}catch(d){u.e(d)}finally{u.f()}return t}var Ee=[l.WearableCategory.HELMET,l.WearableCategory.HAIR,l.WearableCategory.FACIAL_HAIR,l.WearableCategory.MOUTH,l.WearableCategory.EYEBROWS,l.WearableCategory.EYES,l.WearableCategory.UPPER_BODY,l.WearableCategory.LOWER_BODY,l.WearableCategory.FEET];function ke(e){var t=new Map,r=e.wearables.filter((function(e){return!J(e)}));e.wearable&&!J(e.wearable)&&(r=e.wearables.filter((function(t){if(e.wearable){var r=e.wearable.data,a=r.category,n=r.hides,o=r.replaces;if("skin"===t.data.category){if(Ee.includes(a))return!1;if(n&&n.includes("head"))return!1;if(o&&o.includes("head"))return!1}if(t.data.hides&&t.data.hides.includes(a))return!1;if(t.data.replaces&&t.data.replaces.includes(a))return!1}return!0})),r.push(e.wearable));var a,n=Object(p.a)(r);try{for(n.s();!(a=n.n()).done;){var o=a.value,c=o.data.category;U(o,e.bodyShape)&&t.set(c,o)}}catch(x){n.e(x)}finally{n.f()}var i=!1;r=r.filter((function(e){return t.get(e.data.category)===e})).reverse();var u,s=new Set,f=Object(p.a)(r);try{for(f.s();!(u=f.n()).done;){var d=u.value,h=d.data.category;if(!s.has(h)){for(var v=d.data.replaces||[],w=d.data.hides||[],y=Array.from(new Set([].concat(Object(b.a)(v),Object(b.a)(w)))),m=0,g=y;m<g.length;m++){var O=g[m];O!==h&&(t.delete(O),s.add(O))}d.data.category===l.WearableCategory.SKIN&&(i=!0)}}}catch(x){f.e(x)}finally{f.f()}if(i){var E,k=Object(p.a)(Ee);try{for(k.s();!(E=k.n()).done;){var j=E.value;t.delete(j)}}catch(x){k.e(x)}finally{k.f()}}return t}function je(e,t){e&&(e.useAutoRotationBehavior=!0,e.autoRotationBehavior&&(e.autoRotationBehavior.idleRotationSpeed=t.autoRotateSpeed))}var xe;r(380);function We(e,t){return Se.apply(this,arguments)}function Se(){return(Se=Object(w.a)(v.a.mark((function e(t,r){var a,n,o;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:xe&&xe.dispose(),xe=new R.h(t,!0,{preserveDrawingBuffer:!0,stencil:!0,antialias:!0}),(a=new R.m(xe)).autoClear=!0,a.clearColor=new R.f(0,0,0,0),a.preventDefaultOnPointerDown=!1,(n=new R.b("camera",0,0,0,new R.r(0,0,0),a)).mode=R.d.PERSPECTIVE_CAMERA,e.t0=r.camera,e.next=e.t0===l.PreviewCamera.INTERACTIVE?11:e.t0===l.PreviewCamera.STATIC?22:24;break;case 11:e.t1=r.type,e.next=e.t1===l.PreviewType.WEARABLE?14:e.t1===l.PreviewType.AVATAR?17:19;break;case 14:return je(n,r),n.position=new R.r(-2,2,2),e.abrupt("break",20);case 17:return n.position=new R.r(0,1,3.5),e.abrupt("break",20);case 19:console.warn('Unexpected preview.type="'.concat(r.type,'"'));case 20:return n.attachControl(t,!0),e.abrupt("break",24);case 22:return n.position=new R.r(0,1,3.5),e.abrupt("break",24);case 24:return o=new R.r(r.offsetX,r.offsetY,r.offsetZ),n.position.addInPlace(o),n.setTarget(o),n.lowerRadiusLimit=n.upperRadiusLimit=n.radius/r.zoom,new R.g("directional",new R.r(0,0,1),a).intensity=1,new R.i("top",new R.r(0,-1,0),a).intensity=1,new R.i("bottom",new R.r(0,1,0),a).intensity=1,new R.o("spot",new R.r(-2,2,2),new R.r(2,-2,-2),Math.PI/2,1e3,a).intensity=1,xe.runRenderLoop((function(){return a.render()})),e.abrupt("return",a);case 38:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Ae(e,t,r){return Ce.apply(this,arguments)}function Ce(){return(Ce=Object(w.a)(v.a.mark((function e(t,r,a){var n,o,c;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=r.id,o=N(r,a),!(c=o.contents.find((function(e){return e.key.toLowerCase().endsWith("_mask.png")})))){e.next=5;break}return e.abrupt("return",new Promise((function(e,r){var a=new R.q(n,c.url,!0,!1);a.onError=function(){return r(a.errorObject)},a.onSuccess=function(){e(a.texture)},a.run(t,(function(){return e(a.texture)}),r)})));case 5:return e.abrupt("return",null);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Pe(e,t,r){return Be.apply(this,arguments)}function Be(){return(Be=Object(w.a)(v.a.mark((function e(t,r,a){var n,o,c;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=r.id,o=N(r,a),!(c=o.contents.find((function(e){return e.key.toLowerCase().endsWith(".png")&&!e.key.toLowerCase().endsWith("_mask.png")})))){e.next=5;break}return e.abrupt("return",new Promise((function(e,r){var a=new R.q(n,c.url,!0,!1);a.onError=function(){return r(a.errorObject)},a.onSuccess=function(){e(a.texture)},a.run(t,(function(){return e(a.texture)}),r)})));case 5:return e.abrupt("return",null);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Re(e,t){return Le.apply(this,arguments)}function Le(){return Le=Object(w.a)(v.a.mark((function e(t,r){var a;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return a=function(){var e=Object(w.a)(v.a.mark((function e(r,a){return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",R.n.LoadAssetContainerAsync(r,"",t,null,a));case 1:case"end":return e.stop()}}),e)})));return function(t,r){return e.apply(this,arguments)}}(),e.prev=1,e.next=4,a(r,".glb");case 4:case 11:return e.abrupt("return",e.sent);case 7:return e.prev=7,e.t0=e.catch(1),e.next=11,a(r,".gltf");case 12:case"end":return e.stop()}}),e,null,[[1,7]])}))),Le.apply(this,arguments)}var Te=["hair_mat"],Ie=["avatarskin_mat","skin-f","skin_f"];function Me(e,t){return _e.apply(this,arguments)}function _e(){return _e=Object(w.a)(v.a.mark((function e(t,r){var a,n,o,c,i,u,s,f,d,b,h,w,y=arguments;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a=y.length>2&&void 0!==y[2]?y[2]:l.WearableBodyShape.MALE,n=y.length>3?y[3]:void 0,o=y.length>4?y[4]:void 0,!V(c=N(r,a))){e.next=6;break}throw new Error('The wearable="'.concat(r.id,'" is a texture'));case 6:return i=H(c),e.next=9,Re(t,i);case 9:u=e.sent,s=Object(p.a)(u.materials);try{for(d=function(){var e=f.value;if(Te.some((function(t){return e.name.toLowerCase().includes(t)})))if(o){var r=e;r.albedoColor=R.e.FromHexString(o),r.alpha=1}else e.alpha=0,t.removeMaterial(e);if(Ie.some((function(t){return e.name.toLowerCase().includes(t)})))if(n){var a=e;a.albedoColor=R.e.FromHexString(n),a.alpha=1}else e.alpha=0,t.removeMaterial(e)},s.s();!(f=s.n()).done;)d()}catch(v){s.e(v)}finally{s.f()}b=Object(p.a)(u.animationGroups);try{for(b.s();!(h=b.n()).done;)(w=h.value).stop(),w.reset(),w.dispose()}catch(v){b.e(v)}finally{b.f()}return e.abrupt("return",{container:u,wearable:r});case 15:case"end":return e.stop()}}),e)}))),_e.apply(this,arguments)}function De(e){var t,r=new R.j("parent",e),a=Object(p.a)(e.meshes);try{for(a.s();!(t=a.n()).done;){var n=t.value;n!==r&&n.setParent(r)}}catch(u){a.e(u)}finally{a.f()}!function(e){var t=e.getChildren().filter((function(e){return"__root__"!==e.id}));if(t.length>0){for(var r=t[0],a=r.getBoundingInfo(),n=a.boundingBox.minimumWorld.add(r.position),o=a.boundingBox.maximumWorld.add(r.position),c=1;c<t.length;c++){var i=t[c],u=(a=i.getBoundingInfo()).boundingBox.minimumWorld.add(i.position),s=a.boundingBox.maximumWorld.add(i.position);n=R.r.Minimize(n,u),o=R.r.Maximize(o,s)}e.setBoundingInfo(new R.c(n,o))}}(r);var o=r.getBoundingInfo().boundingBox.extendSize.length(),c=new R.r(1/o,1/o,1/o);r.scaling=c;var i=r.getBoundingInfo().boundingBox.center.multiply(c);r.position.subtractInPlace(i)}var Fe=[l.PreviewEmote.IDLE,l.PreviewEmote.MONEY,l.PreviewEmote.CLAP];function Ne(e){return Fe.includes(e)}function Ye(e){var t="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2157234427.commit-a328568";t.endsWith("/")||(t+="/");var r="./emotes/".concat(e,".glb");return t.startsWith("http")?new URL(r,t).href:r}function Ue(e,t){return He.apply(this,arguments)}function He(){return(He=Object(w.a)(v.a.mark((function e(t,r){var a;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Re(t,r);case 2:if(0!==(a=e.sent).animationGroups.length){e.next=5;break}throw new Error("No animation groups found for emote with url=".concat(r));case 5:return e.abrupt("return",a);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Ve(e,t,r){return ze.apply(this,arguments)}function ze(){return(ze=Object(w.a)(v.a.mark((function e(t,r,a){var n,o;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=N(r,a.bodyShape),o=n.contents.find((function(e){return e.key===n.mainFile}))){e.next=4;break}throw new Error("Could not find a valid content in representation for wearable=".concat(r.id," and bodyShape=").concat(a.bodyShape));case 4:return e.abrupt("return",Ue(t,o.url));case 5:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Xe(e,t,r){return Ge.apply(this,arguments)}function Ge(){return Ge=Object(w.a)(v.a.mark((function e(t,r,a){var n,o,c,i,u,s,f,d,b,h,y,m,g,O,E,k,j,x,W,S;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(s=function(){return(s=Object(w.a)(v.a.mark((function e(){return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:a.camera!==l.PreviewCamera.STATIC&&je(t.cameras[0],a),o&&Xe(t,r,a);case 2:case"end":return e.stop()}}),e)})))).apply(this,arguments)},u=function(){return s.apply(this,arguments)},o=Ne(a.emote),!a.wearable||!J(a.wearable)){e.next=14;break}return e.prev=4,e.next=7,Ve(t,a.wearable,a);case 7:n=e.sent,o=!!(null===(c=a.wearable.emoteDataV0)||void 0===c?void 0:c.loop),e.next=14;break;case 11:e.prev=11,e.t0=e.catch(4),console.warn("Could not load emote=".concat(a.wearable.id));case 14:if(n){e.next=19;break}return i=Ye(a.emote),e.next=18,Ue(t,i);case 18:n=e.sent;case 19:e.prev=19,f=new R.a("emote",t),d=Object(p.a)(r),e.prev=22,d.s();case 24:if((b=d.n()).done){e.next=35;break}if(h=b.value,y=h.container.transformNodes.reduce((function(e,t){var r=e.get(t.id)||[];return r.push(t),e.set(t.id,r)}),new Map),!(n.animationGroups.length>0)){e.next=32;break}m=Object(p.a)(n.animationGroups[0].targetedAnimations);try{for(m.s();!(g=m.n()).done;)if(O=g.value,E=O.animation,k=O.target,(j=y.get(k.id))&&j.length>0){x=Object(p.a)(j);try{for(x.s();!(W=x.n()).done;)S=W.value,f.addTargetedAnimation(E,S)}catch(A){x.e(A)}finally{x.f()}}}catch(A){m.e(A)}finally{m.f()}e.next=33;break;case 32:throw new Error("No animationGroups found");case 33:e.next=24;break;case 35:e.next=40;break;case 37:e.prev=37,e.t1=e.catch(22),d.e(e.t1);case 40:return e.prev=40,d.f(),e.finish(40);case 43:f.play(),f.onAnimationEndObservable.addOnce(u),e.next=50;break;case 47:e.prev=47,e.t2=e.catch(19),console.warn("Could not play emote=".concat(a.emote),e.t2);case 50:case"end":return e.stop()}}),e,null,[[4,11],[19,47],[22,37,40,43]])}))),Ge.apply(this,arguments)}function Ze(e,t,r){return function(){var a=Object(w.a)(v.a.mark((function a(n){var o;return v.a.wrap((function(a){for(;;)switch(a.prev=a.next){case 0:if(!(o=t.find(ve(n)))){a.next=3;break}return a.abrupt("return",Promise.all([Pe(e,o,r),Ae(e,o,r)]));case 3:return a.abrupt("return",[null,null]);case 4:case"end":return a.stop()}}),a)})));return function(e){return a.apply(this,arguments)}}()}function Je(e,t,r){return Ke.apply(this,arguments)}function Ke(){return(Ke=Object(w.a)(v.a.mark((function e(t,r,a){var n,o,c,i,s,f;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=Ze(t,r,a),e.next=3,Promise.all([n(l.WearableCategory.EYES),n(l.WearableCategory.EYEBROWS),n(l.WearableCategory.MOUTH)]);case 3:return o=e.sent,c=Object(u.a)(o,3),i=c[0],s=c[1],f=c[2],e.abrupt("return",{eyes:i,eyebrows:s,mouth:f});case 9:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function qe(e,t,r,a,n,o){return Qe.apply(this,arguments)}function Qe(){return(Qe=Object(w.a)(v.a.mark((function e(t,r,a,n,o,c){var i,s,f,l,d,b,h,w,y,m,g,O;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:i=Object(p.a)(r.container.meshes);try{for(i.s();!(s=i.n()).done;)(f=s.value).name.toLowerCase().endsWith("mask_eyes")&&(l=Object(u.a)(a,2),d=l[0],b=l[1],d&&$e(t,"eyes",f,d,c.eyes,b,"#ffffff")),f.name.toLowerCase().endsWith("mask_eyebrows")&&(h=Object(u.a)(n,2),w=h[0],y=h[1],w&&$e(t,"eyebrows",f,w,c.hair,y,c.hair)),f.name.toLowerCase().endsWith("mask_mouth")&&(m=Object(u.a)(o,2),g=m[0],O=m[1],g&&$e(t,"mouth",f,g,c.skin,O,c.skin))}catch(v){i.e(v)}finally{i.f()}case 2:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function $e(e,t,r,a,n,o,c){var i=new R.p("".concat(t,"_standard_material"),e);i.alphaMode=R.l.PBRMATERIAL_ALPHABLEND,i.backFaceCulling=!0,a.hasAlpha=!0,i.sideOrientation=R.k.CW,i.diffuseTexture=a,i.diffuseColor=o?R.e.Black():M(c),o&&(i.emissiveTexture=o,i.emissiveColor=M(n)),r.material=i}function et(e){var t=function(e){var t,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:l.WearableBodyShape.MALE,a={},n=Object(p.a)(e);try{for(n.s();!(t=n.n()).done;){var o=t.value;try{var c,i=N(o,r),u=Object(p.a)(i.contents);try{for(u.s();!(c=u.n()).done;){var s=c.value;a[s.key]=s.url}}catch(f){u.e(f)}finally{u.f()}}catch(d){console.warn('Skipping generation of mappings for wearable="'.concat(o.id,'" since it lacks a representation for bodyShape="').concat(r,'"'));continue}}}catch(f){n.e(f)}finally{n.f()}return a}(e.wearable?[e.wearable].concat(Object(b.a)(e.wearables)):e.wearables,e.bodyShape);R.n.OnPluginActivatedObservable.add((function(e){"gltf"===e.name&&(e.preprocessUrlAsync=function(){var e=Object(w.a)(v.a.mark((function e(r){var a;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return"/content/contents/",a=r.split("/content/contents/"),e.abrupt("return",a.length>0&&a[1]?t[a[1]]:r);case 3:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}())}))}function tt(){return(tt=Object(w.a)(v.a.mark((function e(t,r){var a,n,o,c,i,u,s,f,d,b,h,w,y,m,g,O,E,k;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,We(t,r);case 2:if(a=e.sent,et(r),n=[],r.type!==l.PreviewType.AVATAR){e.next=28;break}o=ke(r),c=Array.from(o.values()),i=Object(p.a)(c.filter(me));try{for(i.s();!(u=i.n()).done;)s=u.value,f=Me(a,s,r.bodyShape,r.skin,r.hair).catch((function(e){console.warn(e.message)})),n.push(f)}catch(v){i.e(v)}finally{i.f()}return e.next=12,Promise.all(n);case 12:d=e.sent.filter(ye),b=Object(p.a)(d);try{for(b.s();!(h=b.n()).done;)h.value.container.addAllToScene()}catch(v){b.e(v)}finally{b.f()}return w=Oe(d),y=c.filter(ge),e.next=19,Je(a,y,r.bodyShape);case 19:return m=e.sent,g=m.eyes,O=m.eyebrows,E=m.mouth,qe(a,w,g,O,E,r),e.next=26,Xe(a,d,r);case 26:e.next=44;break;case 28:if(r.wearable){e.next=30;break}throw new Error("No wearable to render");case 30:return k=r.wearable,e.prev=31,e.next=34,Me(a,k,r.bodyShape,r.skin,r.hair);case 34:e.sent.container.addAllToScene(),e.next=44;break;case 38:return e.prev=38,e.t0=e.catch(31),e.next=42,Me(a,k,r.bodyShape===l.WearableBodyShape.MALE?l.WearableBodyShape.FEMALE:l.WearableBodyShape.MALE,r.skin,r.hair);case 42:e.sent.container.addAllToScene();case 44:De(a);case 45:case"end":return e.stop()}}),e,null,[[31,38]])})))).apply(this,arguments)}r(378);var rt=r(124),at=function(){var e=Object(n.useState)(""),t=Object(u.a)(e,2),r=t[0],a=t[1],o=function(){var e=Object(n.useState)({width:void 0,height:void 0}),t=Object(u.a)(e,2),r=t[0],a=t[1];return Object(n.useEffect)((function(){function e(){a({width:window.innerWidth,height:window.innerHeight})}return window.addEventListener("resize",e),e(),function(){return window.removeEventListener("resize",e)}}),[]),r}(),c=o.width,i=o.height,s=Object(n.useState)({}),d=Object(u.a)(s,2),p=d[0],b=d[1],h=Object(n.useState)(!1),v=Object(u.a)(h,2),w=v[0],y=v[1],m=Object(n.useState)(!0),g=Object(u.a)(m,2),O=g[0],E=g[1],k=Object(n.useState)(!1),j=Object(u.a)(k,2),x=j[0],W=j[1],S=Object(n.useRef)(null),A=he(),C=Object(u.a)(A,3),P=C[0],B=C[1],R=C[2],L=Object(n.useState)(""),T=Object(u.a)(L,2),I=T[0],M=T[1],_=Object(n.useState)(!0),D=Object(u.a)(_,2),F=D[0],N=D[1],Y=Object(n.useState)(!1),U=Object(u.a)(Y,2),H=U[0],V=U[1],z=r||R,X=(O||B)&&!z,G=!!I&&!F&&!X,Z=F&&!X;return Object(n.useEffect)((function(){S.current&&P&&(b({backgroundImage:P.background.gradient?P.background.gradient:void 0,opacity:1}),P.background.image&&M(P.background.image),P.type===l.PreviewType.TEXTURE?(N(!1),E(!1),W(!0)):function(e,t){return tt.apply(this,arguments)}(S.current,P).catch((function(e){return a(e.message)})).finally((function(){E(!1),W(!0)})))}),[S.current,P]),Object(n.useEffect)((function(){H||(x?(pe(le.LOAD),V(!0)):z&&(pe(le.ERROR,z),V(!0)))}),[x,z,H]),Object(n.useEffect)((function(){if(B){var e=!1;O||(E(!0),e=!0),H&&(V(!1),e=!0),e&&x&&W(!1)}}),[B,O,H,x]),Object(rt.jsxs)("div",{className:f()("Preview",{"is-dragging":w,"is-loading":X,"is-loaded":x,"is-3d":F&&(null===P||void 0===P?void 0:P.camera)===l.PreviewCamera.INTERACTIVE,"has-error":!!z}),style:p,children:[Object(rt.jsx)("img",{src:I,className:f()("thumbnail",{"is-visible":G}),alt:"preview"}),Object(rt.jsx)("canvas",{id:"wearable-preview",className:f()({"is-visible":Z}),width:c,height:i,ref:S,onMouseDown:function(){return y(F&&!z)},onMouseUp:function(){return y(!1)}}),z&&Object(rt.jsx)("div",{className:"error",children:z})]})},nt=o.a.memo(at);i.a.render(Object(rt.jsx)(o.a.StrictMode,{children:Object(rt.jsx)(nt,{})}),document.getElementById("root")),window.update=function(e,t){window.postMessage({type:"update",options:Object(a.a)({},e,t)})}}},[[381,1,2]]]);
2
+ //# sourceMappingURL=main.0f2e7470.chunk.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["lib/sleep.ts","lib/json.ts","lib/api/nft.ts","lib/api/peer.ts","lib/cache.ts","lib/color.ts","lib/representation.ts","lib/wearable.ts","lib/zoom.ts","lib/config.ts","lib/message.ts","hooks/useOverrides.ts","hooks/useOptions.ts","hooks/useConfig.ts","hooks/useAsync.ts","lib/babylon/utils.ts","lib/babylon/body.ts","lib/babylon/slots.ts","lib/babylon/camera.ts","lib/babylon/scene.ts","lib/babylon/emotes.ts","lib/babylon/face.ts","lib/babylon/mappings.ts","lib/babylon/render.ts","components/Preview/Preview.tsx","hooks/useWindowSize.ts","index.tsx"],"names":["sleep","ms","a","Promise","resolve","setTimeout","json","url","attempts","fetch","resp","ok","Error","text","nftApiByEnv","PreviewEnv","DEV","PROD","NFTApi","contractAddress","itemId","env","data","length","tokenId","nft","nftApi","peerByEnv","PeerApi","urns","map","urn","join","wearables","profile","profiles","peerApi","createMemo","cache","memo","key","fn","args","reset","formatHex","color","startsWith","numberToHex","value","toString","slice","colorToHex","r","g","b","hexToColor","hex","parsed","parseHex","Color3","parseInt","is","representation","bodyShape","bodyShapes","includes","isMale","WearableBodyShape","MALE","isFemale","FEMALE","getRepresentation","wearable","shape","representations","some","id","find","getRepresentationOrDefault","hasRepresentation","error","getContentUrl","content","contents","mainFile","isTexture","endsWith","getWearableByCategory","category","getDefaultCategories","WearableCategory","EYEBROWS","MOUTH","EYES","HAIR","UPPER_BODY","LOWER_BODY","FEET","getDefaultWearableUrn","getWearableBodyShape","wearabe","isEmote","parseZoom","rawZoom","parsedZoom","parseFloat","isNaN","Math","min","max","getZoom","SKIN","DEFAULT_PROFILE","fetchWearable","fetchWearables","results","profileMemo","fetchProfile","then","avatars","catch","console","log","fetchWearableFromContract","options","network","fetchNFT","Network","ETHEREUM","image","split","fetchAvatar","filter","defaultWearableUrns","push","defaultWearables","wearablePromise","profilePromise","all","avatar","skin","hair","eyes","zoom","type","PreviewType","WEARABLE","background","gradient","transparentBackground","undefined","AVATAR","TEXTURE","Rarity","getGradient","rarity","light","dark","thumbnail","emote","PreviewEmote","IDLE","Object","values","camera","PreviewCamera","INTERACTIVE","autoRotateSpeed","offsetX","offsetY","offsetZ","MessageType","sendMessage","message","event","JSON","stringify","window","parent","postMessage","useOptions","useState","location","search","useMemo","params","URLSearchParams","autoRotateSpeedParam","get","offsetXParam","offsetYParam","offsetZParam","bodyShapeParam","has","getAll","reduce","selected","overrides","setOverrides","useEffect","previous","onmessage","UPDATE","useOverrides","keysToOverride","keys","newOptions","useConfig","asyncFunction","deps","isLoading","setIsLoading","result","setResult","setError","finally","useAsync","createConfig","isCategory","isHidden","asset","hides","replaces","isSuccesful","isModel","isFacialFeature","getBodyShape","assets","part","hasSkin","hideUpperBody","hideLowerBody","hideFeet","hideHead","container","meshes","mesh","name","toLowerCase","setEnabled","categoriesHiddenBySkin","HELMET","FACIAL_HAIR","getSlots","config","slots","Map","slot","set","reverse","alreadyRemoved","Set","replaced","hidden","toRemove","Array","from","delete","add","startAutoRotateBehavior","useAutoRotationBehavior","autoRotationBehavior","idleRotationSpeed","engine","createScene","canvas","dispose","Engine","preserveDrawingBuffer","stencil","antialias","root","Scene","autoClear","clearColor","Color4","preventDefaultOnPointerDown","ArcRotateCamera","Vector3","mode","Camera","PERSPECTIVE_CAMERA","STATIC","position","warn","attachControl","offset","addInPlace","setTarget","lowerRadiusLimit","upperRadiusLimit","radius","DirectionalLight","intensity","HemisphericLight","SpotLight","PI","runRenderLoop","render","loadMask","scene","file","reject","task","TextureAssetTask","onError","errorObject","onSuccess","texture","run","loadTexture","loadAssetContainer","load","extension","SceneLoader","LoadAssetContainerAsync","hairMaterials","skinMaterials","loadAsset","materials","material","mat","pbr","albedoColor","FromHexString","alpha","removeMaterial","animationGroups","animationGroup","stop","center","Mesh","setParent","children","getChildren","child","boundingInfo","getBoundingInfo","boundingBox","minimumWorld","maximumWorld","i","siblingMin","siblingMax","Minimize","Maximize","setBoundingInfo","BoundingInfo","refreshBoundingInfo","size","extendSize","scale","scaling","multiply","subtractInPlace","loopedEmotes","MONEY","CLAP","isLooped","buildEmoteUrl","baseUrl","process","path","URL","href","loadEmoteFromUrl","loadEmoteFromWearable","playEmote","onAnimationEnd","cameras","loop","emoteDataV0","emoteUrl","emoteAnimationGroup","AnimationGroup","nodes","transformNodes","node","list","targetedAnimations","targetedAnimation","animation","target","newTargets","newTarget","addTargetedAnimation","play","onAnimationEndObservable","addOnce","getCategoryLoader","features","feature","getFacialFeatures","loadCategory","eyebrows","mouth","applyFacialFeatures","mask","applyTextureAndMask","maskColor","newMaterial","StandardMaterial","alphaMode","PBRMaterial","PBRMATERIAL_ALPHABLEND","backFaceCulling","hasAlpha","sideOrientation","Orientation","CW","diffuseTexture","diffuseColor","Black","emissiveTexture","emissiveColor","setupMappings","mappings","createMappings","OnPluginActivatedObservable","plugin","preprocessUrlAsync","parts","promises","promise","addAllToScene","Preview","previewError","setPreviewError","width","height","windowSize","setWindowSize","handleResize","innerWidth","innerHeight","addEventListener","removeEventListener","useWindowSize","style","setStyle","isDragging","setIsDragging","isLoadingModel","setIsLoadingModel","isLoaded","setIsLoaded","canvasRef","useRef","isLoadingConfig","configError","setImage","is3D","setIs3D","isMessageSent","setIsMessageSent","showImage","showCanvas","current","backgroundImage","opacity","LOAD","ERROR","shouldResetIsLoaded","className","classNames","src","alt","ref","onMouseDown","onMouseUp","React","ReactDOM","StrictMode","document","getElementById","update","prop"],"mappings":"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","file":"static/js/main.8cd65464.chunk.js","sourcesContent":["export async function sleep(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n","import { sleep } from './sleep'\n\nexport async function json<T>(url: string, attempts = 3): Promise<T> {\n try {\n const resp = await fetch(url)\n if (!resp.ok) {\n throw new Error(await resp.text())\n }\n return resp.json() as Promise<T>\n } catch (error) {\n if (attempts > 0) {\n await sleep(100)\n return json(url, attempts - 1)\n } else {\n throw error\n }\n }\n}\n","import { Item, NFT, PreviewEnv } from '@dcl/schemas'\nimport { json } from '../json'\n\nexport const nftApiByEnv: Record<PreviewEnv, string> = {\n [PreviewEnv.DEV]: 'https://nft-api.decentraland.io',\n [PreviewEnv.PROD]: 'https://nft-api.decentraland.org',\n}\n\nclass NFTApi {\n async fetchItem(contractAddress: string, itemId: string, env: PreviewEnv) {\n const { data } = await json<{ data: Item[] }>(`${nftApiByEnv[env]}/v1/items?contractAddress=${contractAddress}&itemId=${itemId}`)\n if (data.length === 0) {\n throw new Error(`Item not found for contractAddress=\"${contractAddress}\" itemId=\"${itemId}\"`)\n }\n return data[0]\n }\n async fetchNFT(contractAddress: string, tokenId: string, env: PreviewEnv) {\n const { data } = await json<{ data: { nft: NFT }[] }>(\n `${nftApiByEnv[env]}/v1/nfts?contractAddress=${contractAddress}&tokenId=${tokenId}`\n )\n if (data.length === 0) {\n throw new Error(`NFT not found for contractAddress=\"${contractAddress}\" tokenId=\"${tokenId}\"`)\n }\n return data[0].nft\n }\n}\n\nexport const nftApi = new NFTApi()\n","import { PreviewEnv, Profile, WearableDefinition } from '@dcl/schemas'\nimport { json } from '../json'\n\nexport const peerByEnv: Record<PreviewEnv, string> = {\n [PreviewEnv.DEV]: 'https://peer.decentraland.zone',\n [PreviewEnv.PROD]: 'https://peer.decentraland.org',\n}\n\nclass PeerApi {\n async fetchWearables(urns: string[], env: PreviewEnv) {\n if (urns.length === 0) {\n return []\n }\n const { wearables } = await json<{ wearables: WearableDefinition[] }>(\n `${peerByEnv[env]}/lambdas/collections/wearables?${urns.map((urn) => `wearableId=${urn}`).join('&')}`\n )\n if (wearables.length === 0) {\n throw new Error(`Wearables not found for urns=\"${urns}\"`)\n }\n return wearables\n }\n async fetchProfile(profile: string, env: PreviewEnv) {\n const profiles = await json<Profile[]>(`${peerByEnv[env]}/lambdas/profiles?id=${profile}`)\n return profiles.length > 0 ? profiles[0] : null\n }\n}\n\nexport const peerApi = new PeerApi()\n","interface IMemo<T> {\n memo: (key: string, fn: (...args: any[]) => Promise<T>, ...args: any[]) => Promise<T>\n reset: () => void\n}\n\nexport function createMemo<T>(): IMemo<T> {\n const cache: Record<string, Promise<T>> = {}\n return {\n memo: async (key, fn, ...args) => {\n const exists = key in cache\n if (!exists) {\n cache[key] = fn(...args)\n }\n return cache[key]\n },\n reset: () => {\n for (const key in cache) {\n delete cache[key]\n }\n },\n }\n}\n","import { Color3 } from '@babylonjs/core'\nimport { Color3 as RGB } from '@dcl/schemas'\n\nexport function formatHex(color: string) {\n return color.startsWith('#') ? color : '#' + color\n}\n\nexport function parseHex(color: string) {\n return color.startsWith('#') ? color.slice(1) : color\n}\n\nexport function numberToHex(value: number) {\n const hex = ((value * 255) | 0).toString(16)\n return ('0' + hex).slice(-2)\n}\n\nexport function colorToHex(color: RGB) {\n return numberToHex(color.r) + numberToHex(color.g) + numberToHex(color.b)\n}\n\nexport function hexToColor(hex: string) {\n const parsed = parseHex(hex)\n const color = new Color3(\n parseInt(parsed.slice(0, 2), 16) / 256,\n parseInt(parsed.slice(2, 4), 16) / 256,\n parseInt(parsed.slice(4, 6), 16) / 256\n )\n return color\n}\n","import { RepresentationDefinition, WearableBodyShape, WearableDefinition } from '@dcl/schemas'\n\nexport function is(representation: RepresentationDefinition, bodyShape: WearableBodyShape) {\n return representation.bodyShapes.includes(bodyShape)\n}\n\nexport function isMale(representation: RepresentationDefinition) {\n return is(representation, WearableBodyShape.MALE)\n}\n\nexport function isFemale(representation: RepresentationDefinition) {\n return is(representation, WearableBodyShape.FEMALE)\n}\n\nexport function getRepresentation(wearable: WearableDefinition, shape = WearableBodyShape.MALE) {\n switch (shape) {\n case WearableBodyShape.FEMALE: {\n if (!wearable.data.representations.some(isFemale)) {\n throw new Error(`Could not find a BaseFemale representation for wearable=\"${wearable.id}\"`)\n }\n return wearable.data.representations.find(isFemale)!\n }\n case WearableBodyShape.MALE: {\n if (!wearable.data.representations.some(isMale)) {\n throw new Error(`Could not find a BaseMale representation for wearable=\"${wearable.id}\"`)\n }\n return wearable.data.representations.find(isMale)!\n }\n }\n}\n\nexport function getRepresentationOrDefault(wearable: WearableDefinition, shape = WearableBodyShape.MALE) {\n if (hasRepresentation(wearable, shape)) {\n return getRepresentation(wearable, shape)\n }\n if (wearable.data.representations.length > 0) {\n return wearable.data.representations[0]\n }\n throw new Error(`The wearable=\"${wearable.id}\" has no representation`)\n}\n\nexport function hasRepresentation(wearable: WearableDefinition, shape = WearableBodyShape.MALE) {\n try {\n getRepresentation(wearable, shape)\n return true\n } catch (error) {\n return false\n }\n}\n\nexport function getContentUrl(representation: RepresentationDefinition) {\n const content = representation.contents.find((content) => content.key === representation.mainFile)\n if (!content) {\n throw new Error(`Could not find main file`)\n }\n return content.url\n}\n\nexport function isTexture(representation: RepresentationDefinition) {\n return representation.mainFile.endsWith('png')\n}\n","import { WearableBodyShape, WearableCategory, WearableDefinition } from '@dcl/schemas'\n\nexport function getWearableByCategory(wearables: WearableDefinition[], category: WearableCategory) {\n return wearables.find((wearable) => wearable.data.category === category) || null\n}\n\nexport function getDefaultCategories(shape: WearableBodyShape) {\n switch (shape) {\n case WearableBodyShape.MALE:\n return [\n WearableCategory.EYEBROWS,\n WearableCategory.MOUTH,\n WearableCategory.EYES,\n WearableCategory.HAIR,\n WearableCategory.UPPER_BODY,\n WearableCategory.LOWER_BODY,\n WearableCategory.FEET,\n ]\n case WearableBodyShape.FEMALE:\n return [\n WearableCategory.EYEBROWS,\n WearableCategory.MOUTH,\n WearableCategory.EYES,\n WearableCategory.HAIR,\n WearableCategory.UPPER_BODY,\n WearableCategory.LOWER_BODY,\n WearableCategory.FEET,\n ]\n }\n}\n\nexport function getDefaultWearableUrn(category: WearableCategory, shape: WearableBodyShape) {\n switch (category) {\n case WearableCategory.EYEBROWS:\n return shape === WearableBodyShape.MALE\n ? 'urn:decentraland:off-chain:base-avatars:eyebrows_00'\n : 'urn:decentraland:off-chain:base-avatars:f_eyebrows_00'\n case WearableCategory.MOUTH:\n return shape === WearableBodyShape.MALE\n ? 'urn:decentraland:off-chain:base-avatars:mouth_00'\n : 'urn:decentraland:off-chain:base-avatars:f_mouth_00'\n case WearableCategory.EYES:\n return shape === WearableBodyShape.MALE\n ? 'urn:decentraland:off-chain:base-avatars:eyes_00'\n : 'urn:decentraland:off-chain:base-avatars:f_eyes_00'\n case WearableCategory.HAIR:\n return shape === WearableBodyShape.MALE\n ? 'urn:decentraland:off-chain:base-avatars:casual_hair_01'\n : 'urn:decentraland:off-chain:base-avatars:standard_hair'\n case WearableCategory.UPPER_BODY:\n return shape === WearableBodyShape.MALE\n ? 'urn:decentraland:off-chain:base-avatars:green_hoodie'\n : 'urn:decentraland:off-chain:base-avatars:f_sweater'\n case WearableCategory.LOWER_BODY:\n return shape === WearableBodyShape.MALE\n ? 'urn:decentraland:off-chain:base-avatars:brown_pants'\n : 'urn:decentraland:off-chain:base-avatars:f_jeans'\n case WearableCategory.FEET:\n return shape === WearableBodyShape.MALE\n ? 'urn:decentraland:off-chain:base-avatars:sneakers'\n : 'urn:decentraland:off-chain:base-avatars:bun_shoes'\n default:\n throw new Error(`There is no default wearable for category=\"${category}\"`)\n }\n}\n\nexport function isWearable(value: WearableDefinition | void): value is WearableDefinition {\n return !!value\n}\n\nexport function getWearableBodyShape(wearabe: WearableDefinition): WearableBodyShape {\n const bodyShapes = [WearableBodyShape.MALE, WearableBodyShape.FEMALE]\n return (\n bodyShapes.find((bodyShape) => wearabe.data.representations.some((representation) => representation.bodyShapes.includes(bodyShape))) ||\n bodyShapes[0]\n )\n}\n\nexport function isEmote(wearable: WearableDefinition) {\n return !!wearable && `emoteDataV0` in wearable\n}\n","import { WearableCategory, WearableDefinition } from '@dcl/schemas'\n\nexport function parseZoom(rawZoom: string | null) {\n const parsedZoom = rawZoom ? parseFloat(rawZoom) : null\n const zoom = parsedZoom === null || isNaN(parsedZoom) ? null : (Math.min(Math.max(parsedZoom, 0), 100) * 1.8) / 100 + 1\n return zoom\n}\n\n/**\n * Returns the right zoom for a given category\n * @param category\n * @returns\n */\nexport function getZoom(wearable?: WearableDefinition | void) {\n const category = wearable?.data.category\n switch (category) {\n case WearableCategory.UPPER_BODY:\n return 2\n case WearableCategory.SKIN:\n return 1.75\n default:\n return 1.25\n }\n}\n","import {\n Avatar,\n Network,\n PreviewCamera,\n PreviewConfig,\n PreviewEmote,\n PreviewEnv,\n PreviewOptions,\n PreviewType,\n Rarity,\n WearableBodyShape,\n WearableDefinition,\n} from '@dcl/schemas'\nimport { nftApi } from './api/nft'\nimport { peerApi } from './api/peer'\nimport { createMemo } from './cache'\nimport { colorToHex, formatHex } from './color'\nimport { getRepresentationOrDefault, hasRepresentation, isTexture } from './representation'\nimport { getDefaultCategories, getDefaultWearableUrn, getWearableBodyShape, getWearableByCategory, isEmote } from './wearable'\nimport { getZoom } from './zoom'\n\nconst DEFAULT_PROFILE = 'default'\n\nasync function fetchWearable(urn: string, env: PreviewEnv) {\n const results = await fetchWearables([urn], env)\n if (results.length !== 1) {\n throw new Error(`Could not find wearable for urn=\"${urn}\"`)\n }\n return results[0]\n}\nexport const wearableMemo = createMemo<WearableDefinition[]>()\nasync function fetchWearables(urns: string[], env: PreviewEnv) {\n return peerApi.fetchWearables(urns, env)\n}\n\nexport const profileMemo = createMemo<Avatar | null>()\nasync function fetchProfile(profile: string, env: PreviewEnv) {\n return profileMemo.memo(profile, async () => {\n if (profile === DEFAULT_PROFILE) {\n return null\n }\n const resp = await peerApi\n .fetchProfile(profile, env)\n .then((profile) => (profile && profile.avatars.length > 0 ? profile.avatars[0] : null))\n .catch((error: Error) => console.log(`Failed to load profile=\"${profile}\"`, error))\n return resp || null\n })\n}\n\nasync function fetchWearableFromContract(options: {\n contractAddress: string\n itemId?: string | null\n tokenId?: string | null\n env: PreviewEnv\n}) {\n const { contractAddress, itemId, tokenId, env } = options\n if (!itemId && !tokenId) {\n throw new Error(`You need to provide an itemId or a tokenId`)\n }\n\n const network = env === PreviewEnv.PROD ? 'matic' : 'mumbai'\n let urn = `urn:decentraland:${network}:collections-v2:${contractAddress}:${itemId}`\n if (!itemId && !tokenId) {\n throw new Error(`You must provide either tokenId or itemId`)\n } else if (!itemId && tokenId) {\n const nft = await nftApi.fetchNFT(contractAddress, tokenId, env)\n urn =\n nft.network !== Network.ETHEREUM\n ? `urn:decentraland:${network}:collections-v2:${contractAddress}:${nft.itemId}`\n : nft.image.split('contents/')[1].split('/thumbnail')[0] // since the Ethereum collections have a different URN, we extract it from the image path\n }\n return fetchWearable(urn, env)\n}\n\nasync function fetchAvatar(urns: string[], bodyShape: WearableBodyShape, env: PreviewEnv) {\n // fetch wearables\n let wearables = await fetchWearables([bodyShape, ...urns], env)\n // filter out wearables that don't have a representation for the body shape\n wearables = wearables.filter((wearable) => hasRepresentation(wearable, bodyShape))\n // fill default categories\n const defaultWearableUrns: string[] = []\n for (const category of getDefaultCategories(bodyShape)) {\n const wearable = getWearableByCategory(wearables, category)\n if (!wearable) {\n const urn = getDefaultWearableUrn(category, bodyShape)\n if (urn) {\n defaultWearableUrns.push(urn)\n } else {\n throw new Error(`Could not get default URN for category=\"${category}\"`)\n }\n }\n }\n if (defaultWearableUrns.length > 0) {\n const defaultWearables = await fetchWearables(defaultWearableUrns, env)\n wearables = [...wearables, ...defaultWearables]\n }\n return wearables\n}\n\nexport async function createConfig(options: PreviewOptions = {}): Promise<PreviewConfig> {\n const { contractAddress, tokenId, itemId } = options\n const env = options.env || PreviewEnv.PROD\n\n // load wearable to preview\n let wearablePromise: Promise<WearableDefinition | void> = Promise.resolve()\n if (contractAddress) {\n wearablePromise = fetchWearableFromContract({ contractAddress, tokenId, itemId, env })\n }\n\n // load profile\n const profilePromise = options.profile ? fetchProfile(options.profile, env) : Promise.resolve(null)\n\n // await promises\n const [wearable, profile] = await Promise.all([wearablePromise, profilePromise] as const)\n\n // use body shape from options, default to the profile one, if no profile default to the wearable bodyShape, if none, default to male\n const bodyShape =\n options.bodyShape ||\n (profile && (profile.avatar.bodyShape as WearableBodyShape)) ||\n (wearable ? getWearableBodyShape(wearable!) : WearableBodyShape.MALE)\n\n // use colors from options, default to profile, if none, use default values\n const skin = formatHex(options.skin || (profile && colorToHex(profile.avatar.skin.color)) || 'cc9b76')\n const hair = formatHex(options.hair || (profile && colorToHex(profile.avatar.hair.color)) || '000000')\n const eyes = formatHex(options.eyes || (profile && colorToHex(profile.avatar.eyes.color)) || '000000')\n\n // merge urns from profile (if any) and extra urns\n const urns = [...(profile ? profile.avatar.wearables : []), ...(options.urns || [])]\n\n let wearables: WearableDefinition[] = []\n let zoom = 1.75\n let type = PreviewType.WEARABLE\n let background: PreviewConfig['background'] = {\n gradient: options.transparentBackground ? undefined : `radial-gradient(#676370, #18141b)`,\n }\n\n // if loading multiple wearables, or if wearable is emote, render full avatar\n if (urns.length > 0 || (wearable && isEmote(wearable)) || options.profile === DEFAULT_PROFILE) {\n type = PreviewType.AVATAR\n wearables = await fetchAvatar(urns, bodyShape, env)\n }\n\n if (wearable) {\n zoom = wearables.length > 0 ? zoom : getZoom(wearable)\n const representation = getRepresentationOrDefault(wearable)\n if (isTexture(representation) && type !== PreviewType.AVATAR) {\n type = PreviewType.TEXTURE\n }\n const [light, dark] = Rarity.getGradient(wearable.rarity!)\n const gradient = `radial-gradient(${light}, ${dark})`\n background = {\n image: wearable.thumbnail,\n gradient,\n }\n }\n\n let emote = PreviewEmote.IDLE\n if (options.emote && Object.values(PreviewEmote).includes(options.emote)) {\n emote = options.emote\n }\n\n let camera = PreviewCamera.INTERACTIVE\n if (options.camera && Object.values(PreviewCamera).includes(options.camera)) {\n camera = options.camera\n }\n const autoRotateSpeed = typeof options.autoRotateSpeed === 'number' && !isNaN(options.autoRotateSpeed) ? options.autoRotateSpeed : 0.2\n\n return {\n wearable: wearable ?? undefined,\n wearables,\n bodyShape,\n skin,\n hair,\n eyes,\n type,\n background,\n emote,\n camera,\n autoRotateSpeed,\n offsetX: options.offsetX || 0,\n offsetY: options.offsetY || 0,\n offsetZ: options.offsetZ || 0,\n zoom: options.zoom || zoom,\n }\n}\n","export enum MessageType {\n LOAD = 'load',\n ERROR = 'error',\n UPDATE = 'update',\n}\n\nexport function sendMessage(type: MessageType, message?: string) {\n const event = JSON.stringify({ type, message })\n window.parent && window.parent.postMessage(event, '*')\n}\n","import { PreviewOptions } from '@dcl/schemas'\nimport { useState, useEffect } from 'react'\nimport { MessageType } from '../lib/message'\n\nexport const useOverrides = () => {\n const [overrides, setOverrides] = useState<PreviewOptions>({})\n\n // receive message from parent window to update options\n useEffect(() => {\n const previous = window.onmessage\n window.onmessage = function (event: MessageEvent) {\n if (event.data && event.data.type === MessageType.UPDATE) {\n const message = event.data as { type: MessageType.UPDATE; options: PreviewOptions }\n if (message.options && typeof message.options === 'object') {\n setOverrides(message.options)\n }\n }\n }\n return () => {\n window.onmessage = previous\n }\n }, [])\n\n return overrides\n}\n","import { useMemo, useState } from 'react'\nimport { useOverrides } from './useOverrides'\n\nimport { PreviewCamera, PreviewEmote, PreviewEnv, PreviewOptions, WearableBodyShape } from '@dcl/schemas'\nimport { parseZoom } from '../lib/zoom'\n\nexport const useOptions = () => {\n // get options from url params\n const [search] = useState(window.location.search.toString())\n const options = useMemo<PreviewOptions>(() => {\n const params = new URLSearchParams(search)\n const autoRotateSpeedParam = params.get('autoRotateSpeed') as string | null\n const offsetXParam = params.get('offsetX') as string | null\n const offsetYParam = params.get('offsetY') as string | null\n const offsetZParam = params.get('offsetZ') as string | null\n const bodyShapeParam = params.get('bodyShape')\n const options = {\n contractAddress: params.get('contract')!,\n tokenId: params.get('token'),\n itemId: params.get('item'),\n skin: params.get('skin'),\n hair: params.get('hair'),\n eyes: params.get('eyes'),\n emote: params.get('emote') as PreviewEmote | null,\n camera: params.get('camera') as PreviewCamera | null,\n transparentBackground: params.has('transparentBackground'),\n autoRotateSpeed: autoRotateSpeedParam ? parseFloat(autoRotateSpeedParam) : null,\n offsetX: offsetXParam ? parseFloat(offsetXParam) : null,\n offsetY: offsetYParam ? parseFloat(offsetYParam) : null,\n offsetZ: offsetZParam ? parseFloat(offsetZParam) : null,\n zoom: parseZoom(params.get('zoom')),\n bodyShape: bodyShapeParam === 'female' ? WearableBodyShape.FEMALE : bodyShapeParam === 'male' ? WearableBodyShape.MALE : null,\n urns: params.getAll('urn'),\n profile: params.get('profile'),\n env: Object.values(PreviewEnv)\n .filter((value): value is PreviewEnv => typeof value === 'string')\n .reduce((selected, value) => (value === params.get('env') ? value : selected), PreviewEnv.PROD),\n }\n return options\n }, [search])\n\n // apply overrides\n const overrides = useOverrides()\n const optionsWithOverrides = useMemo(() => {\n const keysToOverride = (Object.keys(overrides) as (keyof PreviewOptions)[]).filter(\n (key) => typeof overrides[key] !== 'undefined' && overrides[key] !== null\n )\n if (options && keysToOverride.length > 0) {\n const newOptions: PreviewOptions = { ...options }\n for (const key of keysToOverride) {\n const value = overrides[key]\n if (value) {\n newOptions[key] = value as never\n }\n }\n return newOptions\n }\n return options\n }, [options, overrides])\n\n // return options with overrides applied (if any)\n return optionsWithOverrides\n}\n","import { createConfig } from '../lib/config'\nimport { useAsync } from './useAsync'\nimport { useOptions } from './useOptions'\n\nexport function useConfig() {\n const options = useOptions()\n const [avatar, isLoading, error] = useAsync(() => createConfig(options), [options])\n return [avatar, isLoading, error] as const\n}\n","import { useEffect, useState } from 'react'\n\nexport function useAsync<T>(asyncFunction: (...args: any[]) => Promise<T>, deps: React.DependencyList = []) {\n const [isLoading, setIsLoading] = useState(false)\n const [result, setResult] = useState<T | null>(null)\n const [error, setError] = useState('')\n useEffect(() => {\n setIsLoading(true)\n asyncFunction()\n .then((result) => setResult(result))\n .catch((error) => setError(error.message))\n .finally(() => setIsLoading(false))\n }, deps) // eslint-disable-line\n return [result, isLoading, error] as const\n}\n","import { WearableCategory, WearableDefinition } from '@dcl/schemas'\nimport { getRepresentationOrDefault, isTexture } from '../representation'\nimport { Asset } from './scene'\n\nexport function isCategory(category: WearableCategory) {\n return (wearable: WearableDefinition) => wearable.data.category === category\n}\n\nexport function isHidden(category: WearableCategory) {\n return (asset: Asset) => {\n return (\n asset.wearable.data.category === category ||\n (asset.wearable.data.hides || []).includes(category) ||\n (asset.wearable.data.replaces || []).includes(category)\n )\n }\n}\n\nexport function isSuccesful(result: void | Asset): result is Asset {\n return !!result\n}\n\nexport function isModel(wearable: WearableDefinition): boolean {\n const representation = getRepresentationOrDefault(wearable)\n return !isTexture(representation)\n}\n\nexport function isFacialFeature(wearable: WearableDefinition): boolean {\n return !isModel(wearable)\n}\n","import { WearableCategory } from '@dcl/schemas'\nimport { Asset } from './scene'\nimport { isHidden } from './utils'\n\nexport function getBodyShape(assets: Asset[]) {\n const bodyShape = assets.find((part) => part.wearable.data.category === ('body_shape' as WearableCategory))\n\n if (!bodyShape) {\n throw new Error(`Could not find a bodyShape when trying to hide base body parts`)\n }\n\n // hide base body parts if necessary\n const hasSkin = assets.some((part) => part.wearable.data.category === WearableCategory.SKIN)\n const hideUpperBody = hasSkin || assets.some(isHidden(WearableCategory.UPPER_BODY))\n const hideLowerBody = hasSkin || assets.some(isHidden(WearableCategory.LOWER_BODY))\n const hideFeet = hasSkin || assets.some(isHidden(WearableCategory.FEET))\n const hideHead = hasSkin || assets.some(isHidden('head' as WearableCategory))\n\n for (const mesh of bodyShape.container.meshes) {\n const name = mesh.name.toLowerCase()\n if (name.endsWith('ubody_basemesh') && hideUpperBody) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('lbody_basemesh') && hideLowerBody) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('feet_basemesh') && hideFeet) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('head') && hideHead) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('head_basemesh') && hideHead) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('mask_eyes') && hideHead) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('mask_eyebrows') && hideHead) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('mask_mouth') && hideHead) {\n mesh.setEnabled(false)\n }\n }\n\n return bodyShape\n}\n","import { PreviewConfig, WearableCategory, WearableDefinition } from '@dcl/schemas'\nimport { hasRepresentation } from '../representation'\nimport { isEmote } from '../wearable'\n\nconst categoriesHiddenBySkin = [\n WearableCategory.HELMET,\n WearableCategory.HAIR,\n WearableCategory.FACIAL_HAIR,\n WearableCategory.MOUTH,\n WearableCategory.EYEBROWS,\n WearableCategory.EYES,\n WearableCategory.UPPER_BODY,\n WearableCategory.LOWER_BODY,\n WearableCategory.FEET,\n]\n\nexport function getSlots(config: PreviewConfig) {\n const slots = new Map<WearableCategory, WearableDefinition>()\n\n let wearables: WearableDefinition[] = config.wearables.filter((wearable) => !isEmote(wearable)) // remove emotes if any\n\n // remove other wearables that hide the equipped wearable\n if (config.wearable && !isEmote(config.wearable)) {\n wearables = config.wearables.filter((wearable) => {\n if (config.wearable) {\n const { category, hides, replaces } = config.wearable.data\n if (wearable.data.category === 'skin') {\n if (categoriesHiddenBySkin.includes(category)) {\n return false\n }\n if (hides && hides.includes('head' as WearableCategory)) {\n return false\n }\n if (replaces && replaces.includes('head' as WearableCategory)) {\n return false\n }\n }\n if (wearable.data.hides && wearable.data.hides.includes(category)) {\n return false\n }\n if (wearable.data.replaces && wearable.data.replaces.includes(category)) {\n return false\n }\n }\n return true\n })\n // add the equipped wearable at the end\n wearables.push(config.wearable)\n }\n\n // arrange wearbles in slots\n for (const wearable of wearables) {\n const slot = wearable.data.category\n if (hasRepresentation(wearable, config.bodyShape)) {\n slots.set(slot, wearable)\n }\n }\n let hasSkin = false\n // grab only the wearables that ended up in the map, and process in reverse order (last wearables can hide/replace the first ones)\n wearables = wearables.filter((wearable) => slots.get(wearable.data.category) === wearable).reverse()\n const alreadyRemoved = new Set<string>()\n for (const wearable of wearables) {\n const category = wearable.data.category\n if (alreadyRemoved.has(category)) {\n continue\n }\n const replaced = wearable.data.replaces || []\n const hidden = wearable.data.hides || []\n const toRemove = Array.from(new Set([...replaced, ...hidden]))\n for (const slot of toRemove) {\n if (slot !== category) {\n slots.delete(slot)\n alreadyRemoved.add(slot)\n }\n }\n if (wearable.data.category === WearableCategory.SKIN) {\n hasSkin = true\n }\n }\n // skins hide all the following slots\n if (hasSkin) {\n for (const category of categoriesHiddenBySkin) {\n slots.delete(category)\n }\n }\n\n return slots\n}\n","import { ArcRotateCamera } from '@babylonjs/core'\nimport { PreviewConfig } from '@dcl/schemas'\n\nexport function startAutoRotateBehavior(camera: ArcRotateCamera, config: PreviewConfig) {\n if (camera) {\n camera.useAutoRotationBehavior = true\n if (camera.autoRotationBehavior) {\n camera.autoRotationBehavior.idleRotationSpeed = config.autoRotateSpeed\n }\n }\n}\n","import {\n ArcRotateCamera,\n AssetContainer,\n BoundingInfo,\n Camera,\n Color3,\n Color4,\n DirectionalLight,\n Engine,\n HemisphericLight,\n Mesh,\n PBRMaterial,\n Scene,\n SceneLoader,\n SpotLight,\n Texture,\n TextureAssetTask,\n Vector3,\n} from '@babylonjs/core'\nimport '@babylonjs/loaders'\nimport { PreviewCamera, PreviewConfig, PreviewType, WearableBodyShape, WearableDefinition } from '@dcl/schemas'\nimport { getContentUrl, getRepresentation, isTexture } from '../representation'\nimport { startAutoRotateBehavior } from './camera'\n\nexport type Asset = {\n container: AssetContainer\n wearable: WearableDefinition\n}\n\n/**\n * It refreshes the bounding info of a mesh, taking into account all of its children\n * @param parent\n */\nfunction refreshBoundingInfo(parent: Mesh) {\n const children = parent.getChildren().filter((mesh) => mesh.id !== '__root__')\n if (children.length > 0) {\n const child = children[0] as Mesh\n // child.showBoundingBox = true\n let boundingInfo = child.getBoundingInfo()\n\n let min = boundingInfo.boundingBox.minimumWorld.add(child.position)\n let max = boundingInfo.boundingBox.maximumWorld.add(child.position)\n\n for (let i = 1; i < children.length; i++) {\n const child = children[i] as Mesh\n // child.showBoundingBox = true\n boundingInfo = child.getBoundingInfo()\n const siblingMin = boundingInfo.boundingBox.minimumWorld.add(child.position)\n const siblingMax = boundingInfo.boundingBox.maximumWorld.add(child.position)\n\n min = Vector3.Minimize(min, siblingMin)\n max = Vector3.Maximize(max, siblingMax)\n }\n\n parent.setBoundingInfo(new BoundingInfo(min, max))\n }\n}\n\n/**\n * Creates a Scene with the right camera, light and effects\n * @param canvas\n * @param zoom\n * @returns\n */\nlet engine: Engine\nexport async function createScene(canvas: HTMLCanvasElement, config: PreviewConfig) {\n // Create engine\n if (engine) {\n engine.dispose()\n }\n engine = new Engine(canvas, true, {\n preserveDrawingBuffer: true,\n stencil: true,\n antialias: true,\n })\n\n // Load GLB/GLTF\n const root = new Scene(engine)\n root.autoClear = true\n root.clearColor = new Color4(0, 0, 0, 0)\n root.preventDefaultOnPointerDown = false\n\n // Setup Camera\n var camera = new ArcRotateCamera('camera', 0, 0, 0, new Vector3(0, 0, 0), root)\n camera.mode = Camera.PERSPECTIVE_CAMERA\n switch (config.camera) {\n case PreviewCamera.INTERACTIVE: {\n switch (config.type) {\n case PreviewType.WEARABLE: {\n startAutoRotateBehavior(camera, config)\n camera.position = new Vector3(-2, 2, 2)\n break\n }\n case PreviewType.AVATAR: {\n camera.position = new Vector3(0, 1, 3.5)\n break\n }\n default: {\n console.warn(`Unexpected preview.type=\"${config.type}\"`)\n // do nothing\n }\n }\n camera.attachControl(canvas, true)\n break\n }\n case PreviewCamera.STATIC: {\n camera.position = new Vector3(0, 1, 3.5)\n break\n }\n }\n const offset = new Vector3(config.offsetX, config.offsetY, config.offsetZ)\n camera.position.addInPlace(offset)\n camera.setTarget(offset)\n camera.lowerRadiusLimit = camera.upperRadiusLimit = camera.radius / config.zoom\n\n // Setup lights\n var directional = new DirectionalLight('directional', new Vector3(0, 0, 1), root)\n directional.intensity = 1\n var top = new HemisphericLight('top', new Vector3(0, -1, 0), root)\n top.intensity = 1\n var bottom = new HemisphericLight('bottom', new Vector3(0, 1, 0), root)\n bottom.intensity = 1\n var spot = new SpotLight('spot', new Vector3(-2, 2, 2), new Vector3(2, -2, -2), Math.PI / 2, 1000, root)\n spot.intensity = 1\n\n // render loop\n engine.runRenderLoop(() => root.render())\n\n return root\n}\n\nexport async function loadMask(scene: Scene, wearable: WearableDefinition, bodyShape: WearableBodyShape): Promise<Texture | null> {\n const name = wearable.id\n const representation = getRepresentation(wearable, bodyShape)\n const file = representation.contents.find((file) => file.key.toLowerCase().endsWith('_mask.png'))\n if (file) {\n return new Promise((resolve, reject) => {\n const task = new TextureAssetTask(name, file.url, true, false)\n task.onError = () => reject(task.errorObject)\n task.onSuccess = () => {\n resolve(task.texture)\n }\n task.run(scene, () => resolve(task.texture), reject)\n })\n }\n return null\n}\n\nexport async function loadTexture(scene: Scene, wearable: WearableDefinition, bodyShape: WearableBodyShape): Promise<Texture | null> {\n const name = wearable.id\n const representation = getRepresentation(wearable, bodyShape)\n const file = representation.contents.find(\n (file) => file.key.toLowerCase().endsWith('.png') && !file.key.toLowerCase().endsWith('_mask.png')\n )\n if (file) {\n return new Promise((resolve, reject) => {\n const task = new TextureAssetTask(name, file.url, true, false)\n task.onError = () => reject(task.errorObject)\n task.onSuccess = () => {\n resolve(task.texture)\n }\n task.run(scene, () => resolve(task.texture), reject)\n })\n }\n return null\n}\n\nexport async function loadAssetContainer(scene: Scene, url: string) {\n const load = async (url: string, extension: string) => SceneLoader.LoadAssetContainerAsync(url, '', scene, null, extension)\n // try with GLB, if it fails try with GLTF\n try {\n return await load(url, '.glb')\n } catch (error) {\n return await load(url, '.gltf')\n }\n}\n\n/**\n * Loads a wearable into the Scene, using a given a body shape, skin and hair color\n * @param scene\n * @param wearable\n * @param bodyShape\n * @param skin\n * @param hair\n */\n\nconst hairMaterials = ['hair_mat']\n// there are some representations that use a modified material name like \"skin-f\" or \"skin_f\", i added them to the list support those wearables\nconst skinMaterials = ['avatarskin_mat', 'skin-f', 'skin_f']\nexport async function loadAsset(\n scene: Scene,\n wearable: WearableDefinition,\n bodyShape = WearableBodyShape.MALE,\n skin?: string,\n hair?: string\n) {\n const representation = getRepresentation(wearable, bodyShape)\n if (isTexture(representation)) {\n throw new Error(`The wearable=\"${wearable.id}\" is a texture`)\n }\n const url = getContentUrl(representation)\n const container = await loadAssetContainer(scene, url)\n\n // Clean up\n for (let material of container.materials) {\n if (hairMaterials.some((mat) => material.name.toLowerCase().includes(mat))) {\n if (hair) {\n const pbr = material as PBRMaterial\n pbr.albedoColor = Color3.FromHexString(hair)\n pbr.alpha = 1\n } else {\n material.alpha = 0\n scene.removeMaterial(material)\n }\n }\n if (skinMaterials.some((mat) => material.name.toLowerCase().includes(mat))) {\n if (skin) {\n const pbr = material as PBRMaterial\n pbr.albedoColor = Color3.FromHexString(skin)\n pbr.alpha = 1\n } else {\n material.alpha = 0\n scene.removeMaterial(material)\n }\n }\n }\n\n // Stop any animations\n for (const animationGroup of container.animationGroups) {\n animationGroup.stop()\n animationGroup.reset()\n animationGroup.dispose()\n }\n\n return { container, wearable }\n}\n\n/**\n * Center and resizes a Scene to fit in the camera view\n * @param scene\n */\n\nexport function center(scene: Scene) {\n // Setup parent\n var parent = new Mesh('parent', scene)\n for (const mesh of scene.meshes) {\n if (mesh !== parent) {\n mesh.setParent(parent)\n }\n }\n\n // resize and center\n refreshBoundingInfo(parent)\n const bounds = parent.getBoundingInfo().boundingBox.extendSize\n const size = bounds.length()\n const scale = new Vector3(1 / size, 1 / size, 1 / size)\n parent.scaling = scale\n const center = parent.getBoundingInfo().boundingBox.center.multiply(scale)\n parent.position.subtractInPlace(center)\n}\n","import { AnimationGroup, ArcRotateCamera, AssetContainer, Scene, TransformNode } from '@babylonjs/core'\nimport { PreviewCamera, PreviewConfig, PreviewEmote, WearableDefinition } from '@dcl/schemas'\nimport { getRepresentation } from '../representation'\nimport { isEmote } from '../wearable'\nimport { startAutoRotateBehavior } from './camera'\nimport { Asset, loadAssetContainer } from './scene'\n\nconst loopedEmotes = [PreviewEmote.IDLE, PreviewEmote.MONEY, PreviewEmote.CLAP]\n\nfunction isLooped(emote: PreviewEmote) {\n return loopedEmotes.includes(emote)\n}\n\nexport function buildEmoteUrl(emote: PreviewEmote) {\n let baseUrl = process.env.PUBLIC_URL || ''\n if (!baseUrl.endsWith('/')) {\n baseUrl += '/'\n }\n const path = `./emotes/${emote}.glb`\n const url = baseUrl.startsWith('http') ? new URL(path, baseUrl).href : path\n return url\n}\n\nexport async function loadEmoteFromUrl(scene: Scene, url: string) {\n const container = await loadAssetContainer(scene, url)\n if (container.animationGroups.length === 0) {\n throw new Error(`No animation groups found for emote with url=${url}`)\n }\n return container\n}\n\nexport async function loadEmoteFromWearable(scene: Scene, wearable: WearableDefinition, config: PreviewConfig) {\n const representation = getRepresentation(wearable, config.bodyShape)\n const content = representation.contents.find((content) => content.key === representation.mainFile)\n if (!content) {\n throw new Error(`Could not find a valid content in representation for wearable=${wearable.id} and bodyShape=${config.bodyShape}`)\n }\n return loadEmoteFromUrl(scene, content.url)\n}\n\nexport async function playEmote(scene: Scene, assets: Asset[], config: PreviewConfig) {\n // load asset container for emote\n let container: AssetContainer | undefined\n let loop = isLooped(config.emote)\n if (config.wearable && isEmote(config.wearable)) {\n try {\n container = await loadEmoteFromWearable(scene, config.wearable, config)\n loop = !!config.wearable.emoteDataV0?.loop\n } catch (error) {\n console.warn(`Could not load emote=${config.wearable.id}`)\n }\n }\n if (!container) {\n const emoteUrl = buildEmoteUrl(config.emote)\n container = await loadEmoteFromUrl(scene, emoteUrl)\n }\n\n // start camera rotation after animation ends\n async function onAnimationEnd() {\n if (config.camera !== PreviewCamera.STATIC) {\n const camera = scene.cameras[0] as ArcRotateCamera\n startAutoRotateBehavior(camera, config)\n }\n if (loop) {\n // keep playing idle animation on loop\n playEmote(scene, assets, config)\n }\n }\n\n // play emote animation\n try {\n const emoteAnimationGroup = new AnimationGroup('emote', scene)\n for (const asset of assets) {\n // store all the transform nodes in a map, there can be repeated node ids\n // if a wearable has multiple representations, so for each id we keep an array of nodes\n const nodes = asset.container.transformNodes.reduce((map, node) => {\n const list = map.get(node.id) || []\n list.push(node)\n return map.set(node.id, list)\n }, new Map<string, TransformNode[]>())\n // apply each targeted animation from the emote asset container to the transform nodes of all the wearables\n if (container.animationGroups.length > 0) {\n for (const targetedAnimation of container.animationGroups[0].targetedAnimations) {\n const animation = targetedAnimation.animation\n const target = targetedAnimation.target as TransformNode\n const newTargets = nodes.get(target.id)\n if (newTargets && newTargets.length > 0) {\n for (const newTarget of newTargets) {\n emoteAnimationGroup.addTargetedAnimation(animation, newTarget)\n }\n }\n }\n } else {\n throw new Error(`No animationGroups found`)\n }\n }\n // play animation group and apply\n emoteAnimationGroup.play()\n emoteAnimationGroup.onAnimationEndObservable.addOnce(onAnimationEnd)\n } catch (error) {\n console.warn(`Could not play emote=${config.emote}`, error)\n }\n}\n\nexport function shouldPlayEmote(config: PreviewConfig) {\n return config.emote\n}\n","import { AbstractMesh, Color3, Orientation, PBRMaterial, Scene, StandardMaterial, Texture } from '@babylonjs/core'\nimport { PreviewConfig, WearableBodyShape, WearableCategory, WearableDefinition } from '@dcl/schemas'\nimport { hexToColor } from '../color'\nimport { Asset, loadMask, loadTexture } from './scene'\nimport { isCategory } from './utils'\n\nfunction getCategoryLoader(scene: Scene, features: WearableDefinition[], bodyShape: WearableBodyShape) {\n return async (category: WearableCategory) => {\n const feature = features.find(isCategory(category))\n if (feature) {\n return Promise.all([loadTexture(scene, feature, bodyShape), loadMask(scene, feature, bodyShape)]) as Promise<\n [Texture | null, Texture | null]\n >\n }\n return [null, null] as [null, null]\n }\n}\n\nexport async function getFacialFeatures(scene: Scene, features: WearableDefinition[], bodyShape: WearableBodyShape) {\n const loadCategory = getCategoryLoader(scene, features, bodyShape)\n const [eyes, eyebrows, mouth] = await Promise.all([\n loadCategory(WearableCategory.EYES),\n loadCategory(WearableCategory.EYEBROWS),\n loadCategory(WearableCategory.MOUTH),\n ])\n return { eyes, eyebrows, mouth }\n}\n\nexport async function applyFacialFeatures(\n scene: Scene,\n bodyShape: Asset,\n eyes: [Texture | null, Texture | null],\n eyebrows: [Texture | null, Texture | null],\n mouth: [Texture | null, Texture | null],\n config: PreviewConfig\n) {\n for (const mesh of bodyShape.container.meshes) {\n if (mesh.name.toLowerCase().endsWith('mask_eyes')) {\n const [texture, mask] = eyes\n if (texture) {\n applyTextureAndMask(scene, 'eyes', mesh, texture, config.eyes, mask, '#ffffff')\n }\n }\n if (mesh.name.toLowerCase().endsWith('mask_eyebrows')) {\n const [texture, mask] = eyebrows\n if (texture) {\n applyTextureAndMask(scene, 'eyebrows', mesh, texture, config.hair, mask, config.hair)\n }\n }\n if (mesh.name.toLowerCase().endsWith('mask_mouth')) {\n const [texture, mask] = mouth\n if (texture) {\n applyTextureAndMask(scene, 'mouth', mesh, texture, config.skin, mask, config.skin)\n }\n }\n }\n}\n\nfunction applyTextureAndMask(\n scene: Scene,\n name: string,\n mesh: AbstractMesh,\n texture: Texture,\n color: string,\n mask: Texture | null,\n maskColor: string\n) {\n const newMaterial = new StandardMaterial(`${name}_standard_material`, scene)\n newMaterial.alphaMode = PBRMaterial.PBRMATERIAL_ALPHABLEND\n newMaterial.backFaceCulling = true\n texture.hasAlpha = true\n newMaterial.sideOrientation = Orientation.CW\n newMaterial.diffuseTexture = texture\n newMaterial.diffuseColor = mask ? Color3.Black() : hexToColor(maskColor)\n if (mask) {\n newMaterial.emissiveTexture = mask\n newMaterial.emissiveColor = hexToColor(color)\n }\n mesh.material = newMaterial\n}\n","import { SceneLoader } from '@babylonjs/core'\nimport { GLTFFileLoader } from '@babylonjs/loaders'\nimport { PreviewConfig, WearableBodyShape, WearableDefinition } from '@dcl/schemas'\nimport { getRepresentation } from '../representation'\n\nexport function createMappings(wearables: WearableDefinition[], bodyShape = WearableBodyShape.MALE) {\n const mappings: Record<string, string> = {}\n for (const wearable of wearables) {\n try {\n const representation = getRepresentation(wearable, bodyShape)\n for (const file of representation.contents) {\n mappings[file.key] = file.url\n }\n } catch (error) {\n console.warn(\n `Skipping generation of mappings for wearable=\"${wearable.id}\" since it lacks a representation for bodyShape=\"${bodyShape}\"`\n )\n continue\n }\n }\n return mappings\n}\n\n/**\n * Configures the mappings for all the relative paths within a model to the right IPFS in the catalyst\n * @param wearables\n */\nexport function setupMappings(config: PreviewConfig) {\n const wearables = config.wearable ? [config.wearable, ...config.wearables] : config.wearables\n const mappings = createMappings(wearables, config.bodyShape)\n SceneLoader.OnPluginActivatedObservable.add((plugin) => {\n if (plugin.name === 'gltf') {\n const gltf = plugin as GLTFFileLoader\n gltf.preprocessUrlAsync = async (url: string) => {\n const baseUrl = `/content/contents/`\n const parts = url.split(baseUrl)\n return parts.length > 0 && !!parts[1] ? mappings[parts[1]] : url\n }\n }\n })\n}\n","import { PreviewConfig, PreviewType, WearableBodyShape } from '@dcl/schemas'\nimport { getBodyShape } from './body'\nimport { getSlots } from './slots'\nimport { playEmote } from './emotes'\nimport { applyFacialFeatures, getFacialFeatures } from './face'\nimport { setupMappings } from './mappings'\nimport { Asset, center, createScene, loadAsset } from './scene'\nimport { isFacialFeature, isModel, isSuccesful } from './utils'\n\n/**\n * Initializes Babylon, creates the scene and loads a list of wearables in it\n * @param canvas\n * @param wearables\n * @param options\n */\nexport async function render(canvas: HTMLCanvasElement, config: PreviewConfig) {\n // create the root scene\n const root = await createScene(canvas, config)\n\n // setup the mappings for all the contents\n setupMappings(config)\n\n // load all the wearables into the root scene\n const promises: Promise<void | Asset>[] = []\n\n if (config.type === PreviewType.AVATAR) {\n // get slots\n const slots = getSlots(config)\n\n // get wearables\n const wearables = Array.from(slots.values())\n\n for (const wearable of wearables.filter(isModel)) {\n const promise = loadAsset(root, wearable, config.bodyShape, config.skin, config.hair).catch((error) => {\n console.warn(error.message)\n })\n promises.push(promise)\n }\n const assets = (await Promise.all(promises)).filter(isSuccesful)\n\n // add all assets to scene\n for (const asset of assets) {\n asset.container.addAllToScene()\n }\n\n // build avatar\n const bodyShape = getBodyShape(assets)\n // apply facial features\n const features = wearables.filter(isFacialFeature)\n const { eyes, eyebrows, mouth } = await getFacialFeatures(root, features, config.bodyShape)\n applyFacialFeatures(root, bodyShape, eyes, eyebrows, mouth, config)\n\n // play emote\n await playEmote(root, assets, config)\n } else {\n if (!config.wearable) {\n throw new Error('No wearable to render')\n }\n const wearable = config.wearable\n try {\n // try loading with the required body shape\n const asset = await loadAsset(root, wearable, config.bodyShape, config.skin, config.hair)\n asset.container.addAllToScene()\n } catch (error) {\n // default to other body shape if failed\n const asset = await loadAsset(\n root,\n wearable,\n config.bodyShape === WearableBodyShape.MALE ? WearableBodyShape.FEMALE : WearableBodyShape.MALE,\n config.skin,\n config.hair\n )\n asset.container.addAllToScene()\n }\n }\n\n // center the root scene into the camera\n center(root)\n}\n","import React, { useEffect, useRef, useState } from 'react'\nimport classNames from 'classnames'\nimport { PreviewCamera, PreviewType } from '@dcl/schemas'\nimport { useWindowSize } from '../../hooks/useWindowSize'\nimport { useConfig } from '../../hooks/useConfig'\nimport { MessageType, sendMessage } from '../../lib/message'\nimport { render } from '../../lib/babylon/render'\nimport './Preview.css'\n\nconst Preview: React.FC = () => {\n const [previewError, setPreviewError] = useState('')\n const { width, height } = useWindowSize()\n const [style, setStyle] = useState<React.CSSProperties>({})\n const [isDragging, setIsDragging] = useState(false)\n const [isLoadingModel, setIsLoadingModel] = useState(true)\n const [isLoaded, setIsLoaded] = useState(false)\n const canvasRef = useRef<HTMLCanvasElement>(null)\n const [config, isLoadingConfig, configError] = useConfig()\n const [image, setImage] = useState('')\n const [is3D, setIs3D] = useState(true)\n const [isMessageSent, setIsMessageSent] = useState(false)\n\n const error = previewError || configError\n const isLoading = (isLoadingModel || isLoadingConfig) && !error\n const showImage = !!image && !is3D && !isLoading\n const showCanvas = is3D && !isLoading\n\n useEffect(() => {\n if (canvasRef.current && config) {\n // rarity background\n setStyle({ backgroundImage: config.background.gradient ? config.background.gradient : undefined, opacity: 1 })\n\n // set background image\n if (config.background.image) {\n setImage(config.background.image)\n }\n\n // load model or image (for texture only wearables)\n if (config.type === PreviewType.TEXTURE) {\n setIs3D(false)\n setIsLoadingModel(false)\n setIsLoaded(true)\n } else {\n // preview models\n render(canvasRef.current, config)\n .catch((error) => setPreviewError(error.message))\n .finally(() => {\n setIsLoadingModel(false)\n setIsLoaded(true)\n })\n }\n }\n }, [canvasRef.current, config]) // eslint-disable-line\n\n // send a mesasge to the parent window when loaded or error occurs\n useEffect(() => {\n if (!isMessageSent) {\n if (isLoaded) {\n sendMessage(MessageType.LOAD)\n setIsMessageSent(true)\n } else if (error) {\n sendMessage(MessageType.ERROR, error)\n setIsMessageSent(true)\n }\n }\n }, [isLoaded, error, isMessageSent])\n\n // when the config is being loaded again (because the was an update to some of the options) reset all the other loading flags\n useEffect(() => {\n if (isLoadingConfig) {\n let shouldResetIsLoaded = false\n if (!isLoadingModel) {\n setIsLoadingModel(true)\n shouldResetIsLoaded = true\n }\n if (isMessageSent) {\n setIsMessageSent(false)\n shouldResetIsLoaded = true\n }\n if (shouldResetIsLoaded && isLoaded) {\n setIsLoaded(false)\n }\n }\n }, [isLoadingConfig, isLoadingModel, isMessageSent, isLoaded])\n\n return (\n <div\n className={classNames('Preview', {\n 'is-dragging': isDragging,\n 'is-loading': isLoading,\n 'is-loaded': isLoaded,\n 'is-3d': is3D && config?.camera === PreviewCamera.INTERACTIVE,\n 'has-error': !!error,\n })}\n style={style}\n >\n <img\n src={image}\n className={classNames('thumbnail', {\n 'is-visible': showImage,\n })}\n alt=\"preview\"\n />\n <canvas\n id=\"wearable-preview\"\n className={classNames({\n 'is-visible': showCanvas,\n })}\n width={width}\n height={height}\n ref={canvasRef}\n onMouseDown={() => setIsDragging(is3D && !error)}\n onMouseUp={() => setIsDragging(false)}\n ></canvas>\n {error && <div className=\"error\">{error}</div>}\n </div>\n )\n}\n\nexport default React.memo(Preview)\n","import { useState, useEffect } from 'react'\n\n// Define general type for useWindowSize hook, which includes width and height\ninterface Size {\n width: number | undefined\n height: number | undefined\n}\n\nexport function useWindowSize(): Size {\n // Initialize state with undefined width/height so server and client renders match\n // Learn more here: https://joshwcomeau.com/react/the-perils-of-rehydration/\n const [windowSize, setWindowSize] = useState<Size>({\n width: undefined,\n height: undefined,\n })\n useEffect(() => {\n // Handler to call on window resize\n function handleResize() {\n // Set window width/height to state\n setWindowSize({\n width: window.innerWidth,\n height: window.innerHeight,\n })\n }\n // Add event listener\n window.addEventListener('resize', handleResize)\n // Call handler right away so state gets updated with initial window size\n handleResize()\n // Remove event listener on cleanup\n return () => window.removeEventListener('resize', handleResize)\n }, []) // Empty array ensures that effect is only run on mount\n return windowSize\n}\n","import React from 'react'\nimport ReactDOM from 'react-dom'\nimport './index.css'\nimport { Preview } from './components/Preview'\n\nReactDOM.render(\n <React.StrictMode>\n <Preview />\n </React.StrictMode>,\n document.getElementById('root')\n)\n\n/// DELETE MEEE!!!!!11\nfunction update(prop: string, value: string) {\n window.postMessage({ type: 'update', options: { [prop]: value } })\n}\n\n;(window as any).update = update\n"],"sourceRoot":""}
1
+ {"version":3,"sources":["lib/sleep.ts","lib/json.ts","lib/api/nft.ts","lib/api/peer.ts","lib/cache.ts","lib/color.ts","lib/representation.ts","lib/wearable.ts","lib/zoom.ts","lib/config.ts","lib/message.ts","hooks/useOverrides.ts","hooks/useOptions.ts","hooks/useConfig.ts","hooks/useAsync.ts","lib/babylon/utils.ts","lib/babylon/body.ts","lib/babylon/slots.ts","lib/babylon/camera.ts","lib/babylon/scene.ts","lib/babylon/emotes.ts","lib/babylon/face.ts","lib/babylon/mappings.ts","lib/babylon/render.ts","components/Preview/Preview.tsx","hooks/useWindowSize.ts","index.tsx"],"names":["sleep","ms","a","Promise","resolve","setTimeout","json","url","attempts","fetch","resp","ok","Error","text","nftApiByEnv","PreviewEnv","DEV","PROD","NFTApi","contractAddress","itemId","env","data","length","tokenId","nft","nftApi","peerByEnv","PeerApi","urns","map","urn","join","wearables","profile","profiles","peerApi","createMemo","cache","memo","key","fn","args","reset","formatHex","color","startsWith","numberToHex","value","toString","slice","colorToHex","r","g","b","hexToColor","hex","parsed","parseHex","Color3","parseInt","is","representation","bodyShape","bodyShapes","includes","isMale","WearableBodyShape","MALE","isFemale","FEMALE","getRepresentation","wearable","shape","representations","some","id","find","getRepresentationOrDefault","hasRepresentation","error","getContentUrl","content","contents","mainFile","isTexture","endsWith","getWearableByCategory","category","getDefaultCategories","WearableCategory","EYEBROWS","MOUTH","EYES","HAIR","UPPER_BODY","LOWER_BODY","FEET","getDefaultWearableUrn","getWearableBodyShape","wearabe","isEmote","parseZoom","rawZoom","parsedZoom","parseFloat","isNaN","Math","min","max","getZoom","SKIN","DEFAULT_PROFILE","fetchWearable","fetchWearables","results","profileMemo","fetchProfile","then","avatars","catch","console","log","fetchWearableFromContract","options","network","fetchNFT","Network","ETHEREUM","image","split","fetchAvatar","filter","defaultWearableUrns","push","defaultWearables","wearablePromise","profilePromise","all","avatar","skin","hair","eyes","zoom","type","PreviewType","WEARABLE","background","gradient","transparentBackground","undefined","AVATAR","TEXTURE","Rarity","getGradient","rarity","light","dark","thumbnail","emote","PreviewEmote","IDLE","Object","values","camera","PreviewCamera","INTERACTIVE","autoRotateSpeed","offsetX","offsetY","offsetZ","MessageType","sendMessage","message","event","JSON","stringify","window","parent","postMessage","useOptions","useState","location","search","useMemo","params","URLSearchParams","autoRotateSpeedParam","get","offsetXParam","offsetYParam","offsetZParam","bodyShapeParam","has","getAll","reduce","selected","overrides","setOverrides","useEffect","previous","onmessage","UPDATE","useOverrides","keysToOverride","keys","newOptions","useConfig","asyncFunction","deps","isLoading","setIsLoading","result","setResult","setError","finally","useAsync","createConfig","isCategory","isHidden","asset","hides","replaces","isSuccesful","isModel","isFacialFeature","getBodyShape","assets","part","hasSkin","hideUpperBody","hideLowerBody","hideFeet","hideHead","container","meshes","mesh","name","toLowerCase","setEnabled","categoriesHiddenBySkin","HELMET","FACIAL_HAIR","getSlots","config","slots","Map","slot","set","reverse","alreadyRemoved","Set","replaced","hidden","toRemove","Array","from","delete","add","startAutoRotateBehavior","useAutoRotationBehavior","autoRotationBehavior","idleRotationSpeed","engine","createScene","canvas","dispose","Engine","preserveDrawingBuffer","stencil","antialias","root","Scene","autoClear","clearColor","Color4","preventDefaultOnPointerDown","ArcRotateCamera","Vector3","mode","Camera","PERSPECTIVE_CAMERA","STATIC","position","warn","attachControl","offset","addInPlace","setTarget","lowerRadiusLimit","upperRadiusLimit","radius","DirectionalLight","intensity","HemisphericLight","SpotLight","PI","runRenderLoop","render","loadMask","scene","file","reject","task","TextureAssetTask","onError","errorObject","onSuccess","texture","run","loadTexture","loadAssetContainer","load","extension","SceneLoader","LoadAssetContainerAsync","hairMaterials","skinMaterials","loadAsset","materials","material","mat","pbr","albedoColor","FromHexString","alpha","removeMaterial","animationGroups","animationGroup","stop","center","Mesh","setParent","children","getChildren","child","boundingInfo","getBoundingInfo","boundingBox","minimumWorld","maximumWorld","i","siblingMin","siblingMax","Minimize","Maximize","setBoundingInfo","BoundingInfo","refreshBoundingInfo","size","extendSize","scale","scaling","multiply","subtractInPlace","loopedEmotes","MONEY","CLAP","isLooped","buildEmoteUrl","baseUrl","process","path","URL","href","loadEmoteFromUrl","loadEmoteFromWearable","playEmote","onAnimationEnd","cameras","loop","emoteDataV0","emoteUrl","emoteAnimationGroup","AnimationGroup","nodes","transformNodes","node","list","targetedAnimations","targetedAnimation","animation","target","newTargets","newTarget","addTargetedAnimation","play","onAnimationEndObservable","addOnce","getCategoryLoader","features","feature","getFacialFeatures","loadCategory","eyebrows","mouth","applyFacialFeatures","mask","applyTextureAndMask","maskColor","newMaterial","StandardMaterial","alphaMode","PBRMaterial","PBRMATERIAL_ALPHABLEND","backFaceCulling","hasAlpha","sideOrientation","Orientation","CW","diffuseTexture","diffuseColor","Black","emissiveTexture","emissiveColor","setupMappings","mappings","createMappings","OnPluginActivatedObservable","plugin","preprocessUrlAsync","parts","promises","promise","addAllToScene","Preview","previewError","setPreviewError","width","height","windowSize","setWindowSize","handleResize","innerWidth","innerHeight","addEventListener","removeEventListener","useWindowSize","style","setStyle","isDragging","setIsDragging","isLoadingModel","setIsLoadingModel","isLoaded","setIsLoaded","canvasRef","useRef","isLoadingConfig","configError","setImage","is3D","setIs3D","isMessageSent","setIsMessageSent","showImage","showCanvas","current","backgroundImage","opacity","LOAD","ERROR","shouldResetIsLoaded","className","classNames","src","alt","ref","onMouseDown","onMouseUp","React","ReactDOM","StrictMode","document","getElementById","update","prop"],"mappings":"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","file":"static/js/main.0f2e7470.chunk.js","sourcesContent":["export async function sleep(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n","import { sleep } from './sleep'\n\nexport async function json<T>(url: string, attempts = 3): Promise<T> {\n try {\n const resp = await fetch(url)\n if (!resp.ok) {\n throw new Error(await resp.text())\n }\n return resp.json() as Promise<T>\n } catch (error) {\n if (attempts > 0) {\n await sleep(100)\n return json(url, attempts - 1)\n } else {\n throw error\n }\n }\n}\n","import { Item, NFT, PreviewEnv } from '@dcl/schemas'\nimport { json } from '../json'\n\nexport const nftApiByEnv: Record<PreviewEnv, string> = {\n [PreviewEnv.DEV]: 'https://nft-api.decentraland.io',\n [PreviewEnv.PROD]: 'https://nft-api.decentraland.org',\n}\n\nclass NFTApi {\n async fetchItem(contractAddress: string, itemId: string, env: PreviewEnv) {\n const { data } = await json<{ data: Item[] }>(`${nftApiByEnv[env]}/v1/items?contractAddress=${contractAddress}&itemId=${itemId}`)\n if (data.length === 0) {\n throw new Error(`Item not found for contractAddress=\"${contractAddress}\" itemId=\"${itemId}\"`)\n }\n return data[0]\n }\n async fetchNFT(contractAddress: string, tokenId: string, env: PreviewEnv) {\n const { data } = await json<{ data: { nft: NFT }[] }>(\n `${nftApiByEnv[env]}/v1/nfts?contractAddress=${contractAddress}&tokenId=${tokenId}`\n )\n if (data.length === 0) {\n throw new Error(`NFT not found for contractAddress=\"${contractAddress}\" tokenId=\"${tokenId}\"`)\n }\n return data[0].nft\n }\n}\n\nexport const nftApi = new NFTApi()\n","import { PreviewEnv, Profile, WearableDefinition } from '@dcl/schemas'\nimport { json } from '../json'\n\nexport const peerByEnv: Record<PreviewEnv, string> = {\n [PreviewEnv.DEV]: 'https://peer.decentraland.zone',\n [PreviewEnv.PROD]: 'https://peer.decentraland.org',\n}\n\nclass PeerApi {\n async fetchWearables(urns: string[], env: PreviewEnv) {\n if (urns.length === 0) {\n return []\n }\n const { wearables } = await json<{ wearables: WearableDefinition[] }>(\n `${peerByEnv[env]}/lambdas/collections/wearables?${urns.map((urn) => `wearableId=${urn}`).join('&')}`\n )\n if (wearables.length === 0) {\n throw new Error(`Wearables not found for urns=\"${urns}\"`)\n }\n return wearables\n }\n async fetchProfile(profile: string, env: PreviewEnv) {\n const profiles = await json<Profile[]>(`${peerByEnv[env]}/lambdas/profiles?id=${profile}`)\n return profiles.length > 0 ? profiles[0] : null\n }\n}\n\nexport const peerApi = new PeerApi()\n","interface IMemo<T> {\n memo: (key: string, fn: (...args: any[]) => Promise<T>, ...args: any[]) => Promise<T>\n reset: () => void\n}\n\nexport function createMemo<T>(): IMemo<T> {\n const cache: Record<string, Promise<T>> = {}\n return {\n memo: async (key, fn, ...args) => {\n const exists = key in cache\n if (!exists) {\n cache[key] = fn(...args)\n }\n return cache[key]\n },\n reset: () => {\n for (const key in cache) {\n delete cache[key]\n }\n },\n }\n}\n","import { Color3 } from '@babylonjs/core'\nimport { Color3 as RGB } from '@dcl/schemas'\n\nexport function formatHex(color: string) {\n return color.startsWith('#') ? color : '#' + color\n}\n\nexport function parseHex(color: string) {\n return color.startsWith('#') ? color.slice(1) : color\n}\n\nexport function numberToHex(value: number) {\n const hex = ((value * 255) | 0).toString(16)\n return ('0' + hex).slice(-2)\n}\n\nexport function colorToHex(color: RGB) {\n return numberToHex(color.r) + numberToHex(color.g) + numberToHex(color.b)\n}\n\nexport function hexToColor(hex: string) {\n const parsed = parseHex(hex)\n const color = new Color3(\n parseInt(parsed.slice(0, 2), 16) / 256,\n parseInt(parsed.slice(2, 4), 16) / 256,\n parseInt(parsed.slice(4, 6), 16) / 256\n )\n return color\n}\n","import { RepresentationDefinition, WearableBodyShape, WearableDefinition } from '@dcl/schemas'\n\nexport function is(representation: RepresentationDefinition, bodyShape: WearableBodyShape) {\n return representation.bodyShapes.includes(bodyShape)\n}\n\nexport function isMale(representation: RepresentationDefinition) {\n return is(representation, WearableBodyShape.MALE)\n}\n\nexport function isFemale(representation: RepresentationDefinition) {\n return is(representation, WearableBodyShape.FEMALE)\n}\n\nexport function getRepresentation(wearable: WearableDefinition, shape = WearableBodyShape.MALE) {\n switch (shape) {\n case WearableBodyShape.FEMALE: {\n if (!wearable.data.representations.some(isFemale)) {\n throw new Error(`Could not find a BaseFemale representation for wearable=\"${wearable.id}\"`)\n }\n return wearable.data.representations.find(isFemale)!\n }\n case WearableBodyShape.MALE: {\n if (!wearable.data.representations.some(isMale)) {\n throw new Error(`Could not find a BaseMale representation for wearable=\"${wearable.id}\"`)\n }\n return wearable.data.representations.find(isMale)!\n }\n }\n}\n\nexport function getRepresentationOrDefault(wearable: WearableDefinition, shape = WearableBodyShape.MALE) {\n if (hasRepresentation(wearable, shape)) {\n return getRepresentation(wearable, shape)\n }\n if (wearable.data.representations.length > 0) {\n return wearable.data.representations[0]\n }\n throw new Error(`The wearable=\"${wearable.id}\" has no representation`)\n}\n\nexport function hasRepresentation(wearable: WearableDefinition, shape = WearableBodyShape.MALE) {\n try {\n getRepresentation(wearable, shape)\n return true\n } catch (error) {\n return false\n }\n}\n\nexport function getContentUrl(representation: RepresentationDefinition) {\n const content = representation.contents.find((content) => content.key === representation.mainFile)\n if (!content) {\n throw new Error(`Could not find main file`)\n }\n return content.url\n}\n\nexport function isTexture(representation: RepresentationDefinition) {\n return representation.mainFile.endsWith('png')\n}\n","import { WearableBodyShape, WearableCategory, WearableDefinition } from '@dcl/schemas'\n\nexport function getWearableByCategory(wearables: WearableDefinition[], category: WearableCategory) {\n return wearables.find((wearable) => wearable.data.category === category) || null\n}\n\nexport function getDefaultCategories(shape: WearableBodyShape) {\n switch (shape) {\n case WearableBodyShape.MALE:\n return [\n WearableCategory.EYEBROWS,\n WearableCategory.MOUTH,\n WearableCategory.EYES,\n WearableCategory.HAIR,\n WearableCategory.UPPER_BODY,\n WearableCategory.LOWER_BODY,\n WearableCategory.FEET,\n ]\n case WearableBodyShape.FEMALE:\n return [\n WearableCategory.EYEBROWS,\n WearableCategory.MOUTH,\n WearableCategory.EYES,\n WearableCategory.HAIR,\n WearableCategory.UPPER_BODY,\n WearableCategory.LOWER_BODY,\n WearableCategory.FEET,\n ]\n }\n}\n\nexport function getDefaultWearableUrn(category: WearableCategory, shape: WearableBodyShape) {\n switch (category) {\n case WearableCategory.EYEBROWS:\n return shape === WearableBodyShape.MALE\n ? 'urn:decentraland:off-chain:base-avatars:eyebrows_00'\n : 'urn:decentraland:off-chain:base-avatars:f_eyebrows_00'\n case WearableCategory.MOUTH:\n return shape === WearableBodyShape.MALE\n ? 'urn:decentraland:off-chain:base-avatars:mouth_00'\n : 'urn:decentraland:off-chain:base-avatars:f_mouth_00'\n case WearableCategory.EYES:\n return shape === WearableBodyShape.MALE\n ? 'urn:decentraland:off-chain:base-avatars:eyes_00'\n : 'urn:decentraland:off-chain:base-avatars:f_eyes_00'\n case WearableCategory.HAIR:\n return shape === WearableBodyShape.MALE\n ? 'urn:decentraland:off-chain:base-avatars:casual_hair_01'\n : 'urn:decentraland:off-chain:base-avatars:standard_hair'\n case WearableCategory.UPPER_BODY:\n return shape === WearableBodyShape.MALE\n ? 'urn:decentraland:off-chain:base-avatars:green_hoodie'\n : 'urn:decentraland:off-chain:base-avatars:f_sweater'\n case WearableCategory.LOWER_BODY:\n return shape === WearableBodyShape.MALE\n ? 'urn:decentraland:off-chain:base-avatars:brown_pants'\n : 'urn:decentraland:off-chain:base-avatars:f_jeans'\n case WearableCategory.FEET:\n return shape === WearableBodyShape.MALE\n ? 'urn:decentraland:off-chain:base-avatars:sneakers'\n : 'urn:decentraland:off-chain:base-avatars:bun_shoes'\n default:\n throw new Error(`There is no default wearable for category=\"${category}\"`)\n }\n}\n\nexport function isWearable(value: WearableDefinition | void): value is WearableDefinition {\n return !!value\n}\n\nexport function getWearableBodyShape(wearabe: WearableDefinition): WearableBodyShape {\n const bodyShapes = [WearableBodyShape.MALE, WearableBodyShape.FEMALE]\n return (\n bodyShapes.find((bodyShape) => wearabe.data.representations.some((representation) => representation.bodyShapes.includes(bodyShape))) ||\n bodyShapes[0]\n )\n}\n\nexport function isEmote(wearable: WearableDefinition) {\n return !!wearable && `emoteDataV0` in wearable\n}\n","import { WearableCategory, WearableDefinition } from '@dcl/schemas'\n\nexport function parseZoom(rawZoom: string | null) {\n const parsedZoom = rawZoom ? parseFloat(rawZoom) : null\n const zoom = parsedZoom === null || isNaN(parsedZoom) ? null : (Math.min(Math.max(parsedZoom, 0), 100) * 1.8) / 100 + 1\n return zoom\n}\n\n/**\n * Returns the right zoom for a given category\n * @param category\n * @returns\n */\nexport function getZoom(wearable?: WearableDefinition | void) {\n const category = wearable?.data.category\n switch (category) {\n case WearableCategory.UPPER_BODY:\n return 2\n case WearableCategory.SKIN:\n return 1.75\n default:\n return 1.25\n }\n}\n","import {\n Avatar,\n Network,\n PreviewCamera,\n PreviewConfig,\n PreviewEmote,\n PreviewEnv,\n PreviewOptions,\n PreviewType,\n Rarity,\n WearableBodyShape,\n WearableDefinition,\n} from '@dcl/schemas'\nimport { nftApi } from './api/nft'\nimport { peerApi } from './api/peer'\nimport { createMemo } from './cache'\nimport { colorToHex, formatHex } from './color'\nimport { getRepresentationOrDefault, hasRepresentation, isTexture } from './representation'\nimport { getDefaultCategories, getDefaultWearableUrn, getWearableBodyShape, getWearableByCategory, isEmote } from './wearable'\nimport { getZoom } from './zoom'\n\nconst DEFAULT_PROFILE = 'default'\n\nasync function fetchWearable(urn: string, env: PreviewEnv) {\n const results = await fetchWearables([urn], env)\n if (results.length !== 1) {\n throw new Error(`Could not find wearable for urn=\"${urn}\"`)\n }\n return results[0]\n}\nexport const wearableMemo = createMemo<WearableDefinition[]>()\nasync function fetchWearables(urns: string[], env: PreviewEnv) {\n return peerApi.fetchWearables(urns, env)\n}\n\nexport const profileMemo = createMemo<Avatar | null>()\nasync function fetchProfile(profile: string, env: PreviewEnv) {\n return profileMemo.memo(profile, async () => {\n if (profile === DEFAULT_PROFILE) {\n return null\n }\n const resp = await peerApi\n .fetchProfile(profile, env)\n .then((profile) => (profile && profile.avatars.length > 0 ? profile.avatars[0] : null))\n .catch((error: Error) => console.log(`Failed to load profile=\"${profile}\"`, error))\n return resp || null\n })\n}\n\nasync function fetchWearableFromContract(options: {\n contractAddress: string\n itemId?: string | null\n tokenId?: string | null\n env: PreviewEnv\n}) {\n const { contractAddress, itemId, tokenId, env } = options\n if (!itemId && !tokenId) {\n throw new Error(`You need to provide an itemId or a tokenId`)\n }\n\n const network = env === PreviewEnv.PROD ? 'matic' : 'mumbai'\n let urn = `urn:decentraland:${network}:collections-v2:${contractAddress}:${itemId}`\n if (!itemId && !tokenId) {\n throw new Error(`You must provide either tokenId or itemId`)\n } else if (!itemId && tokenId) {\n const nft = await nftApi.fetchNFT(contractAddress, tokenId, env)\n urn =\n nft.network !== Network.ETHEREUM\n ? `urn:decentraland:${network}:collections-v2:${contractAddress}:${nft.itemId}`\n : nft.image.split('contents/')[1].split('/thumbnail')[0] // since the Ethereum collections have a different URN, we extract it from the image path\n }\n return fetchWearable(urn, env)\n}\n\nasync function fetchAvatar(urns: string[], bodyShape: WearableBodyShape, env: PreviewEnv) {\n // fetch wearables\n let wearables = await fetchWearables([bodyShape, ...urns], env)\n // filter out wearables that don't have a representation for the body shape\n wearables = wearables.filter((wearable) => hasRepresentation(wearable, bodyShape))\n // fill default categories\n const defaultWearableUrns: string[] = []\n for (const category of getDefaultCategories(bodyShape)) {\n const wearable = getWearableByCategory(wearables, category)\n if (!wearable) {\n const urn = getDefaultWearableUrn(category, bodyShape)\n if (urn) {\n defaultWearableUrns.push(urn)\n } else {\n throw new Error(`Could not get default URN for category=\"${category}\"`)\n }\n }\n }\n if (defaultWearableUrns.length > 0) {\n const defaultWearables = await fetchWearables(defaultWearableUrns, env)\n wearables = [...wearables, ...defaultWearables]\n }\n return wearables\n}\n\nexport async function createConfig(options: PreviewOptions = {}): Promise<PreviewConfig> {\n const { contractAddress, tokenId, itemId } = options\n const env = options.env || PreviewEnv.PROD\n\n // load wearable to preview\n let wearablePromise: Promise<WearableDefinition | void> = Promise.resolve()\n if (contractAddress) {\n wearablePromise = fetchWearableFromContract({ contractAddress, tokenId, itemId, env })\n }\n\n // load profile\n const profilePromise = options.profile ? fetchProfile(options.profile, env) : Promise.resolve(null)\n\n // await promises\n const [wearable, profile] = await Promise.all([wearablePromise, profilePromise] as const)\n\n // use body shape from options, default to the profile one, if no profile default to the wearable bodyShape, if none, default to male\n const bodyShape =\n options.bodyShape ||\n (profile && (profile.avatar.bodyShape as WearableBodyShape)) ||\n (wearable ? getWearableBodyShape(wearable!) : WearableBodyShape.MALE)\n\n // use colors from options, default to profile, if none, use default values\n const skin = formatHex(options.skin || (profile && colorToHex(profile.avatar.skin.color)) || 'cc9b76')\n const hair = formatHex(options.hair || (profile && colorToHex(profile.avatar.hair.color)) || '000000')\n const eyes = formatHex(options.eyes || (profile && colorToHex(profile.avatar.eyes.color)) || '000000')\n\n // merge urns from profile (if any) and extra urns\n const urns = [...(profile ? profile.avatar.wearables : []), ...(options.urns || [])]\n\n let wearables: WearableDefinition[] = []\n let zoom = 1.75\n let type = PreviewType.WEARABLE\n let background: PreviewConfig['background'] = {\n gradient: options.transparentBackground ? undefined : `radial-gradient(#676370, #18141b)`,\n }\n\n // if loading multiple wearables, or if wearable is emote, render full avatar\n if (urns.length > 0 || (wearable && isEmote(wearable)) || options.profile === DEFAULT_PROFILE) {\n type = PreviewType.AVATAR\n wearables = await fetchAvatar(urns, bodyShape, env)\n }\n\n if (wearable) {\n zoom = wearables.length > 0 ? zoom : getZoom(wearable)\n const representation = getRepresentationOrDefault(wearable)\n if (isTexture(representation) && type !== PreviewType.AVATAR) {\n type = PreviewType.TEXTURE\n }\n const [light, dark] = Rarity.getGradient(wearable.rarity!)\n const gradient = `radial-gradient(${light}, ${dark})`\n background = {\n image: wearable.thumbnail,\n gradient,\n }\n }\n\n let emote = PreviewEmote.IDLE\n if (options.emote && Object.values(PreviewEmote).includes(options.emote)) {\n emote = options.emote\n }\n\n let camera = PreviewCamera.INTERACTIVE\n if (options.camera && Object.values(PreviewCamera).includes(options.camera)) {\n camera = options.camera\n }\n const autoRotateSpeed = typeof options.autoRotateSpeed === 'number' && !isNaN(options.autoRotateSpeed) ? options.autoRotateSpeed : 0.2\n\n return {\n wearable: wearable ?? undefined,\n wearables,\n bodyShape,\n skin,\n hair,\n eyes,\n type,\n background,\n emote,\n camera,\n autoRotateSpeed,\n offsetX: options.offsetX || 0,\n offsetY: options.offsetY || 0,\n offsetZ: options.offsetZ || 0,\n zoom: options.zoom || zoom,\n }\n}\n","export enum MessageType {\n LOAD = 'load',\n ERROR = 'error',\n UPDATE = 'update',\n}\n\nexport function sendMessage(type: MessageType, message?: string) {\n const event = JSON.stringify({ type, message })\n window.parent && window.parent.postMessage(event, '*')\n}\n","import { PreviewOptions } from '@dcl/schemas'\nimport { useState, useEffect } from 'react'\nimport { MessageType } from '../lib/message'\n\nexport const useOverrides = () => {\n const [overrides, setOverrides] = useState<PreviewOptions>({})\n\n // receive message from parent window to update options\n useEffect(() => {\n const previous = window.onmessage\n window.onmessage = function (event: MessageEvent) {\n if (event.data && event.data.type === MessageType.UPDATE) {\n const message = event.data as { type: MessageType.UPDATE; options: PreviewOptions }\n if (message.options && typeof message.options === 'object') {\n setOverrides(message.options)\n }\n }\n }\n return () => {\n window.onmessage = previous\n }\n }, [])\n\n return overrides\n}\n","import { useMemo, useState } from 'react'\nimport { useOverrides } from './useOverrides'\n\nimport { PreviewCamera, PreviewEmote, PreviewEnv, PreviewOptions, WearableBodyShape } from '@dcl/schemas'\nimport { parseZoom } from '../lib/zoom'\n\nexport const useOptions = () => {\n // get options from url params\n const [search] = useState(window.location.search.toString())\n const options = useMemo<PreviewOptions>(() => {\n const params = new URLSearchParams(search)\n const autoRotateSpeedParam = params.get('autoRotateSpeed') as string | null\n const offsetXParam = params.get('offsetX') as string | null\n const offsetYParam = params.get('offsetY') as string | null\n const offsetZParam = params.get('offsetZ') as string | null\n const bodyShapeParam = params.get('bodyShape')\n const options = {\n contractAddress: params.get('contract')!,\n tokenId: params.get('token'),\n itemId: params.get('item'),\n skin: params.get('skin'),\n hair: params.get('hair'),\n eyes: params.get('eyes'),\n emote: params.get('emote') as PreviewEmote | null,\n camera: params.get('camera') as PreviewCamera | null,\n transparentBackground: params.has('transparentBackground'),\n autoRotateSpeed: autoRotateSpeedParam ? parseFloat(autoRotateSpeedParam) : null,\n offsetX: offsetXParam ? parseFloat(offsetXParam) : null,\n offsetY: offsetYParam ? parseFloat(offsetYParam) : null,\n offsetZ: offsetZParam ? parseFloat(offsetZParam) : null,\n zoom: parseZoom(params.get('zoom')),\n bodyShape: bodyShapeParam === 'female' ? WearableBodyShape.FEMALE : bodyShapeParam === 'male' ? WearableBodyShape.MALE : null,\n urns: params.getAll('urn'),\n profile: params.get('profile'),\n env: Object.values(PreviewEnv)\n .filter((value): value is PreviewEnv => typeof value === 'string')\n .reduce((selected, value) => (value === params.get('env') ? value : selected), PreviewEnv.PROD),\n }\n return options\n }, [search])\n\n // apply overrides\n const overrides = useOverrides()\n const optionsWithOverrides = useMemo(() => {\n const keysToOverride = (Object.keys(overrides) as (keyof PreviewOptions)[]).filter(\n (key) => typeof overrides[key] !== 'undefined' && overrides[key] !== null\n )\n if (options && keysToOverride.length > 0) {\n const newOptions: PreviewOptions = { ...options }\n for (const key of keysToOverride) {\n const value = overrides[key]\n if (value) {\n newOptions[key] = value as never\n }\n }\n return newOptions\n }\n return options\n }, [options, overrides])\n\n // return options with overrides applied (if any)\n return optionsWithOverrides\n}\n","import { createConfig } from '../lib/config'\nimport { useAsync } from './useAsync'\nimport { useOptions } from './useOptions'\n\nexport function useConfig() {\n const options = useOptions()\n const [avatar, isLoading, error] = useAsync(() => createConfig(options), [options])\n return [avatar, isLoading, error] as const\n}\n","import { useEffect, useState } from 'react'\n\nexport function useAsync<T>(asyncFunction: (...args: any[]) => Promise<T>, deps: React.DependencyList = []) {\n const [isLoading, setIsLoading] = useState(false)\n const [result, setResult] = useState<T | null>(null)\n const [error, setError] = useState('')\n useEffect(() => {\n setIsLoading(true)\n asyncFunction()\n .then((result) => setResult(result))\n .catch((error) => setError(error.message))\n .finally(() => setIsLoading(false))\n }, deps) // eslint-disable-line\n return [result, isLoading, error] as const\n}\n","import { WearableCategory, WearableDefinition } from '@dcl/schemas'\nimport { getRepresentationOrDefault, isTexture } from '../representation'\nimport { Asset } from './scene'\n\nexport function isCategory(category: WearableCategory) {\n return (wearable: WearableDefinition) => wearable.data.category === category\n}\n\nexport function isHidden(category: WearableCategory) {\n return (asset: Asset) => {\n return (\n asset.wearable.data.category === category ||\n (asset.wearable.data.hides || []).includes(category) ||\n (asset.wearable.data.replaces || []).includes(category)\n )\n }\n}\n\nexport function isSuccesful(result: void | Asset): result is Asset {\n return !!result\n}\n\nexport function isModel(wearable: WearableDefinition): boolean {\n const representation = getRepresentationOrDefault(wearable)\n return !isTexture(representation)\n}\n\nexport function isFacialFeature(wearable: WearableDefinition): boolean {\n return !isModel(wearable)\n}\n","import { WearableCategory } from '@dcl/schemas'\nimport { Asset } from './scene'\nimport { isHidden } from './utils'\n\nexport function getBodyShape(assets: Asset[]) {\n const bodyShape = assets.find((part) => part.wearable.data.category === ('body_shape' as WearableCategory))\n\n if (!bodyShape) {\n throw new Error(`Could not find a bodyShape when trying to hide base body parts`)\n }\n\n // hide base body parts if necessary\n const hasSkin = assets.some((part) => part.wearable.data.category === WearableCategory.SKIN)\n const hideUpperBody = hasSkin || assets.some(isHidden(WearableCategory.UPPER_BODY))\n const hideLowerBody = hasSkin || assets.some(isHidden(WearableCategory.LOWER_BODY))\n const hideFeet = hasSkin || assets.some(isHidden(WearableCategory.FEET))\n const hideHead = hasSkin || assets.some(isHidden('head' as WearableCategory))\n\n for (const mesh of bodyShape.container.meshes) {\n const name = mesh.name.toLowerCase()\n if (name.endsWith('ubody_basemesh') && hideUpperBody) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('lbody_basemesh') && hideLowerBody) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('feet_basemesh') && hideFeet) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('head') && hideHead) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('head_basemesh') && hideHead) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('mask_eyes') && hideHead) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('mask_eyebrows') && hideHead) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('mask_mouth') && hideHead) {\n mesh.setEnabled(false)\n }\n }\n\n return bodyShape\n}\n","import { PreviewConfig, WearableCategory, WearableDefinition } from '@dcl/schemas'\nimport { hasRepresentation } from '../representation'\nimport { isEmote } from '../wearable'\n\nconst categoriesHiddenBySkin = [\n WearableCategory.HELMET,\n WearableCategory.HAIR,\n WearableCategory.FACIAL_HAIR,\n WearableCategory.MOUTH,\n WearableCategory.EYEBROWS,\n WearableCategory.EYES,\n WearableCategory.UPPER_BODY,\n WearableCategory.LOWER_BODY,\n WearableCategory.FEET,\n]\n\nexport function getSlots(config: PreviewConfig) {\n const slots = new Map<WearableCategory, WearableDefinition>()\n\n let wearables: WearableDefinition[] = config.wearables.filter((wearable) => !isEmote(wearable)) // remove emotes if any\n\n // remove other wearables that hide the equipped wearable\n if (config.wearable && !isEmote(config.wearable)) {\n wearables = config.wearables.filter((wearable) => {\n if (config.wearable) {\n const { category, hides, replaces } = config.wearable.data\n if (wearable.data.category === 'skin') {\n if (categoriesHiddenBySkin.includes(category)) {\n return false\n }\n if (hides && hides.includes('head' as WearableCategory)) {\n return false\n }\n if (replaces && replaces.includes('head' as WearableCategory)) {\n return false\n }\n }\n if (wearable.data.hides && wearable.data.hides.includes(category)) {\n return false\n }\n if (wearable.data.replaces && wearable.data.replaces.includes(category)) {\n return false\n }\n }\n return true\n })\n // add the equipped wearable at the end\n wearables.push(config.wearable)\n }\n\n // arrange wearbles in slots\n for (const wearable of wearables) {\n const slot = wearable.data.category\n if (hasRepresentation(wearable, config.bodyShape)) {\n slots.set(slot, wearable)\n }\n }\n let hasSkin = false\n // grab only the wearables that ended up in the map, and process in reverse order (last wearables can hide/replace the first ones)\n wearables = wearables.filter((wearable) => slots.get(wearable.data.category) === wearable).reverse()\n const alreadyRemoved = new Set<string>()\n for (const wearable of wearables) {\n const category = wearable.data.category\n if (alreadyRemoved.has(category)) {\n continue\n }\n const replaced = wearable.data.replaces || []\n const hidden = wearable.data.hides || []\n const toRemove = Array.from(new Set([...replaced, ...hidden]))\n for (const slot of toRemove) {\n if (slot !== category) {\n slots.delete(slot)\n alreadyRemoved.add(slot)\n }\n }\n if (wearable.data.category === WearableCategory.SKIN) {\n hasSkin = true\n }\n }\n // skins hide all the following slots\n if (hasSkin) {\n for (const category of categoriesHiddenBySkin) {\n slots.delete(category)\n }\n }\n\n return slots\n}\n","import { ArcRotateCamera } from '@babylonjs/core'\nimport { PreviewConfig } from '@dcl/schemas'\n\nexport function startAutoRotateBehavior(camera: ArcRotateCamera, config: PreviewConfig) {\n if (camera) {\n camera.useAutoRotationBehavior = true\n if (camera.autoRotationBehavior) {\n camera.autoRotationBehavior.idleRotationSpeed = config.autoRotateSpeed\n }\n }\n}\n","import {\n ArcRotateCamera,\n AssetContainer,\n BoundingInfo,\n Camera,\n Color3,\n Color4,\n DirectionalLight,\n Engine,\n HemisphericLight,\n Mesh,\n PBRMaterial,\n Scene,\n SceneLoader,\n SpotLight,\n Texture,\n TextureAssetTask,\n Vector3,\n} from '@babylonjs/core'\nimport '@babylonjs/loaders'\nimport { PreviewCamera, PreviewConfig, PreviewType, WearableBodyShape, WearableDefinition } from '@dcl/schemas'\nimport { getContentUrl, getRepresentation, isTexture } from '../representation'\nimport { startAutoRotateBehavior } from './camera'\n\nexport type Asset = {\n container: AssetContainer\n wearable: WearableDefinition\n}\n\n/**\n * It refreshes the bounding info of a mesh, taking into account all of its children\n * @param parent\n */\nfunction refreshBoundingInfo(parent: Mesh) {\n const children = parent.getChildren().filter((mesh) => mesh.id !== '__root__')\n if (children.length > 0) {\n const child = children[0] as Mesh\n // child.showBoundingBox = true\n let boundingInfo = child.getBoundingInfo()\n\n let min = boundingInfo.boundingBox.minimumWorld.add(child.position)\n let max = boundingInfo.boundingBox.maximumWorld.add(child.position)\n\n for (let i = 1; i < children.length; i++) {\n const child = children[i] as Mesh\n // child.showBoundingBox = true\n boundingInfo = child.getBoundingInfo()\n const siblingMin = boundingInfo.boundingBox.minimumWorld.add(child.position)\n const siblingMax = boundingInfo.boundingBox.maximumWorld.add(child.position)\n\n min = Vector3.Minimize(min, siblingMin)\n max = Vector3.Maximize(max, siblingMax)\n }\n\n parent.setBoundingInfo(new BoundingInfo(min, max))\n }\n}\n\n/**\n * Creates a Scene with the right camera, light and effects\n * @param canvas\n * @param zoom\n * @returns\n */\nlet engine: Engine\nexport async function createScene(canvas: HTMLCanvasElement, config: PreviewConfig) {\n // Create engine\n if (engine) {\n engine.dispose()\n }\n engine = new Engine(canvas, true, {\n preserveDrawingBuffer: true,\n stencil: true,\n antialias: true,\n })\n\n // Load GLB/GLTF\n const root = new Scene(engine)\n root.autoClear = true\n root.clearColor = new Color4(0, 0, 0, 0)\n root.preventDefaultOnPointerDown = false\n\n // Setup Camera\n var camera = new ArcRotateCamera('camera', 0, 0, 0, new Vector3(0, 0, 0), root)\n camera.mode = Camera.PERSPECTIVE_CAMERA\n switch (config.camera) {\n case PreviewCamera.INTERACTIVE: {\n switch (config.type) {\n case PreviewType.WEARABLE: {\n startAutoRotateBehavior(camera, config)\n camera.position = new Vector3(-2, 2, 2)\n break\n }\n case PreviewType.AVATAR: {\n camera.position = new Vector3(0, 1, 3.5)\n break\n }\n default: {\n console.warn(`Unexpected preview.type=\"${config.type}\"`)\n // do nothing\n }\n }\n camera.attachControl(canvas, true)\n break\n }\n case PreviewCamera.STATIC: {\n camera.position = new Vector3(0, 1, 3.5)\n break\n }\n }\n const offset = new Vector3(config.offsetX, config.offsetY, config.offsetZ)\n camera.position.addInPlace(offset)\n camera.setTarget(offset)\n camera.lowerRadiusLimit = camera.upperRadiusLimit = camera.radius / config.zoom\n\n // Setup lights\n var directional = new DirectionalLight('directional', new Vector3(0, 0, 1), root)\n directional.intensity = 1\n var top = new HemisphericLight('top', new Vector3(0, -1, 0), root)\n top.intensity = 1\n var bottom = new HemisphericLight('bottom', new Vector3(0, 1, 0), root)\n bottom.intensity = 1\n var spot = new SpotLight('spot', new Vector3(-2, 2, 2), new Vector3(2, -2, -2), Math.PI / 2, 1000, root)\n spot.intensity = 1\n\n // render loop\n engine.runRenderLoop(() => root.render())\n\n return root\n}\n\nexport async function loadMask(scene: Scene, wearable: WearableDefinition, bodyShape: WearableBodyShape): Promise<Texture | null> {\n const name = wearable.id\n const representation = getRepresentation(wearable, bodyShape)\n const file = representation.contents.find((file) => file.key.toLowerCase().endsWith('_mask.png'))\n if (file) {\n return new Promise((resolve, reject) => {\n const task = new TextureAssetTask(name, file.url, true, false)\n task.onError = () => reject(task.errorObject)\n task.onSuccess = () => {\n resolve(task.texture)\n }\n task.run(scene, () => resolve(task.texture), reject)\n })\n }\n return null\n}\n\nexport async function loadTexture(scene: Scene, wearable: WearableDefinition, bodyShape: WearableBodyShape): Promise<Texture | null> {\n const name = wearable.id\n const representation = getRepresentation(wearable, bodyShape)\n const file = representation.contents.find(\n (file) => file.key.toLowerCase().endsWith('.png') && !file.key.toLowerCase().endsWith('_mask.png')\n )\n if (file) {\n return new Promise((resolve, reject) => {\n const task = new TextureAssetTask(name, file.url, true, false)\n task.onError = () => reject(task.errorObject)\n task.onSuccess = () => {\n resolve(task.texture)\n }\n task.run(scene, () => resolve(task.texture), reject)\n })\n }\n return null\n}\n\nexport async function loadAssetContainer(scene: Scene, url: string) {\n const load = async (url: string, extension: string) => SceneLoader.LoadAssetContainerAsync(url, '', scene, null, extension)\n // try with GLB, if it fails try with GLTF\n try {\n return await load(url, '.glb')\n } catch (error) {\n return await load(url, '.gltf')\n }\n}\n\n/**\n * Loads a wearable into the Scene, using a given a body shape, skin and hair color\n * @param scene\n * @param wearable\n * @param bodyShape\n * @param skin\n * @param hair\n */\n\nconst hairMaterials = ['hair_mat']\n// there are some representations that use a modified material name like \"skin-f\" or \"skin_f\", i added them to the list support those wearables\nconst skinMaterials = ['avatarskin_mat', 'skin-f', 'skin_f']\nexport async function loadAsset(\n scene: Scene,\n wearable: WearableDefinition,\n bodyShape = WearableBodyShape.MALE,\n skin?: string,\n hair?: string\n) {\n const representation = getRepresentation(wearable, bodyShape)\n if (isTexture(representation)) {\n throw new Error(`The wearable=\"${wearable.id}\" is a texture`)\n }\n const url = getContentUrl(representation)\n const container = await loadAssetContainer(scene, url)\n\n // Clean up\n for (let material of container.materials) {\n if (hairMaterials.some((mat) => material.name.toLowerCase().includes(mat))) {\n if (hair) {\n const pbr = material as PBRMaterial\n pbr.albedoColor = Color3.FromHexString(hair)\n pbr.alpha = 1\n } else {\n material.alpha = 0\n scene.removeMaterial(material)\n }\n }\n if (skinMaterials.some((mat) => material.name.toLowerCase().includes(mat))) {\n if (skin) {\n const pbr = material as PBRMaterial\n pbr.albedoColor = Color3.FromHexString(skin)\n pbr.alpha = 1\n } else {\n material.alpha = 0\n scene.removeMaterial(material)\n }\n }\n }\n\n // Stop any animations\n for (const animationGroup of container.animationGroups) {\n animationGroup.stop()\n animationGroup.reset()\n animationGroup.dispose()\n }\n\n return { container, wearable }\n}\n\n/**\n * Center and resizes a Scene to fit in the camera view\n * @param scene\n */\n\nexport function center(scene: Scene) {\n // Setup parent\n var parent = new Mesh('parent', scene)\n for (const mesh of scene.meshes) {\n if (mesh !== parent) {\n mesh.setParent(parent)\n }\n }\n\n // resize and center\n refreshBoundingInfo(parent)\n const bounds = parent.getBoundingInfo().boundingBox.extendSize\n const size = bounds.length()\n const scale = new Vector3(1 / size, 1 / size, 1 / size)\n parent.scaling = scale\n const center = parent.getBoundingInfo().boundingBox.center.multiply(scale)\n parent.position.subtractInPlace(center)\n}\n","import { AnimationGroup, ArcRotateCamera, AssetContainer, Scene, TransformNode } from '@babylonjs/core'\nimport { PreviewCamera, PreviewConfig, PreviewEmote, WearableDefinition } from '@dcl/schemas'\nimport { getRepresentation } from '../representation'\nimport { isEmote } from '../wearable'\nimport { startAutoRotateBehavior } from './camera'\nimport { Asset, loadAssetContainer } from './scene'\n\nconst loopedEmotes = [PreviewEmote.IDLE, PreviewEmote.MONEY, PreviewEmote.CLAP]\n\nfunction isLooped(emote: PreviewEmote) {\n return loopedEmotes.includes(emote)\n}\n\nexport function buildEmoteUrl(emote: PreviewEmote) {\n let baseUrl = process.env.PUBLIC_URL || ''\n if (!baseUrl.endsWith('/')) {\n baseUrl += '/'\n }\n const path = `./emotes/${emote}.glb`\n const url = baseUrl.startsWith('http') ? new URL(path, baseUrl).href : path\n return url\n}\n\nexport async function loadEmoteFromUrl(scene: Scene, url: string) {\n const container = await loadAssetContainer(scene, url)\n if (container.animationGroups.length === 0) {\n throw new Error(`No animation groups found for emote with url=${url}`)\n }\n return container\n}\n\nexport async function loadEmoteFromWearable(scene: Scene, wearable: WearableDefinition, config: PreviewConfig) {\n const representation = getRepresentation(wearable, config.bodyShape)\n const content = representation.contents.find((content) => content.key === representation.mainFile)\n if (!content) {\n throw new Error(`Could not find a valid content in representation for wearable=${wearable.id} and bodyShape=${config.bodyShape}`)\n }\n return loadEmoteFromUrl(scene, content.url)\n}\n\nexport async function playEmote(scene: Scene, assets: Asset[], config: PreviewConfig) {\n // load asset container for emote\n let container: AssetContainer | undefined\n let loop = isLooped(config.emote)\n if (config.wearable && isEmote(config.wearable)) {\n try {\n container = await loadEmoteFromWearable(scene, config.wearable, config)\n loop = !!config.wearable.emoteDataV0?.loop\n } catch (error) {\n console.warn(`Could not load emote=${config.wearable.id}`)\n }\n }\n if (!container) {\n const emoteUrl = buildEmoteUrl(config.emote)\n container = await loadEmoteFromUrl(scene, emoteUrl)\n }\n\n // start camera rotation after animation ends\n async function onAnimationEnd() {\n if (config.camera !== PreviewCamera.STATIC) {\n const camera = scene.cameras[0] as ArcRotateCamera\n startAutoRotateBehavior(camera, config)\n }\n if (loop) {\n // keep playing idle animation on loop\n playEmote(scene, assets, config)\n }\n }\n\n // play emote animation\n try {\n const emoteAnimationGroup = new AnimationGroup('emote', scene)\n for (const asset of assets) {\n // store all the transform nodes in a map, there can be repeated node ids\n // if a wearable has multiple representations, so for each id we keep an array of nodes\n const nodes = asset.container.transformNodes.reduce((map, node) => {\n const list = map.get(node.id) || []\n list.push(node)\n return map.set(node.id, list)\n }, new Map<string, TransformNode[]>())\n // apply each targeted animation from the emote asset container to the transform nodes of all the wearables\n if (container.animationGroups.length > 0) {\n for (const targetedAnimation of container.animationGroups[0].targetedAnimations) {\n const animation = targetedAnimation.animation\n const target = targetedAnimation.target as TransformNode\n const newTargets = nodes.get(target.id)\n if (newTargets && newTargets.length > 0) {\n for (const newTarget of newTargets) {\n emoteAnimationGroup.addTargetedAnimation(animation, newTarget)\n }\n }\n }\n } else {\n throw new Error(`No animationGroups found`)\n }\n }\n // play animation group and apply\n emoteAnimationGroup.play()\n emoteAnimationGroup.onAnimationEndObservable.addOnce(onAnimationEnd)\n } catch (error) {\n console.warn(`Could not play emote=${config.emote}`, error)\n }\n}\n\nexport function shouldPlayEmote(config: PreviewConfig) {\n return config.emote\n}\n","import { AbstractMesh, Color3, Orientation, PBRMaterial, Scene, StandardMaterial, Texture } from '@babylonjs/core'\nimport { PreviewConfig, WearableBodyShape, WearableCategory, WearableDefinition } from '@dcl/schemas'\nimport { hexToColor } from '../color'\nimport { Asset, loadMask, loadTexture } from './scene'\nimport { isCategory } from './utils'\n\nfunction getCategoryLoader(scene: Scene, features: WearableDefinition[], bodyShape: WearableBodyShape) {\n return async (category: WearableCategory) => {\n const feature = features.find(isCategory(category))\n if (feature) {\n return Promise.all([loadTexture(scene, feature, bodyShape), loadMask(scene, feature, bodyShape)]) as Promise<\n [Texture | null, Texture | null]\n >\n }\n return [null, null] as [null, null]\n }\n}\n\nexport async function getFacialFeatures(scene: Scene, features: WearableDefinition[], bodyShape: WearableBodyShape) {\n const loadCategory = getCategoryLoader(scene, features, bodyShape)\n const [eyes, eyebrows, mouth] = await Promise.all([\n loadCategory(WearableCategory.EYES),\n loadCategory(WearableCategory.EYEBROWS),\n loadCategory(WearableCategory.MOUTH),\n ])\n return { eyes, eyebrows, mouth }\n}\n\nexport async function applyFacialFeatures(\n scene: Scene,\n bodyShape: Asset,\n eyes: [Texture | null, Texture | null],\n eyebrows: [Texture | null, Texture | null],\n mouth: [Texture | null, Texture | null],\n config: PreviewConfig\n) {\n for (const mesh of bodyShape.container.meshes) {\n if (mesh.name.toLowerCase().endsWith('mask_eyes')) {\n const [texture, mask] = eyes\n if (texture) {\n applyTextureAndMask(scene, 'eyes', mesh, texture, config.eyes, mask, '#ffffff')\n }\n }\n if (mesh.name.toLowerCase().endsWith('mask_eyebrows')) {\n const [texture, mask] = eyebrows\n if (texture) {\n applyTextureAndMask(scene, 'eyebrows', mesh, texture, config.hair, mask, config.hair)\n }\n }\n if (mesh.name.toLowerCase().endsWith('mask_mouth')) {\n const [texture, mask] = mouth\n if (texture) {\n applyTextureAndMask(scene, 'mouth', mesh, texture, config.skin, mask, config.skin)\n }\n }\n }\n}\n\nfunction applyTextureAndMask(\n scene: Scene,\n name: string,\n mesh: AbstractMesh,\n texture: Texture,\n color: string,\n mask: Texture | null,\n maskColor: string\n) {\n const newMaterial = new StandardMaterial(`${name}_standard_material`, scene)\n newMaterial.alphaMode = PBRMaterial.PBRMATERIAL_ALPHABLEND\n newMaterial.backFaceCulling = true\n texture.hasAlpha = true\n newMaterial.sideOrientation = Orientation.CW\n newMaterial.diffuseTexture = texture\n newMaterial.diffuseColor = mask ? Color3.Black() : hexToColor(maskColor)\n if (mask) {\n newMaterial.emissiveTexture = mask\n newMaterial.emissiveColor = hexToColor(color)\n }\n mesh.material = newMaterial\n}\n","import { SceneLoader } from '@babylonjs/core'\nimport { GLTFFileLoader } from '@babylonjs/loaders'\nimport { PreviewConfig, WearableBodyShape, WearableDefinition } from '@dcl/schemas'\nimport { getRepresentation } from '../representation'\n\nexport function createMappings(wearables: WearableDefinition[], bodyShape = WearableBodyShape.MALE) {\n const mappings: Record<string, string> = {}\n for (const wearable of wearables) {\n try {\n const representation = getRepresentation(wearable, bodyShape)\n for (const file of representation.contents) {\n mappings[file.key] = file.url\n }\n } catch (error) {\n console.warn(\n `Skipping generation of mappings for wearable=\"${wearable.id}\" since it lacks a representation for bodyShape=\"${bodyShape}\"`\n )\n continue\n }\n }\n return mappings\n}\n\n/**\n * Configures the mappings for all the relative paths within a model to the right IPFS in the catalyst\n * @param wearables\n */\nexport function setupMappings(config: PreviewConfig) {\n const wearables = config.wearable ? [config.wearable, ...config.wearables] : config.wearables\n const mappings = createMappings(wearables, config.bodyShape)\n SceneLoader.OnPluginActivatedObservable.add((plugin) => {\n if (plugin.name === 'gltf') {\n const gltf = plugin as GLTFFileLoader\n gltf.preprocessUrlAsync = async (url: string) => {\n const baseUrl = `/content/contents/`\n const parts = url.split(baseUrl)\n return parts.length > 0 && !!parts[1] ? mappings[parts[1]] : url\n }\n }\n })\n}\n","import { PreviewConfig, PreviewType, WearableBodyShape } from '@dcl/schemas'\nimport { getBodyShape } from './body'\nimport { getSlots } from './slots'\nimport { playEmote } from './emotes'\nimport { applyFacialFeatures, getFacialFeatures } from './face'\nimport { setupMappings } from './mappings'\nimport { Asset, center, createScene, loadAsset } from './scene'\nimport { isFacialFeature, isModel, isSuccesful } from './utils'\n\n/**\n * Initializes Babylon, creates the scene and loads a list of wearables in it\n * @param canvas\n * @param wearables\n * @param options\n */\nexport async function render(canvas: HTMLCanvasElement, config: PreviewConfig) {\n // create the root scene\n const root = await createScene(canvas, config)\n\n // setup the mappings for all the contents\n setupMappings(config)\n\n // load all the wearables into the root scene\n const promises: Promise<void | Asset>[] = []\n\n if (config.type === PreviewType.AVATAR) {\n // get slots\n const slots = getSlots(config)\n\n // get wearables\n const wearables = Array.from(slots.values())\n\n for (const wearable of wearables.filter(isModel)) {\n const promise = loadAsset(root, wearable, config.bodyShape, config.skin, config.hair).catch((error) => {\n console.warn(error.message)\n })\n promises.push(promise)\n }\n const assets = (await Promise.all(promises)).filter(isSuccesful)\n\n // add all assets to scene\n for (const asset of assets) {\n asset.container.addAllToScene()\n }\n\n // build avatar\n const bodyShape = getBodyShape(assets)\n // apply facial features\n const features = wearables.filter(isFacialFeature)\n const { eyes, eyebrows, mouth } = await getFacialFeatures(root, features, config.bodyShape)\n applyFacialFeatures(root, bodyShape, eyes, eyebrows, mouth, config)\n\n // play emote\n await playEmote(root, assets, config)\n } else {\n if (!config.wearable) {\n throw new Error('No wearable to render')\n }\n const wearable = config.wearable\n try {\n // try loading with the required body shape\n const asset = await loadAsset(root, wearable, config.bodyShape, config.skin, config.hair)\n asset.container.addAllToScene()\n } catch (error) {\n // default to other body shape if failed\n const asset = await loadAsset(\n root,\n wearable,\n config.bodyShape === WearableBodyShape.MALE ? WearableBodyShape.FEMALE : WearableBodyShape.MALE,\n config.skin,\n config.hair\n )\n asset.container.addAllToScene()\n }\n }\n\n // center the root scene into the camera\n center(root)\n}\n","import React, { useEffect, useRef, useState } from 'react'\nimport classNames from 'classnames'\nimport { PreviewCamera, PreviewType } from '@dcl/schemas'\nimport { useWindowSize } from '../../hooks/useWindowSize'\nimport { useConfig } from '../../hooks/useConfig'\nimport { MessageType, sendMessage } from '../../lib/message'\nimport { render } from '../../lib/babylon/render'\nimport './Preview.css'\n\nconst Preview: React.FC = () => {\n const [previewError, setPreviewError] = useState('')\n const { width, height } = useWindowSize()\n const [style, setStyle] = useState<React.CSSProperties>({})\n const [isDragging, setIsDragging] = useState(false)\n const [isLoadingModel, setIsLoadingModel] = useState(true)\n const [isLoaded, setIsLoaded] = useState(false)\n const canvasRef = useRef<HTMLCanvasElement>(null)\n const [config, isLoadingConfig, configError] = useConfig()\n const [image, setImage] = useState('')\n const [is3D, setIs3D] = useState(true)\n const [isMessageSent, setIsMessageSent] = useState(false)\n\n const error = previewError || configError\n const isLoading = (isLoadingModel || isLoadingConfig) && !error\n const showImage = !!image && !is3D && !isLoading\n const showCanvas = is3D && !isLoading\n\n useEffect(() => {\n if (canvasRef.current && config) {\n // rarity background\n setStyle({ backgroundImage: config.background.gradient ? config.background.gradient : undefined, opacity: 1 })\n\n // set background image\n if (config.background.image) {\n setImage(config.background.image)\n }\n\n // load model or image (for texture only wearables)\n if (config.type === PreviewType.TEXTURE) {\n setIs3D(false)\n setIsLoadingModel(false)\n setIsLoaded(true)\n } else {\n // preview models\n render(canvasRef.current, config)\n .catch((error) => setPreviewError(error.message))\n .finally(() => {\n setIsLoadingModel(false)\n setIsLoaded(true)\n })\n }\n }\n }, [canvasRef.current, config]) // eslint-disable-line\n\n // send a mesasge to the parent window when loaded or error occurs\n useEffect(() => {\n if (!isMessageSent) {\n if (isLoaded) {\n sendMessage(MessageType.LOAD)\n setIsMessageSent(true)\n } else if (error) {\n sendMessage(MessageType.ERROR, error)\n setIsMessageSent(true)\n }\n }\n }, [isLoaded, error, isMessageSent])\n\n // when the config is being loaded again (because the was an update to some of the options) reset all the other loading flags\n useEffect(() => {\n if (isLoadingConfig) {\n let shouldResetIsLoaded = false\n if (!isLoadingModel) {\n setIsLoadingModel(true)\n shouldResetIsLoaded = true\n }\n if (isMessageSent) {\n setIsMessageSent(false)\n shouldResetIsLoaded = true\n }\n if (shouldResetIsLoaded && isLoaded) {\n setIsLoaded(false)\n }\n }\n }, [isLoadingConfig, isLoadingModel, isMessageSent, isLoaded])\n\n return (\n <div\n className={classNames('Preview', {\n 'is-dragging': isDragging,\n 'is-loading': isLoading,\n 'is-loaded': isLoaded,\n 'is-3d': is3D && config?.camera === PreviewCamera.INTERACTIVE,\n 'has-error': !!error,\n })}\n style={style}\n >\n <img\n src={image}\n className={classNames('thumbnail', {\n 'is-visible': showImage,\n })}\n alt=\"preview\"\n />\n <canvas\n id=\"wearable-preview\"\n className={classNames({\n 'is-visible': showCanvas,\n })}\n width={width}\n height={height}\n ref={canvasRef}\n onMouseDown={() => setIsDragging(is3D && !error)}\n onMouseUp={() => setIsDragging(false)}\n ></canvas>\n {error && <div className=\"error\">{error}</div>}\n </div>\n )\n}\n\nexport default React.memo(Preview)\n","import { useState, useEffect } from 'react'\n\n// Define general type for useWindowSize hook, which includes width and height\ninterface Size {\n width: number | undefined\n height: number | undefined\n}\n\nexport function useWindowSize(): Size {\n // Initialize state with undefined width/height so server and client renders match\n // Learn more here: https://joshwcomeau.com/react/the-perils-of-rehydration/\n const [windowSize, setWindowSize] = useState<Size>({\n width: undefined,\n height: undefined,\n })\n useEffect(() => {\n // Handler to call on window resize\n function handleResize() {\n // Set window width/height to state\n setWindowSize({\n width: window.innerWidth,\n height: window.innerHeight,\n })\n }\n // Add event listener\n window.addEventListener('resize', handleResize)\n // Call handler right away so state gets updated with initial window size\n handleResize()\n // Remove event listener on cleanup\n return () => window.removeEventListener('resize', handleResize)\n }, []) // Empty array ensures that effect is only run on mount\n return windowSize\n}\n","import React from 'react'\nimport ReactDOM from 'react-dom'\nimport './index.css'\nimport { Preview } from './components/Preview'\n\nReactDOM.render(\n <React.StrictMode>\n <Preview />\n </React.StrictMode>,\n document.getElementById('root')\n)\n\n/// DELETE MEEE!!!!!11\nfunction update(prop: string, value: string) {\n window.postMessage({ type: 'update', options: { [prop]: value } })\n}\n\n;(window as any).update = update\n"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ !function(e){function r(r){for(var n,a,u=r[0],i=r[1],c=r[2],f=0,s=[];f<u.length;f++)a=u[f],Object.prototype.hasOwnProperty.call(o,a)&&o[a]&&s.push(o[a][0]),o[a]=0;for(n in i)Object.prototype.hasOwnProperty.call(i,n)&&(e[n]=i[n]);for(p&&p(r);s.length;)s.shift()();return l.push.apply(l,c||[]),t()}function t(){for(var e,r=0;r<l.length;r++){for(var t=l[r],n=!0,u=1;u<t.length;u++){var i=t[u];0!==o[i]&&(n=!1)}n&&(l.splice(r--,1),e=a(a.s=t[0]))}return e}var n={},o={1:0},l=[];function a(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,a),t.l=!0,t.exports}a.m=e,a.c=n,a.d=function(e,r,t){a.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},a.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},a.t=function(e,r){if(1&r&&(e=a(e)),8&r)return e;if(4&r&&"object"===typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(a.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)a.d(t,n,function(r){return e[r]}.bind(null,n));return t},a.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(r,"a",r),r},a.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},a.p="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2157234427.commit-a328568/";var u=this["webpackJsonp@dcl/wearable-preview"]=this["webpackJsonp@dcl/wearable-preview"]||[],i=u.push.bind(u);u.push=r,u=u.slice();for(var c=0;c<u.length;c++)r(u[c]);var p=i;t()}([]);
2
+ //# sourceMappingURL=runtime-main.9dc757c1.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../webpack/bootstrap"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","this","oldJsonpFunction","slice"],"mappings":"aACE,SAASA,EAAqBC,GAQ7B,IAPA,IAMIC,EAAUC,EANVC,EAAWH,EAAK,GAChBI,EAAcJ,EAAK,GACnBK,EAAiBL,EAAK,GAIHM,EAAI,EAAGC,EAAW,GACpCD,EAAIH,EAASK,OAAQF,IACzBJ,EAAUC,EAASG,GAChBG,OAAOC,UAAUC,eAAeC,KAAKC,EAAiBX,IAAYW,EAAgBX,IACpFK,EAASO,KAAKD,EAAgBX,GAAS,IAExCW,EAAgBX,GAAW,EAE5B,IAAID,KAAYG,EACZK,OAAOC,UAAUC,eAAeC,KAAKR,EAAaH,KACpDc,EAAQd,GAAYG,EAAYH,IAKlC,IAFGe,GAAqBA,EAAoBhB,GAEtCO,EAASC,QACdD,EAASU,OAATV,GAOD,OAHAW,EAAgBJ,KAAKK,MAAMD,EAAiBb,GAAkB,IAGvDe,IAER,SAASA,IAER,IADA,IAAIC,EACIf,EAAI,EAAGA,EAAIY,EAAgBV,OAAQF,IAAK,CAG/C,IAFA,IAAIgB,EAAiBJ,EAAgBZ,GACjCiB,GAAY,EACRC,EAAI,EAAGA,EAAIF,EAAed,OAAQgB,IAAK,CAC9C,IAAIC,EAAQH,EAAeE,GACG,IAA3BX,EAAgBY,KAAcF,GAAY,GAE3CA,IACFL,EAAgBQ,OAAOpB,IAAK,GAC5Be,EAASM,EAAoBA,EAAoBC,EAAIN,EAAe,KAItE,OAAOD,EAIR,IAAIQ,EAAmB,GAKnBhB,EAAkB,CACrB,EAAG,GAGAK,EAAkB,GAGtB,SAASS,EAAoB1B,GAG5B,GAAG4B,EAAiB5B,GACnB,OAAO4B,EAAiB5B,GAAU6B,QAGnC,IAAIC,EAASF,EAAiB5B,GAAY,CACzCK,EAAGL,EACH+B,GAAG,EACHF,QAAS,IAUV,OANAf,EAAQd,GAAUW,KAAKmB,EAAOD,QAASC,EAAQA,EAAOD,QAASH,GAG/DI,EAAOC,GAAI,EAGJD,EAAOD,QAKfH,EAAoBM,EAAIlB,EAGxBY,EAAoBO,EAAIL,EAGxBF,EAAoBQ,EAAI,SAASL,EAASM,EAAMC,GAC3CV,EAAoBW,EAAER,EAASM,IAClC3B,OAAO8B,eAAeT,EAASM,EAAM,CAAEI,YAAY,EAAMC,IAAKJ,KAKhEV,EAAoBe,EAAI,SAASZ,GACX,qBAAXa,QAA0BA,OAAOC,aAC1CnC,OAAO8B,eAAeT,EAASa,OAAOC,YAAa,CAAEC,MAAO,WAE7DpC,OAAO8B,eAAeT,EAAS,aAAc,CAAEe,OAAO,KAQvDlB,EAAoBmB,EAAI,SAASD,EAAOE,GAEvC,GADU,EAAPA,IAAUF,EAAQlB,EAAoBkB,IAC/B,EAAPE,EAAU,OAAOF,EACpB,GAAW,EAAPE,GAA8B,kBAAVF,GAAsBA,GAASA,EAAMG,WAAY,OAAOH,EAChF,IAAII,EAAKxC,OAAOyC,OAAO,MAGvB,GAFAvB,EAAoBe,EAAEO,GACtBxC,OAAO8B,eAAeU,EAAI,UAAW,CAAET,YAAY,EAAMK,MAAOA,IACtD,EAAPE,GAA4B,iBAATF,EAAmB,IAAI,IAAIM,KAAON,EAAOlB,EAAoBQ,EAAEc,EAAIE,EAAK,SAASA,GAAO,OAAON,EAAMM,IAAQC,KAAK,KAAMD,IAC9I,OAAOF,GAIRtB,EAAoB0B,EAAI,SAAStB,GAChC,IAAIM,EAASN,GAAUA,EAAOiB,WAC7B,WAAwB,OAAOjB,EAAgB,SAC/C,WAA8B,OAAOA,GAEtC,OADAJ,EAAoBQ,EAAEE,EAAQ,IAAKA,GAC5BA,GAIRV,EAAoBW,EAAI,SAASgB,EAAQC,GAAY,OAAO9C,OAAOC,UAAUC,eAAeC,KAAK0C,EAAQC,IAGzG5B,EAAoB6B,EAAI,sFAExB,IAAIC,EAAaC,KAAK,qCAAuCA,KAAK,sCAAwC,GACtGC,EAAmBF,EAAW3C,KAAKsC,KAAKK,GAC5CA,EAAW3C,KAAOf,EAClB0D,EAAaA,EAAWG,QACxB,IAAI,IAAItD,EAAI,EAAGA,EAAImD,EAAWjD,OAAQF,IAAKP,EAAqB0D,EAAWnD,IAC3E,IAAIU,EAAsB2C,EAI1BvC,I","file":"static/js/runtime-main.bb3996d2.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t1: 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2157195817.commit-5065de7/\";\n\n \tvar jsonpArray = this[\"webpackJsonp@dcl/wearable-preview\"] = this[\"webpackJsonp@dcl/wearable-preview\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// run deferred modules from other chunks\n \tcheckDeferredModules();\n"],"sourceRoot":""}
1
+ {"version":3,"sources":["../webpack/bootstrap"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","this","oldJsonpFunction","slice"],"mappings":"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","file":"static/js/runtime-main.9dc757c1.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t1: 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2157234427.commit-a328568/\";\n\n \tvar jsonpArray = this[\"webpackJsonp@dcl/wearable-preview\"] = this[\"webpackJsonp@dcl/wearable-preview\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// run deferred modules from other chunks\n \tcheckDeferredModules();\n"],"sourceRoot":""}
@@ -1,2 +0,0 @@
1
- !function(e){function r(r){for(var n,u,a=r[0],i=r[1],c=r[2],f=0,s=[];f<a.length;f++)u=a[f],Object.prototype.hasOwnProperty.call(o,u)&&o[u]&&s.push(o[u][0]),o[u]=0;for(n in i)Object.prototype.hasOwnProperty.call(i,n)&&(e[n]=i[n]);for(p&&p(r);s.length;)s.shift()();return l.push.apply(l,c||[]),t()}function t(){for(var e,r=0;r<l.length;r++){for(var t=l[r],n=!0,a=1;a<t.length;a++){var i=t[a];0!==o[i]&&(n=!1)}n&&(l.splice(r--,1),e=u(u.s=t[0]))}return e}var n={},o={1:0},l=[];function u(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,u),t.l=!0,t.exports}u.m=e,u.c=n,u.d=function(e,r,t){u.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},u.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},u.t=function(e,r){if(1&r&&(e=u(e)),8&r)return e;if(4&r&&"object"===typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(u.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)u.d(t,n,function(r){return e[r]}.bind(null,n));return t},u.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return u.d(r,"a",r),r},u.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},u.p="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2157195817.commit-5065de7/";var a=this["webpackJsonp@dcl/wearable-preview"]=this["webpackJsonp@dcl/wearable-preview"]||[],i=a.push.bind(a);a.push=r,a=a.slice();for(var c=0;c<a.length;c++)r(a[c]);var p=i;t()}([]);
2
- //# sourceMappingURL=runtime-main.bb3996d2.js.map