main
js 44 lines 1.51 KB
Raw
1 import { store as fileBrowserStore } from "/components/modals/file-browser/file-browser-store.js";
2
3 function waitForElement(selector, timeoutMs = 3000) {
4 const found = document.querySelector(selector);
5 if (found) return Promise.resolve(found);
6 return new Promise((resolve) => {
7 const timeout = globalThis.setTimeout(() => {
8 observer.disconnect();
9 resolve(document.querySelector(selector));
10 }, timeoutMs);
11 const observer = new MutationObserver(() => {
12 const element = document.querySelector(selector);
13 if (!element) return;
14 globalThis.clearTimeout(timeout);
15 observer.disconnect();
16 resolve(element);
17 });
18 observer.observe(document.body, { childList: true, subtree: true });
19 });
20 }
21
22 export default async function registerFilesSurface(surfaces) {
23 surfaces.registerSurface({
24 id: "files",
25 title: "Files",
26 icon: "folder",
27 order: 5,
28 modalPath: "modals/file-browser/file-browser.html",
29 beginDockHandoff() {
30 fileBrowserStore.beginSurfaceHandoff?.();
31 },
32 finishDockHandoff(payload = {}) {
33 fileBrowserStore.finishSurfaceHandoff?.(payload);
34 },
35 cancelDockHandoff() {
36 fileBrowserStore.cancelSurfaceHandoff?.();
37 },
38 async open(payload = {}) {
39 const panel = await waitForElement('[data-surface-id="files"] .file-browser-root');
40 if (!panel) throw new Error("Files surface panel did not mount.");
41 await fileBrowserStore.openSurface(payload.path || payload.filePath || payload.directory || "");
42 },
43 });
44 }