Files
Pier_v1/랜딩페이지/sample-loader.ts
T

23 lines
1.6 KiB
TypeScript

import { sampleResource } from './sample-resource';
import type { Sample } from './sample-explorer';
/** Reuse #project-file → openProjectFile → openProjectText; never mutate app state here. */
export async function loadSampleIntoApp(sample:Sample,showApp:()=>void,showLanding:()=>void):Promise<void>{
const {text}=await sampleResource(sample),picker=document.querySelector<HTMLInputElement>('#project-file'),toasts=document.querySelector('#toast-host');
if(!picker||!toasts)throw new Error('기존 프로젝트 파일 로더를 찾을 수 없습니다.');
let cleanup=()=>{};
const completed=new Promise<void>((resolve,reject)=>{
const observer=new MutationObserver(records=>{
for(const record of records)for(const node of record.addedNodes){const message=node.textContent??'';
if(message.includes(`${sample.filename}을 열었습니다.`)){cleanup();resolve();}
else if(message.includes('프로젝트 파일을 열지 못했습니다:')){cleanup();reject(new Error(message.replace(/닫기$/,'')));}
}
});
const timer=window.setTimeout(()=>{cleanup();reject(new Error(`${sample.bridge}: 기존 로더의 완료 응답이 없습니다.`));},30000);
cleanup=()=>{observer.disconnect();clearTimeout(timer);};observer.observe(toasts,{childList:true,subtree:true});
});
try{
const transfer=new DataTransfer();transfer.items.add(new File([text],sample.filename,{type:'application/json'}));picker.files=transfer.files;
showApp();picker.dispatchEvent(new Event('change',{bubbles:true}));await completed;
}catch(error){showLanding();throw error;}finally{cleanup();}
}