@dxos/plugin-native 0.7.5-main.2567c87 → 0.7.5-main.5ae2ba8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/browser/index.mjs +2 -2
- package/dist/lib/browser/index.mjs.map +2 -2
- package/dist/lib/browser/{initialize-6OEQRMUZ.mjs → initialize-XWHZ2OWK.mjs} +36 -26
- package/dist/lib/browser/initialize-XWHZ2OWK.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/types/src/initialize.d.ts.map +1 -1
- package/package.json +7 -6
- package/src/NativePlugin.tsx +1 -1
- package/src/initialize.ts +30 -22
- package/dist/lib/browser/initialize-6OEQRMUZ.mjs.map +0 -7
|
@@ -9,9 +9,9 @@ import { definePlugin, Events, defineModule } from "@dxos/app-framework";
|
|
|
9
9
|
var NativePlugin = () => definePlugin(meta, [
|
|
10
10
|
defineModule({
|
|
11
11
|
id: `${meta.id}/module/startup`,
|
|
12
|
-
activatesOn: Events.
|
|
12
|
+
activatesOn: Events.DispatcherReady,
|
|
13
13
|
activate: async (context) => {
|
|
14
|
-
const { initializeNativeApp } = await import("./initialize-
|
|
14
|
+
const { initializeNativeApp } = await import("./initialize-XWHZ2OWK.mjs");
|
|
15
15
|
await initializeNativeApp(context);
|
|
16
16
|
return [];
|
|
17
17
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/meta.ts", "../../../src/NativePlugin.tsx"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type PluginMeta } from '@dxos/app-framework';\n\nexport const NATIVE_PLUGIN = 'dxos.org/plugin/native';\n\nexport const meta = {\n id: NATIVE_PLUGIN,\n} satisfies PluginMeta;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport type { PluginsContext } from '@dxos/app-framework';\nimport { definePlugin, Events, defineModule } from '@dxos/app-framework';\n\nimport { meta } from './meta';\n\n// TODO(burdon): Initial url has index.html, which must be caught/redirected.\n\nexport const NativePlugin = () =>\n definePlugin(meta, [\n defineModule({\n id: `${meta.id}/module/startup`,\n activatesOn: Events.
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type PluginMeta } from '@dxos/app-framework';\n\nexport const NATIVE_PLUGIN = 'dxos.org/plugin/native';\n\nexport const meta = {\n id: NATIVE_PLUGIN,\n} satisfies PluginMeta;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport type { PluginsContext } from '@dxos/app-framework';\nimport { definePlugin, Events, defineModule } from '@dxos/app-framework';\n\nimport { meta } from './meta';\n\n// TODO(burdon): Initial url has index.html, which must be caught/redirected.\n\nexport const NativePlugin = () =>\n definePlugin(meta, [\n defineModule({\n id: `${meta.id}/module/startup`,\n activatesOn: Events.DispatcherReady,\n activate: async (context: PluginsContext) => {\n const { initializeNativeApp } = await import('./initialize');\n await initializeNativeApp(context);\n return [];\n },\n }),\n ]);\n"],
|
|
5
5
|
"mappings": ";AAMO,IAAMA,gBAAgB;AAEtB,IAAMC,OAAO;EAClBC,IAAIF;AACN;;;ACLA,SAASG,cAAcC,QAAQC,oBAAoB;AAM5C,IAAMC,eAAe,MAC1BC,aAAaC,MAAM;EACjBC,aAAa;IACXC,IAAI,GAAGF,KAAKE,EAAE;IACdC,aAAaC,OAAOC;IACpBC,UAAU,OAAOC,YAAAA;AACf,YAAM,EAAEC,oBAAmB,IAAK,MAAM,OAAO,2BAAA;AAC7C,YAAMA,oBAAoBD,OAAAA;AAC1B,aAAO,CAAA;IACT;EACF,CAAA;CACD;",
|
|
6
|
-
"names": ["NATIVE_PLUGIN", "meta", "id", "definePlugin", "Events", "defineModule", "NativePlugin", "definePlugin", "meta", "defineModule", "id", "activatesOn", "Events", "
|
|
6
|
+
"names": ["NATIVE_PLUGIN", "meta", "id", "definePlugin", "Events", "defineModule", "NativePlugin", "definePlugin", "meta", "defineModule", "id", "activatesOn", "Events", "DispatcherReady", "activate", "context", "initializeNativeApp"]
|
|
7
7
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// packages/plugins/experimental/plugin-native/src/initialize.ts
|
|
2
|
-
import {
|
|
2
|
+
import { SettingsAction, LayoutAction, createIntent, Capabilities } from "@dxos/app-framework";
|
|
3
3
|
import { HELP_PLUGIN } from "@dxos/plugin-help";
|
|
4
4
|
import { COMMANDS_DIALOG } from "@dxos/plugin-navtree";
|
|
5
5
|
import { safeParseJson } from "@dxos/util";
|
|
@@ -15,10 +15,16 @@ var loadSocketSupplyModules = async () => {
|
|
|
15
15
|
/* @vite-ignore */
|
|
16
16
|
windowModule
|
|
17
17
|
);
|
|
18
|
+
const osModule = "socket:os";
|
|
19
|
+
const socketOs = await import(
|
|
20
|
+
/* @vite-ignore */
|
|
21
|
+
osModule
|
|
22
|
+
);
|
|
18
23
|
const { meta_title: appName } = app.config;
|
|
19
24
|
return {
|
|
20
25
|
app,
|
|
21
26
|
socketWindow,
|
|
27
|
+
socketOs,
|
|
22
28
|
appName
|
|
23
29
|
};
|
|
24
30
|
};
|
|
@@ -76,10 +82,12 @@ var setupMenuItemListener = (dispatch, app) => {
|
|
|
76
82
|
const id = `${event.detail.parent}:${event.detail.title}`;
|
|
77
83
|
switch (id) {
|
|
78
84
|
case "App Name:Search commands": {
|
|
79
|
-
void dispatch(createIntent(LayoutAction.
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
85
|
+
void dispatch(createIntent(LayoutAction.UpdateDialog, {
|
|
86
|
+
part: "dialog",
|
|
87
|
+
subject: COMMANDS_DIALOG,
|
|
88
|
+
options: {
|
|
89
|
+
blockAlign: "start"
|
|
90
|
+
}
|
|
83
91
|
}));
|
|
84
92
|
break;
|
|
85
93
|
}
|
|
@@ -88,9 +96,12 @@ var setupMenuItemListener = (dispatch, app) => {
|
|
|
88
96
|
break;
|
|
89
97
|
}
|
|
90
98
|
case "App Name:Show shortcuts": {
|
|
91
|
-
void dispatch(createIntent(LayoutAction.
|
|
92
|
-
|
|
93
|
-
|
|
99
|
+
void dispatch(createIntent(LayoutAction.UpdateDialog, {
|
|
100
|
+
part: "dialog",
|
|
101
|
+
subject: `${HELP_PLUGIN}/Shortcuts`,
|
|
102
|
+
options: {
|
|
103
|
+
blockAlign: "center"
|
|
104
|
+
}
|
|
94
105
|
}));
|
|
95
106
|
break;
|
|
96
107
|
}
|
|
@@ -109,17 +120,12 @@ var setupApplicationUrlListener = (app, dispatch) => {
|
|
|
109
120
|
if (location.includes("InvitationCode")) {
|
|
110
121
|
window.location.href = location;
|
|
111
122
|
} else {
|
|
112
|
-
void dispatch(createIntent(
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
location
|
|
119
|
-
]
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
));
|
|
123
|
+
void dispatch(createIntent(LayoutAction.Open, {
|
|
124
|
+
part: "main",
|
|
125
|
+
subject: [
|
|
126
|
+
location
|
|
127
|
+
]
|
|
128
|
+
}));
|
|
123
129
|
}
|
|
124
130
|
});
|
|
125
131
|
};
|
|
@@ -127,17 +133,21 @@ var setupGlobalHotkey = async (socketWindow, appWindow, dispatch) => {
|
|
|
127
133
|
const binding = await socketWindow.hotkey.bind("cmd + k");
|
|
128
134
|
binding.addEventListener("hotkey", () => {
|
|
129
135
|
appWindow.restore();
|
|
130
|
-
void dispatch(createIntent(LayoutAction.
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
136
|
+
void dispatch(createIntent(LayoutAction.UpdateDialog, {
|
|
137
|
+
part: "dialog",
|
|
138
|
+
subject: COMMANDS_DIALOG,
|
|
139
|
+
options: {
|
|
140
|
+
blockAlign: "start"
|
|
141
|
+
}
|
|
134
142
|
}));
|
|
135
143
|
});
|
|
136
144
|
};
|
|
137
145
|
var initializeNativeApp = async (context) => {
|
|
138
|
-
const { app, socketWindow, appName } = await loadSocketSupplyModules();
|
|
146
|
+
const { app, socketWindow, socketOs, appName } = await loadSocketSupplyModules();
|
|
139
147
|
const { dispatchPromise: dispatch } = context.requestCapability(Capabilities.IntentDispatcher);
|
|
140
|
-
|
|
148
|
+
const platform = socketOs.platform();
|
|
149
|
+
document.body.setAttribute("data-platform", platform);
|
|
150
|
+
if (platform === "darwin" || platform === "win32") {
|
|
141
151
|
await configureDesktopWindowSizing(app);
|
|
142
152
|
await configureSystemMenu(app, appName);
|
|
143
153
|
setupMenuItemListener(dispatch, app);
|
|
@@ -148,4 +158,4 @@ var initializeNativeApp = async (context) => {
|
|
|
148
158
|
export {
|
|
149
159
|
initializeNativeApp
|
|
150
160
|
};
|
|
151
|
-
//# sourceMappingURL=initialize-
|
|
161
|
+
//# sourceMappingURL=initialize-XWHZ2OWK.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/initialize.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport type { PluginsContext } from '@dxos/app-framework';\nimport { SettingsAction, LayoutAction, createIntent, Capabilities } from '@dxos/app-framework';\nimport { HELP_PLUGIN } from '@dxos/plugin-help';\nimport { COMMANDS_DIALOG } from '@dxos/plugin-navtree';\nimport { safeParseJson } from '@dxos/util';\n\n// TODO(burdon): Reconcile with other properties.\nconst KEY_WINDOW_SIZE = 'dxos.org/plugin/native/window-size';\n\n/**\n * Native code for socketsupply app.\n * https://www.npmjs.com/package/@socketsupply/socket\n * https://github.com/socketsupply/socket-examples\n */\n\nconst loadSocketSupplyModules = async () => {\n // SocketSupply implements the dynamic import.\n const module = 'socket:application';\n const app = await import(/* @vite-ignore */ module);\n const windowModule = 'socket:window';\n const socketWindow = await import(/* @vite-ignore */ windowModule);\n const osModule = 'socket:os';\n const socketOs = await import(/* @vite-ignore */ osModule);\n const { meta_title: appName } = app.config;\n\n return { app, socketWindow, socketOs, appName };\n};\n\nconst configureDesktopWindowSizing = async (app: any) => {\n const { width, height } = safeParseJson<{ width?: number; height?: number }>(\n localStorage.getItem(KEY_WINDOW_SIZE),\n {},\n );\n\n if (width && height) {\n const appWindow = await app.getCurrentWindow();\n await appWindow.setSize({ width, height });\n }\n\n window.addEventListener('resize', async () => {\n const appWindow = await app.getCurrentWindow();\n const { width, height } = appWindow.getSize();\n localStorage.setItem(KEY_WINDOW_SIZE, JSON.stringify({ width, height }));\n });\n};\n\nconst configureSystemMenu = async (app: any, appName: string) => {\n const itemsMac = `\n Hide ${appName}: h + CommandOrControl\n Hide Others: h + Control + Meta\n ---\n `;\n\n // TODO(mjamesderocher) Change menu names to use translations\n const menu = `\n App Name:\n About ${appName}: _\n Settings...: , + CommandOrControl\n ---\n Show shortcuts: / + CommandOrControl\n Search commands: k + CommandOrControl\n ---\n ${itemsMac}\n Quit: q + CommandOrControl\n ;\n\n Edit:\n Cut: x + CommandOrControl\n Copy: c + CommandOrControl\n Paste: v + CommandOrControl\n Delete: _\n Select All: a + CommandOrControl\n ;\n `;\n\n void app.setSystemMenu({ index: 0, value: menu });\n};\n\nconst setupMenuItemListener = (dispatch: any, app: any) => {\n window.addEventListener('menuItemSelected', async (event: any) => {\n const id = `${event.detail.parent}:${event.detail.title}`;\n switch (id) {\n case 'App Name:Search commands': {\n void dispatch(\n createIntent(LayoutAction.UpdateDialog, {\n part: 'dialog',\n subject: COMMANDS_DIALOG,\n options: {\n blockAlign: 'start',\n },\n }),\n );\n break;\n }\n case 'App Name:Settings...': {\n void dispatch(createIntent(SettingsAction.Open));\n break;\n }\n case 'App Name:Show shortcuts': {\n void dispatch(\n createIntent(LayoutAction.UpdateDialog, {\n part: 'dialog',\n subject: `${HELP_PLUGIN}/Shortcuts`,\n options: {\n blockAlign: 'center',\n },\n }),\n );\n break;\n }\n case 'App Name:Quit': {\n await app.exit();\n break;\n }\n }\n });\n};\n\nconst setupApplicationUrlListener = (app: any, dispatch: any) => {\n const appWindow = app.getCurrentWindow();\n\n // applicationurl is a custom event fired by the Socket Supply Runtime:\n // https://github.com/socketsupply/socket/blob/ef7fb5559876e41062d5896aafb7b79989fc96e5/api/internal/events.js#L6\n window.addEventListener('applicationurl', ({ url }: any) => {\n appWindow.restore();\n const location = url.toString().replace('composer://', '');\n if (location.includes('InvitationCode')) {\n // TODO(mjamesderocher): Integrate this with app routing.\n // Currently, the dialogs are controlled by Client Plugin and not the Layout Plugin.\n window.location.href = location;\n } else {\n // TODO(thure): What is `location` and is this right?\n void dispatch(createIntent(LayoutAction.Open, { part: 'main', subject: [location] }));\n }\n });\n};\n\nconst setupGlobalHotkey = async (socketWindow: any, appWindow: any, dispatch: any) => {\n const binding = await socketWindow.hotkey.bind('cmd + k');\n\n // Global hotkey listener\n binding.addEventListener('hotkey', () => {\n appWindow.restore();\n void dispatch(\n createIntent(LayoutAction.UpdateDialog, {\n part: 'dialog',\n subject: COMMANDS_DIALOG,\n options: {\n blockAlign: 'start',\n },\n }),\n );\n });\n};\n\nexport const initializeNativeApp = async (context: PluginsContext) => {\n const { app, socketWindow, socketOs, appName } = await loadSocketSupplyModules();\n const { dispatchPromise: dispatch } = context.requestCapability(Capabilities.IntentDispatcher);\n\n const platform = socketOs.platform();\n\n document.body.setAttribute('data-platform', platform);\n\n if (platform === 'darwin' || platform === 'win32') {\n await configureDesktopWindowSizing(app);\n await configureSystemMenu(app, appName);\n setupMenuItemListener(dispatch, app);\n setupApplicationUrlListener(app, dispatch);\n await setupGlobalHotkey(socketWindow, app, dispatch);\n }\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["SettingsAction", "LayoutAction", "createIntent", "Capabilities", "HELP_PLUGIN", "COMMANDS_DIALOG", "safeParseJson", "KEY_WINDOW_SIZE", "loadSocketSupplyModules", "module", "app", "windowModule", "socketWindow", "osModule", "socketOs", "meta_title", "appName", "config", "configureDesktopWindowSizing", "width", "height", "safeParseJson", "localStorage", "getItem", "appWindow", "getCurrentWindow", "setSize", "window", "addEventListener", "getSize", "setItem", "JSON", "stringify", "configureSystemMenu", "itemsMac", "menu", "setSystemMenu", "index", "value", "setupMenuItemListener", "dispatch", "event", "id", "detail", "parent", "title", "createIntent", "LayoutAction", "UpdateDialog", "part", "subject", "COMMANDS_DIALOG", "options", "blockAlign", "SettingsAction", "Open", "HELP_PLUGIN", "exit", "setupApplicationUrlListener", "url", "restore", "location", "toString", "replace", "includes", "href", "setupGlobalHotkey", "binding", "hotkey", "bind", "initializeNativeApp", "context", "dispatchPromise", "requestCapability", "Capabilities", "IntentDispatcher", "platform", "document", "body", "setAttribute"]
|
|
7
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"inputs":{"packages/plugins/experimental/plugin-native/src/meta.ts":{"bytes":916,"imports":[],"format":"esm"},"packages/plugins/experimental/plugin-native/src/initialize.ts":{"bytes":
|
|
1
|
+
{"inputs":{"packages/plugins/experimental/plugin-native/src/meta.ts":{"bytes":916,"imports":[],"format":"esm"},"packages/plugins/experimental/plugin-native/src/initialize.ts":{"bytes":19087,"imports":[{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/plugin-help","kind":"import-statement","external":true},{"path":"@dxos/plugin-navtree","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"format":"esm"},"packages/plugins/experimental/plugin-native/src/NativePlugin.tsx":{"bytes":2527,"imports":[{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-native/src/meta.ts","kind":"import-statement","original":"./meta"},{"path":"packages/plugins/experimental/plugin-native/src/initialize.ts","kind":"dynamic-import","original":"./initialize"}],"format":"esm"},"packages/plugins/experimental/plugin-native/src/index.ts":{"bytes":607,"imports":[{"path":"packages/plugins/experimental/plugin-native/src/meta.ts","kind":"import-statement","original":"./meta"},{"path":"packages/plugins/experimental/plugin-native/src/NativePlugin.tsx","kind":"import-statement","original":"./NativePlugin"}],"format":"esm"}},"outputs":{"packages/plugins/experimental/plugin-native/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":1579},"packages/plugins/experimental/plugin-native/dist/lib/browser/index.mjs":{"imports":[{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-native/dist/lib/browser/initialize-XWHZ2OWK.mjs","kind":"dynamic-import"}],"exports":["NATIVE_PLUGIN","NativePlugin","meta"],"entryPoint":"packages/plugins/experimental/plugin-native/src/index.ts","inputs":{"packages/plugins/experimental/plugin-native/src/meta.ts":{"bytesInOutput":82},"packages/plugins/experimental/plugin-native/src/index.ts":{"bytesInOutput":0},"packages/plugins/experimental/plugin-native/src/NativePlugin.tsx":{"bytesInOutput":405}},"bytes":702},"packages/plugins/experimental/plugin-native/dist/lib/browser/initialize-XWHZ2OWK.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":9462},"packages/plugins/experimental/plugin-native/dist/lib/browser/initialize-XWHZ2OWK.mjs":{"imports":[{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/plugin-help","kind":"import-statement","external":true},{"path":"@dxos/plugin-navtree","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"exports":["initializeNativeApp"],"entryPoint":"packages/plugins/experimental/plugin-native/src/initialize.ts","inputs":{"packages/plugins/experimental/plugin-native/src/initialize.ts":{"bytesInOutput":4504}},"bytes":4652}}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"initialize.d.ts","sourceRoot":"","sources":["../../../src/initialize.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"initialize.d.ts","sourceRoot":"","sources":["../../../src/initialize.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AA2J1D,eAAO,MAAM,mBAAmB,YAAmB,cAAc,kBAehE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/plugin-native",
|
|
3
|
-
"version": "0.7.5-main.
|
|
3
|
+
"version": "0.7.5-main.5ae2ba8",
|
|
4
4
|
"description": "Composer plugin that runs when on a native device.",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
7
7
|
"license": "MIT",
|
|
8
8
|
"author": "DXOS.org",
|
|
9
9
|
"sideEffects": true,
|
|
10
|
+
"type": "module",
|
|
10
11
|
"exports": {
|
|
11
12
|
".": {
|
|
12
13
|
"types": "./dist/types/src/index.d.ts",
|
|
@@ -22,11 +23,11 @@
|
|
|
22
23
|
"src"
|
|
23
24
|
],
|
|
24
25
|
"dependencies": {
|
|
25
|
-
"@dxos/app-framework": "0.7.5-main.
|
|
26
|
-
"@dxos/
|
|
27
|
-
"@dxos/
|
|
28
|
-
"@dxos/
|
|
29
|
-
"@dxos/
|
|
26
|
+
"@dxos/app-framework": "0.7.5-main.5ae2ba8",
|
|
27
|
+
"@dxos/util": "0.7.5-main.5ae2ba8",
|
|
28
|
+
"@dxos/log": "0.7.5-main.5ae2ba8",
|
|
29
|
+
"@dxos/plugin-navtree": "0.7.5-main.5ae2ba8",
|
|
30
|
+
"@dxos/plugin-help": "0.7.5-main.5ae2ba8"
|
|
30
31
|
},
|
|
31
32
|
"devDependencies": {
|
|
32
33
|
"vite": "5.4.7"
|
package/src/NativePlugin.tsx
CHANGED
|
@@ -13,7 +13,7 @@ export const NativePlugin = () =>
|
|
|
13
13
|
definePlugin(meta, [
|
|
14
14
|
defineModule({
|
|
15
15
|
id: `${meta.id}/module/startup`,
|
|
16
|
-
activatesOn: Events.
|
|
16
|
+
activatesOn: Events.DispatcherReady,
|
|
17
17
|
activate: async (context: PluginsContext) => {
|
|
18
18
|
const { initializeNativeApp } = await import('./initialize');
|
|
19
19
|
await initializeNativeApp(context);
|
package/src/initialize.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import type { PluginsContext } from '@dxos/app-framework';
|
|
6
|
-
import {
|
|
6
|
+
import { SettingsAction, LayoutAction, createIntent, Capabilities } from '@dxos/app-framework';
|
|
7
7
|
import { HELP_PLUGIN } from '@dxos/plugin-help';
|
|
8
8
|
import { COMMANDS_DIALOG } from '@dxos/plugin-navtree';
|
|
9
9
|
import { safeParseJson } from '@dxos/util';
|
|
@@ -23,9 +23,11 @@ const loadSocketSupplyModules = async () => {
|
|
|
23
23
|
const app = await import(/* @vite-ignore */ module);
|
|
24
24
|
const windowModule = 'socket:window';
|
|
25
25
|
const socketWindow = await import(/* @vite-ignore */ windowModule);
|
|
26
|
+
const osModule = 'socket:os';
|
|
27
|
+
const socketOs = await import(/* @vite-ignore */ osModule);
|
|
26
28
|
const { meta_title: appName } = app.config;
|
|
27
29
|
|
|
28
|
-
return { app, socketWindow, appName };
|
|
30
|
+
return { app, socketWindow, socketOs, appName };
|
|
29
31
|
};
|
|
30
32
|
|
|
31
33
|
const configureDesktopWindowSizing = async (app: any) => {
|
|
@@ -84,10 +86,12 @@ const setupMenuItemListener = (dispatch: any, app: any) => {
|
|
|
84
86
|
switch (id) {
|
|
85
87
|
case 'App Name:Search commands': {
|
|
86
88
|
void dispatch(
|
|
87
|
-
createIntent(LayoutAction.
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
89
|
+
createIntent(LayoutAction.UpdateDialog, {
|
|
90
|
+
part: 'dialog',
|
|
91
|
+
subject: COMMANDS_DIALOG,
|
|
92
|
+
options: {
|
|
93
|
+
blockAlign: 'start',
|
|
94
|
+
},
|
|
91
95
|
}),
|
|
92
96
|
);
|
|
93
97
|
break;
|
|
@@ -98,9 +102,12 @@ const setupMenuItemListener = (dispatch: any, app: any) => {
|
|
|
98
102
|
}
|
|
99
103
|
case 'App Name:Show shortcuts': {
|
|
100
104
|
void dispatch(
|
|
101
|
-
createIntent(LayoutAction.
|
|
102
|
-
|
|
103
|
-
|
|
105
|
+
createIntent(LayoutAction.UpdateDialog, {
|
|
106
|
+
part: 'dialog',
|
|
107
|
+
subject: `${HELP_PLUGIN}/Shortcuts`,
|
|
108
|
+
options: {
|
|
109
|
+
blockAlign: 'center',
|
|
110
|
+
},
|
|
104
111
|
}),
|
|
105
112
|
);
|
|
106
113
|
break;
|
|
@@ -126,13 +133,8 @@ const setupApplicationUrlListener = (app: any, dispatch: any) => {
|
|
|
126
133
|
// Currently, the dialogs are controlled by Client Plugin and not the Layout Plugin.
|
|
127
134
|
window.location.href = location;
|
|
128
135
|
} else {
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
NavigationAction.Open,
|
|
132
|
-
// TODO(thure): what is `location` and is this right?
|
|
133
|
-
{ activeParts: { main: [location] } },
|
|
134
|
-
),
|
|
135
|
-
);
|
|
136
|
+
// TODO(thure): What is `location` and is this right?
|
|
137
|
+
void dispatch(createIntent(LayoutAction.Open, { part: 'main', subject: [location] }));
|
|
136
138
|
}
|
|
137
139
|
});
|
|
138
140
|
};
|
|
@@ -144,20 +146,26 @@ const setupGlobalHotkey = async (socketWindow: any, appWindow: any, dispatch: an
|
|
|
144
146
|
binding.addEventListener('hotkey', () => {
|
|
145
147
|
appWindow.restore();
|
|
146
148
|
void dispatch(
|
|
147
|
-
createIntent(LayoutAction.
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
149
|
+
createIntent(LayoutAction.UpdateDialog, {
|
|
150
|
+
part: 'dialog',
|
|
151
|
+
subject: COMMANDS_DIALOG,
|
|
152
|
+
options: {
|
|
153
|
+
blockAlign: 'start',
|
|
154
|
+
},
|
|
151
155
|
}),
|
|
152
156
|
);
|
|
153
157
|
});
|
|
154
158
|
};
|
|
155
159
|
|
|
156
160
|
export const initializeNativeApp = async (context: PluginsContext) => {
|
|
157
|
-
const { app, socketWindow, appName } = await loadSocketSupplyModules();
|
|
161
|
+
const { app, socketWindow, socketOs, appName } = await loadSocketSupplyModules();
|
|
158
162
|
const { dispatchPromise: dispatch } = context.requestCapability(Capabilities.IntentDispatcher);
|
|
159
163
|
|
|
160
|
-
|
|
164
|
+
const platform = socketOs.platform();
|
|
165
|
+
|
|
166
|
+
document.body.setAttribute('data-platform', platform);
|
|
167
|
+
|
|
168
|
+
if (platform === 'darwin' || platform === 'win32') {
|
|
161
169
|
await configureDesktopWindowSizing(app);
|
|
162
170
|
await configureSystemMenu(app, appName);
|
|
163
171
|
setupMenuItemListener(dispatch, app);
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/initialize.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport type { PluginsContext } from '@dxos/app-framework';\nimport { NavigationAction, SettingsAction, LayoutAction, createIntent, Capabilities } from '@dxos/app-framework';\nimport { HELP_PLUGIN } from '@dxos/plugin-help';\nimport { COMMANDS_DIALOG } from '@dxos/plugin-navtree';\nimport { safeParseJson } from '@dxos/util';\n\n// TODO(burdon): Reconcile with other properties.\nconst KEY_WINDOW_SIZE = 'dxos.org/plugin/native/window-size';\n\n/**\n * Native code for socketsupply app.\n * https://www.npmjs.com/package/@socketsupply/socket\n * https://github.com/socketsupply/socket-examples\n */\n\nconst loadSocketSupplyModules = async () => {\n // SocketSupply implements the dynamic import.\n const module = 'socket:application';\n const app = await import(/* @vite-ignore */ module);\n const windowModule = 'socket:window';\n const socketWindow = await import(/* @vite-ignore */ windowModule);\n const { meta_title: appName } = app.config;\n\n return { app, socketWindow, appName };\n};\n\nconst configureDesktopWindowSizing = async (app: any) => {\n const { width, height } = safeParseJson<{ width?: number; height?: number }>(\n localStorage.getItem(KEY_WINDOW_SIZE),\n {},\n );\n\n if (width && height) {\n const appWindow = await app.getCurrentWindow();\n await appWindow.setSize({ width, height });\n }\n\n window.addEventListener('resize', async () => {\n const appWindow = await app.getCurrentWindow();\n const { width, height } = appWindow.getSize();\n localStorage.setItem(KEY_WINDOW_SIZE, JSON.stringify({ width, height }));\n });\n};\n\nconst configureSystemMenu = async (app: any, appName: string) => {\n const itemsMac = `\n Hide ${appName}: h + CommandOrControl\n Hide Others: h + Control + Meta\n ---\n `;\n\n // TODO(mjamesderocher) Change menu names to use translations\n const menu = `\n App Name:\n About ${appName}: _\n Settings...: , + CommandOrControl\n ---\n Show shortcuts: / + CommandOrControl\n Search commands: k + CommandOrControl\n ---\n ${itemsMac}\n Quit: q + CommandOrControl\n ;\n\n Edit:\n Cut: x + CommandOrControl\n Copy: c + CommandOrControl\n Paste: v + CommandOrControl\n Delete: _\n Select All: a + CommandOrControl\n ;\n `;\n\n void app.setSystemMenu({ index: 0, value: menu });\n};\n\nconst setupMenuItemListener = (dispatch: any, app: any) => {\n window.addEventListener('menuItemSelected', async (event: any) => {\n const id = `${event.detail.parent}:${event.detail.title}`;\n switch (id) {\n case 'App Name:Search commands': {\n void dispatch(\n createIntent(LayoutAction.SetLayout, {\n element: 'dialog',\n component: COMMANDS_DIALOG,\n dialogBlockAlign: 'start',\n }),\n );\n break;\n }\n case 'App Name:Settings...': {\n void dispatch(createIntent(SettingsAction.Open));\n break;\n }\n case 'App Name:Show shortcuts': {\n void dispatch(\n createIntent(LayoutAction.SetLayout, {\n element: 'dialog',\n component: `${HELP_PLUGIN}/Shortcuts`,\n }),\n );\n break;\n }\n case 'App Name:Quit': {\n await app.exit();\n break;\n }\n }\n });\n};\n\nconst setupApplicationUrlListener = (app: any, dispatch: any) => {\n const appWindow = app.getCurrentWindow();\n\n // applicationurl is a custom event fired by the Socket Supply Runtime:\n // https://github.com/socketsupply/socket/blob/ef7fb5559876e41062d5896aafb7b79989fc96e5/api/internal/events.js#L6\n window.addEventListener('applicationurl', ({ url }: any) => {\n appWindow.restore();\n const location = url.toString().replace('composer://', '');\n if (location.includes('InvitationCode')) {\n // TODO(mjamesderocher): Integrate this with app routing.\n // Currently, the dialogs are controlled by Client Plugin and not the Layout Plugin.\n window.location.href = location;\n } else {\n void dispatch(\n createIntent(\n NavigationAction.Open,\n // TODO(thure): what is `location` and is this right?\n { activeParts: { main: [location] } },\n ),\n );\n }\n });\n};\n\nconst setupGlobalHotkey = async (socketWindow: any, appWindow: any, dispatch: any) => {\n const binding = await socketWindow.hotkey.bind('cmd + k');\n\n // Global hotkey listener\n binding.addEventListener('hotkey', () => {\n appWindow.restore();\n void dispatch(\n createIntent(LayoutAction.SetLayout, {\n element: 'dialog',\n component: COMMANDS_DIALOG,\n dialogBlockAlign: 'start',\n }),\n );\n });\n};\n\nexport const initializeNativeApp = async (context: PluginsContext) => {\n const { app, socketWindow, appName } = await loadSocketSupplyModules();\n const { dispatchPromise: dispatch } = context.requestCapability(Capabilities.IntentDispatcher);\n\n if (process.platform === 'darwin' || process.platform === 'win32') {\n await configureDesktopWindowSizing(app);\n await configureSystemMenu(app, appName);\n setupMenuItemListener(dispatch, app);\n setupApplicationUrlListener(app, dispatch);\n await setupGlobalHotkey(socketWindow, app, dispatch);\n }\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["NavigationAction", "SettingsAction", "LayoutAction", "createIntent", "Capabilities", "HELP_PLUGIN", "COMMANDS_DIALOG", "safeParseJson", "KEY_WINDOW_SIZE", "loadSocketSupplyModules", "module", "app", "windowModule", "socketWindow", "meta_title", "appName", "config", "configureDesktopWindowSizing", "width", "height", "safeParseJson", "localStorage", "getItem", "appWindow", "getCurrentWindow", "setSize", "window", "addEventListener", "getSize", "setItem", "JSON", "stringify", "configureSystemMenu", "itemsMac", "menu", "setSystemMenu", "index", "value", "setupMenuItemListener", "dispatch", "event", "id", "detail", "parent", "title", "createIntent", "LayoutAction", "SetLayout", "element", "component", "COMMANDS_DIALOG", "dialogBlockAlign", "SettingsAction", "Open", "HELP_PLUGIN", "exit", "setupApplicationUrlListener", "url", "restore", "location", "toString", "replace", "includes", "href", "NavigationAction", "activeParts", "main", "setupGlobalHotkey", "binding", "hotkey", "bind", "initializeNativeApp", "context", "dispatchPromise", "requestCapability", "Capabilities", "IntentDispatcher", "process", "platform"]
|
|
7
|
-
}
|