@osdk/react-devtools 0.12.0 → 0.12.1-main-e3a6fa4fb529f640175ebec3bec4c55bc8854f9c
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/CHANGELOG.md +7 -0
- package/build/esm/components/MonitoringPanel.js +51 -33
- package/build/esm/components/MonitoringPanel.js.map +1 -1
- package/build/esm/components/MonitoringPanel.module.scss.js +2 -4
- package/build/esm/fiber/DegradationNotice.js +7 -1
- package/build/esm/fiber/DegradationNotice.js.map +1 -1
- package/build/esm/hooks/useClientMetrics.js +34 -0
- package/build/esm/hooks/useClientMetrics.js.map +1 -0
- package/build/esm/hooks/usePersistedState.js +27 -1
- package/build/esm/hooks/usePersistedState.js.map +1 -1
- package/build/esm/index.js +2 -0
- package/build/esm/index.js.map +1 -1
- package/build/esm/metrics/clientMetrics.js +87 -0
- package/build/esm/metrics/clientMetrics.js.map +1 -0
- package/build/esm/styles.css +30 -45
- package/build/esm/styles.js +1 -1
- package/build/types/components/MonitoringPanel.d.ts.map +1 -1
- package/build/types/fiber/DegradationNotice.d.ts +1 -0
- package/build/types/fiber/DegradationNotice.d.ts.map +1 -1
- package/build/types/hooks/useClientMetrics.d.ts +11 -0
- package/build/types/hooks/useClientMetrics.d.ts.map +1 -0
- package/build/types/hooks/usePersistedState.d.ts +6 -1
- package/build/types/hooks/usePersistedState.d.ts.map +1 -1
- package/build/types/index.d.ts +3 -0
- package/build/types/index.d.ts.map +1 -1
- package/build/types/metrics/clientMetrics.d.ts +28 -0
- package/build/types/metrics/clientMetrics.d.ts.map +1 -0
- package/package.json +4 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# @osdk/react-devtools
|
|
2
2
|
|
|
3
|
+
## 0.12.1-main-e3a6fa4fb529f640175ebec3bec4c55bc8854f9c
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- e3a6fa4: add client metrics (cache, latency, and optimistic-update effectiveness) that the redesigned performance tab reads
|
|
8
|
+
- 7449f91: Restyle the MonitoringPanel devtools tab bar to use Blueprint Tabs
|
|
9
|
+
|
|
3
10
|
## 0.12.0
|
|
4
11
|
|
|
5
12
|
### Minor Changes
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import { Button, Classes, PortalProvider, Tooltip } from "@blueprintjs/core";
|
|
17
|
+
import { Button, Classes, PortalProvider, Tab, Tabs, Tooltip } from "@blueprintjs/core";
|
|
18
18
|
import classNames from "classnames";
|
|
19
19
|
import React, { useCallback, useMemo, useRef, useState } from "react";
|
|
20
20
|
import { createPortal } from "react-dom";
|
|
@@ -75,6 +75,7 @@ const UI_CONSTANTS = {
|
|
|
75
75
|
MAX_DOCKED_BOTTOM_HEIGHT: 800,
|
|
76
76
|
MAX_DOCKED_RIGHT_WIDTH: 800
|
|
77
77
|
};
|
|
78
|
+
const DEVTOOLS_TAB_IDS = ["performance", "compute", "intercept", "debugging"];
|
|
78
79
|
export const MonitoringPanel = ({
|
|
79
80
|
monitorStore
|
|
80
81
|
}) => {
|
|
@@ -82,7 +83,12 @@ export const MonitoringPanel = ({
|
|
|
82
83
|
const computeStore = monitorStore.getComputeStore();
|
|
83
84
|
const fiberCapabilities = useFiberCapabilities();
|
|
84
85
|
const [activeTab, setActiveTab] = useState("performance");
|
|
85
|
-
const
|
|
86
|
+
const onActiveTabChange = useCallback(newTabId => {
|
|
87
|
+
if (isDevtoolsTabId(newTabId)) {
|
|
88
|
+
setActiveTab(newTabId);
|
|
89
|
+
}
|
|
90
|
+
}, []);
|
|
91
|
+
const [position, setPosition] = usePersistedState(`monitor-position`, {
|
|
86
92
|
x: window.innerWidth - UI_CONSTANTS.DEFAULT_PANEL_RIGHT_OFFSET,
|
|
87
93
|
y: UI_CONSTANTS.DEFAULT_PANEL_TOP_OFFSET,
|
|
88
94
|
width: UI_CONSTANTS.DEFAULT_PANEL_WIDTH,
|
|
@@ -90,7 +96,7 @@ export const MonitoringPanel = ({
|
|
|
90
96
|
collapsed: false,
|
|
91
97
|
dockMode: "floating"
|
|
92
98
|
});
|
|
93
|
-
const [themePreference, setThemePreference] = usePersistedState("
|
|
99
|
+
const [themePreference, setThemePreference] = usePersistedState("devtools-theme", "dark");
|
|
94
100
|
const systemPrefersDark = React.useSyncExternalStore(subscribeDarkMode, getDarkModeSnapshot);
|
|
95
101
|
const resolvedTheme = useMemo(() => themePreference === "auto" ? systemPrefersDark ? "dark" : "light" : themePreference, [themePreference, systemPrefersDark]);
|
|
96
102
|
|
|
@@ -303,6 +309,7 @@ export const MonitoringPanel = ({
|
|
|
303
309
|
}, /*#__PURE__*/React.createElement("div", {
|
|
304
310
|
className: styles.minimized,
|
|
305
311
|
"data-dt-theme": resolvedTheme,
|
|
312
|
+
"aria-label": "View OSDK Devtools",
|
|
306
313
|
onClick: () => setPosition(prev => ({
|
|
307
314
|
...prev,
|
|
308
315
|
collapsed: false
|
|
@@ -311,7 +318,9 @@ export const MonitoringPanel = ({
|
|
|
311
318
|
className: styles.minimizedIcon
|
|
312
319
|
}, "</>")))), shadowMount);
|
|
313
320
|
}
|
|
314
|
-
const panelClassName = classNames(styles.panel,
|
|
321
|
+
const panelClassName = classNames(styles.panel,
|
|
322
|
+
// Class needed to remove the useless outline added on tabs/buttons
|
|
323
|
+
Classes.FOCUS_DISABLED, resolvedTheme === "dark" ? Classes.DARK : undefined, {
|
|
315
324
|
[styles.floating]: position.dockMode === "floating",
|
|
316
325
|
[styles.dockedBottom]: position.dockMode === "docked-bottom",
|
|
317
326
|
[styles.dockedRight]: position.dockMode === "docked-right"
|
|
@@ -408,39 +417,48 @@ export const MonitoringPanel = ({
|
|
|
408
417
|
title: "Minimize",
|
|
409
418
|
"aria-label": "Minimize devtools panel"
|
|
410
419
|
}))), /*#__PURE__*/React.createElement("div", {
|
|
411
|
-
className: styles.tabs,
|
|
412
|
-
role: "tablist",
|
|
413
|
-
"aria-label": "Devtools tabs"
|
|
414
|
-
}, ["performance", "compute", "intercept", "debugging"].map(tab => /*#__PURE__*/React.createElement("button", {
|
|
415
|
-
key: tab,
|
|
416
|
-
type: "button",
|
|
417
|
-
role: "tab",
|
|
418
|
-
"aria-selected": activeTab === tab,
|
|
419
|
-
className: classNames(styles.tabButton, activeTab === tab && styles.tabButtonActive),
|
|
420
|
-
onClick: () => setActiveTab(tab)
|
|
421
|
-
}, tab.charAt(0).toUpperCase() + tab.slice(1)))), /*#__PURE__*/React.createElement("div", {
|
|
422
420
|
className: styles.content
|
|
423
421
|
}, (!fiberCapabilities.hookInstalled || !fiberCapabilities.fiberAccessWorking) && /*#__PURE__*/React.createElement(DegradationNotice, {
|
|
422
|
+
className: styles.notice,
|
|
424
423
|
onRetry: () => validateFiberAccess()
|
|
425
|
-
}), /*#__PURE__*/React.createElement(
|
|
426
|
-
className:
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
424
|
+
}), /*#__PURE__*/React.createElement(Tabs, {
|
|
425
|
+
className: styles.tabs,
|
|
426
|
+
selectedTabId: activeTab,
|
|
427
|
+
onChange: onActiveTabChange
|
|
428
|
+
}, /*#__PURE__*/React.createElement(Tab, {
|
|
429
|
+
id: "performance",
|
|
430
|
+
title: "Performance",
|
|
431
|
+
panelClassName: styles.tabPanel,
|
|
432
|
+
panel: /*#__PURE__*/React.createElement(PerformanceTab, {
|
|
433
|
+
metricsStore: metricsStore,
|
|
434
|
+
monitorStore: monitorStore
|
|
435
|
+
})
|
|
436
|
+
}), /*#__PURE__*/React.createElement(Tab, {
|
|
437
|
+
id: "compute",
|
|
438
|
+
title: "Compute",
|
|
439
|
+
panelClassName: styles.tabPanel,
|
|
440
|
+
panel: /*#__PURE__*/React.createElement(ComputeTab, {
|
|
441
|
+
computeStore: computeStore
|
|
442
|
+
})
|
|
443
|
+
}), /*#__PURE__*/React.createElement(Tab, {
|
|
444
|
+
id: "intercept",
|
|
445
|
+
title: "Intercept",
|
|
446
|
+
panelClassName: styles.tabPanel,
|
|
447
|
+
panel: /*#__PURE__*/React.createElement(InterceptTab, {
|
|
448
|
+
monitorStore: monitorStore,
|
|
449
|
+
theme: resolvedTheme
|
|
450
|
+
})
|
|
451
|
+
}), /*#__PURE__*/React.createElement(Tab, {
|
|
452
|
+
id: "debugging",
|
|
453
|
+
title: "Debugging",
|
|
454
|
+
panelClassName: styles.tabPanel,
|
|
455
|
+
panel: /*#__PURE__*/React.createElement(DebuggingTab, {
|
|
456
|
+
monitorStore: monitorStore
|
|
457
|
+
})
|
|
443
458
|
}))))), shadowMount);
|
|
444
459
|
};
|
|
445
460
|
export const SafeMonitoringPanel = props => /*#__PURE__*/React.createElement(MonitorErrorBoundary, null, /*#__PURE__*/React.createElement(MonitoringPanel, props));
|
|
461
|
+
function isDevtoolsTabId(id) {
|
|
462
|
+
return DEVTOOLS_TAB_IDS.some(tabId => tabId === id);
|
|
463
|
+
}
|
|
446
464
|
//# sourceMappingURL=MonitoringPanel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MonitoringPanel.js","names":["Button","Classes","PortalProvider","Tooltip","classNames","React","useCallback","useMemo","useRef","useState","createPortal","DegradationNotice","useFiberCapabilities","validateFiberAccess","usePersistedState","getDevtoolsShadowMount","ComputeTab","DebuggingTab","InterceptTab","MonitorErrorBoundary","PerformanceTab","styles","darkModeMql","window","matchMedia","undefined","subscribeDarkMode","callback","addEventListener","removeEventListener","getDarkModeSnapshot","matches","subscribeWindowSize","windowSizeSnapshot","width","innerWidth","height","innerHeight","getWindowSizeSnapshot","current","UI_CONSTANTS","DEFAULT_PANEL_WIDTH","DEFAULT_PANEL_HEIGHT","DEFAULT_PANEL_RIGHT_OFFSET","DEFAULT_PANEL_TOP_OFFSET","MIN_PANEL_WIDTH","MIN_PANEL_HEIGHT","TOOLTIP_HOVER_DELAY","DOCKED_BOTTOM_HEIGHT","DOCKED_RIGHT_WIDTH","MIN_DOCKED_BOTTOM_HEIGHT","MIN_DOCKED_RIGHT_WIDTH","MAX_DOCKED_BOTTOM_HEIGHT","MAX_DOCKED_RIGHT_WIDTH","MonitoringPanel","monitorStore","metricsStore","getMetricsStore","computeStore","getComputeStore","fiberCapabilities","activeTab","setActiveTab","position","setPosition","x","y","collapsed","dockMode","themePreference","setThemePreference","systemPrefersDark","useSyncExternalStore","resolvedTheme","shadowMount","panelEl","setPanelEl","isDragging","isResizing","dragStart","elemX","elemY","resizeStart","setPositionRef","dragAbortRef","attachDragListeners","abort","controller","AbortController","signal","document","e","deltaX","clientX","deltaY","clientY","prev","Math","max","min","handle","newHeight","newWidth","newX","newY","includes","handleMouseDown","target","closest","controls","preventDefault","handleResizeMouseDown","stopPropagation","handleDockToggle","nextMode","windowSize","effectivePosition","maxX","maxY","createElement","portalContainer","content","placement","hoverOpenDelay","className","minimized","onClick","minimizedIcon","panelClassName","panel","DARK","floating","dockedBottom","dockedRight","ref","style","left","top","right","bottom","cls","horizontal","vertical","corner","topLeft","topRight","bottomLeft","bottomRight","map","key","resizeHandle","onMouseDown","header","title","badge","variant","size","icon","reset","tabs","role","tab","type","tabButton","tabButtonActive","charAt","toUpperCase","slice","hookInstalled","fiberAccessWorking","onRetry","tabContentVisible","tabContentHidden","theme","SafeMonitoringPanel","props"],"sources":["MonitoringPanel.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Button, Classes, PortalProvider, Tooltip } from \"@blueprintjs/core\";\nimport classNames from \"classnames\";\nimport React, { useCallback, useMemo, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport {\n DegradationNotice,\n useFiberCapabilities,\n} from \"../fiber/DegradationNotice.js\";\nimport { validateFiberAccess } from \"../fiber/validation.js\";\nimport { usePersistedState } from \"../hooks/usePersistedState.js\";\nimport { getDevtoolsShadowMount } from \"../shadow/ShadowHost.js\";\nimport type { MonitorStore } from \"../store/MonitorStore.js\";\nimport type { PanelPosition } from \"../types/index.js\";\nimport { ComputeTab } from \"./ComputeTab.js\";\nimport { DebuggingTab } from \"./DebuggingTab.js\";\nimport { InterceptTab } from \"./InterceptTab.js\";\nimport { MonitorErrorBoundary } from \"./MonitorErrorBoundary.js\";\nimport { PerformanceTab } from \"./PerformanceTab.js\";\n\nimport styles from \"./MonitoringPanel.module.scss\";\n\nconst darkModeMql =\n typeof window !== \"undefined\"\n ? window.matchMedia(\"(prefers-color-scheme: dark)\")\n : undefined;\n\nfunction subscribeDarkMode(callback: () => void): () => void {\n if (darkModeMql) {\n darkModeMql.addEventListener(\"change\", callback);\n return () => darkModeMql.removeEventListener(\"change\", callback);\n }\n return () => {};\n}\n\nfunction getDarkModeSnapshot(): boolean {\n return darkModeMql ? darkModeMql.matches : true;\n}\n\nfunction subscribeWindowSize(callback: () => void): () => void {\n window.addEventListener(\"resize\", callback);\n return () => window.removeEventListener(\"resize\", callback);\n}\n\nlet windowSizeSnapshot =\n typeof window !== \"undefined\"\n ? { width: window.innerWidth, height: window.innerHeight }\n : { width: 0, height: 0 };\n\nfunction getWindowSizeSnapshot(): { width: number; height: number } {\n const current = { width: window.innerWidth, height: window.innerHeight };\n if (\n current.width !== windowSizeSnapshot.width ||\n current.height !== windowSizeSnapshot.height\n ) {\n windowSizeSnapshot = current;\n }\n return windowSizeSnapshot;\n}\n\nconst UI_CONSTANTS = {\n DEFAULT_PANEL_WIDTH: 400,\n DEFAULT_PANEL_HEIGHT: 600,\n DEFAULT_PANEL_RIGHT_OFFSET: 420,\n DEFAULT_PANEL_TOP_OFFSET: 20,\n MIN_PANEL_WIDTH: 320,\n MIN_PANEL_HEIGHT: 200,\n TOOLTIP_HOVER_DELAY: 500,\n DOCKED_BOTTOM_HEIGHT: 400,\n DOCKED_RIGHT_WIDTH: 500,\n MIN_DOCKED_BOTTOM_HEIGHT: 200,\n MIN_DOCKED_RIGHT_WIDTH: 320,\n MAX_DOCKED_BOTTOM_HEIGHT: 800,\n MAX_DOCKED_RIGHT_WIDTH: 800,\n};\n\nexport interface MonitoringPanelProps {\n /** The MonitorStore instance that provides all metrics, compute, and component tracking data. */\n monitorStore: MonitorStore;\n}\n\nexport const MonitoringPanel: React.FC<MonitoringPanelProps> = ({\n monitorStore,\n}) => {\n const metricsStore = monitorStore.getMetricsStore();\n const computeStore = monitorStore.getComputeStore();\n const fiberCapabilities = useFiberCapabilities();\n const [activeTab, setActiveTab] = useState<\n \"performance\" | \"compute\" | \"intercept\" | \"debugging\"\n >(\"performance\");\n const [position, setPosition] = usePersistedState<PanelPosition>(\n \"osdk-monitor-position\",\n {\n x: window.innerWidth - UI_CONSTANTS.DEFAULT_PANEL_RIGHT_OFFSET,\n y: UI_CONSTANTS.DEFAULT_PANEL_TOP_OFFSET,\n width: UI_CONSTANTS.DEFAULT_PANEL_WIDTH,\n height: UI_CONSTANTS.DEFAULT_PANEL_HEIGHT,\n collapsed: false,\n dockMode: \"floating\",\n }\n );\n\n const [themePreference, setThemePreference] = usePersistedState<\n \"light\" | \"dark\" | \"auto\"\n >(\"osdk-devtools-theme\", \"dark\");\n\n const systemPrefersDark = React.useSyncExternalStore(\n subscribeDarkMode,\n getDarkModeSnapshot\n );\n\n const resolvedTheme = useMemo(\n () =>\n themePreference === \"auto\"\n ? systemPrefersDark\n ? \"dark\"\n : \"light\"\n : themePreference,\n [themePreference, systemPrefersDark]\n );\n\n // Renders inside a shadow root so the bundled Blueprint + devtools CSS can't\n // leak into the page, and the page's CSS can't leak in.\n const [shadowMount] = useState(getDevtoolsShadowMount);\n\n // Callback-ref state so a re-render fires once the panel mounts; overlays\n // portal into it (see PortalProvider below) so the panel-scoped styles apply.\n const [panelEl, setPanelEl] = useState<HTMLDivElement | null>(null);\n const isDragging = useRef(false);\n const isResizing = useRef<string | null>(null);\n const dragStart = useRef({ x: 0, y: 0, elemX: 0, elemY: 0 });\n const resizeStart = useRef({\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n elemX: 0,\n elemY: 0,\n });\n\n const setPositionRef = useRef(setPosition);\n setPositionRef.current = setPosition;\n\n const dragAbortRef = useRef<AbortController | null>(null);\n\n const attachDragListeners = useCallback(() => {\n dragAbortRef.current?.abort();\n const controller = new AbortController();\n dragAbortRef.current = controller;\n const { signal } = controller;\n\n const handleMouseMove = (e: MouseEvent) => {\n if (isDragging.current) {\n const deltaX = e.clientX - dragStart.current.x;\n const deltaY = e.clientY - dragStart.current.y;\n setPositionRef.current((prev) => ({\n ...prev,\n x: Math.max(\n 0,\n Math.min(\n window.innerWidth - prev.width,\n dragStart.current.elemX + deltaX\n )\n ),\n y: Math.max(\n 0,\n Math.min(\n window.innerHeight - prev.height,\n dragStart.current.elemY + deltaY\n )\n ),\n }));\n } else if (isResizing.current) {\n const deltaX = e.clientX - resizeStart.current.x;\n const deltaY = e.clientY - resizeStart.current.y;\n const handle = isResizing.current;\n\n setPositionRef.current((prev) => {\n if (prev.dockMode === \"docked-bottom\") {\n const newHeight = Math.max(\n UI_CONSTANTS.MIN_DOCKED_BOTTOM_HEIGHT,\n Math.min(\n UI_CONSTANTS.MAX_DOCKED_BOTTOM_HEIGHT,\n resizeStart.current.height - deltaY\n )\n );\n return {\n ...prev,\n height: newHeight,\n y: window.innerHeight - newHeight,\n };\n }\n\n if (prev.dockMode === \"docked-right\") {\n const newWidth = Math.max(\n UI_CONSTANTS.MIN_DOCKED_RIGHT_WIDTH,\n Math.min(\n UI_CONSTANTS.MAX_DOCKED_RIGHT_WIDTH,\n resizeStart.current.width - deltaX\n )\n );\n return {\n ...prev,\n width: newWidth,\n x: window.innerWidth - newWidth,\n };\n }\n\n let newX = prev.x;\n let newY = prev.y;\n let newWidth = prev.width;\n let newHeight = prev.height;\n\n if (handle.includes(\"right\")) {\n newWidth = Math.max(\n UI_CONSTANTS.MIN_PANEL_WIDTH,\n resizeStart.current.width + deltaX\n );\n }\n if (handle.includes(\"left\")) {\n newWidth = Math.max(\n UI_CONSTANTS.MIN_PANEL_WIDTH,\n resizeStart.current.width - deltaX\n );\n newX = resizeStart.current.elemX + deltaX;\n if (newWidth === UI_CONSTANTS.MIN_PANEL_WIDTH) {\n newX =\n resizeStart.current.elemX +\n resizeStart.current.width -\n UI_CONSTANTS.MIN_PANEL_WIDTH;\n }\n }\n if (handle.includes(\"bottom\")) {\n newHeight = Math.max(\n UI_CONSTANTS.MIN_PANEL_HEIGHT,\n resizeStart.current.height + deltaY\n );\n }\n if (handle.includes(\"top\")) {\n newHeight = Math.max(\n UI_CONSTANTS.MIN_PANEL_HEIGHT,\n resizeStart.current.height - deltaY\n );\n newY = resizeStart.current.elemY + deltaY;\n if (newHeight === UI_CONSTANTS.MIN_PANEL_HEIGHT) {\n newY =\n resizeStart.current.elemY +\n resizeStart.current.height -\n UI_CONSTANTS.MIN_PANEL_HEIGHT;\n }\n }\n\n return {\n ...prev,\n x: newX,\n y: newY,\n width: newWidth,\n height: newHeight,\n };\n });\n }\n };\n\n const handleMouseUp = () => {\n isDragging.current = false;\n isResizing.current = null;\n controller.abort();\n dragAbortRef.current = null;\n };\n\n document.addEventListener(\"mousemove\", handleMouseMove, { signal });\n document.addEventListener(\"mouseup\", handleMouseUp, { signal });\n }, []);\n\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n if ((e.target as HTMLElement).closest(`.${styles.controls}`)) {\n return;\n }\n if (position.dockMode !== \"floating\") {\n return;\n }\n isDragging.current = true;\n dragStart.current = {\n x: e.clientX,\n y: e.clientY,\n elemX: position.x,\n elemY: position.y,\n };\n e.preventDefault();\n attachDragListeners();\n },\n [position, attachDragListeners]\n );\n\n const handleResizeMouseDown = useCallback(\n (e: React.MouseEvent, handle: string) => {\n isResizing.current = handle;\n resizeStart.current = {\n x: e.clientX,\n y: e.clientY,\n width: position.width,\n height: position.height,\n elemX: position.x,\n elemY: position.y,\n };\n e.preventDefault();\n e.stopPropagation();\n attachDragListeners();\n },\n [position, attachDragListeners]\n );\n\n const handleDockToggle = useCallback(() => {\n setPosition((prev) => {\n const nextMode =\n prev.dockMode === \"floating\"\n ? \"docked-bottom\"\n : prev.dockMode === \"docked-bottom\"\n ? \"docked-right\"\n : \"floating\";\n\n if (nextMode === \"docked-bottom\") {\n return {\n x: 0,\n y: window.innerHeight - UI_CONSTANTS.DOCKED_BOTTOM_HEIGHT,\n width: window.innerWidth,\n height: UI_CONSTANTS.DOCKED_BOTTOM_HEIGHT,\n collapsed: false,\n dockMode: nextMode,\n };\n } else if (nextMode === \"docked-right\") {\n return {\n x: window.innerWidth - UI_CONSTANTS.DOCKED_RIGHT_WIDTH,\n y: 0,\n width: UI_CONSTANTS.DOCKED_RIGHT_WIDTH,\n height: window.innerHeight,\n collapsed: false,\n dockMode: nextMode,\n };\n } else {\n return {\n x: window.innerWidth - UI_CONSTANTS.DEFAULT_PANEL_RIGHT_OFFSET,\n y: UI_CONSTANTS.DEFAULT_PANEL_TOP_OFFSET,\n width: UI_CONSTANTS.DEFAULT_PANEL_WIDTH,\n height: UI_CONSTANTS.DEFAULT_PANEL_HEIGHT,\n collapsed: false,\n dockMode: nextMode,\n };\n }\n });\n }, [setPosition]);\n\n const windowSize = React.useSyncExternalStore(\n subscribeWindowSize,\n getWindowSizeSnapshot\n );\n\n const effectivePosition = useMemo(() => {\n if (position.dockMode === \"floating\") {\n const maxX = windowSize.width - position.width;\n const maxY = windowSize.height - position.height;\n return {\n ...position,\n x: Math.max(0, Math.min(position.x, maxX)),\n y: Math.max(0, Math.min(position.y, maxY)),\n };\n }\n if (position.dockMode === \"docked-bottom\") {\n return {\n ...position,\n width: windowSize.width,\n y: windowSize.height - position.height,\n };\n }\n if (position.dockMode === \"docked-right\") {\n return {\n ...position,\n height: windowSize.height,\n x: windowSize.width - position.width,\n };\n }\n return position;\n }, [position, windowSize]);\n\n if (position.collapsed) {\n return createPortal(\n <PortalProvider portalContainer={shadowMount}>\n <Tooltip\n content=\"View OSDK Devtools\"\n placement=\"left\"\n hoverOpenDelay={UI_CONSTANTS.TOOLTIP_HOVER_DELAY}\n >\n <div\n className={styles.minimized}\n data-dt-theme={resolvedTheme}\n onClick={() =>\n setPosition((prev) => ({ ...prev, collapsed: false }))\n }\n >\n <span className={styles.minimizedIcon}></></span>\n </div>\n </Tooltip>\n </PortalProvider>,\n shadowMount\n );\n }\n\n const panelClassName = classNames(\n styles.panel,\n resolvedTheme === \"dark\" ? Classes.DARK : undefined,\n {\n [styles.floating]: position.dockMode === \"floating\",\n [styles.dockedBottom]: position.dockMode === \"docked-bottom\",\n [styles.dockedRight]: position.dockMode === \"docked-right\",\n }\n );\n return createPortal(\n <PortalProvider portalContainer={panelEl ?? shadowMount}>\n <div\n ref={setPanelEl}\n className={panelClassName}\n data-dt-theme={resolvedTheme}\n style={{\n left:\n effectivePosition.dockMode === \"docked-bottom\"\n ? 0\n : effectivePosition.x,\n top:\n effectivePosition.dockMode === \"docked-right\"\n ? 0\n : effectivePosition.y,\n width: effectivePosition.width,\n height: effectivePosition.height,\n right: effectivePosition.dockMode === \"docked-right\" ? 0 : undefined,\n bottom:\n effectivePosition.dockMode === \"docked-bottom\" ? 0 : undefined,\n }}\n >\n {(position.dockMode === \"floating\"\n ? [\n { cls: [styles.horizontal, styles.top], handle: \"top\" },\n { cls: [styles.horizontal, styles.bottom], handle: \"bottom\" },\n { cls: [styles.vertical, styles.left], handle: \"left\" },\n { cls: [styles.vertical, styles.right], handle: \"right\" },\n { cls: [styles.corner, styles.topLeft], handle: \"topLeft\" },\n { cls: [styles.corner, styles.topRight], handle: \"topRight\" },\n {\n cls: [styles.corner, styles.bottomLeft],\n handle: \"bottomLeft\",\n },\n {\n cls: [styles.corner, styles.bottomRight],\n handle: \"bottomRight\",\n },\n ]\n : position.dockMode === \"docked-bottom\"\n ? [{ cls: [styles.horizontal, styles.top], handle: \"top\" }]\n : position.dockMode === \"docked-right\"\n ? [{ cls: [styles.vertical, styles.left], handle: \"left\" }]\n : []\n ).map(({ cls, handle }) => (\n <div\n key={handle}\n className={classNames(styles.resizeHandle, ...cls)}\n onMouseDown={(e) => handleResizeMouseDown(e, handle)}\n />\n ))}\n\n <div className={styles.header} onMouseDown={handleMouseDown}>\n <h3 className={styles.title}>\n OSDK Devtools\n <span className={styles.badge}>Beta</span>\n </h3>\n <div className={styles.controls}>\n <Button\n variant=\"minimal\"\n size=\"small\"\n icon={\n themePreference === \"dark\"\n ? \"moon\"\n : themePreference === \"light\"\n ? \"flash\"\n : \"automatic-updates\"\n }\n onClick={() =>\n setThemePreference(\n themePreference === \"dark\"\n ? \"light\"\n : themePreference === \"light\"\n ? \"auto\"\n : \"dark\"\n )\n }\n title={`Theme: ${themePreference} (click to cycle)`}\n aria-label={`Theme: ${themePreference}. Click to cycle.`}\n />\n <Button\n variant=\"minimal\"\n size=\"small\"\n icon={\n position.dockMode === \"floating\"\n ? \"widget\"\n : position.dockMode === \"docked-bottom\"\n ? \"layout-sorted-clusters\"\n : \"layout-hierarchy\"\n }\n onClick={handleDockToggle}\n title={`Dock mode: ${position.dockMode} (click to cycle)`}\n aria-label={`Dock mode: ${position.dockMode}. Click to cycle.`}\n />\n <Button\n variant=\"minimal\"\n size=\"small\"\n icon=\"reset\"\n onClick={() => metricsStore.reset()}\n title=\"Reset metrics\"\n aria-label=\"Reset metrics\"\n />\n <Button\n variant=\"minimal\"\n size=\"small\"\n icon=\"minimize\"\n onClick={() =>\n setPosition((prev) => ({ ...prev, collapsed: true }))\n }\n title=\"Minimize\"\n aria-label=\"Minimize devtools panel\"\n />\n </div>\n </div>\n\n <div className={styles.tabs} role=\"tablist\" aria-label=\"Devtools tabs\">\n {([\"performance\", \"compute\", \"intercept\", \"debugging\"] as const).map(\n (tab) => (\n <button\n key={tab}\n type=\"button\"\n role=\"tab\"\n aria-selected={activeTab === tab}\n className={classNames(\n styles.tabButton,\n activeTab === tab && styles.tabButtonActive\n )}\n onClick={() => setActiveTab(tab)}\n >\n {tab.charAt(0).toUpperCase() + tab.slice(1)}\n </button>\n )\n )}\n </div>\n\n <div className={styles.content}>\n {(!fiberCapabilities.hookInstalled ||\n !fiberCapabilities.fiberAccessWorking) && (\n <DegradationNotice onRetry={() => validateFiberAccess()} />\n )}\n\n <div\n className={\n activeTab === \"performance\"\n ? styles.tabContentVisible\n : styles.tabContentHidden\n }\n >\n <PerformanceTab\n metricsStore={metricsStore}\n monitorStore={monitorStore}\n />\n </div>\n <div\n className={\n activeTab === \"compute\"\n ? styles.tabContentVisible\n : styles.tabContentHidden\n }\n >\n <ComputeTab computeStore={computeStore} />\n </div>\n <div\n className={\n activeTab === \"intercept\"\n ? styles.tabContentVisible\n : styles.tabContentHidden\n }\n >\n <InterceptTab monitorStore={monitorStore} theme={resolvedTheme} />\n </div>\n <div\n className={\n activeTab === \"debugging\"\n ? styles.tabContentVisible\n : styles.tabContentHidden\n }\n >\n <DebuggingTab monitorStore={monitorStore} />\n </div>\n </div>\n </div>\n </PortalProvider>,\n shadowMount\n );\n};\n\nexport const SafeMonitoringPanel: React.FC<MonitoringPanelProps> = (props) => (\n <MonitorErrorBoundary>\n <MonitoringPanel {...props} />\n </MonitorErrorBoundary>\n);\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"MonitoringPanel.js","names":["Button","Classes","PortalProvider","Tab","Tabs","Tooltip","classNames","React","useCallback","useMemo","useRef","useState","createPortal","DegradationNotice","useFiberCapabilities","validateFiberAccess","usePersistedState","getDevtoolsShadowMount","ComputeTab","DebuggingTab","InterceptTab","MonitorErrorBoundary","PerformanceTab","styles","darkModeMql","window","matchMedia","undefined","subscribeDarkMode","callback","addEventListener","removeEventListener","getDarkModeSnapshot","matches","subscribeWindowSize","windowSizeSnapshot","width","innerWidth","height","innerHeight","getWindowSizeSnapshot","current","UI_CONSTANTS","DEFAULT_PANEL_WIDTH","DEFAULT_PANEL_HEIGHT","DEFAULT_PANEL_RIGHT_OFFSET","DEFAULT_PANEL_TOP_OFFSET","MIN_PANEL_WIDTH","MIN_PANEL_HEIGHT","TOOLTIP_HOVER_DELAY","DOCKED_BOTTOM_HEIGHT","DOCKED_RIGHT_WIDTH","MIN_DOCKED_BOTTOM_HEIGHT","MIN_DOCKED_RIGHT_WIDTH","MAX_DOCKED_BOTTOM_HEIGHT","MAX_DOCKED_RIGHT_WIDTH","DEVTOOLS_TAB_IDS","MonitoringPanel","monitorStore","metricsStore","getMetricsStore","computeStore","getComputeStore","fiberCapabilities","activeTab","setActiveTab","onActiveTabChange","newTabId","isDevtoolsTabId","position","setPosition","x","y","collapsed","dockMode","themePreference","setThemePreference","systemPrefersDark","useSyncExternalStore","resolvedTheme","shadowMount","panelEl","setPanelEl","isDragging","isResizing","dragStart","elemX","elemY","resizeStart","setPositionRef","dragAbortRef","attachDragListeners","abort","controller","AbortController","signal","document","e","deltaX","clientX","deltaY","clientY","prev","Math","max","min","handle","newHeight","newWidth","newX","newY","includes","handleMouseDown","target","closest","controls","preventDefault","handleResizeMouseDown","stopPropagation","handleDockToggle","nextMode","windowSize","effectivePosition","maxX","maxY","createElement","portalContainer","content","placement","hoverOpenDelay","className","minimized","onClick","minimizedIcon","panelClassName","panel","FOCUS_DISABLED","DARK","floating","dockedBottom","dockedRight","ref","style","left","top","right","bottom","cls","horizontal","vertical","corner","topLeft","topRight","bottomLeft","bottomRight","map","key","resizeHandle","onMouseDown","header","title","badge","variant","size","icon","reset","hookInstalled","fiberAccessWorking","notice","onRetry","tabs","selectedTabId","onChange","id","tabPanel","theme","SafeMonitoringPanel","props","some","tabId"],"sources":["MonitoringPanel.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { TabId } from \"@blueprintjs/core\";\nimport {\n Button,\n Classes,\n PortalProvider,\n Tab,\n Tabs,\n Tooltip,\n} from \"@blueprintjs/core\";\nimport classNames from \"classnames\";\nimport React, { useCallback, useMemo, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport {\n DegradationNotice,\n useFiberCapabilities,\n} from \"../fiber/DegradationNotice.js\";\nimport { validateFiberAccess } from \"../fiber/validation.js\";\nimport { usePersistedState } from \"../hooks/usePersistedState.js\";\nimport { getDevtoolsShadowMount } from \"../shadow/ShadowHost.js\";\nimport type { MonitorStore } from \"../store/MonitorStore.js\";\nimport type { PanelPosition } from \"../types/index.js\";\nimport { ComputeTab } from \"./ComputeTab.js\";\nimport { DebuggingTab } from \"./DebuggingTab.js\";\nimport { InterceptTab } from \"./InterceptTab.js\";\nimport { MonitorErrorBoundary } from \"./MonitorErrorBoundary.js\";\nimport { PerformanceTab } from \"./PerformanceTab.js\";\n\nimport styles from \"./MonitoringPanel.module.scss\";\n\nconst darkModeMql =\n typeof window !== \"undefined\"\n ? window.matchMedia(\"(prefers-color-scheme: dark)\")\n : undefined;\n\nfunction subscribeDarkMode(callback: () => void): () => void {\n if (darkModeMql) {\n darkModeMql.addEventListener(\"change\", callback);\n return () => darkModeMql.removeEventListener(\"change\", callback);\n }\n return () => {};\n}\n\nfunction getDarkModeSnapshot(): boolean {\n return darkModeMql ? darkModeMql.matches : true;\n}\n\nfunction subscribeWindowSize(callback: () => void): () => void {\n window.addEventListener(\"resize\", callback);\n return () => window.removeEventListener(\"resize\", callback);\n}\n\nlet windowSizeSnapshot =\n typeof window !== \"undefined\"\n ? { width: window.innerWidth, height: window.innerHeight }\n : { width: 0, height: 0 };\n\nfunction getWindowSizeSnapshot(): { width: number; height: number } {\n const current = { width: window.innerWidth, height: window.innerHeight };\n if (\n current.width !== windowSizeSnapshot.width ||\n current.height !== windowSizeSnapshot.height\n ) {\n windowSizeSnapshot = current;\n }\n return windowSizeSnapshot;\n}\n\nconst UI_CONSTANTS = {\n DEFAULT_PANEL_WIDTH: 400,\n DEFAULT_PANEL_HEIGHT: 600,\n DEFAULT_PANEL_RIGHT_OFFSET: 420,\n DEFAULT_PANEL_TOP_OFFSET: 20,\n MIN_PANEL_WIDTH: 320,\n MIN_PANEL_HEIGHT: 200,\n TOOLTIP_HOVER_DELAY: 500,\n DOCKED_BOTTOM_HEIGHT: 400,\n DOCKED_RIGHT_WIDTH: 500,\n MIN_DOCKED_BOTTOM_HEIGHT: 200,\n MIN_DOCKED_RIGHT_WIDTH: 320,\n MAX_DOCKED_BOTTOM_HEIGHT: 800,\n MAX_DOCKED_RIGHT_WIDTH: 800,\n};\n\nconst DEVTOOLS_TAB_IDS = [\n \"performance\",\n \"compute\",\n \"intercept\",\n \"debugging\",\n] as const;\n\ntype DevtoolsTabId = (typeof DEVTOOLS_TAB_IDS)[number];\n\nexport interface MonitoringPanelProps {\n /** The MonitorStore instance that provides all metrics, compute, and component tracking data. */\n monitorStore: MonitorStore;\n}\n\nexport const MonitoringPanel: React.FC<MonitoringPanelProps> = ({\n monitorStore,\n}) => {\n const metricsStore = monitorStore.getMetricsStore();\n const computeStore = monitorStore.getComputeStore();\n const fiberCapabilities = useFiberCapabilities();\n const [activeTab, setActiveTab] = useState<DevtoolsTabId>(\"performance\");\n const onActiveTabChange = useCallback((newTabId: TabId) => {\n if (isDevtoolsTabId(newTabId)) {\n setActiveTab(newTabId);\n }\n }, []);\n const [position, setPosition] = usePersistedState<PanelPosition>(\n `monitor-position`,\n {\n x: window.innerWidth - UI_CONSTANTS.DEFAULT_PANEL_RIGHT_OFFSET,\n y: UI_CONSTANTS.DEFAULT_PANEL_TOP_OFFSET,\n width: UI_CONSTANTS.DEFAULT_PANEL_WIDTH,\n height: UI_CONSTANTS.DEFAULT_PANEL_HEIGHT,\n collapsed: false,\n dockMode: \"floating\",\n }\n );\n\n const [themePreference, setThemePreference] = usePersistedState<\n \"light\" | \"dark\" | \"auto\"\n >(\"devtools-theme\", \"dark\");\n\n const systemPrefersDark = React.useSyncExternalStore(\n subscribeDarkMode,\n getDarkModeSnapshot\n );\n\n const resolvedTheme = useMemo(\n () =>\n themePreference === \"auto\"\n ? systemPrefersDark\n ? \"dark\"\n : \"light\"\n : themePreference,\n [themePreference, systemPrefersDark]\n );\n\n // Renders inside a shadow root so the bundled Blueprint + devtools CSS can't\n // leak into the page, and the page's CSS can't leak in.\n const [shadowMount] = useState(getDevtoolsShadowMount);\n\n // Callback-ref state so a re-render fires once the panel mounts; overlays\n // portal into it (see PortalProvider below) so the panel-scoped styles apply.\n const [panelEl, setPanelEl] = useState<HTMLDivElement | null>(null);\n const isDragging = useRef(false);\n const isResizing = useRef<string | null>(null);\n const dragStart = useRef({ x: 0, y: 0, elemX: 0, elemY: 0 });\n const resizeStart = useRef({\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n elemX: 0,\n elemY: 0,\n });\n\n const setPositionRef = useRef(setPosition);\n setPositionRef.current = setPosition;\n\n const dragAbortRef = useRef<AbortController | null>(null);\n\n const attachDragListeners = useCallback(() => {\n dragAbortRef.current?.abort();\n const controller = new AbortController();\n dragAbortRef.current = controller;\n const { signal } = controller;\n\n const handleMouseMove = (e: MouseEvent) => {\n if (isDragging.current) {\n const deltaX = e.clientX - dragStart.current.x;\n const deltaY = e.clientY - dragStart.current.y;\n setPositionRef.current((prev) => ({\n ...prev,\n x: Math.max(\n 0,\n Math.min(\n window.innerWidth - prev.width,\n dragStart.current.elemX + deltaX\n )\n ),\n y: Math.max(\n 0,\n Math.min(\n window.innerHeight - prev.height,\n dragStart.current.elemY + deltaY\n )\n ),\n }));\n } else if (isResizing.current) {\n const deltaX = e.clientX - resizeStart.current.x;\n const deltaY = e.clientY - resizeStart.current.y;\n const handle = isResizing.current;\n\n setPositionRef.current((prev) => {\n if (prev.dockMode === \"docked-bottom\") {\n const newHeight = Math.max(\n UI_CONSTANTS.MIN_DOCKED_BOTTOM_HEIGHT,\n Math.min(\n UI_CONSTANTS.MAX_DOCKED_BOTTOM_HEIGHT,\n resizeStart.current.height - deltaY\n )\n );\n return {\n ...prev,\n height: newHeight,\n y: window.innerHeight - newHeight,\n };\n }\n\n if (prev.dockMode === \"docked-right\") {\n const newWidth = Math.max(\n UI_CONSTANTS.MIN_DOCKED_RIGHT_WIDTH,\n Math.min(\n UI_CONSTANTS.MAX_DOCKED_RIGHT_WIDTH,\n resizeStart.current.width - deltaX\n )\n );\n return {\n ...prev,\n width: newWidth,\n x: window.innerWidth - newWidth,\n };\n }\n\n let newX = prev.x;\n let newY = prev.y;\n let newWidth = prev.width;\n let newHeight = prev.height;\n\n if (handle.includes(\"right\")) {\n newWidth = Math.max(\n UI_CONSTANTS.MIN_PANEL_WIDTH,\n resizeStart.current.width + deltaX\n );\n }\n if (handle.includes(\"left\")) {\n newWidth = Math.max(\n UI_CONSTANTS.MIN_PANEL_WIDTH,\n resizeStart.current.width - deltaX\n );\n newX = resizeStart.current.elemX + deltaX;\n if (newWidth === UI_CONSTANTS.MIN_PANEL_WIDTH) {\n newX =\n resizeStart.current.elemX +\n resizeStart.current.width -\n UI_CONSTANTS.MIN_PANEL_WIDTH;\n }\n }\n if (handle.includes(\"bottom\")) {\n newHeight = Math.max(\n UI_CONSTANTS.MIN_PANEL_HEIGHT,\n resizeStart.current.height + deltaY\n );\n }\n if (handle.includes(\"top\")) {\n newHeight = Math.max(\n UI_CONSTANTS.MIN_PANEL_HEIGHT,\n resizeStart.current.height - deltaY\n );\n newY = resizeStart.current.elemY + deltaY;\n if (newHeight === UI_CONSTANTS.MIN_PANEL_HEIGHT) {\n newY =\n resizeStart.current.elemY +\n resizeStart.current.height -\n UI_CONSTANTS.MIN_PANEL_HEIGHT;\n }\n }\n\n return {\n ...prev,\n x: newX,\n y: newY,\n width: newWidth,\n height: newHeight,\n };\n });\n }\n };\n\n const handleMouseUp = () => {\n isDragging.current = false;\n isResizing.current = null;\n controller.abort();\n dragAbortRef.current = null;\n };\n\n document.addEventListener(\"mousemove\", handleMouseMove, { signal });\n document.addEventListener(\"mouseup\", handleMouseUp, { signal });\n }, []);\n\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n if ((e.target as HTMLElement).closest(`.${styles.controls}`)) {\n return;\n }\n if (position.dockMode !== \"floating\") {\n return;\n }\n isDragging.current = true;\n dragStart.current = {\n x: e.clientX,\n y: e.clientY,\n elemX: position.x,\n elemY: position.y,\n };\n e.preventDefault();\n attachDragListeners();\n },\n [position, attachDragListeners]\n );\n\n const handleResizeMouseDown = useCallback(\n (e: React.MouseEvent, handle: string) => {\n isResizing.current = handle;\n resizeStart.current = {\n x: e.clientX,\n y: e.clientY,\n width: position.width,\n height: position.height,\n elemX: position.x,\n elemY: position.y,\n };\n e.preventDefault();\n e.stopPropagation();\n attachDragListeners();\n },\n [position, attachDragListeners]\n );\n\n const handleDockToggle = useCallback(() => {\n setPosition((prev) => {\n const nextMode =\n prev.dockMode === \"floating\"\n ? \"docked-bottom\"\n : prev.dockMode === \"docked-bottom\"\n ? \"docked-right\"\n : \"floating\";\n\n if (nextMode === \"docked-bottom\") {\n return {\n x: 0,\n y: window.innerHeight - UI_CONSTANTS.DOCKED_BOTTOM_HEIGHT,\n width: window.innerWidth,\n height: UI_CONSTANTS.DOCKED_BOTTOM_HEIGHT,\n collapsed: false,\n dockMode: nextMode,\n };\n } else if (nextMode === \"docked-right\") {\n return {\n x: window.innerWidth - UI_CONSTANTS.DOCKED_RIGHT_WIDTH,\n y: 0,\n width: UI_CONSTANTS.DOCKED_RIGHT_WIDTH,\n height: window.innerHeight,\n collapsed: false,\n dockMode: nextMode,\n };\n } else {\n return {\n x: window.innerWidth - UI_CONSTANTS.DEFAULT_PANEL_RIGHT_OFFSET,\n y: UI_CONSTANTS.DEFAULT_PANEL_TOP_OFFSET,\n width: UI_CONSTANTS.DEFAULT_PANEL_WIDTH,\n height: UI_CONSTANTS.DEFAULT_PANEL_HEIGHT,\n collapsed: false,\n dockMode: nextMode,\n };\n }\n });\n }, [setPosition]);\n\n const windowSize = React.useSyncExternalStore(\n subscribeWindowSize,\n getWindowSizeSnapshot\n );\n\n const effectivePosition = useMemo(() => {\n if (position.dockMode === \"floating\") {\n const maxX = windowSize.width - position.width;\n const maxY = windowSize.height - position.height;\n return {\n ...position,\n x: Math.max(0, Math.min(position.x, maxX)),\n y: Math.max(0, Math.min(position.y, maxY)),\n };\n }\n if (position.dockMode === \"docked-bottom\") {\n return {\n ...position,\n width: windowSize.width,\n y: windowSize.height - position.height,\n };\n }\n if (position.dockMode === \"docked-right\") {\n return {\n ...position,\n height: windowSize.height,\n x: windowSize.width - position.width,\n };\n }\n return position;\n }, [position, windowSize]);\n\n if (position.collapsed) {\n return createPortal(\n <PortalProvider portalContainer={shadowMount}>\n <Tooltip\n content=\"View OSDK Devtools\"\n placement=\"left\"\n hoverOpenDelay={UI_CONSTANTS.TOOLTIP_HOVER_DELAY}\n >\n <div\n className={styles.minimized}\n data-dt-theme={resolvedTheme}\n aria-label=\"View OSDK Devtools\"\n onClick={() =>\n setPosition((prev) => ({ ...prev, collapsed: false }))\n }\n >\n <span className={styles.minimizedIcon}></></span>\n </div>\n </Tooltip>\n </PortalProvider>,\n shadowMount\n );\n }\n\n const panelClassName = classNames(\n styles.panel,\n // Class needed to remove the useless outline added on tabs/buttons\n Classes.FOCUS_DISABLED,\n resolvedTheme === \"dark\" ? Classes.DARK : undefined,\n {\n [styles.floating]: position.dockMode === \"floating\",\n [styles.dockedBottom]: position.dockMode === \"docked-bottom\",\n [styles.dockedRight]: position.dockMode === \"docked-right\",\n }\n );\n return createPortal(\n <PortalProvider portalContainer={panelEl ?? shadowMount}>\n <div\n ref={setPanelEl}\n className={panelClassName}\n data-dt-theme={resolvedTheme}\n style={{\n left:\n effectivePosition.dockMode === \"docked-bottom\"\n ? 0\n : effectivePosition.x,\n top:\n effectivePosition.dockMode === \"docked-right\"\n ? 0\n : effectivePosition.y,\n width: effectivePosition.width,\n height: effectivePosition.height,\n right: effectivePosition.dockMode === \"docked-right\" ? 0 : undefined,\n bottom:\n effectivePosition.dockMode === \"docked-bottom\" ? 0 : undefined,\n }}\n >\n {(position.dockMode === \"floating\"\n ? [\n { cls: [styles.horizontal, styles.top], handle: \"top\" },\n { cls: [styles.horizontal, styles.bottom], handle: \"bottom\" },\n { cls: [styles.vertical, styles.left], handle: \"left\" },\n { cls: [styles.vertical, styles.right], handle: \"right\" },\n { cls: [styles.corner, styles.topLeft], handle: \"topLeft\" },\n { cls: [styles.corner, styles.topRight], handle: \"topRight\" },\n {\n cls: [styles.corner, styles.bottomLeft],\n handle: \"bottomLeft\",\n },\n {\n cls: [styles.corner, styles.bottomRight],\n handle: \"bottomRight\",\n },\n ]\n : position.dockMode === \"docked-bottom\"\n ? [{ cls: [styles.horizontal, styles.top], handle: \"top\" }]\n : position.dockMode === \"docked-right\"\n ? [{ cls: [styles.vertical, styles.left], handle: \"left\" }]\n : []\n ).map(({ cls, handle }) => (\n <div\n key={handle}\n className={classNames(styles.resizeHandle, ...cls)}\n onMouseDown={(e) => handleResizeMouseDown(e, handle)}\n />\n ))}\n\n <div className={styles.header} onMouseDown={handleMouseDown}>\n <h3 className={styles.title}>\n OSDK Devtools\n <span className={styles.badge}>Beta</span>\n </h3>\n <div className={styles.controls}>\n <Button\n variant=\"minimal\"\n size=\"small\"\n icon={\n themePreference === \"dark\"\n ? \"moon\"\n : themePreference === \"light\"\n ? \"flash\"\n : \"automatic-updates\"\n }\n onClick={() =>\n setThemePreference(\n themePreference === \"dark\"\n ? \"light\"\n : themePreference === \"light\"\n ? \"auto\"\n : \"dark\"\n )\n }\n title={`Theme: ${themePreference} (click to cycle)`}\n aria-label={`Theme: ${themePreference}. Click to cycle.`}\n />\n <Button\n variant=\"minimal\"\n size=\"small\"\n icon={\n position.dockMode === \"floating\"\n ? \"widget\"\n : position.dockMode === \"docked-bottom\"\n ? \"layout-sorted-clusters\"\n : \"layout-hierarchy\"\n }\n onClick={handleDockToggle}\n title={`Dock mode: ${position.dockMode} (click to cycle)`}\n aria-label={`Dock mode: ${position.dockMode}. Click to cycle.`}\n />\n <Button\n variant=\"minimal\"\n size=\"small\"\n icon=\"reset\"\n onClick={() => metricsStore.reset()}\n title=\"Reset metrics\"\n aria-label=\"Reset metrics\"\n />\n <Button\n variant=\"minimal\"\n size=\"small\"\n icon=\"minimize\"\n onClick={() =>\n setPosition((prev) => ({ ...prev, collapsed: true }))\n }\n title=\"Minimize\"\n aria-label=\"Minimize devtools panel\"\n />\n </div>\n </div>\n\n <div className={styles.content}>\n {(!fiberCapabilities.hookInstalled ||\n !fiberCapabilities.fiberAccessWorking) && (\n <DegradationNotice\n className={styles.notice}\n onRetry={() => validateFiberAccess()}\n />\n )}\n\n <Tabs\n className={styles.tabs}\n selectedTabId={activeTab}\n onChange={onActiveTabChange}\n >\n <Tab\n id=\"performance\"\n title=\"Performance\"\n panelClassName={styles.tabPanel}\n panel={\n <PerformanceTab\n metricsStore={metricsStore}\n monitorStore={monitorStore}\n />\n }\n />\n <Tab\n id=\"compute\"\n title=\"Compute\"\n panelClassName={styles.tabPanel}\n panel={<ComputeTab computeStore={computeStore} />}\n />\n <Tab\n id=\"intercept\"\n title=\"Intercept\"\n panelClassName={styles.tabPanel}\n panel={\n <InterceptTab\n monitorStore={monitorStore}\n theme={resolvedTheme}\n />\n }\n />\n <Tab\n id=\"debugging\"\n title=\"Debugging\"\n panelClassName={styles.tabPanel}\n panel={<DebuggingTab monitorStore={monitorStore} />}\n />\n </Tabs>\n </div>\n </div>\n </PortalProvider>,\n shadowMount\n );\n};\n\nexport const SafeMonitoringPanel: React.FC<MonitoringPanelProps> = (props) => (\n <MonitorErrorBoundary>\n <MonitoringPanel {...props} />\n </MonitorErrorBoundary>\n);\n\nfunction isDevtoolsTabId(id: string | number): id is DevtoolsTabId {\n return DEVTOOLS_TAB_IDS.some((tabId) => tabId === id);\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -23,11 +23,9 @@ const styles = {
|
|
|
23
23
|
"controls": "MonitoringPanel-module__controls___0x-Xb00n",
|
|
24
24
|
"iconButton": "MonitoringPanel-module__iconButton___Ofs4kVaT",
|
|
25
25
|
"content": "MonitoringPanel-module__content___ZVPMCH4O",
|
|
26
|
+
"notice": "MonitoringPanel-module__notice___W3C3JBnI",
|
|
26
27
|
"tabs": "MonitoringPanel-module__tabs___bqn6HDbz",
|
|
27
|
-
"
|
|
28
|
-
"tabButtonActive": "MonitoringPanel-module__tabButtonActive___gEhlfE4y",
|
|
29
|
-
"tabContentVisible": "MonitoringPanel-module__tabContentVisible___llXLpVeb",
|
|
30
|
-
"tabContentHidden": "MonitoringPanel-module__tabContentHidden___Hm4ckAQm",
|
|
28
|
+
"tabPanel": "MonitoringPanel-module__tabPanel___fRtsspWk",
|
|
31
29
|
"metricsGrid": "MonitoringPanel-module__metricsGrid___Ui5kYWKE",
|
|
32
30
|
"computeMetricsGrid": "MonitoringPanel-module__computeMetricsGrid___7yTv8eKM",
|
|
33
31
|
"metricCell": "MonitoringPanel-module__metricCell___5zQ-5e-x",
|
|
@@ -54,7 +54,8 @@ function getCapabilitiesSnapshot() {
|
|
|
54
54
|
}
|
|
55
55
|
export const DegradationNotice = ({
|
|
56
56
|
onRetry,
|
|
57
|
-
showWhenHealthy = false
|
|
57
|
+
showWhenHealthy = false,
|
|
58
|
+
className
|
|
58
59
|
}) => {
|
|
59
60
|
const capabilities = React.useSyncExternalStore(subscribeToCapabilities, getCapabilitiesSnapshot, getCapabilitiesSnapshot);
|
|
60
61
|
const disabledFeatures = [...capabilities.disabledFeatures];
|
|
@@ -64,6 +65,7 @@ export const DegradationNotice = ({
|
|
|
64
65
|
}
|
|
65
66
|
if (!hasIssues && showWhenHealthy) {
|
|
66
67
|
return /*#__PURE__*/React.createElement(Callout, {
|
|
68
|
+
className: className,
|
|
67
69
|
intent: Intent.SUCCESS,
|
|
68
70
|
icon: "tick-circle",
|
|
69
71
|
title: "Fiber Access Healthy",
|
|
@@ -78,6 +80,7 @@ export const DegradationNotice = ({
|
|
|
78
80
|
}
|
|
79
81
|
if (!capabilities.hookInstalled) {
|
|
80
82
|
return /*#__PURE__*/React.createElement(Callout, {
|
|
83
|
+
className: className,
|
|
81
84
|
intent: Intent.WARNING,
|
|
82
85
|
icon: "warning-sign",
|
|
83
86
|
title: "DevTools Hook Not Installed",
|
|
@@ -98,6 +101,7 @@ export const DegradationNotice = ({
|
|
|
98
101
|
}
|
|
99
102
|
if (!capabilities.rendererDetected) {
|
|
100
103
|
return /*#__PURE__*/React.createElement(Callout, {
|
|
104
|
+
className: className,
|
|
101
105
|
intent: Intent.PRIMARY,
|
|
102
106
|
icon: "time",
|
|
103
107
|
title: "Waiting for React",
|
|
@@ -120,6 +124,7 @@ export const DegradationNotice = ({
|
|
|
120
124
|
}
|
|
121
125
|
if (!capabilities.fiberAccessWorking) {
|
|
122
126
|
return /*#__PURE__*/React.createElement(Callout, {
|
|
127
|
+
className: className,
|
|
123
128
|
intent: Intent.DANGER,
|
|
124
129
|
icon: "error",
|
|
125
130
|
title: "Fiber Access Unavailable",
|
|
@@ -143,6 +148,7 @@ export const DegradationNotice = ({
|
|
|
143
148
|
}, "Retry"));
|
|
144
149
|
}
|
|
145
150
|
return /*#__PURE__*/React.createElement(Callout, {
|
|
151
|
+
className: className,
|
|
146
152
|
intent: Intent.WARNING,
|
|
147
153
|
icon: "warning-sign",
|
|
148
154
|
title: "Some Features Disabled",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DegradationNotice.js","names":["Button","Callout","Intent","Tag","React","getCapabilitiesManager","onReactDetected","validateFiberAccess","FEATURE_LABELS","FEATURE_DESCRIPTIONS","subscribeToCapabilities","onStoreChange","manager","unsubscribe","onCapabilitiesChange","unsubscribeReactDetected","getCapabilitiesSnapshot","getCapabilities","DegradationNotice","onRetry","showWhenHealthy","capabilities","useSyncExternalStore","disabledFeatures","hasIssues","fiberAccessWorking","length","createElement","intent","SUCCESS","icon","title","style","margin","detectedReactVersion","Fragment","hookInstalled","WARNING","fontSize","color","rendererDetected","PRIMARY","size","variant","onClick","marginTop","DANGER","display","flexWrap","gap","marginBottom","map","feature","key","minimal","errorCount","resetAll","subscribeToCapabilitiesSimple","useFiberCapabilities"],"sources":["DegradationNotice.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Button, Callout, Intent, Tag } from \"@blueprintjs/core\";\nimport React from \"react\";\n\nimport {\n type FiberCapabilities,\n type FiberFeature,\n getCapabilitiesManager,\n} from \"./capabilities.js\";\nimport { onReactDetected } from \"./DevtoolsHook.js\";\nimport { validateFiberAccess } from \"./validation.js\";\n\nconst FEATURE_LABELS: Record<FiberFeature, string> = {\n \"component-inspection\": \"Component Inspection\",\n \"hook-discovery\": \"Hook Discovery\",\n \"render-tracking\": \"Render Tracking\",\n \"state-inspection\": \"State Inspection\",\n \"metadata-extraction\": \"Metadata Extraction\",\n \"fiber-discovery\": \"Fiber Discovery\",\n};\n\nconst FEATURE_DESCRIPTIONS: Record<FiberFeature, string> = {\n \"component-inspection\": \"View component hierarchy and props\",\n \"hook-discovery\": \"Detect OSDK hooks in components\",\n \"render-tracking\": \"Track component re-renders\",\n \"state-inspection\": \"Inspect component state and hooks\",\n \"metadata-extraction\": \"Extract OSDK hook metadata from fibers\",\n \"fiber-discovery\": \"Discover OSDK components from fiber tree\",\n};\n\nexport interface DegradationNoticeProps {\n onRetry?: () => void;\n showWhenHealthy?: boolean;\n}\n\nfunction subscribeToCapabilities(onStoreChange: () => void): () => void {\n const manager = getCapabilitiesManager();\n\n validateFiberAccess();\n\n const unsubscribe = manager.onCapabilitiesChange(() => {\n onStoreChange();\n });\n\n const unsubscribeReactDetected = onReactDetected(() => {\n validateFiberAccess();\n });\n\n return () => {\n unsubscribe();\n unsubscribeReactDetected();\n };\n}\n\nfunction getCapabilitiesSnapshot(): FiberCapabilities {\n return getCapabilitiesManager().getCapabilities();\n}\n\nexport const DegradationNotice: React.FC<DegradationNoticeProps> = ({\n onRetry,\n showWhenHealthy = false,\n}) => {\n const capabilities = React.useSyncExternalStore(\n subscribeToCapabilities,\n getCapabilitiesSnapshot,\n getCapabilitiesSnapshot\n );\n\n const disabledFeatures = [...capabilities.disabledFeatures];\n const hasIssues =\n !capabilities.fiberAccessWorking || disabledFeatures.length > 0;\n\n if (!hasIssues && !showWhenHealthy) {\n return null;\n }\n\n if (!hasIssues && showWhenHealthy) {\n return (\n <Callout\n intent={Intent.SUCCESS}\n icon=\"tick-circle\"\n title=\"Fiber Access Healthy\"\n style={{ margin: \"8px\" }}\n >\n <p style={{ margin: 0 }}>\n All fiber features are working correctly.\n {capabilities.detectedReactVersion && (\n <>React {capabilities.detectedReactVersion} detected.</>\n )}\n </p>\n </Callout>\n );\n }\n\n if (!capabilities.hookInstalled) {\n return (\n <Callout\n intent={Intent.WARNING}\n icon=\"warning-sign\"\n title=\"DevTools Hook Not Installed\"\n style={{ margin: \"8px\" }}\n >\n <p style={{ margin: \"0 0 8px 0\" }}>\n The React DevTools hook was not installed before React loaded. Some\n features may be unavailable.\n </p>\n <p style={{ margin: 0, fontSize: \"12px\", color: \"#5c7080\" }}>\n Ensure the devtools are imported before React in your entry point.\n </p>\n </Callout>\n );\n }\n\n if (!capabilities.rendererDetected) {\n return (\n <Callout\n intent={Intent.PRIMARY}\n icon=\"time\"\n title=\"Waiting for React\"\n style={{ margin: \"8px\" }}\n >\n <p style={{ margin: 0 }}>\n No React renderer detected yet. React may still be loading.\n </p>\n {onRetry && (\n <Button\n size=\"small\"\n variant=\"minimal\"\n intent={Intent.PRIMARY}\n onClick={onRetry}\n style={{ marginTop: \"8px\" }}\n >\n Check Again\n </Button>\n )}\n </Callout>\n );\n }\n\n if (!capabilities.fiberAccessWorking) {\n return (\n <Callout\n intent={Intent.DANGER}\n icon=\"error\"\n title=\"Fiber Access Unavailable\"\n style={{ margin: \"8px\" }}\n >\n <p style={{ margin: \"0 0 8px 0\" }}>\n Unable to access React's internal fiber tree. Component\n inspection and related features are disabled.\n </p>\n {capabilities.detectedReactVersion && (\n <p\n style={{ margin: \"0 0 8px 0\", fontSize: \"12px\", color: \"#5c7080\" }}\n >\n React {capabilities.detectedReactVersion} detected\n </p>\n )}\n {onRetry && (\n <Button size=\"small\" intent={Intent.PRIMARY} onClick={onRetry}>\n Retry\n </Button>\n )}\n </Callout>\n );\n }\n\n return (\n <Callout\n intent={Intent.WARNING}\n icon=\"warning-sign\"\n title=\"Some Features Disabled\"\n style={{ margin: \"8px\" }}\n >\n <p style={{ margin: \"0 0 8px 0\" }}>\n The following features have been temporarily disabled due to errors:\n </p>\n <div\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: \"4px\",\n marginBottom: \"8px\",\n }}\n >\n {disabledFeatures.map((feature) => (\n <Tag\n key={feature}\n intent={Intent.WARNING}\n minimal\n title={FEATURE_DESCRIPTIONS[feature]}\n >\n {FEATURE_LABELS[feature]}\n </Tag>\n ))}\n </div>\n {capabilities.errorCount > 0 && (\n <p style={{ margin: \"0 0 8px 0\", fontSize: \"12px\", color: \"#5c7080\" }}>\n {capabilities.errorCount} error\n {capabilities.errorCount > 1 ? \"s\" : \"\"} recorded. Features will\n auto-recover after 30 seconds of successful operation.\n </p>\n )}\n {onRetry && (\n <Button\n size=\"small\"\n variant=\"minimal\"\n intent={Intent.WARNING}\n onClick={() => {\n getCapabilitiesManager().resetAll();\n onRetry();\n }}\n >\n Reset & Retry\n </Button>\n )}\n </Callout>\n );\n};\n\nfunction subscribeToCapabilitiesSimple(onStoreChange: () => void): () => void {\n const manager = getCapabilitiesManager();\n return manager.onCapabilitiesChange(() => {\n onStoreChange();\n });\n}\n\nexport function useFiberCapabilities(): FiberCapabilities {\n return React.useSyncExternalStore(\n subscribeToCapabilitiesSimple,\n getCapabilitiesSnapshot,\n getCapabilitiesSnapshot\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"DegradationNotice.js","names":["Button","Callout","Intent","Tag","React","getCapabilitiesManager","onReactDetected","validateFiberAccess","FEATURE_LABELS","FEATURE_DESCRIPTIONS","subscribeToCapabilities","onStoreChange","manager","unsubscribe","onCapabilitiesChange","unsubscribeReactDetected","getCapabilitiesSnapshot","getCapabilities","DegradationNotice","onRetry","showWhenHealthy","className","capabilities","useSyncExternalStore","disabledFeatures","hasIssues","fiberAccessWorking","length","createElement","intent","SUCCESS","icon","title","style","margin","detectedReactVersion","Fragment","hookInstalled","WARNING","fontSize","color","rendererDetected","PRIMARY","size","variant","onClick","marginTop","DANGER","display","flexWrap","gap","marginBottom","map","feature","key","minimal","errorCount","resetAll","subscribeToCapabilitiesSimple","useFiberCapabilities"],"sources":["DegradationNotice.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Button, Callout, Intent, Tag } from \"@blueprintjs/core\";\nimport React from \"react\";\n\nimport {\n type FiberCapabilities,\n type FiberFeature,\n getCapabilitiesManager,\n} from \"./capabilities.js\";\nimport { onReactDetected } from \"./DevtoolsHook.js\";\nimport { validateFiberAccess } from \"./validation.js\";\n\nconst FEATURE_LABELS: Record<FiberFeature, string> = {\n \"component-inspection\": \"Component Inspection\",\n \"hook-discovery\": \"Hook Discovery\",\n \"render-tracking\": \"Render Tracking\",\n \"state-inspection\": \"State Inspection\",\n \"metadata-extraction\": \"Metadata Extraction\",\n \"fiber-discovery\": \"Fiber Discovery\",\n};\n\nconst FEATURE_DESCRIPTIONS: Record<FiberFeature, string> = {\n \"component-inspection\": \"View component hierarchy and props\",\n \"hook-discovery\": \"Detect OSDK hooks in components\",\n \"render-tracking\": \"Track component re-renders\",\n \"state-inspection\": \"Inspect component state and hooks\",\n \"metadata-extraction\": \"Extract OSDK hook metadata from fibers\",\n \"fiber-discovery\": \"Discover OSDK components from fiber tree\",\n};\n\nexport interface DegradationNoticeProps {\n onRetry?: () => void;\n showWhenHealthy?: boolean;\n className?: string;\n}\n\nfunction subscribeToCapabilities(onStoreChange: () => void): () => void {\n const manager = getCapabilitiesManager();\n\n validateFiberAccess();\n\n const unsubscribe = manager.onCapabilitiesChange(() => {\n onStoreChange();\n });\n\n const unsubscribeReactDetected = onReactDetected(() => {\n validateFiberAccess();\n });\n\n return () => {\n unsubscribe();\n unsubscribeReactDetected();\n };\n}\n\nfunction getCapabilitiesSnapshot(): FiberCapabilities {\n return getCapabilitiesManager().getCapabilities();\n}\n\nexport const DegradationNotice: React.FC<DegradationNoticeProps> = ({\n onRetry,\n showWhenHealthy = false,\n className,\n}) => {\n const capabilities = React.useSyncExternalStore(\n subscribeToCapabilities,\n getCapabilitiesSnapshot,\n getCapabilitiesSnapshot\n );\n\n const disabledFeatures = [...capabilities.disabledFeatures];\n const hasIssues =\n !capabilities.fiberAccessWorking || disabledFeatures.length > 0;\n\n if (!hasIssues && !showWhenHealthy) {\n return null;\n }\n\n if (!hasIssues && showWhenHealthy) {\n return (\n <Callout\n className={className}\n intent={Intent.SUCCESS}\n icon=\"tick-circle\"\n title=\"Fiber Access Healthy\"\n style={{ margin: \"8px\" }}\n >\n <p style={{ margin: 0 }}>\n All fiber features are working correctly.\n {capabilities.detectedReactVersion && (\n <>React {capabilities.detectedReactVersion} detected.</>\n )}\n </p>\n </Callout>\n );\n }\n\n if (!capabilities.hookInstalled) {\n return (\n <Callout\n className={className}\n intent={Intent.WARNING}\n icon=\"warning-sign\"\n title=\"DevTools Hook Not Installed\"\n style={{ margin: \"8px\" }}\n >\n <p style={{ margin: \"0 0 8px 0\" }}>\n The React DevTools hook was not installed before React loaded. Some\n features may be unavailable.\n </p>\n <p style={{ margin: 0, fontSize: \"12px\", color: \"#5c7080\" }}>\n Ensure the devtools are imported before React in your entry point.\n </p>\n </Callout>\n );\n }\n\n if (!capabilities.rendererDetected) {\n return (\n <Callout\n className={className}\n intent={Intent.PRIMARY}\n icon=\"time\"\n title=\"Waiting for React\"\n style={{ margin: \"8px\" }}\n >\n <p style={{ margin: 0 }}>\n No React renderer detected yet. React may still be loading.\n </p>\n {onRetry && (\n <Button\n size=\"small\"\n variant=\"minimal\"\n intent={Intent.PRIMARY}\n onClick={onRetry}\n style={{ marginTop: \"8px\" }}\n >\n Check Again\n </Button>\n )}\n </Callout>\n );\n }\n\n if (!capabilities.fiberAccessWorking) {\n return (\n <Callout\n className={className}\n intent={Intent.DANGER}\n icon=\"error\"\n title=\"Fiber Access Unavailable\"\n style={{ margin: \"8px\" }}\n >\n <p style={{ margin: \"0 0 8px 0\" }}>\n Unable to access React's internal fiber tree. Component\n inspection and related features are disabled.\n </p>\n {capabilities.detectedReactVersion && (\n <p\n style={{ margin: \"0 0 8px 0\", fontSize: \"12px\", color: \"#5c7080\" }}\n >\n React {capabilities.detectedReactVersion} detected\n </p>\n )}\n {onRetry && (\n <Button size=\"small\" intent={Intent.PRIMARY} onClick={onRetry}>\n Retry\n </Button>\n )}\n </Callout>\n );\n }\n\n return (\n <Callout\n className={className}\n intent={Intent.WARNING}\n icon=\"warning-sign\"\n title=\"Some Features Disabled\"\n style={{ margin: \"8px\" }}\n >\n <p style={{ margin: \"0 0 8px 0\" }}>\n The following features have been temporarily disabled due to errors:\n </p>\n <div\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: \"4px\",\n marginBottom: \"8px\",\n }}\n >\n {disabledFeatures.map((feature) => (\n <Tag\n key={feature}\n intent={Intent.WARNING}\n minimal={true}\n title={FEATURE_DESCRIPTIONS[feature]}\n >\n {FEATURE_LABELS[feature]}\n </Tag>\n ))}\n </div>\n {capabilities.errorCount > 0 && (\n <p style={{ margin: \"0 0 8px 0\", fontSize: \"12px\", color: \"#5c7080\" }}>\n {capabilities.errorCount} error\n {capabilities.errorCount > 1 ? \"s\" : \"\"} recorded. Features will\n auto-recover after 30 seconds of successful operation.\n </p>\n )}\n {onRetry && (\n <Button\n size=\"small\"\n variant=\"minimal\"\n intent={Intent.WARNING}\n onClick={() => {\n getCapabilitiesManager().resetAll();\n onRetry();\n }}\n >\n Reset & Retry\n </Button>\n )}\n </Callout>\n );\n};\n\nfunction subscribeToCapabilitiesSimple(onStoreChange: () => void): () => void {\n const manager = getCapabilitiesManager();\n return manager.onCapabilitiesChange(() => {\n onStoreChange();\n });\n}\n\nexport function useFiberCapabilities(): FiberCapabilities {\n return React.useSyncExternalStore(\n subscribeToCapabilitiesSimple,\n getCapabilitiesSnapshot,\n getCapabilitiesSnapshot\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2025 Palantir Technologies, Inc. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { useCallback, useMemo, useSyncExternalStore } from "react";
|
|
18
|
+
import { getClientMetrics } from "../metrics/clientMetrics.js";
|
|
19
|
+
/**
|
|
20
|
+
* Subscribes to the metrics store and returns the full {@link ClientMetrics}
|
|
21
|
+
* set, recomputed whenever any metric changes. It is meant for a single surface
|
|
22
|
+
* that renders these metrics together (the Overview tab), where re-rendering the
|
|
23
|
+
* whole group on any change is expected. If a consumer ever needs one metric in
|
|
24
|
+
* isolation (without re-rendering when unrelated metrics change), add a selector
|
|
25
|
+
* overload here rather than reading a single field off the full result.
|
|
26
|
+
*/
|
|
27
|
+
export function useClientMetrics(monitorStore) {
|
|
28
|
+
const store = monitorStore.getMetricsStore();
|
|
29
|
+
const subscribe = useCallback(callback => store.subscribe(callback), [store]);
|
|
30
|
+
const getSnapshot = useCallback(() => store.getSnapshot(), [store]);
|
|
31
|
+
const snapshot = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
|
|
32
|
+
return useMemo(() => getClientMetrics(snapshot), [snapshot]);
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=useClientMetrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useClientMetrics.js","names":["useCallback","useMemo","useSyncExternalStore","getClientMetrics","useClientMetrics","monitorStore","store","getMetricsStore","subscribe","callback","getSnapshot","snapshot"],"sources":["useClientMetrics.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useCallback, useMemo, useSyncExternalStore } from \"react\";\n\nimport type { ClientMetrics } from \"../metrics/clientMetrics.js\";\nimport { getClientMetrics } from \"../metrics/clientMetrics.js\";\nimport type { MonitorStore } from \"../store/MonitorStore.js\";\n\n/**\n * Subscribes to the metrics store and returns the full {@link ClientMetrics}\n * set, recomputed whenever any metric changes. It is meant for a single surface\n * that renders these metrics together (the Overview tab), where re-rendering the\n * whole group on any change is expected. If a consumer ever needs one metric in\n * isolation (without re-rendering when unrelated metrics change), add a selector\n * overload here rather than reading a single field off the full result.\n */\nexport function useClientMetrics(monitorStore: MonitorStore): ClientMetrics {\n const store = monitorStore.getMetricsStore();\n const subscribe = useCallback(\n (callback: () => void) => store.subscribe(callback),\n [store]\n );\n const getSnapshot = useCallback(() => store.getSnapshot(), [store]);\n const snapshot = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n return useMemo(() => getClientMetrics(snapshot), [snapshot]);\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,WAAW,EAAEC,OAAO,EAAEC,oBAAoB,QAAQ,OAAO;AAGlE,SAASC,gBAAgB,QAAQ,6BAA6B;AAG9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,gBAAgBA,CAACC,YAA0B,EAAiB;EAC1E,MAAMC,KAAK,GAAGD,YAAY,CAACE,eAAe,CAAC,CAAC;EAC5C,MAAMC,SAAS,GAAGR,WAAW,CAC1BS,QAAoB,IAAKH,KAAK,CAACE,SAAS,CAACC,QAAQ,CAAC,EACnD,CAACH,KAAK,CACR,CAAC;EACD,MAAMI,WAAW,GAAGV,WAAW,CAAC,MAAMM,KAAK,CAACI,WAAW,CAAC,CAAC,EAAE,CAACJ,KAAK,CAAC,CAAC;EACnE,MAAMK,QAAQ,GAAGT,oBAAoB,CAACM,SAAS,EAAEE,WAAW,EAAEA,WAAW,CAAC;EAC1E,OAAOT,OAAO,CAAC,MAAME,gBAAgB,CAACQ,QAAQ,CAAC,EAAE,CAACA,QAAQ,CAAC,CAAC;AAC9D","ignoreList":[]}
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
17
|
import React from "react";
|
|
18
|
+
const OSDK_DEVTOOLS_KEY_PREFIX = "osdk-";
|
|
18
19
|
function readFromStorage(key, defaultValue) {
|
|
19
20
|
if (typeof window === "undefined") {
|
|
20
21
|
return defaultValue;
|
|
@@ -26,8 +27,13 @@ function readFromStorage(key, defaultValue) {
|
|
|
26
27
|
return defaultValue;
|
|
27
28
|
}
|
|
28
29
|
}
|
|
29
|
-
export function usePersistedState(
|
|
30
|
+
export function usePersistedState(
|
|
31
|
+
/**
|
|
32
|
+
* The key will be prefixed with `OSDK_DEVTOOLS_KEY_PREFIX`
|
|
33
|
+
*/
|
|
34
|
+
initialKey, defaultValue) {
|
|
30
35
|
const storeRef = React.useRef(null);
|
|
36
|
+
const key = `${OSDK_DEVTOOLS_KEY_PREFIX}${initialKey}`;
|
|
31
37
|
if (storeRef.current == null || storeRef.current.key !== key) {
|
|
32
38
|
storeRef.current = {
|
|
33
39
|
key,
|
|
@@ -86,4 +92,24 @@ export function usePersistedState(key, defaultValue) {
|
|
|
86
92
|
}, [key]);
|
|
87
93
|
return [value, setPersistedValue];
|
|
88
94
|
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Function exported for testing.
|
|
98
|
+
* We don't want tests to use localStorage directly since the storage layer could change
|
|
99
|
+
*/
|
|
100
|
+
export function clearPersistedState() {
|
|
101
|
+
if (typeof window === "undefined") {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
const keysToRemove = [];
|
|
105
|
+
for (let i = 0; i < localStorage.length; i++) {
|
|
106
|
+
const key = localStorage.key(i);
|
|
107
|
+
if (key != null && key.startsWith(OSDK_DEVTOOLS_KEY_PREFIX)) {
|
|
108
|
+
keysToRemove.push(key);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
for (const key of keysToRemove) {
|
|
112
|
+
localStorage.removeItem(key);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
89
115
|
//# sourceMappingURL=usePersistedState.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePersistedState.js","names":["React","readFromStorage","key","defaultValue","window","stored","localStorage","getItem","JSON","parse","usePersistedState","storeRef","useRef","current","value","listeners","Set","subscribe","useCallback","callback","store","add","handleStorageChange","e","newValue","listener","addEventListener","delete","removeEventListener","getSnapshot","useSyncExternalStore","setPersistedValue","resolvedValue","setItem","stringify"],"sources":["usePersistedState.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from \"react\";\n\nfunction readFromStorage<T>(key: string, defaultValue: T): T {\n if (typeof window === \"undefined\") {\n return defaultValue;\n }\n\n try {\n const stored = localStorage.getItem(key);\n return stored ? JSON.parse(stored) : defaultValue;\n } catch {\n return defaultValue;\n }\n}\n\nexport function usePersistedState<T>(\n key: string,\n defaultValue: T\n): [T, (value: T | ((prev: T) => T)) => void] {\n const storeRef = React.useRef<{\n key: string;\n value: T;\n listeners: Set<() => void>;\n } | null>(null);\n\n if (storeRef.current == null || storeRef.current.key !== key) {\n storeRef.current = {\n key,\n value: readFromStorage(key, defaultValue),\n listeners: storeRef.current?.listeners ?? new Set(),\n };\n }\n\n const subscribe = React.useCallback(\n (callback: () => void) => {\n const store = storeRef.current;\n if (store == null) {\n return () => {};\n }\n store.listeners.add(callback);\n\n const handleStorageChange = (e: StorageEvent) => {\n if (e.key === key && e.newValue && store != null) {\n try {\n store.value = JSON.parse(e.newValue);\n for (const listener of store.listeners) {\n listener();\n }\n } catch {}\n }\n };\n\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"storage\", handleStorageChange);\n }\n\n return () => {\n store.listeners.delete(callback);\n if (typeof window !== \"undefined\") {\n window.removeEventListener(\"storage\", handleStorageChange);\n }\n };\n },\n [key]\n );\n\n const getSnapshot = React.useCallback((): T => {\n if (storeRef.current == null) {\n return defaultValue;\n }\n return storeRef.current.value;\n }, [defaultValue]);\n\n const value = React.useSyncExternalStore(subscribe, getSnapshot);\n\n const setPersistedValue = React.useCallback(\n (newValue: T | ((prev: T) => T)) => {\n const store = storeRef.current;\n if (store == null) {\n return;\n }\n\n const resolvedValue =\n typeof newValue === \"function\"\n ? (newValue as (prev: T) => T)(store.value)\n : newValue;\n\n store.value = resolvedValue;\n\n if (typeof window !== \"undefined\") {\n try {\n localStorage.setItem(key, JSON.stringify(resolvedValue));\n } catch {}\n }\n\n for (const listener of store.listeners) {\n listener();\n }\n },\n [key]\n );\n\n return [value, setPersistedValue];\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAOA,KAAK,MAAM,OAAO;AAEzB,SAASC,eAAeA,CAAIC,GAAW,EAAEC,YAAe,EAAK;EAC3D,IAAI,OAAOC,MAAM,KAAK,WAAW,EAAE;IACjC,OAAOD,YAAY;EACrB;EAEA,IAAI;IACF,MAAME,MAAM,GAAGC,YAAY,CAACC,OAAO,CAACL,GAAG,CAAC;IACxC,OAAOG,MAAM,GAAGG,IAAI,CAACC,KAAK,CAACJ,MAAM,CAAC,GAAGF,YAAY;EACnD,CAAC,CAAC,MAAM;IACN,OAAOA,YAAY;EACrB;AACF;AAEA,OAAO,SAASO,iBAAiBA
|
|
1
|
+
{"version":3,"file":"usePersistedState.js","names":["React","OSDK_DEVTOOLS_KEY_PREFIX","readFromStorage","key","defaultValue","window","stored","localStorage","getItem","JSON","parse","usePersistedState","initialKey","storeRef","useRef","current","value","listeners","Set","subscribe","useCallback","callback","store","add","handleStorageChange","e","newValue","listener","addEventListener","delete","removeEventListener","getSnapshot","useSyncExternalStore","setPersistedValue","resolvedValue","setItem","stringify","clearPersistedState","keysToRemove","i","length","startsWith","push","removeItem"],"sources":["usePersistedState.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from \"react\";\n\nconst OSDK_DEVTOOLS_KEY_PREFIX = \"osdk-\";\n\nfunction readFromStorage<T>(key: string, defaultValue: T): T {\n if (typeof window === \"undefined\") {\n return defaultValue;\n }\n\n try {\n const stored = localStorage.getItem(key);\n return stored ? JSON.parse(stored) : defaultValue;\n } catch {\n return defaultValue;\n }\n}\n\nexport function usePersistedState<T>(\n /**\n * The key will be prefixed with `OSDK_DEVTOOLS_KEY_PREFIX`\n */\n initialKey: string,\n defaultValue: T\n): [T, (value: T | ((prev: T) => T)) => void] {\n const storeRef = React.useRef<{\n key: string;\n value: T;\n listeners: Set<() => void>;\n } | null>(null);\n\n const key = `${OSDK_DEVTOOLS_KEY_PREFIX}${initialKey}`;\n\n if (storeRef.current == null || storeRef.current.key !== key) {\n storeRef.current = {\n key,\n value: readFromStorage(key, defaultValue),\n listeners: storeRef.current?.listeners ?? new Set(),\n };\n }\n\n const subscribe = React.useCallback(\n (callback: () => void) => {\n const store = storeRef.current;\n if (store == null) {\n return () => {};\n }\n store.listeners.add(callback);\n\n const handleStorageChange = (e: StorageEvent) => {\n if (e.key === key && e.newValue && store != null) {\n try {\n store.value = JSON.parse(e.newValue);\n for (const listener of store.listeners) {\n listener();\n }\n } catch {}\n }\n };\n\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"storage\", handleStorageChange);\n }\n\n return () => {\n store.listeners.delete(callback);\n if (typeof window !== \"undefined\") {\n window.removeEventListener(\"storage\", handleStorageChange);\n }\n };\n },\n [key]\n );\n\n const getSnapshot = React.useCallback((): T => {\n if (storeRef.current == null) {\n return defaultValue;\n }\n return storeRef.current.value;\n }, [defaultValue]);\n\n const value = React.useSyncExternalStore(subscribe, getSnapshot);\n\n const setPersistedValue = React.useCallback(\n (newValue: T | ((prev: T) => T)) => {\n const store = storeRef.current;\n if (store == null) {\n return;\n }\n\n const resolvedValue =\n typeof newValue === \"function\"\n ? (newValue as (prev: T) => T)(store.value)\n : newValue;\n\n store.value = resolvedValue;\n\n if (typeof window !== \"undefined\") {\n try {\n localStorage.setItem(key, JSON.stringify(resolvedValue));\n } catch {}\n }\n\n for (const listener of store.listeners) {\n listener();\n }\n },\n [key]\n );\n\n return [value, setPersistedValue];\n}\n\n/**\n * Function exported for testing.\n * We don't want tests to use localStorage directly since the storage layer could change\n */\nexport function clearPersistedState(): void {\n if (typeof window === \"undefined\") {\n return;\n }\n\n const keysToRemove: string[] = [];\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key != null && key.startsWith(OSDK_DEVTOOLS_KEY_PREFIX)) {\n keysToRemove.push(key);\n }\n }\n\n for (const key of keysToRemove) {\n localStorage.removeItem(key);\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAOA,KAAK,MAAM,OAAO;AAEzB,MAAMC,wBAAwB,GAAG,OAAO;AAExC,SAASC,eAAeA,CAAIC,GAAW,EAAEC,YAAe,EAAK;EAC3D,IAAI,OAAOC,MAAM,KAAK,WAAW,EAAE;IACjC,OAAOD,YAAY;EACrB;EAEA,IAAI;IACF,MAAME,MAAM,GAAGC,YAAY,CAACC,OAAO,CAACL,GAAG,CAAC;IACxC,OAAOG,MAAM,GAAGG,IAAI,CAACC,KAAK,CAACJ,MAAM,CAAC,GAAGF,YAAY;EACnD,CAAC,CAAC,MAAM;IACN,OAAOA,YAAY;EACrB;AACF;AAEA,OAAO,SAASO,iBAAiBA;AAC/B;AACF;AACA;AACEC,UAAkB,EAClBR,YAAe,EAC6B;EAC5C,MAAMS,QAAQ,GAAGb,KAAK,CAACc,MAAM,CAInB,IAAI,CAAC;EAEf,MAAMX,GAAG,GAAG,GAAGF,wBAAwB,GAAGW,UAAU,EAAE;EAEtD,IAAIC,QAAQ,CAACE,OAAO,IAAI,IAAI,IAAIF,QAAQ,CAACE,OAAO,CAACZ,GAAG,KAAKA,GAAG,EAAE;IAC5DU,QAAQ,CAACE,OAAO,GAAG;MACjBZ,GAAG;MACHa,KAAK,EAAEd,eAAe,CAACC,GAAG,EAAEC,YAAY,CAAC;MACzCa,SAAS,EAAEJ,QAAQ,CAACE,OAAO,EAAEE,SAAS,IAAI,IAAIC,GAAG,CAAC;IACpD,CAAC;EACH;EAEA,MAAMC,SAAS,GAAGnB,KAAK,CAACoB,WAAW,CAChCC,QAAoB,IAAK;IACxB,MAAMC,KAAK,GAAGT,QAAQ,CAACE,OAAO;IAC9B,IAAIO,KAAK,IAAI,IAAI,EAAE;MACjB,OAAO,MAAM,CAAC,CAAC;IACjB;IACAA,KAAK,CAACL,SAAS,CAACM,GAAG,CAACF,QAAQ,CAAC;IAE7B,MAAMG,mBAAmB,GAAIC,CAAe,IAAK;MAC/C,IAAIA,CAAC,CAACtB,GAAG,KAAKA,GAAG,IAAIsB,CAAC,CAACC,QAAQ,IAAIJ,KAAK,IAAI,IAAI,EAAE;QAChD,IAAI;UACFA,KAAK,CAACN,KAAK,GAAGP,IAAI,CAACC,KAAK,CAACe,CAAC,CAACC,QAAQ,CAAC;UACpC,KAAK,MAAMC,QAAQ,IAAIL,KAAK,CAACL,SAAS,EAAE;YACtCU,QAAQ,CAAC,CAAC;UACZ;QACF,CAAC,CAAC,MAAM,CAAC;MACX;IACF,CAAC;IAED,IAAI,OAAOtB,MAAM,KAAK,WAAW,EAAE;MACjCA,MAAM,CAACuB,gBAAgB,CAAC,SAAS,EAAEJ,mBAAmB,CAAC;IACzD;IAEA,OAAO,MAAM;MACXF,KAAK,CAACL,SAAS,CAACY,MAAM,CAACR,QAAQ,CAAC;MAChC,IAAI,OAAOhB,MAAM,KAAK,WAAW,EAAE;QACjCA,MAAM,CAACyB,mBAAmB,CAAC,SAAS,EAAEN,mBAAmB,CAAC;MAC5D;IACF,CAAC;EACH,CAAC,EACD,CAACrB,GAAG,CACN,CAAC;EAED,MAAM4B,WAAW,GAAG/B,KAAK,CAACoB,WAAW,CAAC,MAAS;IAC7C,IAAIP,QAAQ,CAACE,OAAO,IAAI,IAAI,EAAE;MAC5B,OAAOX,YAAY;IACrB;IACA,OAAOS,QAAQ,CAACE,OAAO,CAACC,KAAK;EAC/B,CAAC,EAAE,CAACZ,YAAY,CAAC,CAAC;EAElB,MAAMY,KAAK,GAAGhB,KAAK,CAACgC,oBAAoB,CAACb,SAAS,EAAEY,WAAW,CAAC;EAEhE,MAAME,iBAAiB,GAAGjC,KAAK,CAACoB,WAAW,CACxCM,QAA8B,IAAK;IAClC,MAAMJ,KAAK,GAAGT,QAAQ,CAACE,OAAO;IAC9B,IAAIO,KAAK,IAAI,IAAI,EAAE;MACjB;IACF;IAEA,MAAMY,aAAa,GACjB,OAAOR,QAAQ,KAAK,UAAU,GACzBA,QAAQ,CAAoBJ,KAAK,CAACN,KAAK,CAAC,GACzCU,QAAQ;IAEdJ,KAAK,CAACN,KAAK,GAAGkB,aAAa;IAE3B,IAAI,OAAO7B,MAAM,KAAK,WAAW,EAAE;MACjC,IAAI;QACFE,YAAY,CAAC4B,OAAO,CAAChC,GAAG,EAAEM,IAAI,CAAC2B,SAAS,CAACF,aAAa,CAAC,CAAC;MAC1D,CAAC,CAAC,MAAM,CAAC;IACX;IAEA,KAAK,MAAMP,QAAQ,IAAIL,KAAK,CAACL,SAAS,EAAE;MACtCU,QAAQ,CAAC,CAAC;IACZ;EACF,CAAC,EACD,CAACxB,GAAG,CACN,CAAC;EAED,OAAO,CAACa,KAAK,EAAEiB,iBAAiB,CAAC;AACnC;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASI,mBAAmBA,CAAA,EAAS;EAC1C,IAAI,OAAOhC,MAAM,KAAK,WAAW,EAAE;IACjC;EACF;EAEA,MAAMiC,YAAsB,GAAG,EAAE;EACjC,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGhC,YAAY,CAACiC,MAAM,EAAED,CAAC,EAAE,EAAE;IAC5C,MAAMpC,GAAG,GAAGI,YAAY,CAACJ,GAAG,CAACoC,CAAC,CAAC;IAC/B,IAAIpC,GAAG,IAAI,IAAI,IAAIA,GAAG,CAACsC,UAAU,CAACxC,wBAAwB,CAAC,EAAE;MAC3DqC,YAAY,CAACI,IAAI,CAACvC,GAAG,CAAC;IACxB;EACF;EAEA,KAAK,MAAMA,GAAG,IAAImC,YAAY,EAAE;IAC9B/B,YAAY,CAACoC,UAAU,CAACxC,GAAG,CAAC;EAC9B;AACF","ignoreList":[]}
|