23 lines
1.6 KiB
TypeScript
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();}
|
|
}
|