@dcl/wearable-preview 2.13.1-24096673885.commit-cf09103 → 2.14.0

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.
Files changed (26) hide show
  1. package/assets/{Preview-BloXax2L.js → Preview-CTlb7FVW.js} +383 -383
  2. package/assets/UnityPreview-DN2SYtna.js +1 -0
  3. package/assets/{babylon.inspector.bundle.max-DGZCBG-7.js → babylon.inspector.bundle.max-QDIvUYw7.js} +1 -1
  4. package/{static-local/assets/emote-events-jjoBnMzo.js → assets/emote-events-Dn-X3ox5.js} +5 -5
  5. package/assets/{index-KYuRa154.js → index-DsOKf6lp.js} +3 -3
  6. package/index.html +3 -3
  7. package/package.json +3 -3
  8. package/static-local/assets/{Preview-CGqOUw_I.js → Preview-CvMZxPcZ.js} +383 -383
  9. package/static-local/assets/UnityPreview-oBykrVJt.js +1 -0
  10. package/static-local/assets/{babylon.inspector.bundle.max-DDnqGh7g.js → babylon.inspector.bundle.max-CKYbVI_Y.js} +1 -1
  11. package/{assets/emote-events-R7O4OQgI.js → static-local/assets/emote-events-BIN_p4P1.js} +5 -5
  12. package/static-local/assets/{index-D4VHDB8W.js → index-D54LH2T6.js} +2 -2
  13. package/static-local/index.html +1 -1
  14. package/static-local/package.json +1 -1
  15. package/static-local/unity/Build/aang-renderer.data.br +0 -0
  16. package/static-local/unity/Build/aang-renderer.framework.js.br +0 -0
  17. package/static-local/unity/Build/aang-renderer.loader.js +1 -1
  18. package/static-local/unity/Build/aang-renderer.symbols.json.br +0 -0
  19. package/static-local/unity/Build/aang-renderer.wasm.br +0 -0
  20. package/unity/Build/aang-renderer.data.br +0 -0
  21. package/unity/Build/aang-renderer.framework.js.br +0 -0
  22. package/unity/Build/aang-renderer.loader.js +1 -1
  23. package/unity/Build/aang-renderer.symbols.json.br +0 -0
  24. package/unity/Build/aang-renderer.wasm.br +0 -0
  25. package/assets/UnityPreview-CaPSWPNu.js +0 -1
  26. package/static-local/assets/UnityPreview-Co9Lu6Zt.js +0 -1
@@ -1 +0,0 @@
1
- import{c as k,a as j,r as d,b as W,R as oe,j as U}from"./index-KYuRa154.js";import{m as ie,i as K,d as c,u as te,s as le,f as ce,a as de,b as ue,c as Se,g as me,e as ge,h as $,j as G,k as Ee,l as ye,n as fe,o as pe,p as F,q as L,r as we,t as he}from"./emote-events-R7O4OQgI.js";var x=(e=>(e.SET_MODE="SetMode",e.SET_PROFILE="SetProfile",e.SET_EMOTE="SetEmote",e.SET_URNS="SetUrns",e.SET_BACKGROUND="SetBackground",e.SET_SKIN_COLOR="SetSkinColor",e.SET_HAIR_COLOR="SetHairColor",e.SET_EYE_COLOR="SetEyeColor",e.SET_BODY_SHAPE="SetBodyShape",e.SET_SHOW_ANIMATION_REFERENCE="SetShowAnimationReference",e.SET_PROJECTION="SetProjection",e.ADD_BASE64="AddBase64",e.CLEAR_BASE64="ClearBase64",e.SET_CONTRACT="SetContract",e.SET_ITEM_ID="SetItemID",e.SET_TOKEN_ID="SetTokenID",e.SET_DISABLE_LOADER="SetDisableLoader",e.RELOAD="Reload",e.CLEANUP="Cleanup",e.GET_ELEMENT_BOUNDS="GetElementBounds",e.SET_SPRING_BONES_PARAMS="SetSpringBonesParams",e))(x||{});const Re={unityMode:"SetMode",profile:"SetProfile",emote:"SetEmote",urns:"SetUrns",background:"SetBackground",skin:"SetSkinColor",hair:"SetHairColor",eyes:"SetEyeColor",bodyShape:"SetBodyShape",showAnimationReference:"SetShowAnimationReference",projection:"SetProjection",base64s:"AddBase64",contractAddress:"SetContract",itemId:"SetItemID",tokenId:"SetTokenID",disableLoader:"SetDisableLoader"},Pe={unityMode:e=>String(e),profile:e=>String(e),emote:e=>String(e),urns:e=>Array.isArray(e)?e.join(","):String(e),background:e=>typeof e=="string"?e.replace("#",""):String(e),skin:e=>typeof e=="string"?e.replace("#",""):String(e),hair:e=>typeof e=="string"?e.replace("#",""):String(e),eyes:e=>typeof e=="string"?e.replace("#",""):String(e),bodyShape:e=>String(e),showAnimationReference:e=>String(e),projection:e=>String(e),contractAddress:e=>String(e),itemId:e=>String(e),tokenId:e=>String(e),disableLoader:e=>String(e)},C=(e,t,s)=>{if(e)try{const r=String(t);Object.values(x).includes(r)||(console.warn(`Unknown Unity method: ${r}. Sending anyway...`),k(`Unknown Unity method: ${r}`,{method:r,value:s})),s!==void 0?e.SendMessage("JSBridge",r,s):e.SendMessage("JSBridge",r)}catch(r){console.error(`Failed to send Unity message ${t}:`,r),j(r,{method:String(t),value:s})}else console.warn(`Unity instance not ready, cannot send message: ${t}`),k(`Unity instance not ready, cannot send message: ${t}`,{method:String(t)})},Ae=(e,t,s)=>{if(!e){console.warn("Unity instance not available, cannot send override messages"),k("Unity instance not available, cannot send override messages");return}let r=0;t.base64s!==void 0&&s.base64s&&(C(e,"ClearBase64"),r++,Array.isArray(t.base64s)&&t.base64s.length>0&&t.base64s.forEach(n=>{C(e,"AddBase64",n),r++})),Object.entries(t).forEach(([n,a])=>{if(n!=="base64s"&&s[n]&&a!==void 0){const i=Re[n];if(i){const l=Pe[n],y=l?l(a):String(a);C(e,i,y),r++}else console.warn(`No Unity method mapping found for property: ${n}`),k(`No Unity method mapping found for property: ${n}`,{property:n,value:a})}}),r>0&&C(e,"Reload")};var Ie={VITE_BASE_URL:"https://cdn.decentraland.org/@dcl/wearable-preview/2.13.1-24096673885.commit-cf09103"};const V=new Map,_=(e,t)=>{if(!t)return e;const s=e.replace(/\/$/,""),r=t.replace(/^\//,"");return`${s}/${r}`};function Te(e){if(V.has(e))return V.get(e);const t=new Promise((s,r)=>{const n=document.querySelector(`script[src="${e}"]`);if(n){n.addEventListener("load",()=>s(n)),n.addEventListener("error",i=>r(i));return}const a=document.createElement("script");a.src=e,a.async=!0,a.onload=()=>s(a),a.onerror=i=>r(i),document.body.appendChild(a)});return V.set(e,t),t}const ve=async(e,t,s,r,n,a,i,l,y,S,u,m)=>{try{const o=Ie.VITE_BASE_URL||"";return await Te(_(o,t)),await createUnityInstance(e,{dataUrl:_(o,s),frameworkUrl:_(o,r),codeUrl:_(o,n),streamingAssetsUrl:_(o,i),symbolUrl:_(o,a),companyName:l,productName:y,productVersion:S,matchWebGLToCanvasSize:u,arguments:m})}catch(o){throw console.error("❌ Failed to load Unity instance:",o),o}},be="data:image/png;base64,";function Oe(e){return{getScreenshot:()=>new Promise(t=>{if(!e){t("");return}e.SendMessage("JSBridge","TakeScreenshot",""),window.addEventListener("message",function s(r){if(r.data.type==="unity-renderer"){const{type:n,payload:a}=r.data.payload;n==="screenshot"&&(window.removeEventListener("message",s),t(be+a))}})}),getMetrics:()=>new Promise(t=>{if(!e){t({triangles:0,materials:0,textures:0,meshes:0,bodies:0,entities:0});return}e.SendMessage("JSBridge","GetMetrics",""),window.addEventListener("message",function s(r){if(r.data.type==="unity-renderer"){const{type:n,payload:a}=r.data.payload;n==="metrics"&&(window.removeEventListener("message",s),t(a))}})}),changeZoom:async t=>{e&&e.SendMessage("JSBridge","SetZoom",t.toString())},panCamera:async t=>{if(!e)return;const s=t.x??0,r=t.y??0,n=t.z??0;e.SendMessage("JSBridge","SetOffset",`${s},${r},${n}`)},changeCameraPosition:async t=>{if(!e)return;const s=t.alpha??0,r=t.beta??0,n=t.radius??0;e.SendMessage("JSBridge","SetCameraPosition",`${s},${r},${n}`)},setUsername:async t=>{e&&e.SendMessage("JSBridge","SetUsername",t)},cleanup:async()=>{e&&e.SendMessage("JSBridge","Cleanup","")}}}function Le(e,t,s){const r=ie();let n=0,a=0,i="stopped",l=null,y=0;const S=()=>{u(),y=Date.now(),l=setInterval(()=>{var g;if(i!=="playing")return;const o=Date.now(),f=(o-y)/1e3;if(y=o,a+=f,n>0&&a>=n)if((g=t==null?void 0:t.emoteDataADR74)!=null&&g.loop)a=a%n,r.emit(c.PreviewEmoteEventType.ANIMATION_LOOP);else{a=n,u(),i="stopped",r.emit(c.PreviewEmoteEventType.ANIMATION_PLAYING,{length:a}),r.emit(c.PreviewEmoteEventType.ANIMATION_END);return}r.emit(c.PreviewEmoteEventType.ANIMATION_PLAYING,{length:a})},15)},u=()=>{l!==null&&(clearInterval(l),l=null)},m=(o,f,g)=>new Promise(E=>{if(!e){E(g);return}const p=b=>{if(b.data.type==="unity-renderer"){const{type:I,payload:R}=b.data.payload;I===f&&(window.removeEventListener("message",p),E(R))}};window.addEventListener("message",p),o()});return{getLength:async()=>await m(()=>e.SendMessage("JSBridge","GetEmoteLength",""),"emoteLength",0)??0,isPlaying:async()=>m(()=>e.SendMessage("JSBridge","IsEmotePlaying",""),"isEmotePlaying",!1),goTo:async o=>{e&&(a=o,e.SendMessage("JSBridge","GoToEmote",o.toString()),r.emit(c.PreviewEmoteEventType.ANIMATION_PLAYING,{length:o}))},play:async()=>{e&&(n<=0&&(n=await m(()=>e.SendMessage("JSBridge","GetEmoteLength",""),"emoteLength",0)),i==="stopped"&&(a=0),i="playing",e.SendMessage("JSBridge","PlayEmote",""),S(),r.emit(c.PreviewEmoteEventType.ANIMATION_PLAY))},pause:async()=>{e&&(i="paused",u(),e.SendMessage("JSBridge","PauseEmote",""),r.emit(c.PreviewEmoteEventType.ANIMATION_PAUSE))},stop:async()=>{e&&(i="stopped",a=0,u(),e.SendMessage("JSBridge","StopEmote",""),r.emit(c.PreviewEmoteEventType.ANIMATION_END))},enableSound:async()=>{e&&e.SendMessage("JSBridge","EnableSound","")},disableSound:async()=>{e&&e.SendMessage("JSBridge","DisableSound","")},hasSound:async()=>m(()=>e.SendMessage("JSBridge","HasSound",""),"hasSound",!1),isSocialEmote:async()=>K(t),getSocialEmoteAnimations:async()=>!t||!K(t)?null:[{title:"Start Animation",...t.emoteDataADR74.startAnimation},...t.emoteDataADR74.outcomes.map(o=>({title:o.title,loop:o.loop,audio:o.audio,...o.clips}))],getPlayingSocialEmoteAnimation:async()=>s??null,emote:t,events:r}}function _e(e){return{setSpringBonesParams:async(t,s)=>{e&&e.SendMessage("JSBridge",x.SET_SPRING_BONES_PARAMS,JSON.stringify({itemHash:t,params:s}))}}}const Ne={dataUrl:"/unity/Build/aang-renderer.data.br",frameworkUrl:"/unity/Build/aang-renderer.framework.js.br",codeUrl:"/unity/Build/aang-renderer.wasm.br",symbolUrl:"/unity/Build/aang-renderer.symbols.json.br"};function Ce(){return Ne}async function Me(e,t,s){let r=null;try{const n=Ce();if(r=await ve(e,"/unity/Build/aang-renderer.loader.js",n.dataUrl,n.frameworkUrl,n.codeUrl,n.symbolUrl,"/emotes","Decentraland","AangRenderer","2.2.2",!0,[]),!r)throw new Error("Failed to load Unity instance");const a=Oe(r),i=Le(r,t,s),l=_e(r);return{scene:a,emote:i,physics:l,unity:r}}catch(n){if(console.error("Unity render failed:",n),r!=null&&r.Quit)try{r.Quit()}catch(a){console.error("Error quitting Unity instance:",a),j(a,{phase:"unityQuit"})}throw n}}const De=()=>Math.floor(Math.random()*159)+1,re=()=>`default${De()}`,Ue=(e,t)=>{var s,r,n,a,i,l;return{eyes:$(t.eyes||((r=(s=e==null?void 0:e.avatar)==null?void 0:s.eyes)==null?void 0:r.color)&&G(e.avatar.eyes.color)||"#000000"),hair:$(t.hair||((a=(n=e==null?void 0:e.avatar)==null?void 0:n.hair)==null?void 0:a.color)&&G(e.avatar.hair.color)||"#000000"),skin:$(t.skin||((l=(i=e==null?void 0:e.avatar)==null?void 0:i.skin)==null?void 0:l.color)&&G(e.avatar.skin.color)||"#cc9b76")}},N=e=>e||"",X=e=>e||[],B=e=>e.replace("#","");function Z(e){const t=new URL(window.location.href);Object.entries(e).forEach(([s,r])=>{t.searchParams.delete(s),Array.isArray(r)?r.forEach(n=>{n!==""&&t.searchParams.append(s,n)}):r!==""&&t.searchParams.set(s,r)}),window.history.replaceState({},"",t.toString())}function Be(){const{options:e,overrideSources:t}=te(),[s,r]=d.useState(null),[n,a]=d.useState(!0),[i,l]=d.useState(null),y=d.useRef(null),S=d.useRef(e),u=d.useRef(!0);return d.useEffect(()=>{const m=JSON.stringify(e),o=JSON.stringify(S.current);if(!u.current&&m===o)return;u.current=!1,S.current=e,(async()=>{var g,E;try{a(!0),l(null);const p=e.peerUrl||W.get("PEER_URL"),b=e.marketplaceServerUrl||e.nftServerUrl||W.get("MARKETPLACE_SERVER_URL");let I=c.PreviewType.WEARABLE,R={color:e.background||"#4b4852",transparent:e.disableBackground===!0};const T=le(e.profile);let P=T==null?void 0:T.value;P==="default"&&(P=re());const h=P&&T?T.type==="address"?await ce(P,p):await de(P,p):null,A=e.bodyShape||((g=h==null?void 0:h.avatar)==null?void 0:g.bodyShape)||c.BodyShape.MALE;let w=null;if(e.contractAddress&&(w=await ue({contractAddress:e.contractAddress,tokenId:e.tokenId,itemId:e.itemId,peerUrl:p,marketplaceServerUrl:b}),w&&Se(w))){R={...R,image:w.thumbnail};const D=me(w);ge(D)&&(I=c.PreviewType.TEXTURE)}const{eyes:v,hair:H,skin:Y}=Ue(h,{eyes:e.eyes,hair:e.hair,skin:e.skin}),M=e.unityMode||null,ne=e.camera&&Object.values(c.PreviewCamera).includes(e.camera)?e.camera:c.PreviewCamera.INTERACTIVE,Q=e.projection&&Object.values(c.PreviewProjection).includes(e.projection)?e.projection:c.PreviewProjection.PERSPECTIVE,O=e.disableDefaultEmotes?null:e.emote&&Object.values(c.PreviewEmote).includes(e.emote)?e.emote:c.PreviewEmote.IDLE,J={background:R,bodyShape:A,mode:M,projection:Q,type:I,base64:((E=e.base64s)==null?void 0:E[0])||null,contract:e.contractAddress||null,disableLoader:e.disableLoader||!1,emote:(O==null?void 0:O.toString())||null,eyeColor:v.replace("#",""),hairColor:H.replace("#",""),item:e.itemId||null,profile:P||null,skinColor:Y.replace("#",""),token:e.tokenId||null,urn:e.urns||null,showAnimationReference:null,itemDefinition:w,socialEmote:e.socialEmote||null},ae=JSON.stringify(J),se=JSON.stringify(y.current);if(ae!==se){if(y.current=J,Object.keys(t).length===0){const D=X(e.urns),q=X(e.base64s);if(M===c.PreviewUnityMode.CONFIG){const z={mode:N(M||"")};Z(z)}else{const z={background:R.transparent?"":B(R.color),disableLoader:e.disableLoader?"true":"",profile:N(P||""),bodyShape:N(A||""),eyeColor:B(v||""),hairColor:B(H||""),skinColor:B(Y||""),mode:N(M||""),camera:ne,projection:Q,emote:N((O==null?void 0:O.toString())||""),urn:D.length>0?D:[""],base64:q.length>0?q:[""]};Z(z)}}r(J)}a(!1)}catch(p){console.error("[useUnityConfig] Failed to load config:",p),l(p instanceof Error?p.message:"Failed to load config"),a(!1)}})()},[e,t]),[s,n,i]}const ke="unity-renderer",je="unity-canvas",ee=1,xe="Failed to load Unity";var Je=(e=>(e.LOADED="loaded",e.ERROR="error",e.SCREENSHOT="screenshot",e.CUSTOMIZATION_DONE="customization-done",e.CUSTOMIZATION_STEP="avatar-customization-step",e.ELEMENT_BOUNDS="element-bounds",e))(Je||{});const ze="get_element_bounds",$e="element_bounds_response",Ge=(e,t,s,r)=>{const[n,a]=d.useState({isLoaded:!1,isInitialized:!1,error:null}),i=d.useRef(null),l=d.useCallback(S=>{if(S.data.type===ke){const{type:u,payload:m}=S.data.payload;u==="loaded"&&(m===!0||m==="true")?(a(o=>({...o,isLoaded:!0,isInitialized:!0})),c.sendMessage(L(),c.PreviewMessageType.LOAD,{renderer:c.PreviewRenderer.UNITY}),t.current&&t.current.emote.play()):u==="customization-done"?c.sendMessage(L(),c.PreviewMessageType.CONTROLLER_RESPONSE,{id:"customization-done",ok:!0,result:JSON.parse(S.data.payload.payload)}):u==="avatar-customization-step"?c.sendMessage(L(),c.PreviewMessageType.CONTROLLER_RESPONSE,{id:"avatar-customization-step",ok:!0,result:{step:S.data.payload.payload}}):u==="element-bounds"?c.sendMessage(L(),$e,m):u==="error"&&(j(new Error(m),{component:"UnityPreview",phase:"unityMessage"}),a(o=>({...o,error:m})),c.sendMessage(L(),c.PreviewMessageType.ERROR,{message:"Error loading the wearable. Please try again."}))}},[]),y=d.useCallback(async S=>{if(!(!e.canvas.current||e.isInitializing.current||e.unityInstance.current)){e.isInitializing.current=!0,a(u=>({...u,isLoaded:!1,error:null}));try{const u=S!=null&&S.itemDefinition&&we(S.itemDefinition)?S.itemDefinition:null,{unity:m,...o}=await Me(e.canvas.current,u,(S==null?void 0:S.socialEmote)||void 0);e.unityInstance.current=m,t.current=o,i.current&&i.current(),i.current=he(t.current),a(f=>({...f,isInitialized:!0}))}catch(u){const m=u instanceof Error?u.message:xe;console.error("Unity init failed:",u),j(u,{component:"UnityPreview",phase:"initializeUnity"}),a(o=>({...o,error:m})),c.sendMessage(L(),c.PreviewMessageType.ERROR,{message:m})}finally{e.isInitializing.current=!1}}},[e,t]);return d.useEffect(()=>{n.isInitialized||r||!s||y(s)},[s,r,n.isInitialized,y]),d.useEffect(()=>()=>{i.current&&i.current()},[]),d.useEffect(()=>{if(s)return window.addEventListener("message",l,!1),()=>{window.removeEventListener("message",l,!1)}},[s,l]),n},Fe=e=>{const[t,s]=d.useState({pixelRatio:window.devicePixelRatio||ee,is3D:!0,backgroundImage:""});return d.useEffect(()=>{const r=()=>{s(a=>({...a,pixelRatio:window.devicePixelRatio||ee}))},n=window.matchMedia(`(resolution: ${t.pixelRatio}dppx)`);return n.addEventListener("change",r),()=>{n.removeEventListener("change",r)}},[t.pixelRatio]),d.useEffect(()=>{e&&s(r=>({...r,backgroundImage:e.background.image||"",is3D:e.type!==c.PreviewType.TEXTURE}))},[e]),t},Ve=(e,t,s,r,n)=>{const a=d.useMemo(()=>{const i={};for(const l of Object.keys(n))n[l]&&r[l]!==void 0&&(i[l]=r[l]);return i},[n,r]);d.useEffect(()=>{if(!(!s.isInitialized||!s.isLoaded||!e.current)){if(a.profile==="default"){const i=t.current.profile;a.profile=i!=null&&i.match(/^default\d+$/)?i:re()}Object.keys(a).length>0&&(Ae(e.current,a,n),t.current=a)}},[s.isInitialized,s.isLoaded,a,n,e,t])},He=()=>{const{width:e=window.innerWidth,height:t=window.innerHeight}=Ee(),s=d.useRef(null),r=d.useRef(null),n=d.useRef(!1),a=d.useRef({}),i=ye(),[l,y,S]=Be(),{options:u,overrideSources:m}=te(),o=d.useMemo(()=>({canvas:s,unityInstance:r,isInitializing:n,lastSentOverrides:a}),[]);fe(h=>{var A,w;if(((A=h.data)==null?void 0:A.type)===ze&&r.current){const v=(w=h.data.payload)==null?void 0:w.elementName;v&&C(r.current,x.GET_ELEMENT_BOUNDS,v)}});const f=Ge(o,i,l,y),g=Fe(l);Ve(o.unityInstance,o.lastSentOverrides,f,u,m),pe();const E=d.useMemo(()=>{const h=f.error||S,A=!f.isLoaded&&!h,w=!!g.backgroundImage&&!g.is3D&&!A,v=g.is3D&&!A;return{error:h,isLoading:A,showImage:w,showCanvas:v}},[f.error,f.isLoaded,S,g.backgroundImage,g.is3D]),p=d.useMemo(()=>({opacity:1,backgroundColor:!(l!=null&&l.background.transparent)&&(l==null?void 0:l.type)===c.PreviewType.TEXTURE?l.background.color:void 0}),[l]),b=d.useMemo(()=>({width:`${e}px`,height:`${t}px`}),[e,t]),I=d.useMemo(()=>({width:Math.round(e*g.pixelRatio),height:Math.round(t*g.pixelRatio)}),[e,t,g.pixelRatio]),R=d.useMemo(()=>F("Preview",{"is-loading":E.isLoading,"is-loaded":f.isLoaded,"is-3d":g.is3D,"has-error":!!E.error}),[E.isLoading,f.isLoaded,g.is3D,E.error]),T=d.useMemo(()=>F("thumbnail",{"is-visible":E.showImage}),[E.showImage]),P=d.useMemo(()=>F({"is-visible":E.showCanvas}),[E.showCanvas]);return U.jsxs("div",{className:R,style:p,children:[U.jsx("img",{src:g.backgroundImage,className:T,alt:"preview"}),U.jsx("canvas",{ref:o.canvas,id:je,className:P,width:I.width,height:I.height,style:b}),E.error&&U.jsx("div",{className:"error",children:E.error})]})},qe=oe.memo(He);export{Je as UnityMessageType,qe as default};
@@ -1 +0,0 @@
1
- import{c as k,a as j,r as c,b as W,R as oe,j as U}from"./index-D4VHDB8W.js";import{m as ie,i as K,d,u as te,s as le,f as de,a as ce,b as ue,c as Se,g as me,e as ge,h as $,j as G,k as Ee,l as ye,n as fe,o as pe,p as F,q as L,r as we,t as he}from"./emote-events-jjoBnMzo.js";var x=(e=>(e.SET_MODE="SetMode",e.SET_PROFILE="SetProfile",e.SET_EMOTE="SetEmote",e.SET_URNS="SetUrns",e.SET_BACKGROUND="SetBackground",e.SET_SKIN_COLOR="SetSkinColor",e.SET_HAIR_COLOR="SetHairColor",e.SET_EYE_COLOR="SetEyeColor",e.SET_BODY_SHAPE="SetBodyShape",e.SET_SHOW_ANIMATION_REFERENCE="SetShowAnimationReference",e.SET_PROJECTION="SetProjection",e.ADD_BASE64="AddBase64",e.CLEAR_BASE64="ClearBase64",e.SET_CONTRACT="SetContract",e.SET_ITEM_ID="SetItemID",e.SET_TOKEN_ID="SetTokenID",e.SET_DISABLE_LOADER="SetDisableLoader",e.RELOAD="Reload",e.CLEANUP="Cleanup",e.GET_ELEMENT_BOUNDS="GetElementBounds",e.SET_SPRING_BONES_PARAMS="SetSpringBonesParams",e))(x||{});const Re={unityMode:"SetMode",profile:"SetProfile",emote:"SetEmote",urns:"SetUrns",background:"SetBackground",skin:"SetSkinColor",hair:"SetHairColor",eyes:"SetEyeColor",bodyShape:"SetBodyShape",showAnimationReference:"SetShowAnimationReference",projection:"SetProjection",base64s:"AddBase64",contractAddress:"SetContract",itemId:"SetItemID",tokenId:"SetTokenID",disableLoader:"SetDisableLoader"},Ae={unityMode:e=>String(e),profile:e=>String(e),emote:e=>String(e),urns:e=>Array.isArray(e)?e.join(","):String(e),background:e=>typeof e=="string"?e.replace("#",""):String(e),skin:e=>typeof e=="string"?e.replace("#",""):String(e),hair:e=>typeof e=="string"?e.replace("#",""):String(e),eyes:e=>typeof e=="string"?e.replace("#",""):String(e),bodyShape:e=>String(e),showAnimationReference:e=>String(e),projection:e=>String(e),contractAddress:e=>String(e),itemId:e=>String(e),tokenId:e=>String(e),disableLoader:e=>String(e)},C=(e,t,s)=>{if(e)try{const r=String(t);Object.values(x).includes(r)||(console.warn(`Unknown Unity method: ${r}. Sending anyway...`),k(`Unknown Unity method: ${r}`,{method:r,value:s})),s!==void 0?e.SendMessage("JSBridge",r,s):e.SendMessage("JSBridge",r)}catch(r){console.error(`Failed to send Unity message ${t}:`,r),j(r,{method:String(t),value:s})}else console.warn(`Unity instance not ready, cannot send message: ${t}`),k(`Unity instance not ready, cannot send message: ${t}`,{method:String(t)})},Pe=(e,t,s)=>{if(!e){console.warn("Unity instance not available, cannot send override messages"),k("Unity instance not available, cannot send override messages");return}let r=0;t.base64s!==void 0&&s.base64s&&(C(e,"ClearBase64"),r++,Array.isArray(t.base64s)&&t.base64s.length>0&&t.base64s.forEach(n=>{C(e,"AddBase64",n),r++})),Object.entries(t).forEach(([n,a])=>{if(n!=="base64s"&&s[n]&&a!==void 0){const i=Re[n];if(i){const l=Ae[n],y=l?l(a):String(a);C(e,i,y),r++}else console.warn(`No Unity method mapping found for property: ${n}`),k(`No Unity method mapping found for property: ${n}`,{property:n,value:a})}}),r>0&&C(e,"Reload")};var Ie={VITE_BASE_URL:""};const V=new Map,_=(e,t)=>t;function Te(e){if(V.has(e))return V.get(e);const t=new Promise((s,r)=>{const n=document.querySelector(`script[src="${e}"]`);if(n){n.addEventListener("load",()=>s(n)),n.addEventListener("error",i=>r(i));return}const a=document.createElement("script");a.src=e,a.async=!0,a.onload=()=>s(a),a.onerror=i=>r(i),document.body.appendChild(a)});return V.set(e,t),t}const be=async(e,t,s,r,n,a,i,l,y,S,u,m)=>{try{const o=Ie.VITE_BASE_URL||"";return await Te(_(o,t)),await createUnityInstance(e,{dataUrl:_(o,s),frameworkUrl:_(o,r),codeUrl:_(o,n),streamingAssetsUrl:_(o,i),symbolUrl:_(o,a),companyName:l,productName:y,productVersion:S,matchWebGLToCanvasSize:u,arguments:m})}catch(o){throw console.error("❌ Failed to load Unity instance:",o),o}},ve="data:image/png;base64,";function Oe(e){return{getScreenshot:()=>new Promise(t=>{if(!e){t("");return}e.SendMessage("JSBridge","TakeScreenshot",""),window.addEventListener("message",function s(r){if(r.data.type==="unity-renderer"){const{type:n,payload:a}=r.data.payload;n==="screenshot"&&(window.removeEventListener("message",s),t(ve+a))}})}),getMetrics:()=>new Promise(t=>{if(!e){t({triangles:0,materials:0,textures:0,meshes:0,bodies:0,entities:0});return}e.SendMessage("JSBridge","GetMetrics",""),window.addEventListener("message",function s(r){if(r.data.type==="unity-renderer"){const{type:n,payload:a}=r.data.payload;n==="metrics"&&(window.removeEventListener("message",s),t(a))}})}),changeZoom:async t=>{e&&e.SendMessage("JSBridge","SetZoom",t.toString())},panCamera:async t=>{if(!e)return;const s=t.x??0,r=t.y??0,n=t.z??0;e.SendMessage("JSBridge","SetOffset",`${s},${r},${n}`)},changeCameraPosition:async t=>{if(!e)return;const s=t.alpha??0,r=t.beta??0,n=t.radius??0;e.SendMessage("JSBridge","SetCameraPosition",`${s},${r},${n}`)},setUsername:async t=>{e&&e.SendMessage("JSBridge","SetUsername",t)},cleanup:async()=>{e&&e.SendMessage("JSBridge","Cleanup","")}}}function Le(e,t,s){const r=ie();let n=0,a=0,i="stopped",l=null,y=0;const S=()=>{u(),y=Date.now(),l=setInterval(()=>{var g;if(i!=="playing")return;const o=Date.now(),f=(o-y)/1e3;if(y=o,a+=f,n>0&&a>=n)if((g=t==null?void 0:t.emoteDataADR74)!=null&&g.loop)a=a%n,r.emit(d.PreviewEmoteEventType.ANIMATION_LOOP);else{a=n,u(),i="stopped",r.emit(d.PreviewEmoteEventType.ANIMATION_PLAYING,{length:a}),r.emit(d.PreviewEmoteEventType.ANIMATION_END);return}r.emit(d.PreviewEmoteEventType.ANIMATION_PLAYING,{length:a})},15)},u=()=>{l!==null&&(clearInterval(l),l=null)},m=(o,f,g)=>new Promise(E=>{if(!e){E(g);return}const p=v=>{if(v.data.type==="unity-renderer"){const{type:I,payload:R}=v.data.payload;I===f&&(window.removeEventListener("message",p),E(R))}};window.addEventListener("message",p),o()});return{getLength:async()=>await m(()=>e.SendMessage("JSBridge","GetEmoteLength",""),"emoteLength",0)??0,isPlaying:async()=>m(()=>e.SendMessage("JSBridge","IsEmotePlaying",""),"isEmotePlaying",!1),goTo:async o=>{e&&(a=o,e.SendMessage("JSBridge","GoToEmote",o.toString()),r.emit(d.PreviewEmoteEventType.ANIMATION_PLAYING,{length:o}))},play:async()=>{e&&(n<=0&&(n=await m(()=>e.SendMessage("JSBridge","GetEmoteLength",""),"emoteLength",0)),i==="stopped"&&(a=0),i="playing",e.SendMessage("JSBridge","PlayEmote",""),S(),r.emit(d.PreviewEmoteEventType.ANIMATION_PLAY))},pause:async()=>{e&&(i="paused",u(),e.SendMessage("JSBridge","PauseEmote",""),r.emit(d.PreviewEmoteEventType.ANIMATION_PAUSE))},stop:async()=>{e&&(i="stopped",a=0,u(),e.SendMessage("JSBridge","StopEmote",""),r.emit(d.PreviewEmoteEventType.ANIMATION_END))},enableSound:async()=>{e&&e.SendMessage("JSBridge","EnableSound","")},disableSound:async()=>{e&&e.SendMessage("JSBridge","DisableSound","")},hasSound:async()=>m(()=>e.SendMessage("JSBridge","HasSound",""),"hasSound",!1),isSocialEmote:async()=>K(t),getSocialEmoteAnimations:async()=>!t||!K(t)?null:[{title:"Start Animation",...t.emoteDataADR74.startAnimation},...t.emoteDataADR74.outcomes.map(o=>({title:o.title,loop:o.loop,audio:o.audio,...o.clips}))],getPlayingSocialEmoteAnimation:async()=>s??null,emote:t,events:r}}function _e(e){return{setSpringBonesParams:async(t,s)=>{e&&e.SendMessage("JSBridge",x.SET_SPRING_BONES_PARAMS,JSON.stringify({itemHash:t,params:s}))}}}const Ne={dataUrl:"/unity/Build/aang-renderer.data.br",frameworkUrl:"/unity/Build/aang-renderer.framework.js.br",codeUrl:"/unity/Build/aang-renderer.wasm.br",symbolUrl:"/unity/Build/aang-renderer.symbols.json.br"};function Ce(){return Ne}async function Me(e,t,s){let r=null;try{const n=Ce();if(r=await be(e,"/unity/Build/aang-renderer.loader.js",n.dataUrl,n.frameworkUrl,n.codeUrl,n.symbolUrl,"/emotes","Decentraland","AangRenderer","2.2.2",!0,[]),!r)throw new Error("Failed to load Unity instance");const a=Oe(r),i=Le(r,t,s),l=_e(r);return{scene:a,emote:i,physics:l,unity:r}}catch(n){if(console.error("Unity render failed:",n),r!=null&&r.Quit)try{r.Quit()}catch(a){console.error("Error quitting Unity instance:",a),j(a,{phase:"unityQuit"})}throw n}}const De=()=>Math.floor(Math.random()*159)+1,re=()=>`default${De()}`,Ue=(e,t)=>{var s,r,n,a,i,l;return{eyes:$(t.eyes||((r=(s=e==null?void 0:e.avatar)==null?void 0:s.eyes)==null?void 0:r.color)&&G(e.avatar.eyes.color)||"#000000"),hair:$(t.hair||((a=(n=e==null?void 0:e.avatar)==null?void 0:n.hair)==null?void 0:a.color)&&G(e.avatar.hair.color)||"#000000"),skin:$(t.skin||((l=(i=e==null?void 0:e.avatar)==null?void 0:i.skin)==null?void 0:l.color)&&G(e.avatar.skin.color)||"#cc9b76")}},N=e=>e||"",X=e=>e||[],B=e=>e.replace("#","");function Z(e){const t=new URL(window.location.href);Object.entries(e).forEach(([s,r])=>{t.searchParams.delete(s),Array.isArray(r)?r.forEach(n=>{n!==""&&t.searchParams.append(s,n)}):r!==""&&t.searchParams.set(s,r)}),window.history.replaceState({},"",t.toString())}function Be(){const{options:e,overrideSources:t}=te(),[s,r]=c.useState(null),[n,a]=c.useState(!0),[i,l]=c.useState(null),y=c.useRef(null),S=c.useRef(e),u=c.useRef(!0);return c.useEffect(()=>{const m=JSON.stringify(e),o=JSON.stringify(S.current);if(!u.current&&m===o)return;u.current=!1,S.current=e,(async()=>{var g,E;try{a(!0),l(null);const p=e.peerUrl||W.get("PEER_URL"),v=e.marketplaceServerUrl||e.nftServerUrl||W.get("MARKETPLACE_SERVER_URL");let I=d.PreviewType.WEARABLE,R={color:e.background||"#4b4852",transparent:e.disableBackground===!0};const T=le(e.profile);let A=T==null?void 0:T.value;A==="default"&&(A=re());const h=A&&T?T.type==="address"?await de(A,p):await ce(A,p):null,P=e.bodyShape||((g=h==null?void 0:h.avatar)==null?void 0:g.bodyShape)||d.BodyShape.MALE;let w=null;if(e.contractAddress&&(w=await ue({contractAddress:e.contractAddress,tokenId:e.tokenId,itemId:e.itemId,peerUrl:p,marketplaceServerUrl:v}),w&&Se(w))){R={...R,image:w.thumbnail};const D=me(w);ge(D)&&(I=d.PreviewType.TEXTURE)}const{eyes:b,hair:H,skin:Y}=Ue(h,{eyes:e.eyes,hair:e.hair,skin:e.skin}),M=e.unityMode||null,ne=e.camera&&Object.values(d.PreviewCamera).includes(e.camera)?e.camera:d.PreviewCamera.INTERACTIVE,Q=e.projection&&Object.values(d.PreviewProjection).includes(e.projection)?e.projection:d.PreviewProjection.PERSPECTIVE,O=e.disableDefaultEmotes?null:e.emote&&Object.values(d.PreviewEmote).includes(e.emote)?e.emote:d.PreviewEmote.IDLE,J={background:R,bodyShape:P,mode:M,projection:Q,type:I,base64:((E=e.base64s)==null?void 0:E[0])||null,contract:e.contractAddress||null,disableLoader:e.disableLoader||!1,emote:(O==null?void 0:O.toString())||null,eyeColor:b.replace("#",""),hairColor:H.replace("#",""),item:e.itemId||null,profile:A||null,skinColor:Y.replace("#",""),token:e.tokenId||null,urn:e.urns||null,showAnimationReference:null,itemDefinition:w,socialEmote:e.socialEmote||null},ae=JSON.stringify(J),se=JSON.stringify(y.current);if(ae!==se){if(y.current=J,Object.keys(t).length===0){const D=X(e.urns),q=X(e.base64s);if(M===d.PreviewUnityMode.CONFIG){const z={mode:N(M||"")};Z(z)}else{const z={background:R.transparent?"":B(R.color),disableLoader:e.disableLoader?"true":"",profile:N(A||""),bodyShape:N(P||""),eyeColor:B(b||""),hairColor:B(H||""),skinColor:B(Y||""),mode:N(M||""),camera:ne,projection:Q,emote:N((O==null?void 0:O.toString())||""),urn:D.length>0?D:[""],base64:q.length>0?q:[""]};Z(z)}}r(J)}a(!1)}catch(p){console.error("[useUnityConfig] Failed to load config:",p),l(p instanceof Error?p.message:"Failed to load config"),a(!1)}})()},[e,t]),[s,n,i]}const ke="unity-renderer",je="unity-canvas",ee=1,xe="Failed to load Unity";var Je=(e=>(e.LOADED="loaded",e.ERROR="error",e.SCREENSHOT="screenshot",e.CUSTOMIZATION_DONE="customization-done",e.CUSTOMIZATION_STEP="avatar-customization-step",e.ELEMENT_BOUNDS="element-bounds",e))(Je||{});const ze="get_element_bounds",$e="element_bounds_response",Ge=(e,t,s,r)=>{const[n,a]=c.useState({isLoaded:!1,isInitialized:!1,error:null}),i=c.useRef(null),l=c.useCallback(S=>{if(S.data.type===ke){const{type:u,payload:m}=S.data.payload;u==="loaded"&&(m===!0||m==="true")?(a(o=>({...o,isLoaded:!0,isInitialized:!0})),d.sendMessage(L(),d.PreviewMessageType.LOAD,{renderer:d.PreviewRenderer.UNITY}),t.current&&t.current.emote.play()):u==="customization-done"?d.sendMessage(L(),d.PreviewMessageType.CONTROLLER_RESPONSE,{id:"customization-done",ok:!0,result:JSON.parse(S.data.payload.payload)}):u==="avatar-customization-step"?d.sendMessage(L(),d.PreviewMessageType.CONTROLLER_RESPONSE,{id:"avatar-customization-step",ok:!0,result:{step:S.data.payload.payload}}):u==="element-bounds"?d.sendMessage(L(),$e,m):u==="error"&&(j(new Error(m),{component:"UnityPreview",phase:"unityMessage"}),a(o=>({...o,error:m})),d.sendMessage(L(),d.PreviewMessageType.ERROR,{message:"Error loading the wearable. Please try again."}))}},[]),y=c.useCallback(async S=>{if(!(!e.canvas.current||e.isInitializing.current||e.unityInstance.current)){e.isInitializing.current=!0,a(u=>({...u,isLoaded:!1,error:null}));try{const u=S!=null&&S.itemDefinition&&we(S.itemDefinition)?S.itemDefinition:null,{unity:m,...o}=await Me(e.canvas.current,u,(S==null?void 0:S.socialEmote)||void 0);e.unityInstance.current=m,t.current=o,i.current&&i.current(),i.current=he(t.current),a(f=>({...f,isInitialized:!0}))}catch(u){const m=u instanceof Error?u.message:xe;console.error("Unity init failed:",u),j(u,{component:"UnityPreview",phase:"initializeUnity"}),a(o=>({...o,error:m})),d.sendMessage(L(),d.PreviewMessageType.ERROR,{message:m})}finally{e.isInitializing.current=!1}}},[e,t]);return c.useEffect(()=>{n.isInitialized||r||!s||y(s)},[s,r,n.isInitialized,y]),c.useEffect(()=>()=>{i.current&&i.current()},[]),c.useEffect(()=>{if(s)return window.addEventListener("message",l,!1),()=>{window.removeEventListener("message",l,!1)}},[s,l]),n},Fe=e=>{const[t,s]=c.useState({pixelRatio:window.devicePixelRatio||ee,is3D:!0,backgroundImage:""});return c.useEffect(()=>{const r=()=>{s(a=>({...a,pixelRatio:window.devicePixelRatio||ee}))},n=window.matchMedia(`(resolution: ${t.pixelRatio}dppx)`);return n.addEventListener("change",r),()=>{n.removeEventListener("change",r)}},[t.pixelRatio]),c.useEffect(()=>{e&&s(r=>({...r,backgroundImage:e.background.image||"",is3D:e.type!==d.PreviewType.TEXTURE}))},[e]),t},Ve=(e,t,s,r,n)=>{const a=c.useMemo(()=>{const i={};for(const l of Object.keys(n))n[l]&&r[l]!==void 0&&(i[l]=r[l]);return i},[n,r]);c.useEffect(()=>{if(!(!s.isInitialized||!s.isLoaded||!e.current)){if(a.profile==="default"){const i=t.current.profile;a.profile=i!=null&&i.match(/^default\d+$/)?i:re()}Object.keys(a).length>0&&(Pe(e.current,a,n),t.current=a)}},[s.isInitialized,s.isLoaded,a,n,e,t])},He=()=>{const{width:e=window.innerWidth,height:t=window.innerHeight}=Ee(),s=c.useRef(null),r=c.useRef(null),n=c.useRef(!1),a=c.useRef({}),i=ye(),[l,y,S]=Be(),{options:u,overrideSources:m}=te(),o=c.useMemo(()=>({canvas:s,unityInstance:r,isInitializing:n,lastSentOverrides:a}),[]);fe(h=>{var P,w;if(((P=h.data)==null?void 0:P.type)===ze&&r.current){const b=(w=h.data.payload)==null?void 0:w.elementName;b&&C(r.current,x.GET_ELEMENT_BOUNDS,b)}});const f=Ge(o,i,l,y),g=Fe(l);Ve(o.unityInstance,o.lastSentOverrides,f,u,m),pe();const E=c.useMemo(()=>{const h=f.error||S,P=!f.isLoaded&&!h,w=!!g.backgroundImage&&!g.is3D&&!P,b=g.is3D&&!P;return{error:h,isLoading:P,showImage:w,showCanvas:b}},[f.error,f.isLoaded,S,g.backgroundImage,g.is3D]),p=c.useMemo(()=>({opacity:1,backgroundColor:!(l!=null&&l.background.transparent)&&(l==null?void 0:l.type)===d.PreviewType.TEXTURE?l.background.color:void 0}),[l]),v=c.useMemo(()=>({width:`${e}px`,height:`${t}px`}),[e,t]),I=c.useMemo(()=>({width:Math.round(e*g.pixelRatio),height:Math.round(t*g.pixelRatio)}),[e,t,g.pixelRatio]),R=c.useMemo(()=>F("Preview",{"is-loading":E.isLoading,"is-loaded":f.isLoaded,"is-3d":g.is3D,"has-error":!!E.error}),[E.isLoading,f.isLoaded,g.is3D,E.error]),T=c.useMemo(()=>F("thumbnail",{"is-visible":E.showImage}),[E.showImage]),A=c.useMemo(()=>F({"is-visible":E.showCanvas}),[E.showCanvas]);return U.jsxs("div",{className:R,style:p,children:[U.jsx("img",{src:g.backgroundImage,className:T,alt:"preview"}),U.jsx("canvas",{ref:o.canvas,id:je,className:A,width:I.width,height:I.height,style:v}),E.error&&U.jsx("div",{className:"error",children:E.error})]})},qe=oe.memo(He);export{Je as UnityMessageType,qe as default};