-
-
Notifications
You must be signed in to change notification settings - Fork 159
/
Copy pathmain.js
1 lines (1 loc) · 23 KB
/
main.js
1
const{shell:shell}=require("uxp"),{loginPage:loginPage,exportPage1:exportPage1,exportPage2:exportPage2,exportPage3:exportPage3,processingPage:processingPage,getTemplate:getTemplate,loadingPage:loadingPage,alertDialogPage:alertDialogPage,errDialogPage:errDialogPage,confirmationDialogPage:confirmationDialogPage}=require("./template"),{ExportDoc:ExportDoc}=require("./export"),{LocalState:LocalState}=require("./state"),{Artboard:Artboard}=require("scenegraph");let xdRoot;const baseUrl="https://app.quest.ai",baseApiUrl="https://figma.quest.ai";let isLoggedIn=!1,myprojects=null,accountInfo={hasHiRes:!1,"1x":{v:[150],s:[2]},"2x":{v:[700],s:[2]},aix:{v:[375,650,800,1e3],s:[2,1.75,1.5,1.25]}},localState=null,projectData=null,selectedProject=null,newProjectSuffix=null,artboardsToExport=[],alertDialog=null,alertDialogInitial=null,confirmationDialog=null,QUEST_ROOT_NODE=null,resourcesExpanded=!1,lastSyncedExpanded=!1,showAdvancedOptions=!0,slideshowTimeout=null,currentSlideshowIndex=null,ssoPubKey=null,ssoPvtKey=null,ssoCheckcount=0,ssoAPI=null;const slideshowImages=["images/XD_Plugin_Slideshow1.jpg","images/XD_Plugin_Slideshow2.jpg","images/XD_Plugin_Slideshow3.jpg","images/XD_Plugin_Slideshow4.jpg","images/XD_Plugin_Slideshow5.jpg"];function getQuestRootNode(){return QUEST_ROOT_NODE||(QUEST_ROOT_NODE=document.createElement("panel")),QUEST_ROOT_NODE}function checkLoggedIn(){return new Promise(async function(e,t){let o=baseUrl+"/api/creator/isLoggedIn?ref=XD";try{let t,n=await fetch(o,{method:"GET",headers:{"Content-Type":"application/json"},credentials:"include"});return n&&n.json&&(t=await n.json()),t&&t.data&&(accountInfo=t.data),void e(t&&"ok"===t.status)}catch(t){let o=document.getElementById("loadingPageInnerMessage");o&&(o.innerHTML="Failed to contact server."),console.log("error in check logged in : "+new Date),console.log(t),t.message.includes("Network request failed")&&showAlertDialog(alertDialogInitial),e(!1)}})}async function goToExportPage(){isLoggedIn=!0,showExportPage()}async function create(){QUEST_ROOT_NODE=null,resourcesExpanded=!1,lastSyncedExpanded=!1,showAdvancedOptions=!0;let e=getQuestRootNode();e.innerHTML=loadingPage;const{selection:t,root:o}=require("scenegraph");xdRoot=o,(localState=new LocalState(baseUrl)).writeStats("loaded","xd_plugin","plugin_loaded"),await localState.load();let n="";xdRoot.children.forEach(e=>{n+=e.guid});let a=localState.getHash(n);return projectData=localState.getLastSynced(a),checkLoggedIn().then(async function(o){if(o){if(isLoggedIn=!0,await getMyProjects(),projectData)for(let e=0;e<myprojects.length;e++)myprojects[e].id+""==projectData.project_id+""&&localState.setCurrentProject({name:myprojects[e].name,id:projectData.project_id,type:"website"===myprojects[e].type&&1===myprojects[e].isComponent?"component":myprojects[e].type,artboardsToExport:projectData.artboardsToExport,last_synced:projectData.last_synced});goToExportPage(),updateArtboardsBasedOnSelection(t)}else{e.innerHTML=loginPage,e.querySelector("form").addEventListener("submit",login),setupGoogleSSO(),document.getElementById("password").addEventListener("keyup",function(e){13===e.keyCode&&(e.preventDefault(),document.getElementById("ok").click())})}}),e}function setupGoogleSSOKeyPair(){return new Promise(async function(e,t){let o,n=baseApiUrl+"/api/oauthInternal/getKeyPair?api=true";try{o=await fetch(n,{method:"GET"});let a=await o.text();console.log("Return from server"),console.log(a);const l=JSON.parse(a);ssoPubKey=l.pub,ssoPvtKey=l.pvt,e()}catch(e){console.log("Failed to setup google sso"),console.log(e),t(e)}})}function setupGoogleSSO(){console.log("Registering the google SSO Button"),document.getElementById("googleSSOBtn").addEventListener("click",googleSSOFunc)}async function googleSSOFunc(){console.log("Clicked: google SSO Button");let e=document.getElementById("googleSSO");e.innerText="Please wait, loading the browser....",document.getElementById("googleSSOBtn").style.display="none",localState.writeStats("login","xd_plugin","user_login_sso");try{console.log("Setting up google sso"),await setupGoogleSSOKeyPair(),console.log("Logging into Google SSO");let t=baseUrl+"/login2/google?pub="+ssoPubKey;await shell.openExternal(t),e.innerText="Please wait, checking the server for access...",checkPeriodically()}catch(e){console.log("Error setting up Oauth calls for Google Authentication"),console.log(e),e.message.includes("Network request failed")&&showAlertDialog()}}async function checkPeriodically(){let e;console.log("check periodically");try{e=await fetch(baseUrl+"/api/oauthInternal/isAuthorized",{method:"POST",headers:{"Content-Type":"application/json"},credentials:"include",body:JSON.stringify({pvt:ssoPvtKey})});let t=await e.text(),o=JSON.parse(t);if(console.log("Return value from check.."),"ok"===o.status){console.log("Logged in using google sso"),ssoAPI=o.API_KEY,isLoggedIn=!0,await checkLoggedIn(),await getMyProjects();let e="";xdRoot.children.forEach(t=>{e+=t.guid});let t=localState.getHash(e);if(projectData=localState.getLastSynced(t))for(let e=0;e<myprojects.length;e++)myprojects[e].id+""==projectData.project_id+""&&localState.setCurrentProject({name:myprojects[e].name,id:projectData.project_id,type:"website"===myprojects[e].type&&1===myprojects[e].isComponent?"component":myprojects[e].type,artboardsToExport:projectData.artboardsToExport,last_synced:projectData.last_synced});showExportPage()}else console.log("not yet logged in"),ssoCheckcount<120&&(setTimeout(checkPeriodically,5e3),ssoCheckcount++)}catch(e){console.log("Error setting up Oauth calls for Google Authentication"),console.log(e),document.getElementById("googleSSOBtn").style.display="block"}}async function login(){localState.writeStats("login","xd_plugin","user_login");let e=document.getElementById("errorMsgField");e&&(e.style.display="none");let t,o=document.getElementById("username").value,n=document.getElementById("password").value,a=baseUrl+"/login?api=true";try{t=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json"},credentials:"include",body:JSON.stringify({username:o,password:n})});let e=await t.text(),l={};try{l=JSON.parse(e)}catch(t){console.log("ERROR : Failed to get JSON data from server. Instead got: "),console.log(e),console.log(t)}if("ok"!==l.status){console.log("Failed to login. Details from server:"),console.log(l),isLoggedIn=!1;let e=document.getElementById("errorMsgField");e&&(e.style.display="block")}else{isLoggedIn=!0,await checkLoggedIn(),await getMyProjects();let e="";xdRoot.children.forEach(t=>{e+=t.guid});let t=localState.getHash(e);if(projectData=localState.getLastSynced(t))for(let e=0;e<myprojects.length;e++)myprojects[e].id+""==projectData.project_id+""&&localState.setCurrentProject({name:myprojects[e].name,id:projectData.project_id,type:"website"===myprojects[e].type&&1===myprojects[e].isComponent?"component":myprojects[e].type,artboardsToExport:projectData.artboardsToExport,last_synced:projectData.last_synced});document.getElementById("googleSSOBtn").style.display="block",showExportPage()}}catch(e){console.log("Error in login"),console.log(e),e.message.includes("Network request failed")&&showAlertDialog()}}function hasSameWidthArtboards(){let e=[],t=!1;for(let o of artboardsToExport){if(e.includes(o.width)){t=!0;break}e.push(o.width)}return t}function exportToQuest(){let e,t,o,n;selectedProject?(e=selectedProject.id,t=selectedProject.type,o=selectedProject.name,n=selectedProject.extractVersion):(e=document.getElementById("projectselect").value,t=document.getElementById("gametype").value,o=document.getElementById("projectName").value,n=5);let a=!0,l=!1,s=!0,r=!1,i=!1,c=[];if(artboardsToExport.length>0&&(a=!1),"website"===t&&hasSameWidthArtboards()&&(l=!0),"mobile_optimized"===t)for(let e of artboardsToExport)700===e.width&&960===e.height||(s=!1,c.push(e));"component"===t&&artboardsToExport.length>1&&(r=!0);let d=document.getElementById("imagesizetype");"1x"===d.value||accountInfo.hasHiRes||(i=!0);let g=document.getElementById("exportError");if(a)return g.innerHTML="Please select at least one Artboard to export",void(g.style.display="block");if(r)return g.innerHTML="Please select only one artboard. A component is made from only one artboard.",void(g.style.display="block");if(i)return g.innerHTML="You donot have access to high res image quality. Please reset image quality to 1x",void(g.style.display="block");if(l)return g.innerHTML="Please only select Artboards of different width to export",void(g.style.display="block");if(!s){let e="The following artboards are not 700 x 960: ",t=!0;for(let o of c)t||(e+=", "),e+=o.name,t=!1;return g.innerHTML=e,void(g.style.display="block")}g.style.display="none",newProjectSuffix++;let p=d.value;console.log("image res value = "+p);let u={};switch(p){case"1x":u=accountInfo["1x"];break;case"2x":u=accountInfo["2x"];break;case"aix":u=accountInfo.aix;break;default:u=accountInfo["1x"]}showProcessingPage(),console.log("Exporting to Quest... : "+new Date),require("application").editDocument({editLabel:"Quest : Temporarily making the hidden images visible for export (at the end of export, this operation will be undone)",mergeId:Date.now()},function(){return new Promise(function(a,l){let s=new ExportDoc(xdRoot,baseUrl,localState),r=a;s.importXD(t,e,o,artboardsToExport,n,r,u).then(async function(e){localState.setCurrentProject({name:o,id:e.id,type:t,artboardsToExport:artboardsToExport,last_synced:Date.now()}),await getMyProjects();let n="";xdRoot.children.forEach(e=>{n+=e.guid});let a=localState.getHash(n);localState.addLastSynced(a,e.id);try{await localState.saveData(),showConfirmation()}catch(e){console.log("Error in saving state after export"),console.log(e),e.message.includes("Network request failed")&&showAlertDialog()}},function(e){try{a()}catch(e){}console.log("Failed to export"),console.log(e),e.message.includes("Network request failed")?showAlertDialog():showAlertDialog(null,"Failed to export. Please try again, if problem persists please contact support")})})})}function logout(){return resourcesExpanded=!1,lastSyncedExpanded=!1,showAdvancedOptions=!0,new Promise(function(e,t){fetch(baseUrl+"/logout?api=true",{method:"GET",headers:{"Content-Type":"application/json"},credentials:"include"}).then(function(e){return e.json()}).then(function(t){let o=getQuestRootNode();o.innerHTML=loginPage,o.querySelector("form").addEventListener("submit",login),e(!0)}).catch(function(e){console.log("error in logout"),console.log(e),t(e)})})}function toggleResourcesExpandCollapse(){resourcesExpanded=!resourcesExpanded;let e=document.getElementById("resourcesDetail"),t=document.getElementById("resourcesToggle");resourcesExpanded?(e.style.display="block",t.src="images/Arrow_Down@2x.png"):(e.style.display="none",t.src="images/Arrow_Right@2x.png")}function toggleLastSyncedExpandCollapse(){lastSyncedExpanded=!lastSyncedExpanded;let e=document.getElementById("projectDetailsDiv"),t=document.getElementById("lastSynchedProjectToggle");lastSyncedExpanded?(e.style.display="flex",t.src="images/Arrow_Down@2x.png"):(e.style.display="none",t.src="images/Arrow_Right@2x.png")}function toggleAdvancedOptions(){console.log("In toggle advanced options, current value = :"+showAdvancedOptions+" "+new Date),showAdvancedOptions=!showAdvancedOptions;let e=document.getElementById("advancedOptionsDiv"),t=document.getElementById("advancedOptionsToggle");showAdvancedOptions?(e.style.display="flex",t.src="images/Arrow_Down@2x.png"):(e.style.display="none",t.src="images/Arrow_Right@2x.png")}function showHideAdvancedPanel(e){let t=document.getElementById("advancedOptionsPanel");t.style.display="website"===e||"component"===e?"block":"none"}function showGameTypeDetails(e){let t=e&&e.target.value?e.target.value:"website";if(e){document.getElementById("gametype").value=t}let o=document.getElementById("hint-gametype");switch(t){case"mobile_optimized":o.innerHTML='Artboard size for each scene: <b> 700px Wide and 960px Tall. </b> <a href="https://www.quest.ai/docs?id=mobile-game-amp-playable-document-sizes"> Learn more </a>';break;case"website":o.innerHTML='Responsive web page for any device. <a href="https://www.quest.ai/docs?id=web-page-document-setup">Learn more</a>';break;case"component":o.innerHTML='Components are reusable across projects and must be 1 single artboard <a href="https://www.quest.ai/docs?id=web-page-document-setup">Learn more</a>'}showHideAdvancedPanel(t);let n,a="Artboards Selected:";0===artboardsToExport.length&&(a+=" None");let l=`\n <div class="gameTypeDetailsContainer">\n <div class="shiftClickImg"> <img height="23px" src="images/Shift_Click.png"/> </div>\n <div style="font-size:10px;padding-left:0px; padding-top:10px; padding-right:0px; text-align: left;"> <label> ${n="website"===t?"Hold SHIFT and click artboard title/name. Repeat to select all artboards that make up the different views of this page (e.g. Desktop, Tablet, Mobile).":"component"===t?"Click artboard title/name. Only one artboard can be selected":"Hold SHIFT and click artboard title/name. Repeat to select all artboards that represent the different Scenes of the game."}</label></div>\n <div id="selectedArtboardsTitle" style="font-size:11px;padding-left:0px; padding-top:20px;"> ${a} </div>\n <div id="selectedArtboards" style="display:flex; flex-direction: column; align-items:left; justify-content: left;"> </div>\n </div>\n `;document.getElementById("details-gametype").innerHTML=l,updateArtboardsOnPage()}function showImageScaleTypeDetails(e){let t=e&&e.target&&e.target.value?e.target.value:"1x";if(e){document.getElementById("imagesizetype").value=t}localState.setPrefImageQuality(t);let o=document.getElementById("hint-imagesizetype");switch(t){case"1x":o.innerHTML="Standard Resolution";break;case"aix":o.innerHTML="<b>Premium Feature:</b> Images are exported at high-res (up-to 2X) using AI & optimized for performance."+(accountInfo.hasHiRes?"":' <a href="https://app.quest.ai/platform/tiers">Upgrade Account</a>');break;case"2x":o.innerHTML="<b>Premium Feature:</b> Images are exported at high-res (up-to 2X) at highest quality with larger file sizes."+(accountInfo.hasHiRes?"":' <a href="https://app.quest.ai/platform/tiers">Upgrade Account</a>')}let n=document.getElementById("export");"1x"===t||accountInfo.hasHiRes?(n.setAttribute("uxp-variant","cta"),n.setAttribute("uxp-quiet","false")):(n.setAttribute("uxp-variant","primary"),n.setAttribute("uxp-quiet","true"))}function updateArtboardsBasedOnSelection(e){let t=[];for(let o of e.items)o instanceof Artboard&&t.push(o);updateArtboardsInternal(t)}function updateArtboardsInternal(e){let t=document.getElementById("exportError");t&&(t.style.display="none"),artboardsToExport=[],e.sort((e,t)=>e.width>t.width?1:-1);let o=[768,992],n=0,a=0,l=-1,s=0,r=[],i=[];for(;s<e.length;)s===e.length-1?(l=-1,r.push(a),i.push(l),s++):n<2?e[s].width<o[n]?e[s+1].width<o[n]?(l=e[s].width,r.push(a),i.push(l),a=l,s++):(l=o[n],n++,r.push(a),i.push(l),a=l,s++):n++:(l=e[s].width,r.push(a),i.push(l),a=l,s++);for(let t=0;t<e.length;t++){let o=!1,n=!1,s=!1;a=r[t],l=i[t],a>=992?o=!0:a>=768?(n=!0,-1===l&&(o=!0)):(s=!0,-1===l?(o=!0,n=!0):l>768&&(n=!0)),artboardsToExport.push({name:e[t].name,node:e[t],minWidth:a,maxWidth:l,width:e[t].width,height:e[t].height,hasDesktopIcon:o,hasTabletIcon:n,hasMobileIcon:s}),a=l}let c="Selected Artboards:";0===(artboardsToExport=artboardsToExport.reverse()).length&&(c+=" None"),document.getElementById("selectedArtboardsTitle")&&(updateArtboardsOnPage(),document.getElementById("selectedArtboardsTitle").innerHTML=c)}function updateArtboardsOnPage(){let e;e=selectedProject?selectedProject.type:document.getElementById("gametype").value;let t="";for(let o of artboardsToExport){t+='<div style="background-color:#E8E8E8; display:flex; flex-direction:row; align-items:center; justify-content: start; font-size:12px; border: 1px solid #E8E8E8; border-radius: 3px; margin-left:0px; margin-top:10px; padding:5px 5px 5px 5px;"> ',"website"===e?(o.hasDesktopIcon&&(t+='<img height="11px" style="margin-right:3px;" src="images/Desktop.png">'),o.hasTabletIcon&&(t+='<img height="11px" style="margin-right:3px;" src="images/Tablet.png">'),o.hasMobileIcon&&(t+='<img height="11px" style="margin-right:3px;" src="images/Mobile.png">')):"component"===e&&(t+='<img height="23px" style="margin-right:3px;" src="images/Component.png">');let n=o.name;n.length>15&&(n=n.substring(0,12)+"..."),t+=`<div style="padding-left:6px; vertical-align: middle"> ${n}</div>\n </div>`}document.getElementById("selectedArtboards").innerHTML=t}function changeProjectName(e){if(e){let t=document.getElementById("projectselect");t.value=e.target.value,-1===e.target.value||"-1"===e.target.value?(document.getElementById("gametype").removeAttribute("disabled"),document.getElementById("hint-gametype").style.display="block",document.getElementById("projectTitle").style.display="block",document.getElementById("projectName").style.display="block",document.getElementById("projecthr").style.display="block",document.getElementById("projectName").value="My XD Project "+newProjectSuffix,selectedProject=null):(document.getElementById("gametype").setAttribute("disabled",!0),document.getElementById("hint-gametype").style.display="none",document.getElementById("projectTitle").style.display="none",document.getElementById("projectName").style.display="none",document.getElementById("projecthr").style.display="none",(selectedProject=myprojects.find(e=>e.id+""===t.value))&&(selectedProject.type="website"===selectedProject.type&&1===selectedProject.isComponent?"component":selectedProject.type))}}function showAlertDialog(e,t){let o=e;o||(o=alertDialog),o||(o=document.createElement("dialog")),o.innerHTML=t?errDialogPage:alertDialogPage,document.body.appendChild(o);let n=getQuestRootNode();return t||(n.innerHTML='<div style="padding: 20px 10px 0px 10px; font-size: 14px;">\n No internet connection </div>\n <div style="padding: 10px 10px 0px 10px;"> Please connnect to the internet and re-open the plugin. </div>'),o.showModal()}function showExportPage(){let e=getQuestRootNode(),t=exportPage1,o=localState.getCurrentProject();o?((selectedProject=myprojects.find(e=>e.id===o.id)).type="website"===selectedProject.type&&1===selectedProject.isComponent?"component":selectedProject.type,t+='\n <option class="projectitem" value = "-1">New Project</option>'):t+='\n <option selected="selected" class="projectitem" value = "-1">New Project</option>';let n=0,a=0;for(const e of myprojects){if(n<10&&"XD"===e.source){let a=o&&o.id+""==e.id+""?"selected":"";t+=`\n <option class="projectitem" value = "${e.id}" ${a}>${e.name}</option>`,n++}if(e.name.startsWith("My XD Project ")){let t=e.name.substring(14,e.name.length),o=parseInt(t);o&&o>a&&(a=o)}}newProjectSuffix=a+1,t+=exportPage2,t+=exportPage3,e.innerHTML=t,console.log("setup export page 1"),o?(document.getElementById("gametype").setAttribute("disabled",!0),document.getElementById("hint-gametype").style.display="none",document.getElementById("projectTitle").style.display="none",document.getElementById("projectName").style.display="none",document.getElementById("projecthr").style.display="none"):document.getElementById("projectName").value="My XD Project "+newProjectSuffix,console.log("setup export page 2"),e.querySelector("form").addEventListener("submit",exportToQuest),document.getElementById("gametype").addEventListener("change",showGameTypeDetails),document.getElementById("projectselect").addEventListener("change",changeProjectName),document.getElementById("logout").addEventListener("click",logout),document.getElementById("resourcesToggle").addEventListener("click",toggleResourcesExpandCollapse),document.getElementById("resourcesTitle").addEventListener("click",toggleResourcesExpandCollapse),document.getElementById("lastSynchedProjectToggle").addEventListener("click",toggleLastSyncedExpandCollapse),document.getElementById("lastSynchedProjectTitle").addEventListener("click",toggleLastSyncedExpandCollapse);let l=document.getElementById("imagesizetype");if(localState.getPrefImageQuality()){let e=localState.getPrefImageQuality();"1x"===e||accountInfo&&accountInfo.hasHiRes?l.value=e:(e="1x",console.log("Ignoring state. User does not have access")),showImageScaleTypeDetails({target:{value:localState.getPrefImageQuality()}})}else accountInfo&&accountInfo.hasHiRes&&(l.value="aix",showImageScaleTypeDetails({target:{value:"aix"}}));l.addEventListener("change",showImageScaleTypeDetails),document.getElementById("advancedOptionsToggle").addEventListener("click",toggleAdvancedOptions),document.getElementById("advancedOptionsTitle").addEventListener("click",toggleAdvancedOptions),showGameTypeDetails({target:{value:o?o.type:"website"}}),showCurrentProject()}function showProcessingPage(){getQuestRootNode().innerHTML=processingPage,currentSlideshowIndex=Math.floor(5*Math.random());let e=slideshowImages[currentSlideshowIndex];document.getElementById("slideshowimg").src=e,slideshowTimeout=setTimeout(showNextImage,1e4)}function showNextImage(){5===++currentSlideshowIndex&&(currentSlideshowIndex=0);let e=slideshowImages[currentSlideshowIndex],t=document.getElementById("slideshowimg");t&&(t.src=e,slideshowTimeout=setTimeout(showNextImage,1e4))}function showConfirmation(){clearTimeout(slideshowTimeout),showExportPage(),confirmationDialog&&document.getElementById("viewInQuestDialog")||((confirmationDialog=document.createElement("dialog")).innerHTML=confirmationDialogPage,document.body.appendChild(confirmationDialog));let e=document.getElementById("viewInQuestDialog");return e?e.onclick=redirectToQuest:console.log("ERROR : Cannot find the element to setup redirect to quest."),confirmationDialog.showModal()}function redirectToQuest(){console.log("Redirecting to Quest...");let e=localState.getCurrentProject()?baseUrl+"/platform/editor/"+localState.getCurrentProject().id:null;shell.openExternal(e)}function getMonthName(e){return["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"][e]}function dateToString(e){let t=function(e){return e<10?"0"+e:e};return getMonthName(e.getMonth())+" "+e.getDate()+" "+e.getFullYear()+", "+(e.getHours()>12?t(e.getHours()-12):t(e.getHours()))+":"+t(e.getMinutes())+" "+(e.getHours()>12?"PM":"AM")}function showCurrentProject(){let e=localState.getCurrentProject(),t=document.getElementById("projectDetailsDiv");if(!e)return void(t.innerHTML="None yet!");let o=e.name,n=e.id,a=e.last_synced,l=new Date(a),s=baseUrl+"/platform/editor/"+n,r=getTemplate("PROJECT_DETAILS",{projectName:o,projectId:n,projectUrl:s,projectScreenshotUrl:baseUrl+"/api/ide/getScreenshot/"+n,syncDate:dateToString(l)});t.innerHTML=r,document.getElementById("viewInQuest").addEventListener("click",()=>{redirectToQuest(s)})}function getMyProjects(){return new Promise(async function(e,t){try{let e=baseUrl+"/api/creator/getAllMyProjects",t=await fetch(e,{method:"GET",headers:{"Content-Type":"application/json"},credentials:"include"});const o=await t.json();myprojects=o.data}catch(e){console.log("Error in getting my projects"),console.log(e),e.message.includes("Network request failed")&&showAlertDialog()}e()})}async function show(e){const{selection:t,root:o}=require("scenegraph");xdRoot=o;let n=await create();e.node.appendChild(n)}async function hide(e){localState&&localState.writeStats("unloaded","xd_plugin","plugin_unloaded"),e.node.remove(getQuestRootNode()),QUEST_ROOT_NODE=null}function update(e){updateArtboardsBasedOnSelection(e)}module.exports={panels:{QuestAI:{show:show,hide:hide,update:update}}};