@dxos/plugin-debug 0.10.0 → 0.11.1
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/PLUGIN.mdl +12 -325
- package/README.md +4 -14
- package/dist/lib/DebugPlugin.mjs +29 -0
- package/dist/lib/DebugPlugin.mjs.map +1 -0
- package/dist/lib/DebugPlugin.node.mjs +10 -0
- package/dist/lib/DebugPlugin.node.mjs.map +1 -0
- package/dist/lib/DebugPlugin.workerd.mjs +8 -0
- package/dist/lib/DebugPlugin.workerd.mjs.map +1 -0
- package/dist/lib/capabilities.mjs +11 -0
- package/dist/lib/capabilities.mjs.map +1 -0
- package/dist/lib/chunk-DebugObjectPanel.mjs +58 -0
- package/dist/lib/chunk-DebugObjectPanel.mjs.map +1 -0
- package/dist/lib/chunk-DebugSettings.mjs +237 -0
- package/dist/lib/chunk-DebugSettings.mjs.map +1 -0
- package/dist/lib/chunk-DebugSpaceObjectsPanel.mjs +39 -0
- package/dist/lib/chunk-DebugSpaceObjectsPanel.mjs.map +1 -0
- package/dist/lib/chunk-DebugStatus.mjs +117 -0
- package/dist/lib/chunk-DebugStatus.mjs.map +1 -0
- package/dist/lib/chunk-LogStatus.mjs +44 -0
- package/dist/lib/chunk-LogStatus.mjs.map +1 -0
- package/dist/lib/chunk-SpaceGenerator.mjs +208 -0
- package/dist/lib/chunk-SpaceGenerator.mjs.map +1 -0
- package/dist/lib/chunk-StatsPanel.mjs +58 -0
- package/dist/lib/chunk-StatsPanel.mjs.map +1 -0
- package/dist/lib/chunk-Wireframe.mjs +60 -0
- package/dist/lib/chunk-Wireframe.mjs.map +1 -0
- package/dist/lib/chunk-app-graph-builder.mjs +76 -0
- package/dist/lib/chunk-app-graph-builder.mjs.map +1 -0
- package/dist/lib/chunk-log-recording.mjs +17 -0
- package/dist/lib/chunk-log-recording.mjs.map +1 -0
- package/dist/lib/chunk-meta.mjs +36 -0
- package/dist/lib/chunk-meta.mjs.map +1 -0
- package/dist/lib/chunk-react-surface.mjs +193 -0
- package/dist/lib/chunk-react-surface.mjs.map +1 -0
- package/dist/lib/chunk-settings.mjs +23 -0
- package/dist/lib/chunk-settings.mjs.map +1 -0
- package/dist/lib/chunk-stats-panel.mjs +56 -0
- package/dist/lib/chunk-stats-panel.mjs.map +1 -0
- package/dist/lib/chunk-types.mjs +60 -0
- package/dist/lib/chunk-types.mjs.map +1 -0
- package/dist/lib/components.mjs +763 -0
- package/dist/lib/components.mjs.map +1 -0
- package/dist/lib/containers.mjs +14 -0
- package/dist/lib/containers.mjs.map +1 -0
- package/dist/lib/index.mjs +3 -0
- package/dist/lib/meta.mjs +2 -0
- package/dist/lib/plugin.mjs +8 -0
- package/dist/lib/plugin.mjs.map +1 -0
- package/dist/lib/translations.mjs +38 -0
- package/dist/lib/translations.mjs.map +1 -0
- package/dist/lib/types.mjs +2 -0
- package/dist/types/src/DebugPlugin.d.ts.map +1 -1
- package/dist/types/src/capabilities/DebugSurfaces.d.ts +25 -0
- package/dist/types/src/capabilities/DebugSurfaces.d.ts.map +1 -0
- package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -1
- package/dist/types/src/capabilities/index.d.ts +4 -1
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/log-recording.d.ts +10 -0
- package/dist/types/src/capabilities/log-recording.d.ts.map +1 -0
- package/dist/types/src/capabilities/react-surface.d.ts +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
- package/dist/types/src/capabilities/settings.d.ts +1 -1
- package/dist/types/src/capabilities/stats-panel.d.ts +16 -0
- package/dist/types/src/capabilities/stats-panel.d.ts.map +1 -0
- package/dist/types/src/components/SchemaTable/SchemaTable.d.ts +4 -3
- package/dist/types/src/components/SchemaTable/SchemaTable.d.ts.map +1 -1
- package/dist/types/src/components/SpaceGenerator/ObjectGenerator.d.ts.map +1 -1
- package/dist/types/src/containers/DebugObjectPanel/DebugObjectPanel.d.ts +4 -1
- package/dist/types/src/containers/DebugObjectPanel/DebugObjectPanel.d.ts.map +1 -1
- package/dist/types/src/containers/DebugSettings/DebugSettings.d.ts +4 -1
- package/dist/types/src/containers/DebugSettings/DebugSettings.d.ts.map +1 -1
- package/dist/types/src/containers/DebugSettings/DebugSettings.stories.d.ts +30 -58
- package/dist/types/src/containers/DebugSettings/DebugSettings.stories.d.ts.map +1 -1
- package/dist/types/src/containers/DebugSpaceObjectsPanel/DebugSpaceObjectsPanel.d.ts +4 -1
- package/dist/types/src/containers/DebugSpaceObjectsPanel/DebugSpaceObjectsPanel.d.ts.map +1 -1
- package/dist/types/src/containers/DebugStatus/DebugStatus.d.ts +4 -1
- package/dist/types/src/containers/DebugStatus/DebugStatus.d.ts.map +1 -1
- package/dist/types/src/containers/LogStatus/LogStatus.d.ts +6 -0
- package/dist/types/src/containers/LogStatus/LogStatus.d.ts.map +1 -0
- package/dist/types/src/containers/LogStatus/index.d.ts +2 -0
- package/dist/types/src/containers/LogStatus/index.d.ts.map +1 -0
- package/dist/types/src/containers/SpaceGenerator/SpaceGenerator.d.ts +1 -1
- package/dist/types/src/containers/SpaceGenerator/SpaceGenerator.d.ts.map +1 -1
- package/dist/types/src/containers/StatsPanel/StatsPanel.d.ts +6 -0
- package/dist/types/src/containers/StatsPanel/StatsPanel.d.ts.map +1 -0
- package/dist/types/src/containers/StatsPanel/index.d.ts +2 -0
- package/dist/types/src/containers/StatsPanel/index.d.ts.map +1 -0
- package/dist/types/src/containers/Wireframe/Wireframe.d.ts +4 -1
- package/dist/types/src/containers/Wireframe/Wireframe.d.ts.map +1 -1
- package/dist/types/src/containers/index.d.ts +4 -6
- package/dist/types/src/containers/index.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +26 -57
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/DebugNodes.d.ts +7 -0
- package/dist/types/src/types/DebugNodes.d.ts.map +1 -0
- package/dist/types/src/types/DebugSurface.d.ts +8 -0
- package/dist/types/src/types/DebugSurface.d.ts.map +1 -0
- package/dist/types/src/types/debug.d.ts +3 -1
- package/dist/types/src/types/debug.d.ts.map +1 -1
- package/dist/types/src/types/index.d.ts +2 -2
- package/dist/types/src/types/index.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/dx.config.ts +8 -13
- package/package.json +61 -63
- package/src/DebugPlugin.node.ts +1 -1
- package/src/DebugPlugin.tsx +10 -27
- package/src/DebugPlugin.workerd.ts +1 -1
- package/src/capabilities/DebugSurfaces.tsx +146 -0
- package/src/capabilities/app-graph-builder.ts +39 -373
- package/src/capabilities/index.ts +3 -2
- package/src/capabilities/log-recording.ts +20 -0
- package/src/capabilities/react-surface.ts +123 -0
- package/src/capabilities/stats-panel.ts +74 -0
- package/src/components/SchemaTable/SchemaTable.tsx +6 -5
- package/src/components/SpaceGenerator/ObjectGenerator.tsx +9 -3
- package/src/components/SpaceGenerator/presets.ts +2 -2
- package/src/components/index.ts +1 -1
- package/src/containers/DebugObjectPanel/DebugObjectPanel.tsx +20 -20
- package/src/containers/DebugSettings/DebugSettings.tsx +4 -3
- package/src/containers/DebugSpaceObjectsPanel/DebugSpaceObjectsPanel.tsx +4 -2
- package/src/containers/DebugStatus/DebugStatus.tsx +2 -0
- package/src/containers/LogStatus/LogStatus.tsx +51 -0
- package/src/containers/LogStatus/index.ts +5 -0
- package/src/containers/SpaceGenerator/SpaceGenerator.tsx +108 -10
- package/src/containers/StatsPanel/StatsPanel.tsx +74 -0
- package/src/containers/StatsPanel/index.ts +5 -0
- package/src/containers/Wireframe/Wireframe.tsx +2 -0
- package/src/containers/index.ts +9 -7
- package/src/index.ts +1 -1
- package/src/meta.ts +1 -1
- package/src/plugin.ts +1 -1
- package/src/translations.ts +8 -52
- package/src/types/DebugNodes.ts +18 -0
- package/src/types/DebugSurface.ts +16 -0
- package/src/types/debug.ts +3 -1
- package/src/types/index.ts +3 -3
- package/dist/lib/neutral/DebugGraph-G4FWS57E.mjs +0 -15
- package/dist/lib/neutral/DebugGraph-G4FWS57E.mjs.map +0 -7
- package/dist/lib/neutral/DebugObjectPanel-QSGQJ3LM.mjs +0 -61
- package/dist/lib/neutral/DebugObjectPanel-QSGQJ3LM.mjs.map +0 -7
- package/dist/lib/neutral/DebugPlugin.mjs +0 -59
- package/dist/lib/neutral/DebugPlugin.mjs.map +0 -7
- package/dist/lib/neutral/DebugPlugin.node.mjs +0 -18
- package/dist/lib/neutral/DebugPlugin.node.mjs.map +0 -7
- package/dist/lib/neutral/DebugPlugin.workerd.mjs +0 -12
- package/dist/lib/neutral/DebugPlugin.workerd.mjs.map +0 -7
- package/dist/lib/neutral/DebugSettings-Q3WUL6YQ.mjs +0 -229
- package/dist/lib/neutral/DebugSettings-Q3WUL6YQ.mjs.map +0 -7
- package/dist/lib/neutral/DebugSpaceObjectsPanel-AXFZWEIM.mjs +0 -36
- package/dist/lib/neutral/DebugSpaceObjectsPanel-AXFZWEIM.mjs.map +0 -7
- package/dist/lib/neutral/DebugStatus-H2BAHN26.mjs +0 -122
- package/dist/lib/neutral/DebugStatus-H2BAHN26.mjs.map +0 -7
- package/dist/lib/neutral/DevtoolsOverviewContainer-DWQHTK7D.mjs +0 -24
- package/dist/lib/neutral/DevtoolsOverviewContainer-DWQHTK7D.mjs.map +0 -7
- package/dist/lib/neutral/GithubPanel-4CSJRVKE.mjs +0 -177
- package/dist/lib/neutral/GithubPanel-4CSJRVKE.mjs.map +0 -7
- package/dist/lib/neutral/RegistryPanel-64GIYJHN.mjs +0 -161
- package/dist/lib/neutral/RegistryPanel-64GIYJHN.mjs.map +0 -7
- package/dist/lib/neutral/SpaceGenerator-Y35G6DRV.mjs +0 -146
- package/dist/lib/neutral/SpaceGenerator-Y35G6DRV.mjs.map +0 -7
- package/dist/lib/neutral/Wireframe-WD7S2AUU.mjs +0 -52
- package/dist/lib/neutral/Wireframe-WD7S2AUU.mjs.map +0 -7
- package/dist/lib/neutral/app-graph-builder-UKG4WVYK.mjs +0 -619
- package/dist/lib/neutral/app-graph-builder-UKG4WVYK.mjs.map +0 -7
- package/dist/lib/neutral/capabilities/index.mjs +0 -15
- package/dist/lib/neutral/capabilities/index.mjs.map +0 -7
- package/dist/lib/neutral/chunk-72QXLYMI.mjs +0 -118
- package/dist/lib/neutral/chunk-72QXLYMI.mjs.map +0 -7
- package/dist/lib/neutral/chunk-J5LGTIGS.mjs +0 -10
- package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +0 -7
- package/dist/lib/neutral/chunk-R5C4CKOF.mjs +0 -54
- package/dist/lib/neutral/chunk-R5C4CKOF.mjs.map +0 -7
- package/dist/lib/neutral/components/index.mjs +0 -961
- package/dist/lib/neutral/components/index.mjs.map +0 -7
- package/dist/lib/neutral/containers/index.mjs +0 -27
- package/dist/lib/neutral/containers/index.mjs.map +0 -7
- package/dist/lib/neutral/index.mjs +0 -20
- package/dist/lib/neutral/index.mjs.map +0 -7
- package/dist/lib/neutral/meta.json +0 -1
- package/dist/lib/neutral/meta.mjs +0 -8
- package/dist/lib/neutral/meta.mjs.map +0 -7
- package/dist/lib/neutral/plugin.mjs +0 -12
- package/dist/lib/neutral/plugin.mjs.map +0 -7
- package/dist/lib/neutral/react-context-UJURDOO6.mjs +0 -17
- package/dist/lib/neutral/react-context-UJURDOO6.mjs.map +0 -7
- package/dist/lib/neutral/react-surface-URESE7J4.mjs +0 -484
- package/dist/lib/neutral/react-surface-URESE7J4.mjs.map +0 -7
- package/dist/lib/neutral/settings-5I2674B6.mjs +0 -28
- package/dist/lib/neutral/settings-5I2674B6.mjs.map +0 -7
- package/dist/lib/neutral/translations.mjs +0 -91
- package/dist/lib/neutral/translations.mjs.map +0 -7
- package/dist/lib/neutral/types/index.mjs +0 -16
- package/dist/lib/neutral/types/index.mjs.map +0 -7
- package/dist/types/src/DebugPlugin.test.d.ts +0 -2
- package/dist/types/src/DebugPlugin.test.d.ts.map +0 -1
- package/dist/types/src/capabilities/react-context.d.ts +0 -5
- package/dist/types/src/capabilities/react-context.d.ts.map +0 -1
- package/dist/types/src/containers/DebugGraph/DebugGraph.d.ts +0 -8
- package/dist/types/src/containers/DebugGraph/DebugGraph.d.ts.map +0 -1
- package/dist/types/src/containers/DebugGraph/index.d.ts +0 -2
- package/dist/types/src/containers/DebugGraph/index.d.ts.map +0 -1
- package/dist/types/src/containers/DevtoolsOverviewContainer/DevtoolsOverviewContainer.d.ts +0 -3
- package/dist/types/src/containers/DevtoolsOverviewContainer/DevtoolsOverviewContainer.d.ts.map +0 -1
- package/dist/types/src/containers/DevtoolsOverviewContainer/index.d.ts +0 -2
- package/dist/types/src/containers/DevtoolsOverviewContainer/index.d.ts.map +0 -1
- package/dist/types/src/containers/GithubPanel/GithubComponent.d.ts +0 -15
- package/dist/types/src/containers/GithubPanel/GithubComponent.d.ts.map +0 -1
- package/dist/types/src/containers/GithubPanel/GithubComponent.stories.d.ts +0 -106
- package/dist/types/src/containers/GithubPanel/GithubComponent.stories.d.ts.map +0 -1
- package/dist/types/src/containers/GithubPanel/GithubPanel.d.ts +0 -3
- package/dist/types/src/containers/GithubPanel/GithubPanel.d.ts.map +0 -1
- package/dist/types/src/containers/GithubPanel/index.d.ts +0 -2
- package/dist/types/src/containers/GithubPanel/index.d.ts.map +0 -1
- package/dist/types/src/containers/RegistryPanel/RegistryPanel.d.ts +0 -3
- package/dist/types/src/containers/RegistryPanel/RegistryPanel.d.ts.map +0 -1
- package/dist/types/src/containers/RegistryPanel/index.d.ts +0 -2
- package/dist/types/src/containers/RegistryPanel/index.d.ts.map +0 -1
- package/dist/types/src/types/Devtools.d.ts +0 -57
- package/dist/types/src/types/Devtools.d.ts.map +0 -1
- package/dist/types/src/types/surface.d.ts +0 -4
- package/dist/types/src/types/surface.d.ts.map +0 -1
- package/src/DebugPlugin.test.ts +0 -29
- package/src/capabilities/react-context.tsx +0 -25
- package/src/capabilities/react-surface.tsx +0 -504
- package/src/containers/DebugGraph/DebugGraph.tsx +0 -14
- package/src/containers/DebugGraph/index.ts +0 -5
- package/src/containers/DevtoolsOverviewContainer/DevtoolsOverviewContainer.tsx +0 -27
- package/src/containers/DevtoolsOverviewContainer/index.ts +0 -5
- package/src/containers/GithubPanel/GithubComponent.stories.tsx +0 -38
- package/src/containers/GithubPanel/GithubComponent.tsx +0 -192
- package/src/containers/GithubPanel/GithubPanel.tsx +0 -17
- package/src/containers/GithubPanel/index.ts +0 -5
- package/src/containers/RegistryPanel/RegistryPanel.tsx +0 -150
- package/src/containers/RegistryPanel/index.ts +0 -5
- package/src/types/Devtools.ts +0 -73
- package/src/types/surface.ts +0 -10
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import { setDeep } from "@dxos/util";
|
|
2
|
+
import { useCallback, useEffect, useMemo, useState } from "react";
|
|
3
|
+
import { meta } from "#meta";
|
|
4
|
+
import { AppSpace } from "@dxos/app-toolkit";
|
|
5
|
+
import { IconButton, Input, Select, Toast, useFileDownload, useTranslation } from "@dxos/react-ui";
|
|
6
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
|
+
import { Settings } from "#types";
|
|
8
|
+
import { useClient } from "@dxos/react-client";
|
|
9
|
+
import { SaveConfig, Storage, defs } from "@dxos/config";
|
|
10
|
+
import { log } from "@dxos/log";
|
|
11
|
+
import { MANUAL_LOG_EXPORT_MAX_BYTES } from "@dxos/log-store-idb";
|
|
12
|
+
import { Form } from "@dxos/react-ui-form";
|
|
13
|
+
import { TRACE_ALL_KEY } from "@dxos/tracing";
|
|
14
|
+
//#region src/containers/DebugSettings/DebugSettings.tsx
|
|
15
|
+
var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-debug/src/containers/DebugSettings/DebugSettings.tsx";
|
|
16
|
+
var StorageAdapters = {
|
|
17
|
+
opfs: defs.Runtime.Client.Storage.StorageDriver.WEBFS,
|
|
18
|
+
idb: defs.Runtime.Client.Storage.StorageDriver.IDB
|
|
19
|
+
};
|
|
20
|
+
var DebugSettings = ({ settings, onSettingsChange, logStore, onUpload }) => {
|
|
21
|
+
const { t } = useTranslation(meta.profile.key);
|
|
22
|
+
const [toast, setToast] = useState();
|
|
23
|
+
const download = useFileDownload();
|
|
24
|
+
const [storageConfig, setStorageConfig] = useState({});
|
|
25
|
+
const client = useClient();
|
|
26
|
+
useEffect(() => {
|
|
27
|
+
Storage().then((config) => setStorageConfig(config));
|
|
28
|
+
}, []);
|
|
29
|
+
const handleToast = useCallback((toast) => {
|
|
30
|
+
setToast(toast);
|
|
31
|
+
const timer = setTimeout(() => setToast(void 0), 5e3);
|
|
32
|
+
return () => clearTimeout(timer);
|
|
33
|
+
}, [setToast]);
|
|
34
|
+
const handleDownload = useCallback(async () => {
|
|
35
|
+
const data = await client.diagnostics();
|
|
36
|
+
const file = new Blob([JSON.stringify(data, void 0, 2)], { type: "text/plain" });
|
|
37
|
+
const fileName = `composer-${(/* @__PURE__ */ new Date()).toISOString().replace(/\W/g, "-")}.json`;
|
|
38
|
+
download(file, fileName);
|
|
39
|
+
if (onUpload) {
|
|
40
|
+
const personalSpace = AppSpace.getPersonalSpace(client);
|
|
41
|
+
if (!personalSpace) {
|
|
42
|
+
log.error("no personal space available for upload", void 0, {
|
|
43
|
+
"~LogMeta": "~LogMeta",
|
|
44
|
+
F: __dxlog_file,
|
|
45
|
+
L: 70,
|
|
46
|
+
S: void 0
|
|
47
|
+
});
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const info = await onUpload(personalSpace.db, new File([file], fileName));
|
|
51
|
+
if (!info) {
|
|
52
|
+
log.error("diagnostics failed to upload to IPFS", void 0, {
|
|
53
|
+
"~LogMeta": "~LogMeta",
|
|
54
|
+
F: __dxlog_file,
|
|
55
|
+
L: 75,
|
|
56
|
+
S: void 0
|
|
57
|
+
});
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
handleToast({
|
|
61
|
+
title: t("settings.uploaded.message"),
|
|
62
|
+
description: t("settings.uploaded.description")
|
|
63
|
+
});
|
|
64
|
+
const url = client.config.values.runtime.services.ipfs.gateway + "/" + info.cid;
|
|
65
|
+
navigator.clipboard.writeText(url);
|
|
66
|
+
handleToast({
|
|
67
|
+
title: t("settings.uploaded.message"),
|
|
68
|
+
description: t("settings.uploaded.description")
|
|
69
|
+
});
|
|
70
|
+
log.info("diagnostics", { url }, {
|
|
71
|
+
"~LogMeta": "~LogMeta",
|
|
72
|
+
F: __dxlog_file,
|
|
73
|
+
L: 90,
|
|
74
|
+
S: void 0
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}, [
|
|
78
|
+
client,
|
|
79
|
+
download,
|
|
80
|
+
handleToast,
|
|
81
|
+
onUpload,
|
|
82
|
+
t
|
|
83
|
+
]);
|
|
84
|
+
const handleDownloadLogs = useCallback(async () => {
|
|
85
|
+
const file = await logStore.exportBlob({ maxSize: MANUAL_LOG_EXPORT_MAX_BYTES });
|
|
86
|
+
const fileName = `composer-logs-${(/* @__PURE__ */ new Date()).toISOString().slice(0, 19).replace(/:/g, "-")}.ndjson`;
|
|
87
|
+
download(file, fileName);
|
|
88
|
+
}, [download, logStore]);
|
|
89
|
+
const handleRepair = useCallback(async () => {
|
|
90
|
+
try {
|
|
91
|
+
const info = await client.repair();
|
|
92
|
+
setStorageConfig(await Storage());
|
|
93
|
+
handleToast({
|
|
94
|
+
title: t("settings.repair-success.message"),
|
|
95
|
+
description: JSON.stringify(info, void 0, 2)
|
|
96
|
+
});
|
|
97
|
+
} catch (err) {
|
|
98
|
+
handleToast({
|
|
99
|
+
title: t("settings.repair-failed.message"),
|
|
100
|
+
description: err.message
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
}, [
|
|
104
|
+
client,
|
|
105
|
+
handleToast,
|
|
106
|
+
t
|
|
107
|
+
]);
|
|
108
|
+
const handleWireframeChange = useCallback((checked) => onSettingsChange?.((s) => ({
|
|
109
|
+
...s,
|
|
110
|
+
wireframe: !!checked
|
|
111
|
+
})), [onSettingsChange]);
|
|
112
|
+
const traceAll = useMemo(() => settings.traceAll ?? (typeof localStorage !== "undefined" && localStorage.getItem(TRACE_ALL_KEY) === "true"), [settings.traceAll]);
|
|
113
|
+
const handleTraceAllChange = useCallback((checked) => {
|
|
114
|
+
const value = !!checked;
|
|
115
|
+
localStorage.setItem(TRACE_ALL_KEY, String(value));
|
|
116
|
+
onSettingsChange?.((s) => ({
|
|
117
|
+
...s,
|
|
118
|
+
traceAll: value
|
|
119
|
+
}));
|
|
120
|
+
}, [onSettingsChange]);
|
|
121
|
+
const handleOpenTracingPanel = useCallback(() => {
|
|
122
|
+
window.open("about:blank", "_blank");
|
|
123
|
+
}, []);
|
|
124
|
+
const handleStorageAdapterChange = useCallback((value) => {
|
|
125
|
+
if (confirm(t("settings.storage-adapter.changed-alert.message"))) updateConfig(storageConfig, setStorageConfig, [
|
|
126
|
+
"runtime",
|
|
127
|
+
"client",
|
|
128
|
+
"storage",
|
|
129
|
+
"dataStore"
|
|
130
|
+
], StorageAdapters[value]);
|
|
131
|
+
}, [storageConfig, t]);
|
|
132
|
+
return /* @__PURE__ */ jsx(Form.Root, {
|
|
133
|
+
schema: Settings.Settings,
|
|
134
|
+
values: settings,
|
|
135
|
+
variant: "settings",
|
|
136
|
+
readonly: !onSettingsChange,
|
|
137
|
+
children: /* @__PURE__ */ jsx(Form.Viewport, {
|
|
138
|
+
scroll: true,
|
|
139
|
+
children: /* @__PURE__ */ jsx(Form.Content, { children: /* @__PURE__ */ jsxs(Form.Section, {
|
|
140
|
+
title: meta.profile.name ?? meta.profile.key,
|
|
141
|
+
children: [
|
|
142
|
+
/* @__PURE__ */ jsx(Form.Row, {
|
|
143
|
+
label: t("settings.wireframe.label"),
|
|
144
|
+
description: t("settings.wireframe.description"),
|
|
145
|
+
children: /* @__PURE__ */ jsx(Input.Root, { children: /* @__PURE__ */ jsx(Input.Switch, {
|
|
146
|
+
disabled: !onSettingsChange,
|
|
147
|
+
checked: settings.wireframe,
|
|
148
|
+
onCheckedChange: handleWireframeChange
|
|
149
|
+
}) })
|
|
150
|
+
}),
|
|
151
|
+
/* @__PURE__ */ jsx(Form.Row, {
|
|
152
|
+
label: t("settings.trace-all.label"),
|
|
153
|
+
description: t("settings.trace-all.description"),
|
|
154
|
+
children: /* @__PURE__ */ jsx(Input.Root, { children: /* @__PURE__ */ jsx(Input.Switch, {
|
|
155
|
+
disabled: !onSettingsChange,
|
|
156
|
+
checked: traceAll,
|
|
157
|
+
onCheckedChange: handleTraceAllChange
|
|
158
|
+
}) })
|
|
159
|
+
}),
|
|
160
|
+
/* @__PURE__ */ jsx(Form.Row, {
|
|
161
|
+
label: t("settings.tracing-panel.label"),
|
|
162
|
+
description: t("settings.tracing-panel.description"),
|
|
163
|
+
children: /* @__PURE__ */ jsx(IconButton, {
|
|
164
|
+
icon: "ph--arrow-square-out--regular",
|
|
165
|
+
iconOnly: true,
|
|
166
|
+
label: t("settings.tracing-panel.label"),
|
|
167
|
+
onClick: handleOpenTracingPanel
|
|
168
|
+
})
|
|
169
|
+
}),
|
|
170
|
+
/* @__PURE__ */ jsx(Form.Row, {
|
|
171
|
+
label: t("settings.download-diagnostics.label"),
|
|
172
|
+
description: t("settings.download-diagnostics.description"),
|
|
173
|
+
children: /* @__PURE__ */ jsx(IconButton, {
|
|
174
|
+
icon: "ph--download-simple--regular",
|
|
175
|
+
iconOnly: true,
|
|
176
|
+
label: t("settings.download-diagnostics.label"),
|
|
177
|
+
onClick: handleDownload
|
|
178
|
+
})
|
|
179
|
+
}),
|
|
180
|
+
/* @__PURE__ */ jsx(Form.Row, {
|
|
181
|
+
label: t("settings.download-logs.label"),
|
|
182
|
+
description: t("settings.download-logs.description"),
|
|
183
|
+
children: /* @__PURE__ */ jsx(IconButton, {
|
|
184
|
+
icon: "ph--download-simple--regular",
|
|
185
|
+
iconOnly: true,
|
|
186
|
+
label: t("settings.download-logs.label"),
|
|
187
|
+
onClick: handleDownloadLogs
|
|
188
|
+
})
|
|
189
|
+
}),
|
|
190
|
+
/* @__PURE__ */ jsx(Form.Row, {
|
|
191
|
+
label: t("settings.repair.label"),
|
|
192
|
+
description: t("settings.repair.description"),
|
|
193
|
+
children: /* @__PURE__ */ jsx(IconButton, {
|
|
194
|
+
icon: "ph--first-aid-kit--regular",
|
|
195
|
+
iconOnly: true,
|
|
196
|
+
label: t("settings.repair.label"),
|
|
197
|
+
onClick: handleRepair
|
|
198
|
+
})
|
|
199
|
+
}),
|
|
200
|
+
toast && /* @__PURE__ */ jsxs(Toast.Root, { children: [/* @__PURE__ */ jsx(Toast.Title, {
|
|
201
|
+
icon: "ph--gift--duotone",
|
|
202
|
+
children: /* @__PURE__ */ jsx("span", { children: toast.title })
|
|
203
|
+
}), toast.description && /* @__PURE__ */ jsx(Toast.Description, { children: toast.description })] }),
|
|
204
|
+
/* @__PURE__ */ jsx(Form.Row, {
|
|
205
|
+
label: t("settings.choose-storage-adaptor.label"),
|
|
206
|
+
description: t("settings.choose-storage-adaptor.description"),
|
|
207
|
+
children: /* @__PURE__ */ jsxs(Select.Root, {
|
|
208
|
+
disabled: !onSettingsChange,
|
|
209
|
+
value: Object.entries(StorageAdapters).find(([_name, value]) => value === storageConfig?.runtime?.client?.storage?.dataStore)?.[0],
|
|
210
|
+
onValueChange: handleStorageAdapterChange,
|
|
211
|
+
children: [/* @__PURE__ */ jsx(Select.TriggerButton, {
|
|
212
|
+
disabled: !onSettingsChange,
|
|
213
|
+
placeholder: t("settings.data-store.label")
|
|
214
|
+
}), /* @__PURE__ */ jsx(Select.Portal, { children: /* @__PURE__ */ jsxs(Select.Content, { children: [/* @__PURE__ */ jsx(Select.Viewport, { children: Object.keys(StorageAdapters).map((key) => /* @__PURE__ */ jsx(Select.Option, {
|
|
215
|
+
value: key,
|
|
216
|
+
children: t(`settings.storage-adaptor.${key}.label`)
|
|
217
|
+
}, key)) }), /* @__PURE__ */ jsx(Select.Arrow, {})] }) })]
|
|
218
|
+
})
|
|
219
|
+
})
|
|
220
|
+
]
|
|
221
|
+
}) })
|
|
222
|
+
})
|
|
223
|
+
});
|
|
224
|
+
};
|
|
225
|
+
var updateConfig = (config, setConfig, path, value) => {
|
|
226
|
+
const storageConfigCopy = JSON.parse(JSON.stringify(config ?? {}));
|
|
227
|
+
setDeep(storageConfigCopy, path, value);
|
|
228
|
+
setConfig(storageConfigCopy);
|
|
229
|
+
queueMicrotask(async () => {
|
|
230
|
+
await SaveConfig(storageConfigCopy);
|
|
231
|
+
});
|
|
232
|
+
};
|
|
233
|
+
DebugSettings.displayName = "DebugSettings";
|
|
234
|
+
//#endregion
|
|
235
|
+
export { DebugSettings as default };
|
|
236
|
+
|
|
237
|
+
//# sourceMappingURL=chunk-DebugSettings.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-DebugSettings.mjs","names":[],"sources":["../../src/containers/DebugSettings/DebugSettings.tsx"],"sourcesContent":["//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { AppCapabilities, AppSpace } from '@dxos/app-toolkit';\nimport { type AppSurface } from '@dxos/app-toolkit/ui';\nimport { type ConfigProto, SaveConfig, Storage, defs } from '@dxos/config';\nimport { log } from '@dxos/log';\nimport { type IdbLogStore, MANUAL_LOG_EXPORT_MAX_BYTES } from '@dxos/log-store-idb';\nimport { useClient } from '@dxos/react-client';\nimport { IconButton, Input, Select, Toast, useFileDownload, useTranslation } from '@dxos/react-ui';\nimport { Form } from '@dxos/react-ui-form';\nimport { TRACE_ALL_KEY } from '@dxos/tracing';\nimport { setDeep } from '@dxos/util';\n\nimport { meta } from '#meta';\nimport { Settings } from '#types';\n\ntype Toast = {\n title: string;\n description?: string;\n};\n\nconst StorageAdapters = {\n opfs: defs.Runtime.Client.Storage.StorageDriver.WEBFS,\n idb: defs.Runtime.Client.Storage.StorageDriver.IDB,\n} as const;\n\nexport type DebugSettingsProps = AppSurface.SettingsProps<\n Settings.Settings,\n {\n logStore: IdbLogStore;\n onUpload?: AppCapabilities.FileUploader;\n }\n>;\n\nexport const DebugSettings = ({ settings, onSettingsChange, logStore, onUpload }: DebugSettingsProps) => {\n const { t } = useTranslation(meta.profile.key);\n const [toast, setToast] = useState<Toast>();\n const download = useFileDownload();\n const [storageConfig, setStorageConfig] = useState<ConfigProto>({});\n const client = useClient();\n\n useEffect(() => {\n void Storage().then((config) => setStorageConfig(config));\n }, []);\n\n const handleToast = useCallback(\n (toast: Toast) => {\n setToast(toast);\n const timer = setTimeout(() => setToast(undefined), 5_000);\n return () => clearTimeout(timer);\n },\n [setToast],\n );\n\n const handleDownload = useCallback(async () => {\n const data = await client.diagnostics();\n const file = new Blob([JSON.stringify(data, undefined, 2)], {\n type: 'text/plain',\n });\n const fileName = `composer-${new Date().toISOString().replace(/\\W/g, '-')}.json`;\n download(file, fileName);\n\n if (onUpload) {\n const personalSpace = AppSpace.getPersonalSpace(client);\n if (!personalSpace) {\n log.error('no personal space available for upload');\n return;\n }\n const info = await onUpload(personalSpace.db, new File([file], fileName));\n if (!info) {\n log.error('diagnostics failed to upload to IPFS');\n return;\n }\n handleToast({\n title: t('settings.uploaded.message'),\n description: t('settings.uploaded.description'),\n });\n\n // TODO(nf): move to IpfsPlugin?\n const url = client.config.values.runtime!.services!.ipfs!.gateway + '/' + info.cid;\n void navigator.clipboard.writeText(url);\n handleToast({\n title: t('settings.uploaded.message'),\n description: t('settings.uploaded.description'),\n });\n log.info('diagnostics', { url });\n }\n }, [client, download, handleToast, onUpload, t]);\n\n const handleDownloadLogs = useCallback(async () => {\n const file = await logStore.exportBlob({ maxSize: MANUAL_LOG_EXPORT_MAX_BYTES });\n const fileName = `composer-logs-${new Date().toISOString().slice(0, 19).replace(/:/g, '-')}.ndjson`;\n download(file, fileName);\n }, [download, logStore]);\n\n const handleRepair = useCallback(async () => {\n try {\n const info = await client.repair();\n setStorageConfig(await Storage());\n handleToast({\n title: t('settings.repair-success.message'),\n description: JSON.stringify(info, undefined, 2),\n });\n } catch (err: any) {\n handleToast({\n title: t('settings.repair-failed.message'),\n description: err.message,\n });\n }\n }, [client, handleToast, t]);\n\n const handleWireframeChange = useCallback(\n (checked: boolean) => onSettingsChange?.((s) => ({ ...s, wireframe: !!checked })),\n [onSettingsChange],\n );\n\n const traceAll = useMemo(\n () => settings.traceAll ?? (typeof localStorage !== 'undefined' && localStorage.getItem(TRACE_ALL_KEY) === 'true'),\n [settings.traceAll],\n );\n\n const handleTraceAllChange = useCallback(\n (checked: boolean) => {\n const value = !!checked;\n localStorage.setItem(TRACE_ALL_KEY, String(value));\n onSettingsChange?.((s) => ({ ...s, traceAll: value }));\n },\n [onSettingsChange],\n );\n\n const handleOpenTracingPanel = useCallback(() => {\n window.open('about:blank', '_blank');\n }, []);\n\n const handleStorageAdapterChange = useCallback(\n (value: string) => {\n if (confirm(t('settings.storage-adapter.changed-alert.message'))) {\n updateConfig(\n storageConfig,\n setStorageConfig,\n ['runtime', 'client', 'storage', 'dataStore'],\n StorageAdapters[value as keyof typeof StorageAdapters],\n );\n }\n },\n [storageConfig, t],\n );\n\n return (\n <Form.Root schema={Settings.Settings} values={settings} variant='settings' readonly={!onSettingsChange}>\n <Form.Viewport scroll>\n <Form.Content>\n <Form.Section title={meta.profile.name ?? meta.profile.key}>\n <Form.Row label={t('settings.wireframe.label')} description={t('settings.wireframe.description')}>\n <Input.Root>\n <Input.Switch\n disabled={!onSettingsChange}\n checked={settings.wireframe}\n onCheckedChange={handleWireframeChange}\n />\n </Input.Root>\n </Form.Row>\n <Form.Row label={t('settings.trace-all.label')} description={t('settings.trace-all.description')}>\n <Input.Root>\n <Input.Switch disabled={!onSettingsChange} checked={traceAll} onCheckedChange={handleTraceAllChange} />\n </Input.Root>\n </Form.Row>\n <Form.Row label={t('settings.tracing-panel.label')} description={t('settings.tracing-panel.description')}>\n <IconButton\n icon='ph--arrow-square-out--regular'\n iconOnly\n label={t('settings.tracing-panel.label')}\n onClick={handleOpenTracingPanel}\n />\n </Form.Row>\n <Form.Row\n label={t('settings.download-diagnostics.label')}\n description={t('settings.download-diagnostics.description')}\n >\n <IconButton\n icon='ph--download-simple--regular'\n iconOnly\n label={t('settings.download-diagnostics.label')}\n onClick={handleDownload}\n />\n </Form.Row>\n <Form.Row label={t('settings.download-logs.label')} description={t('settings.download-logs.description')}>\n <IconButton\n icon='ph--download-simple--regular'\n iconOnly\n label={t('settings.download-logs.label')}\n onClick={handleDownloadLogs}\n />\n </Form.Row>\n <Form.Row label={t('settings.repair.label')} description={t('settings.repair.description')}>\n <IconButton\n icon='ph--first-aid-kit--regular'\n iconOnly\n label={t('settings.repair.label')}\n onClick={handleRepair}\n />\n </Form.Row>\n\n {/* TODO(burdon): Move to layout? */}\n {toast && (\n <Toast.Root>\n <Toast.Title icon='ph--gift--duotone'>\n <span>{toast.title}</span>\n </Toast.Title>\n {toast.description && <Toast.Description>{toast.description}</Toast.Description>}\n </Toast.Root>\n )}\n\n <Form.Row\n label={t('settings.choose-storage-adaptor.label')}\n description={t('settings.choose-storage-adaptor.description')}\n >\n <Select.Root\n disabled={!onSettingsChange}\n value={\n Object.entries(StorageAdapters).find(\n ([_name, value]) => value === storageConfig?.runtime?.client?.storage?.dataStore,\n )?.[0]\n }\n onValueChange={handleStorageAdapterChange}\n >\n <Select.TriggerButton disabled={!onSettingsChange} placeholder={t('settings.data-store.label')} />\n <Select.Portal>\n <Select.Content>\n <Select.Viewport>\n {Object.keys(StorageAdapters).map((key) => (\n <Select.Option key={key} value={key}>\n {t(`settings.storage-adaptor.${key}.label`)}\n </Select.Option>\n ))}\n </Select.Viewport>\n <Select.Arrow />\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n </Form.Row>\n </Form.Section>\n </Form.Content>\n </Form.Viewport>\n </Form.Root>\n );\n};\n\nconst updateConfig = (config: ConfigProto, setConfig: (newConfig: ConfigProto) => void, path: string[], value: any) => {\n const storageConfigCopy = JSON.parse(JSON.stringify(config ?? {}));\n setDeep(storageConfigCopy, path, value);\n setConfig(storageConfigCopy);\n queueMicrotask(async () => {\n await SaveConfig(storageConfigCopy);\n });\n};\n\nDebugSettings.displayName = 'DebugSettings';\n"],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { useState } from "react";
|
|
2
|
+
import { Clipboard, Grid, Input, Panel, ScrollArea, Toolbar } from "@dxos/react-ui";
|
|
3
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
4
|
+
import { Filter, Query } from "@dxos/echo";
|
|
5
|
+
import { ObjectsTree } from "@dxos/devtools";
|
|
6
|
+
import { useQuery } from "@dxos/echo-react";
|
|
7
|
+
import { JsonHighlighter } from "@dxos/react-ui-syntax-highlighter";
|
|
8
|
+
//#region src/containers/DebugSpaceObjectsPanel/DebugSpaceObjectsPanel.tsx
|
|
9
|
+
var DebugSpaceObjectsPanel = ({ space, onOpen, canOpen }) => {
|
|
10
|
+
const [selectedId, setSelectedId] = useState(null);
|
|
11
|
+
const [selectedObject] = useQuery(space.db, selectedId ? Query.select(Filter.id(selectedId)) : Query.select(Filter.nothing()));
|
|
12
|
+
return /* @__PURE__ */ jsx(Clipboard.Provider, { children: /* @__PURE__ */ jsxs(Panel.Root, { children: [/* @__PURE__ */ jsx(Panel.Toolbar, {
|
|
13
|
+
asChild: true,
|
|
14
|
+
children: /* @__PURE__ */ jsx(Toolbar.Root, { children: /* @__PURE__ */ jsx(Input.Root, { children: /* @__PURE__ */ jsx(Input.TextInput, {
|
|
15
|
+
disabled: true,
|
|
16
|
+
placeholder: "Search..."
|
|
17
|
+
}) }) })
|
|
18
|
+
}), /* @__PURE__ */ jsx(Panel.Content, {
|
|
19
|
+
asChild: true,
|
|
20
|
+
children: /* @__PURE__ */ jsxs(Grid, {
|
|
21
|
+
rows: 2,
|
|
22
|
+
classNames: "divide-y divide-subdued-separator",
|
|
23
|
+
children: [/* @__PURE__ */ jsx(ScrollArea.Root, { children: /* @__PURE__ */ jsx(ScrollArea.Viewport, { children: /* @__PURE__ */ jsx(ObjectsTree, {
|
|
24
|
+
db: space.db,
|
|
25
|
+
onSelect: (entity) => setSelectedId(entity.id),
|
|
26
|
+
onOpen,
|
|
27
|
+
canOpen
|
|
28
|
+
}) }) }), selectedObject && /* @__PURE__ */ jsx(JsonHighlighter, {
|
|
29
|
+
classNames: "p-1",
|
|
30
|
+
data: selectedObject
|
|
31
|
+
})]
|
|
32
|
+
})
|
|
33
|
+
})] }) });
|
|
34
|
+
};
|
|
35
|
+
DebugSpaceObjectsPanel.displayName = "DebugSpaceObjectsPanel";
|
|
36
|
+
//#endregion
|
|
37
|
+
export { DebugSpaceObjectsPanel as default };
|
|
38
|
+
|
|
39
|
+
//# sourceMappingURL=chunk-DebugSpaceObjectsPanel.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-DebugSpaceObjectsPanel.mjs","names":[],"sources":["../../src/containers/DebugSpaceObjectsPanel/DebugSpaceObjectsPanel.tsx"],"sourcesContent":["//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useState } from 'react';\n\nimport { type AppSurface } from '@dxos/app-toolkit/ui';\nimport { ObjectsTree } from '@dxos/devtools';\nimport { type Entity, Filter, Obj, Query } from '@dxos/echo';\nimport { useQuery } from '@dxos/echo-react';\nimport { type EntityId } from '@dxos/keys';\nimport { Clipboard, Grid, Input, Panel, ScrollArea, Toolbar } from '@dxos/react-ui';\nimport { JsonHighlighter } from '@dxos/react-ui-syntax-highlighter';\n\nexport type DebugSpaceObjectsPanelProps = AppSurface.SpaceArticleProps & {\n onOpen?: (object: Obj.Unknown) => void;\n canOpen?: (entity: Entity.Snapshot) => boolean;\n};\n\nexport const DebugSpaceObjectsPanel = ({ space, onOpen, canOpen }: DebugSpaceObjectsPanelProps) => {\n const [selectedId, setSelectedId] = useState<EntityId | null>(null);\n const [selectedObject] = useQuery(\n space.db,\n selectedId ? Query.select(Filter.id(selectedId)) : Query.select(Filter.nothing()),\n );\n\n return (\n <Clipboard.Provider>\n <Panel.Root>\n <Panel.Toolbar asChild>\n <Toolbar.Root>\n <Input.Root>\n <Input.TextInput disabled placeholder='Search...' />\n </Input.Root>\n </Toolbar.Root>\n </Panel.Toolbar>\n <Panel.Content asChild>\n <Grid rows={2} classNames='divide-y divide-subdued-separator'>\n <ScrollArea.Root>\n <ScrollArea.Viewport>\n <ObjectsTree\n db={space.db}\n onSelect={(entity) => setSelectedId(entity.id)}\n onOpen={onOpen}\n canOpen={canOpen}\n />\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n {selectedObject && <JsonHighlighter classNames='p-1' data={selectedObject} />}\n </Grid>\n </Panel.Content>\n </Panel.Root>\n </Clipboard.Provider>\n );\n};\n\nDebugSpaceObjectsPanel.displayName = 'DebugSpaceObjectsPanel';\n"],"mappings":";;;;;;;;AAmBA,IAAa,0BAA0B,EAAE,OAAO,QAAQ,cAA2C;CACjG,MAAM,CAAC,YAAY,iBAAiB,SAA0B,IAAI;CAClE,MAAM,CAAC,kBAAkB,SACvB,MAAM,IACN,aAAa,MAAM,OAAO,OAAO,GAAG,UAAU,CAAC,IAAI,MAAM,OAAO,OAAO,QAAQ,CAAC,CAClF;CAEA,OACE,oBAAC,UAAU,UAAX,EAAA,UACE,qBAAC,MAAM,MAAP,EAAA,UAAA,CACE,oBAAC,MAAM,SAAP;EAAe,SAAA;YACb,oBAAC,QAAQ,MAAT,EAAA,UACE,oBAAC,MAAM,MAAP,EAAA,UACE,oBAAC,MAAM,WAAP;GAAiB,UAAA;GAAS,aAAY;EAAa,CAAA,EACzC,CAAA,EACA,CAAA;CACD,CAAA,GACf,oBAAC,MAAM,SAAP;EAAe,SAAA;YACb,qBAAC,MAAD;GAAM,MAAM;GAAG,YAAW;aAA1B,CACE,oBAAC,WAAW,MAAZ,EAAA,UACE,oBAAC,WAAW,UAAZ,EAAA,UACE,oBAAC,aAAD;IACE,IAAI,MAAM;IACV,WAAW,WAAW,cAAc,OAAO,EAAE;IACrC;IACC;GACV,CAAA,EACkB,CAAA,EACN,CAAA,GAChB,kBAAkB,oBAAC,iBAAD;IAAiB,YAAW;IAAM,MAAM;GAAiB,CAAA,CACxE;;CACO,CAAA,CACL,EAAA,CAAA,EACM,CAAA;AAExB;AAEA,uBAAuB,cAAc"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { useEffect, useRef, useState } from "react";
|
|
2
|
+
import { IconButton } from "@dxos/react-ui";
|
|
3
|
+
import { Fragment as Fragment$1, jsx } from "react/jsx-runtime";
|
|
4
|
+
import "@dxos/async";
|
|
5
|
+
import { StatusBar } from "@dxos/plugin-status-bar/components";
|
|
6
|
+
import { ConnectionState } from "@dxos/protocols/proto/dxos/client/services";
|
|
7
|
+
import { useNetworkStatus } from "@dxos/react-client/mesh";
|
|
8
|
+
//#region src/containers/DebugStatus/DebugStatus.tsx
|
|
9
|
+
var styles = {
|
|
10
|
+
success: "text-sky-300 dark:text-green-700",
|
|
11
|
+
warning: "text-orange-300 dark:text-orange-600",
|
|
12
|
+
error: "text-red-300 dark:text-red-600"
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Global error handler.
|
|
16
|
+
*/
|
|
17
|
+
var ErrorIndicator = () => {
|
|
18
|
+
const [, forceUpdate] = useState({});
|
|
19
|
+
const errorRef = useRef(null);
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
const errorListener = (event) => {
|
|
22
|
+
const error = event.error ?? event.reason;
|
|
23
|
+
if (errorRef.current !== error) {
|
|
24
|
+
errorRef.current = error;
|
|
25
|
+
forceUpdate({});
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
window.addEventListener("error", errorListener);
|
|
29
|
+
window.addEventListener("unhandledrejection", errorListener);
|
|
30
|
+
return () => {
|
|
31
|
+
window.removeEventListener("error", errorListener);
|
|
32
|
+
window.removeEventListener("unhandledrejection", errorListener);
|
|
33
|
+
};
|
|
34
|
+
}, []);
|
|
35
|
+
const handleReset = () => {
|
|
36
|
+
errorRef.current = null;
|
|
37
|
+
forceUpdate({});
|
|
38
|
+
};
|
|
39
|
+
if (errorRef.current) return /* @__PURE__ */ jsx(StatusBar.Item, { children: /* @__PURE__ */ jsx(IconButton, {
|
|
40
|
+
variant: "ghost",
|
|
41
|
+
icon: "ph--warning-circle--duotone",
|
|
42
|
+
iconOnly: true,
|
|
43
|
+
label: errorRef.current.message,
|
|
44
|
+
classNames: styles.error,
|
|
45
|
+
onClick: handleReset
|
|
46
|
+
}) });
|
|
47
|
+
else return /* @__PURE__ */ jsx(StatusBar.Item, { children: /* @__PURE__ */ jsx(IconButton, {
|
|
48
|
+
variant: "ghost",
|
|
49
|
+
icon: "ph--check--regular",
|
|
50
|
+
iconOnly: true,
|
|
51
|
+
label: "No errors."
|
|
52
|
+
}) });
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Swarm connection handler.
|
|
56
|
+
*/
|
|
57
|
+
var SwarmIndicator = () => {
|
|
58
|
+
const [state, setState] = useState(0);
|
|
59
|
+
const { swarm } = useNetworkStatus();
|
|
60
|
+
useEffect(() => {
|
|
61
|
+
setState(swarm === ConnectionState.ONLINE ? 0 : 1);
|
|
62
|
+
}, [swarm]);
|
|
63
|
+
if (state === 0) return /* @__PURE__ */ jsx(StatusBar.Item, { children: /* @__PURE__ */ jsx(IconButton, {
|
|
64
|
+
variant: "ghost",
|
|
65
|
+
icon: "ph--lightning--regular",
|
|
66
|
+
iconOnly: true,
|
|
67
|
+
label: "Connected to swarm."
|
|
68
|
+
}) });
|
|
69
|
+
else return /* @__PURE__ */ jsx(StatusBar.Item, { children: /* @__PURE__ */ jsx(IconButton, {
|
|
70
|
+
variant: "ghost",
|
|
71
|
+
icon: "ph--lightning-slash--regular",
|
|
72
|
+
iconOnly: true,
|
|
73
|
+
label: "Disconnected from swarm.",
|
|
74
|
+
classNames: styles.warning
|
|
75
|
+
}) });
|
|
76
|
+
};
|
|
77
|
+
/**
|
|
78
|
+
* Data saving indicator.
|
|
79
|
+
*/
|
|
80
|
+
var SavingIndicator = () => {
|
|
81
|
+
const [state, _setState] = useState(0);
|
|
82
|
+
switch (state) {
|
|
83
|
+
case 2: return /* @__PURE__ */ jsx(StatusBar.Item, { children: /* @__PURE__ */ jsx(IconButton, {
|
|
84
|
+
variant: "ghost",
|
|
85
|
+
icon: "ph--circle--duotone",
|
|
86
|
+
iconOnly: true,
|
|
87
|
+
label: "Edit not saved.",
|
|
88
|
+
classNames: styles.warning
|
|
89
|
+
}) });
|
|
90
|
+
case 1: return /* @__PURE__ */ jsx(StatusBar.Item, { children: /* @__PURE__ */ jsx(IconButton, {
|
|
91
|
+
variant: "ghost",
|
|
92
|
+
icon: "ph--circle--duotone",
|
|
93
|
+
iconOnly: true,
|
|
94
|
+
label: "Saving...",
|
|
95
|
+
classNames: styles.success
|
|
96
|
+
}) });
|
|
97
|
+
default: return /* @__PURE__ */ jsx(StatusBar.Item, { children: /* @__PURE__ */ jsx(IconButton, {
|
|
98
|
+
variant: "ghost",
|
|
99
|
+
icon: "ph--circle--duotone",
|
|
100
|
+
iconOnly: true,
|
|
101
|
+
label: "Modified indicator."
|
|
102
|
+
}) });
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
var indicators = [
|
|
106
|
+
SavingIndicator,
|
|
107
|
+
SwarmIndicator,
|
|
108
|
+
ErrorIndicator
|
|
109
|
+
];
|
|
110
|
+
var DebugStatus = () => {
|
|
111
|
+
return /* @__PURE__ */ jsx(Fragment$1, { children: indicators.map((Indicator) => /* @__PURE__ */ jsx(Indicator, {}, Indicator.name)) });
|
|
112
|
+
};
|
|
113
|
+
DebugStatus.displayName = "DebugStatus";
|
|
114
|
+
//#endregion
|
|
115
|
+
export { DebugStatus as default };
|
|
116
|
+
|
|
117
|
+
//# sourceMappingURL=chunk-DebugStatus.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-DebugStatus.mjs","names":[],"sources":["../../src/containers/DebugStatus/DebugStatus.tsx"],"sourcesContent":["//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useEffect, useRef, useState } from 'react';\n\nimport { TimeoutError } from '@dxos/async';\nimport { StatusBar } from '@dxos/plugin-status-bar/components';\nimport { ConnectionState } from '@dxos/protocols/proto/dxos/client/services';\nimport { useNetworkStatus } from '@dxos/react-client/mesh';\nimport { IconButton } from '@dxos/react-ui';\n\nconst styles = {\n success: 'text-sky-300 dark:text-green-700',\n warning: 'text-orange-300 dark:text-orange-600',\n error: 'text-red-300 dark:text-red-600',\n};\n\n// TODO(burdon): Move out of debug plugin.\n// TODO(burdon): Make pluggable (move indicators to relevant plugins).\n// TODO(burdon): Vault heartbeat indicator (global scope)?\n\n/**\n * Ensure light doesn't flicker immediately after start.\n */\n// TODO(burdon): Move to @dxos/async (debounce?)\nconst _timer = (cb: (err?: Error) => void, options?: { min?: number; max?: number }) => {\n const min = options?.min ?? 500;\n let start: number;\n let pending: NodeJS.Timeout;\n let timeout: NodeJS.Timeout;\n return {\n start: () => {\n start = Date.now();\n clearTimeout(pending);\n if (options?.max) {\n clearTimeout(timeout);\n timeout = setTimeout(() => {\n cb(new TimeoutError(options.max));\n }, options.max);\n }\n },\n stop: () => {\n clearTimeout(timeout);\n const delta = Date.now() - start;\n if (delta < min) {\n pending = setTimeout(() => {\n cb();\n }, min - delta);\n }\n },\n };\n};\n\n/**\n * Global error handler.\n */\n// TODO(burdon): Integrate with Sentry?\nconst ErrorIndicator = () => {\n const [, forceUpdate] = useState({});\n const errorRef = useRef<Error>(null);\n useEffect(() => {\n const errorListener = (event: any) => {\n const error: Error = event.error ?? event.reason;\n if (errorRef.current !== error) {\n errorRef.current = error;\n forceUpdate({});\n }\n };\n\n // TODO(burdon): Register globally?\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/error_event\n window.addEventListener('error', errorListener);\n\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/unhandledrejection_event\n window.addEventListener('unhandledrejection', errorListener);\n\n return () => {\n window.removeEventListener('error', errorListener);\n window.removeEventListener('unhandledrejection', errorListener);\n };\n }, []);\n\n const handleReset = () => {\n errorRef.current = null;\n forceUpdate({});\n };\n\n if (errorRef.current) {\n return (\n <StatusBar.Item>\n <IconButton\n variant='ghost'\n icon='ph--warning-circle--duotone'\n iconOnly\n label={errorRef.current.message}\n classNames={styles.error}\n onClick={handleReset}\n />\n </StatusBar.Item>\n );\n } else {\n return (\n <StatusBar.Item>\n <IconButton variant='ghost' icon='ph--check--regular' iconOnly label='No errors.' />\n </StatusBar.Item>\n );\n }\n};\n\n/**\n * Swarm connection handler.\n */\nconst SwarmIndicator = () => {\n const [state, setState] = useState(0);\n const { swarm } = useNetworkStatus();\n useEffect(() => {\n setState(swarm === ConnectionState.ONLINE ? 0 : 1);\n }, [swarm]);\n\n if (state === 0) {\n return (\n <StatusBar.Item>\n <IconButton variant='ghost' icon='ph--lightning--regular' iconOnly label='Connected to swarm.' />\n </StatusBar.Item>\n );\n } else {\n return (\n <StatusBar.Item>\n <IconButton\n variant='ghost'\n icon='ph--lightning-slash--regular'\n iconOnly\n label='Disconnected from swarm.'\n classNames={styles.warning}\n />\n </StatusBar.Item>\n );\n }\n};\n\n/**\n * Data saving indicator.\n */\n// TODO(burdon): Merge with SaveStatus.\nconst SavingIndicator = () => {\n const [state, _setState] = useState(0);\n // TODO(dmaretskyi): Fix this when we have save status for automerge.\n // useEffect(() => {\n // if (!space) {\n // return;\n // }\n // const { start, stop } = timer(() => setState(0), { min: 250 });\n // return space.db.pendingBatch.on(({ duration, error }) => {\n // if (error) {\n // setState(2);\n // stop();\n // } else if (duration === undefined) {\n // setState(1);\n // start();\n // } else {\n // stop();\n // }\n // });\n // }, [space]);\n\n switch (state) {\n case 2:\n return (\n <StatusBar.Item>\n <IconButton\n variant='ghost'\n icon='ph--circle--duotone'\n iconOnly\n label='Edit not saved.'\n classNames={styles.warning}\n />\n </StatusBar.Item>\n );\n case 1:\n return (\n <StatusBar.Item>\n <IconButton\n variant='ghost'\n icon='ph--circle--duotone'\n iconOnly\n label='Saving...'\n classNames={styles.success}\n />\n </StatusBar.Item>\n );\n case 0:\n default:\n return (\n <StatusBar.Item>\n <IconButton variant='ghost' icon='ph--circle--duotone' iconOnly label='Modified indicator.' />\n </StatusBar.Item>\n );\n }\n};\n\nconst indicators = [SavingIndicator, SwarmIndicator, ErrorIndicator];\n\nexport const DebugStatus = () => {\n return (\n <>\n {indicators.map((Indicator) => (\n <Indicator key={Indicator.name} />\n ))}\n </>\n );\n};\n\nDebugStatus.displayName = 'DebugStatus';\n"],"mappings":";;;;;;;;AAYA,IAAM,SAAS;CACb,SAAS;CACT,SAAS;CACT,OAAO;AACT;;;;AA0CA,IAAM,uBAAuB;CAC3B,MAAM,GAAG,eAAe,SAAS,CAAC,CAAC;CACnC,MAAM,WAAW,OAAc,IAAI;CACnC,gBAAgB;EACd,MAAM,iBAAiB,UAAe;GACpC,MAAM,QAAe,MAAM,SAAS,MAAM;GAC1C,IAAI,SAAS,YAAY,OAAO;IAC9B,SAAS,UAAU;IACnB,YAAY,CAAC,CAAC;GAChB;EACF;EAIA,OAAO,iBAAiB,SAAS,aAAa;EAG9C,OAAO,iBAAiB,sBAAsB,aAAa;EAE3D,aAAa;GACX,OAAO,oBAAoB,SAAS,aAAa;GACjD,OAAO,oBAAoB,sBAAsB,aAAa;EAChE;CACF,GAAG,CAAC,CAAC;CAEL,MAAM,oBAAoB;EACxB,SAAS,UAAU;EACnB,YAAY,CAAC,CAAC;CAChB;CAEA,IAAI,SAAS,SACX,OACE,oBAAC,UAAU,MAAX,EAAA,UACE,oBAAC,YAAD;EACE,SAAQ;EACR,MAAK;EACL,UAAA;EACA,OAAO,SAAS,QAAQ;EACxB,YAAY,OAAO;EACnB,SAAS;CACV,CAAA,EACa,CAAA;MAGlB,OACE,oBAAC,UAAU,MAAX,EAAA,UACE,oBAAC,YAAD;EAAY,SAAQ;EAAQ,MAAK;EAAqB,UAAA;EAAS,OAAM;CAAc,CAAA,EACrE,CAAA;AAGtB;;;;AAKA,IAAM,uBAAuB;CAC3B,MAAM,CAAC,OAAO,YAAY,SAAS,CAAC;CACpC,MAAM,EAAE,UAAU,iBAAiB;CACnC,gBAAgB;EACd,SAAS,UAAU,gBAAgB,SAAS,IAAI,CAAC;CACnD,GAAG,CAAC,KAAK,CAAC;CAEV,IAAI,UAAU,GACZ,OACE,oBAAC,UAAU,MAAX,EAAA,UACE,oBAAC,YAAD;EAAY,SAAQ;EAAQ,MAAK;EAAyB,UAAA;EAAS,OAAM;CAAuB,CAAA,EAClF,CAAA;MAGlB,OACE,oBAAC,UAAU,MAAX,EAAA,UACE,oBAAC,YAAD;EACE,SAAQ;EACR,MAAK;EACL,UAAA;EACA,OAAM;EACN,YAAY,OAAO;CACpB,CAAA,EACa,CAAA;AAGtB;;;;AAMA,IAAM,wBAAwB;CAC5B,MAAM,CAAC,OAAO,aAAa,SAAS,CAAC;CAoBrC,QAAQ,OAAR;EACE,KAAK,GACH,OACE,oBAAC,UAAU,MAAX,EAAA,UACE,oBAAC,YAAD;GACE,SAAQ;GACR,MAAK;GACL,UAAA;GACA,OAAM;GACN,YAAY,OAAO;EACpB,CAAA,EACa,CAAA;EAEpB,KAAK,GACH,OACE,oBAAC,UAAU,MAAX,EAAA,UACE,oBAAC,YAAD;GACE,SAAQ;GACR,MAAK;GACL,UAAA;GACA,OAAM;GACN,YAAY,OAAO;EACpB,CAAA,EACa,CAAA;EAGpB,SACE,OACE,oBAAC,UAAU,MAAX,EAAA,UACE,oBAAC,YAAD;GAAY,SAAQ;GAAQ,MAAK;GAAsB,UAAA;GAAS,OAAM;EAAuB,CAAA,EAC/E,CAAA;CAEtB;AACF;AAEA,IAAM,aAAa;CAAC;CAAiB;CAAgB;AAAc;AAEnE,IAAa,oBAAoB;CAC/B,OACE,oBAAA,YAAA,EAAA,UACG,WAAW,KAAK,cACf,oBAAC,WAAD,CAAiC,GAAjB,UAAU,IAAO,CAClC,EACD,CAAA;AAEN;AAEA,YAAY,cAAc"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import "react";
|
|
2
|
+
import { meta } from "#meta";
|
|
3
|
+
import { IconButton, Panel, Popover, useTranslation } from "@dxos/react-ui";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
import { Logger } from "@dxos/react-ui-debug";
|
|
6
|
+
import { StatusBar } from "@dxos/plugin-status-bar/components";
|
|
7
|
+
//#region src/containers/LogStatus/LogStatus.tsx
|
|
8
|
+
/** Status-bar button that opens the log panel in a popover for a quick glance. */
|
|
9
|
+
var LogStatus = () => {
|
|
10
|
+
const { t } = useTranslation(meta.profile.key);
|
|
11
|
+
return /* @__PURE__ */ jsxs(Popover.Root, { children: [/* @__PURE__ */ jsx(StatusBar.Item, { children: /* @__PURE__ */ jsx(Popover.Trigger, {
|
|
12
|
+
asChild: true,
|
|
13
|
+
children: /* @__PURE__ */ jsx(IconButton, {
|
|
14
|
+
variant: "ghost",
|
|
15
|
+
icon: "ph--list-magnifying-glass--regular",
|
|
16
|
+
iconOnly: true,
|
|
17
|
+
label: t("open-logs.label")
|
|
18
|
+
})
|
|
19
|
+
}) }), /* @__PURE__ */ jsx(Popover.Portal, { children: /* @__PURE__ */ jsxs(Popover.Content, {
|
|
20
|
+
side: "top",
|
|
21
|
+
children: [/* @__PURE__ */ jsx(Popover.Viewport, {
|
|
22
|
+
classNames: "w-[40rem] h-[24rem]",
|
|
23
|
+
children: /* @__PURE__ */ jsx(Logger.Root, { children: /* @__PURE__ */ jsxs(Panel.Root, { children: [
|
|
24
|
+
/* @__PURE__ */ jsx(Panel.Toolbar, {
|
|
25
|
+
asChild: true,
|
|
26
|
+
children: /* @__PURE__ */ jsx(Logger.Toolbar, {})
|
|
27
|
+
}),
|
|
28
|
+
/* @__PURE__ */ jsx(Panel.Content, {
|
|
29
|
+
asChild: true,
|
|
30
|
+
children: /* @__PURE__ */ jsx(Logger.Content, { children: /* @__PURE__ */ jsx(Logger.List, {}) })
|
|
31
|
+
}),
|
|
32
|
+
/* @__PURE__ */ jsx(Panel.Statusbar, {
|
|
33
|
+
asChild: true,
|
|
34
|
+
children: /* @__PURE__ */ jsx(Logger.Filter, {})
|
|
35
|
+
})
|
|
36
|
+
] }) })
|
|
37
|
+
}), /* @__PURE__ */ jsx(Popover.Arrow, {})]
|
|
38
|
+
}) })] });
|
|
39
|
+
};
|
|
40
|
+
LogStatus.displayName = "LogStatus";
|
|
41
|
+
//#endregion
|
|
42
|
+
export { LogStatus };
|
|
43
|
+
|
|
44
|
+
//# sourceMappingURL=chunk-LogStatus.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-LogStatus.mjs","names":[],"sources":["../../src/containers/LogStatus/LogStatus.tsx"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\nimport React from 'react';\n\nimport { StatusBar } from '@dxos/plugin-status-bar/components';\nimport { IconButton, Panel, Popover, useTranslation } from '@dxos/react-ui';\nimport { Logger } from '@dxos/react-ui-debug';\n\nimport { meta } from '#meta';\n\n/** Status-bar button that opens the log panel in a popover for a quick glance. */\nexport const LogStatus = () => {\n const { t } = useTranslation(meta.profile.key);\n\n return (\n <Popover.Root>\n {/* IconButton is the direct trigger child so the trigger ref/handlers/ARIA attach to the button, not the container. */}\n <StatusBar.Item>\n <Popover.Trigger asChild>\n <IconButton variant='ghost' icon='ph--list-magnifying-glass--regular' iconOnly label={t('open-logs.label')} />\n </Popover.Trigger>\n </StatusBar.Item>\n <Popover.Portal>\n <Popover.Content side='top'>\n <Popover.Viewport classNames='w-[40rem] h-[24rem]'>\n <Logger.Root>\n <Panel.Root>\n <Panel.Toolbar asChild>\n <Logger.Toolbar />\n </Panel.Toolbar>\n <Panel.Content asChild>\n <Logger.Content>\n <Logger.List />\n </Logger.Content>\n </Panel.Content>\n <Panel.Statusbar asChild>\n <Logger.Filter />\n </Panel.Statusbar>\n </Panel.Root>\n </Logger.Root>\n </Popover.Viewport>\n <Popover.Arrow />\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n );\n};\n\nLogStatus.displayName = 'LogStatus';\n"],"mappings":";;;;;;;;AAaA,IAAa,kBAAkB;CAC7B,MAAM,EAAE,MAAM,eAAe,KAAK,QAAQ,GAAG;CAE7C,OACE,qBAAC,QAAQ,MAAT,EAAA,UAAA,CAEE,oBAAC,UAAU,MAAX,EAAA,UACE,oBAAC,QAAQ,SAAT;EAAiB,SAAA;YACf,oBAAC,YAAD;GAAY,SAAQ;GAAQ,MAAK;GAAqC,UAAA;GAAS,OAAO,EAAE,iBAAiB;EAAI,CAAA;CAC9F,CAAA,EACH,CAAA,GAChB,oBAAC,QAAQ,QAAT,EAAA,UACE,qBAAC,QAAQ,SAAT;EAAiB,MAAK;YAAtB,CACE,oBAAC,QAAQ,UAAT;GAAkB,YAAW;aAC3B,oBAAC,OAAO,MAAR,EAAA,UACE,qBAAC,MAAM,MAAP,EAAA,UAAA;IACE,oBAAC,MAAM,SAAP;KAAe,SAAA;eACb,oBAAC,OAAO,SAAR,CAAiB,CAAA;IACJ,CAAA;IACf,oBAAC,MAAM,SAAP;KAAe,SAAA;eACb,oBAAC,OAAO,SAAR,EAAA,UACE,oBAAC,OAAO,MAAR,CAAc,CAAA,EACA,CAAA;IACH,CAAA;IACf,oBAAC,MAAM,WAAP;KAAiB,SAAA;eACf,oBAAC,OAAO,QAAR,CAAgB,CAAA;IACD,CAAA;GACP,EAAA,CAAA,EACD,CAAA;EACG,CAAA,GAClB,oBAAC,QAAQ,OAAT,CAAgB,CAAA,CACD;IACH,CAAA,CACJ,EAAA,CAAA;AAElB;AAEA,UAAU,cAAc"}
|