main
js 49 lines 1.77 KB
Raw
1 import { store as desktopStore } from "/plugins/_desktop/webui/desktop-store.js";
2
3 function waitForElement(selector, timeoutMs = 10000) {
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 registerDesktopSurface(surfaces) {
23 surfaces.registerSurface({
24 id: "desktop",
25 title: "Desktop",
26 icon: "desktop_windows",
27 order: 20,
28 modalPath: "/plugins/_desktop/webui/main.html",
29 async beginDockHandoff() {
30 desktopStore.beforeDesktopHostHandoff?.();
31 },
32 async finishDockHandoff(payload = {}) {
33 if (payload.opened !== false) desktopStore.afterDesktopHostShown?.({ source: "dock" });
34 },
35 async cancelDockHandoff() {
36 desktopStore.cancelDesktopHostHandoff?.();
37 },
38 async open(payload = {}) {
39 const panel = await waitForElement('[data-surface-id="desktop"] .office-panel');
40 if (!panel) throw new Error("Desktop surface panel did not mount.");
41 await desktopStore.onMount?.(panel, { mode: "canvas" });
42 await desktopStore.onOpen?.(payload);
43 desktopStore.afterDesktopHostShown?.({ source: payload?.source || "canvas" });
44 },
45 async close(payload = {}) {
46 desktopStore.beforeHostHidden?.({ unloadDesktop: payload?.reason === "mobile" });
47 },
48 });
49 }