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{ const {text}=await sampleResource(sample),picker=document.querySelector('#project-file'),toasts=document.querySelector('#toast-host'); if(!picker||!toasts)throw new Error('기존 프로젝트 파일 로더를 찾을 수 없습니다.'); let cleanup=()=>{}; const completed=new Promise((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();} }