import * as FSHandle from "./store-directory-handle.js"; /** @type {(type:string, attributes?:Record, ...children:Array)=>HTMLElement} */ const H =(type, attributes={}, ...children)=> { const el =document.createElement(type); Object.entries(attributes).forEach(([name, data])=>{ if(name.startsWith("on")) { el.addEventListener(name.substring(2), data); } else { el.setAttribute(name, data) } }); children.forEach(child=> { el.appendChild(typeof child == "string" ? document.createTextNode(child) : child); }); return el; } const button = H("button"); const listRoom = H("ul"); /** @type {(errorAction?:()=>void)=>Promise} */ async function ReloadAndRedraw(errorAction = ()=>{}) { listRoom.innerHTML = ""; try { const handle = await FSHandle.getDirectoryHandle(); if(!handle) { console.log("no fs handle") throw new Error("no fs handle set yet") } button.setAttribute("disabled", true); button.innerText = "loading..."; const module = await import("./data/room.js"+"?rand="+Math.random()); const rooms = module.default(); button.innerText = "change directory"; console.log("rooms loaded:", rooms); Object.entries(rooms).forEach(([roomID, roomData])=> { const listPass = H("ul"); Object.entries(roomData.Pass).forEach(([passID, passData])=>{ listPass.appendChild(H("li", {}, H("button", { onclick() { passData.load(); console.log(roomData); globalThis.ROOM=roomData; } }, passData.name) )) }); listRoom.appendChild( H("li", {}, H("div", {}, roomID), listPass ) ); }) } catch(e) { errorAction(); button.innerText = "select directory"; } button.removeAttribute("disabled") } await ReloadAndRedraw(); button.addEventListener("click", async()=> { const directory = await globalThis.showDirectoryPicker(); await FSHandle.setDirectoryHandle(directory); await ReloadAndRedraw(()=>alert("Invalid directory")); }); document.body.appendChild(button); document.body.appendChild(listRoom);