@treasuryspatial/viewer-react 0.1.44 → 0.1.48
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AccessAssetsMenu.d.ts.map +1 -1
- package/dist/AccessAssetsMenu.js +53 -45
- package/dist/AssetUploadCard.d.ts +2 -1
- package/dist/AssetUploadCard.d.ts.map +1 -1
- package/dist/AssetUploadCard.js +3 -2
- package/dist/ViewControls.d.ts +36 -2
- package/dist/ViewControls.d.ts.map +1 -1
- package/dist/ViewControls.js +154 -45
- package/dist/ViewerCanvas.d.ts.map +1 -1
- package/dist/ViewerCanvas.js +15 -40
- package/dist/composerRouting.d.ts +6 -0
- package/dist/composerRouting.d.ts.map +1 -1
- package/dist/composerRouting.js +18 -9
- package/dist/index.d.ts +13 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -4
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/useAdminGallery.d.ts +2 -30
- package/dist/useAdminGallery.d.ts.map +1 -1
- package/dist/useAdminGallery.js +15 -6
- package/dist/useAdminImageStream.d.ts +3 -31
- package/dist/useAdminImageStream.d.ts.map +1 -1
- package/dist/useAdminImageStream.js +22 -10
- package/dist/useComposerAccessGate.js +4 -4
- package/dist/useComposerAuthState.d.ts +1 -0
- package/dist/useComposerAuthState.d.ts.map +1 -1
- package/dist/useComposerAuthState.js +4 -1
- package/dist/useComposerModeDraftState.d.ts +21 -0
- package/dist/useComposerModeDraftState.d.ts.map +1 -0
- package/dist/useComposerModeDraftState.js +89 -0
- package/dist/useComposerUiState.d.ts +11 -4
- package/dist/useComposerUiState.d.ts.map +1 -1
- package/dist/useComposerUiState.js +118 -80
- package/dist/useComposerWorkspaceSession.d.ts +21 -0
- package/dist/useComposerWorkspaceSession.d.ts.map +1 -0
- package/dist/useComposerWorkspaceSession.js +291 -0
- package/dist/useGrasshopperSession.d.ts.map +1 -1
- package/dist/useGrasshopperSession.js +10 -4
- package/dist/useModeShellState.d.ts.map +1 -1
- package/dist/useModeShellState.js +52 -6
- package/dist/usePromptPackSelection.d.ts +20 -0
- package/dist/usePromptPackSelection.d.ts.map +1 -0
- package/dist/usePromptPackSelection.js +81 -0
- package/dist/useRightRailTabs.d.ts.map +1 -1
- package/dist/useRightRailTabs.js +4 -3
- package/dist/useSessionLogout.d.ts.map +1 -1
- package/dist/useSessionLogout.js +12 -1
- package/dist/useSessionRevocationPing.d.ts.map +1 -1
- package/dist/useSessionRevocationPing.js +15 -2
- package/dist/useShellPanelToggle.d.ts +7 -1
- package/dist/useShellPanelToggle.d.ts.map +1 -1
- package/dist/useShellPanelToggle.js +14 -6
- package/dist/workspaceSession.d.ts +36 -0
- package/dist/workspaceSession.d.ts.map +1 -0
- package/dist/workspaceSession.js +141 -0
- package/package.json +9 -8
- package/dist/usePromptPackSelectionByMode.d.ts +0 -26
- package/dist/usePromptPackSelectionByMode.d.ts.map +0 -1
- package/dist/usePromptPackSelectionByMode.js +0 -111
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import { useEffect, useMemo, useRef, useState } from "react";
|
|
2
2
|
import { resolveModeShellDefaults } from "@treasuryspatial/mode-policy";
|
|
3
|
+
import { PANEL_COLLAPSE_BODY_CLASS, PANEL_COLLAPSE_EVENT } from "./useShellPanelToggle";
|
|
3
4
|
const resolveBoolean = (value, fallback) => typeof value === "boolean" ? value : fallback;
|
|
4
5
|
export function useModeShellState({ mode, policy, panelDefaultOpen = true, metricsDefaultOpen = false, inspectorDefaultOpen = false, enabled = true, }) {
|
|
5
6
|
const shellDefaults = useMemo(() => resolveModeShellDefaults(mode, policy), [mode, policy]);
|
|
6
|
-
const [navHidden, setNavHidden] = useState(
|
|
7
|
+
const [navHidden, setNavHidden] = useState(false);
|
|
7
8
|
const [panelOpen, setPanelOpen] = useState(() => resolveBoolean(shellDefaults.leftPanelOpen, panelDefaultOpen));
|
|
8
9
|
const [metricsOpen, setMetricsOpen] = useState(() => resolveBoolean(shellDefaults.metricsOpen, metricsDefaultOpen));
|
|
9
10
|
const [inspectorOpen, setInspectorOpen] = useState(() => resolveBoolean(shellDefaults.inspectorOpen, inspectorDefaultOpen));
|
|
10
11
|
const initializedRef = useRef(false);
|
|
11
12
|
const savedStateRef = useRef(null);
|
|
13
|
+
const panelsCollapsedRef = useRef(false);
|
|
12
14
|
useEffect(() => {
|
|
13
15
|
const nextPanelOpen = resolveBoolean(shellDefaults.leftPanelOpen, panelDefaultOpen);
|
|
14
16
|
const nextMetricsOpen = resolveBoolean(shellDefaults.metricsOpen, metricsDefaultOpen);
|
|
@@ -16,6 +18,17 @@ export function useModeShellState({ mode, policy, panelDefaultOpen = true, metri
|
|
|
16
18
|
if (!initializedRef.current) {
|
|
17
19
|
initializedRef.current = true;
|
|
18
20
|
}
|
|
21
|
+
if (panelsCollapsedRef.current) {
|
|
22
|
+
savedStateRef.current = {
|
|
23
|
+
panelOpen: nextPanelOpen,
|
|
24
|
+
metricsOpen: nextMetricsOpen,
|
|
25
|
+
inspectorOpen: nextInspectorOpen,
|
|
26
|
+
};
|
|
27
|
+
setPanelOpen(false);
|
|
28
|
+
setMetricsOpen(false);
|
|
29
|
+
setInspectorOpen(false);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
19
32
|
setPanelOpen(nextPanelOpen);
|
|
20
33
|
setMetricsOpen(nextMetricsOpen);
|
|
21
34
|
setInspectorOpen(nextInspectorOpen);
|
|
@@ -28,13 +41,33 @@ export function useModeShellState({ mode, policy, panelDefaultOpen = true, metri
|
|
|
28
41
|
shellDefaults.metricsOpen,
|
|
29
42
|
]);
|
|
30
43
|
useEffect(() => {
|
|
31
|
-
if (
|
|
44
|
+
if (typeof window === "undefined")
|
|
32
45
|
return;
|
|
46
|
+
const initialNavHidden = document.body.classList.contains("nav-collapsed");
|
|
47
|
+
const initialPanelsCollapsed = document.body.classList.contains(PANEL_COLLAPSE_BODY_CLASS);
|
|
48
|
+
setNavHidden(initialNavHidden);
|
|
49
|
+
panelsCollapsedRef.current = initialPanelsCollapsed;
|
|
50
|
+
if (initialPanelsCollapsed) {
|
|
51
|
+
savedStateRef.current = {
|
|
52
|
+
panelOpen: resolveBoolean(shellDefaults.leftPanelOpen, panelDefaultOpen),
|
|
53
|
+
metricsOpen: resolveBoolean(shellDefaults.metricsOpen, metricsDefaultOpen),
|
|
54
|
+
inspectorOpen: resolveBoolean(shellDefaults.inspectorOpen, inspectorDefaultOpen),
|
|
55
|
+
};
|
|
56
|
+
setPanelOpen(false);
|
|
57
|
+
setMetricsOpen(false);
|
|
58
|
+
setInspectorOpen(false);
|
|
59
|
+
}
|
|
33
60
|
const handleNavToggle = (event) => {
|
|
34
61
|
const detail = event.detail;
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
62
|
+
setNavHidden(Boolean(detail?.hidden ?? detail?.collapsed));
|
|
63
|
+
};
|
|
64
|
+
const handlePanelsToggle = (event) => {
|
|
65
|
+
if (!enabled)
|
|
66
|
+
return;
|
|
67
|
+
const detail = event.detail;
|
|
68
|
+
const collapsed = Boolean(detail?.collapsed ?? detail?.hidden);
|
|
69
|
+
panelsCollapsedRef.current = collapsed;
|
|
70
|
+
if (collapsed) {
|
|
38
71
|
savedStateRef.current = { panelOpen, metricsOpen, inspectorOpen };
|
|
39
72
|
setPanelOpen(false);
|
|
40
73
|
setMetricsOpen(false);
|
|
@@ -49,10 +82,23 @@ export function useModeShellState({ mode, policy, panelDefaultOpen = true, metri
|
|
|
49
82
|
}
|
|
50
83
|
};
|
|
51
84
|
window.addEventListener("treasury:nav-toggle", handleNavToggle);
|
|
85
|
+
window.addEventListener(PANEL_COLLAPSE_EVENT, handlePanelsToggle);
|
|
52
86
|
return () => {
|
|
53
87
|
window.removeEventListener("treasury:nav-toggle", handleNavToggle);
|
|
88
|
+
window.removeEventListener(PANEL_COLLAPSE_EVENT, handlePanelsToggle);
|
|
54
89
|
};
|
|
55
|
-
}, [
|
|
90
|
+
}, [
|
|
91
|
+
enabled,
|
|
92
|
+
inspectorDefaultOpen,
|
|
93
|
+
inspectorOpen,
|
|
94
|
+
metricsDefaultOpen,
|
|
95
|
+
metricsOpen,
|
|
96
|
+
panelDefaultOpen,
|
|
97
|
+
panelOpen,
|
|
98
|
+
shellDefaults.inspectorOpen,
|
|
99
|
+
shellDefaults.leftPanelOpen,
|
|
100
|
+
shellDefaults.metricsOpen,
|
|
101
|
+
]);
|
|
56
102
|
return {
|
|
57
103
|
navHidden,
|
|
58
104
|
panelOpen,
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type PromptPackCatalogEntry, type PromptPackRef } from "@treasuryspatial/render-kit";
|
|
2
|
+
import type { ComposerWorkspaceSession, ComposerWorkspaceSessionUpdater } from "./workspaceSession";
|
|
3
|
+
export type UsePromptPackSelectionOptions<TDraft = unknown> = {
|
|
4
|
+
mode: string;
|
|
5
|
+
catalog: PromptPackCatalogEntry[];
|
|
6
|
+
envSelection?: PromptPackRef | null;
|
|
7
|
+
overrideSelection?: PromptPackRef | null;
|
|
8
|
+
locked?: boolean;
|
|
9
|
+
workspaceSession?: ComposerWorkspaceSession<TDraft> | null;
|
|
10
|
+
setWorkspaceSession?: (updater: ComposerWorkspaceSessionUpdater<TDraft>) => void;
|
|
11
|
+
};
|
|
12
|
+
export declare function usePromptPackSelection<TDraft = unknown>({ mode, catalog, envSelection, overrideSelection, locked, workspaceSession, setWorkspaceSession, }: UsePromptPackSelectionOptions<TDraft>): {
|
|
13
|
+
activeRef: PromptPackRef | undefined;
|
|
14
|
+
activeLabel: string;
|
|
15
|
+
catalogById: Record<string, PromptPackCatalogEntry>;
|
|
16
|
+
setSelection: (packId: string) => void;
|
|
17
|
+
resetSelection: () => void;
|
|
18
|
+
mergedSelection: PromptPackRef | undefined;
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=usePromptPackSelection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePromptPackSelection.d.ts","sourceRoot":"","sources":["../src/usePromptPackSelection.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,sBAAsB,EAC3B,KAAK,aAAa,EACnB,MAAM,6BAA6B,CAAC;AAErC,OAAO,KAAK,EAAE,wBAAwB,EAAE,+BAA+B,EAAE,MAAM,oBAAoB,CAAC;AAEpG,MAAM,MAAM,6BAA6B,CAAC,MAAM,GAAG,OAAO,IAAI;IAC5D,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,sBAAsB,EAAE,CAAC;IAClC,YAAY,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IACpC,iBAAiB,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IACzC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,gBAAgB,CAAC,EAAE,wBAAwB,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IAC3D,mBAAmB,CAAC,EAAE,CAAC,OAAO,EAAE,+BAA+B,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;CAClF,CAAC;AA+BF,wBAAgB,sBAAsB,CAAC,MAAM,GAAG,OAAO,EAAE,EACvD,IAAI,EACJ,OAAO,EACP,YAAmB,EACnB,iBAAwB,EACxB,MAAc,EACd,gBAAuB,EACvB,mBAAmB,GACpB,EAAE,6BAA6B,CAAC,MAAM,CAAC,GAAG;IACzC,SAAS,EAAE,aAAa,GAAG,SAAS,CAAC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;IACpD,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,eAAe,EAAE,aAAa,GAAG,SAAS,CAAC;CAC5C,CAkEA"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { useCallback, useMemo } from "react";
|
|
2
|
+
const trimOptional = (value) => {
|
|
3
|
+
const trimmed = value?.trim();
|
|
4
|
+
return trimmed ? trimmed : undefined;
|
|
5
|
+
};
|
|
6
|
+
const normalizePromptPackRef = (value) => {
|
|
7
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
8
|
+
return undefined;
|
|
9
|
+
const id = trimOptional(value.id);
|
|
10
|
+
const version = trimOptional(value.version);
|
|
11
|
+
if (!id && !version)
|
|
12
|
+
return undefined;
|
|
13
|
+
return {
|
|
14
|
+
...(id ? { id } : {}),
|
|
15
|
+
...(version ? { version } : {}),
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
const mergeRef = (base, override) => {
|
|
19
|
+
const id = override?.id ?? base?.id;
|
|
20
|
+
const version = override?.version ?? base?.version;
|
|
21
|
+
if (!id && !version)
|
|
22
|
+
return undefined;
|
|
23
|
+
return { id, version };
|
|
24
|
+
};
|
|
25
|
+
const formatLabel = (ref, catalogById) => {
|
|
26
|
+
if (!ref?.id)
|
|
27
|
+
return "";
|
|
28
|
+
const entry = catalogById[ref.id];
|
|
29
|
+
return entry?.label || ref.id;
|
|
30
|
+
};
|
|
31
|
+
export function usePromptPackSelection({ mode, catalog, envSelection = null, overrideSelection = null, locked = false, workspaceSession = null, setWorkspaceSession, }) {
|
|
32
|
+
const catalogById = useMemo(() => Object.fromEntries(catalog.map((entry) => [entry.id, entry])), [catalog]);
|
|
33
|
+
const sessionSelection = useMemo(() => normalizePromptPackRef(workspaceSession?.promptPackSelectionByMode?.[mode]), [mode, workspaceSession]);
|
|
34
|
+
const validSessionSelection = useMemo(() => {
|
|
35
|
+
if (!sessionSelection?.id)
|
|
36
|
+
return sessionSelection;
|
|
37
|
+
if (catalog.length === 0)
|
|
38
|
+
return undefined;
|
|
39
|
+
return catalogById[sessionSelection.id] ? sessionSelection : undefined;
|
|
40
|
+
}, [catalog.length, catalogById, sessionSelection]);
|
|
41
|
+
const mergedSelection = useMemo(() => mergeRef(envSelection ?? undefined, mergeRef(overrideSelection ?? undefined, locked ? undefined : validSessionSelection)), [envSelection, locked, overrideSelection, validSessionSelection]);
|
|
42
|
+
const activeLabel = useMemo(() => formatLabel(mergedSelection, catalogById), [catalogById, mergedSelection]);
|
|
43
|
+
const setSelection = useCallback((packId) => {
|
|
44
|
+
if (!setWorkspaceSession || locked)
|
|
45
|
+
return;
|
|
46
|
+
const trimmedPackId = packId.trim();
|
|
47
|
+
const nextCatalogEntry = trimmedPackId ? catalogById[trimmedPackId] : undefined;
|
|
48
|
+
const nextVersion = nextCatalogEntry?.version || undefined;
|
|
49
|
+
setWorkspaceSession((session) => ({
|
|
50
|
+
...session,
|
|
51
|
+
promptPackSelectionByMode: {
|
|
52
|
+
...session.promptPackSelectionByMode,
|
|
53
|
+
[mode]: trimmedPackId
|
|
54
|
+
? {
|
|
55
|
+
id: trimmedPackId,
|
|
56
|
+
...(nextVersion ? { version: nextVersion } : {}),
|
|
57
|
+
}
|
|
58
|
+
: null,
|
|
59
|
+
},
|
|
60
|
+
}));
|
|
61
|
+
}, [catalogById, locked, mode, setWorkspaceSession]);
|
|
62
|
+
const resetSelection = useCallback(() => {
|
|
63
|
+
if (!setWorkspaceSession || locked)
|
|
64
|
+
return;
|
|
65
|
+
setWorkspaceSession((session) => ({
|
|
66
|
+
...session,
|
|
67
|
+
promptPackSelectionByMode: {
|
|
68
|
+
...session.promptPackSelectionByMode,
|
|
69
|
+
[mode]: null,
|
|
70
|
+
},
|
|
71
|
+
}));
|
|
72
|
+
}, [locked, mode, setWorkspaceSession]);
|
|
73
|
+
return {
|
|
74
|
+
activeRef: mergedSelection,
|
|
75
|
+
activeLabel,
|
|
76
|
+
catalogById,
|
|
77
|
+
setSelection,
|
|
78
|
+
resetSelection,
|
|
79
|
+
mergedSelection,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useRightRailTabs.d.ts","sourceRoot":"","sources":["../src/useRightRailTabs.ts"],"names":[],"mappings":"AAEA,OAAO,EAA+B,KAAK,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEnG,MAAM,MAAM,kBAAkB,GAAG;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,iBAAiB,CAAC;IAC9B,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,kBAAkB,EAAE,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;
|
|
1
|
+
{"version":3,"file":"useRightRailTabs.d.ts","sourceRoot":"","sources":["../src/useRightRailTabs.ts"],"names":[],"mappings":"AAEA,OAAO,EAA+B,KAAK,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEnG,MAAM,MAAM,kBAAkB,GAAG;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,iBAAiB,CAAC;IAC9B,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,kBAAkB,EAAE,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAIF,wBAAgB,gBAAgB,CAAC,EAC/B,IAAI,EACJ,UAAU,EACV,QAAQ,EACR,UAAU,GACX,EAAE,uBAAuB,GAAG,kBAAkB,CA0B9C"}
|
package/dist/useRightRailTabs.js
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { useEffect, useMemo, useState } from "react";
|
|
2
2
|
import { resolveRightRailTabsForMode } from "@treasuryspatial/mode-policy";
|
|
3
|
+
const labelFromTabId = (id) => id.replace(/[-_]+/g, " ");
|
|
3
4
|
export function useRightRailTabs({ mode, modePolicy, baseTabs, defaultTab, }) {
|
|
4
5
|
const tabs = useMemo(() => {
|
|
5
6
|
const fallbackTabs = baseTabs.map((tab) => tab.id);
|
|
6
7
|
const resolvedTabs = resolveRightRailTabsForMode(mode, modePolicy, fallbackTabs);
|
|
7
|
-
const
|
|
8
|
-
return
|
|
8
|
+
const tabById = new Map(baseTabs.map((tab) => [tab.id, tab]));
|
|
9
|
+
return resolvedTabs.map((id) => tabById.get(id) ?? { id, label: labelFromTabId(id) });
|
|
9
10
|
}, [baseTabs, mode, modePolicy]);
|
|
10
|
-
const modeDefaultTab = useMemo(() => tabs[0]?.id ?? defaultTab ?? "
|
|
11
|
+
const modeDefaultTab = useMemo(() => tabs[0]?.id ?? defaultTab ?? "feed", [defaultTab, tabs]);
|
|
11
12
|
const [activeTab, setActiveTab] = useState(() => modeDefaultTab);
|
|
12
13
|
useEffect(() => {
|
|
13
14
|
if (activeTab && tabs.some((tab) => tab.id === activeTab))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSessionLogout.d.ts","sourceRoot":"","sources":["../src/useSessionLogout.ts"],"names":[],"mappings":"AACA,OAAO,EAAuB,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"useSessionLogout.d.ts","sourceRoot":"","sources":["../src/useSessionLogout.ts"],"names":[],"mappings":"AACA,OAAO,EAAuB,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAI5E,MAAM,MAAM,uBAAuB,GAAG;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AAEvD,wBAAgB,gBAAgB,CAAC,EAC/B,WAAgC,EAChC,YAAuB,EACvB,UAAU,EACV,UAAU,GACX,GAAE,uBAA4B,GAAG,oBAAoB,CAyBrD"}
|
package/dist/useSessionLogout.js
CHANGED
|
@@ -1,9 +1,20 @@
|
|
|
1
1
|
import { useCallback } from "react";
|
|
2
2
|
import { clearSessionCookies } from "./sessionAuth";
|
|
3
|
+
const TELEMETRY_SESSION_STORAGE_KEY = "telemetry:session-id";
|
|
3
4
|
export function useSessionLogout({ logoutRoute = "/api/auth/logout", redirectPath = "/login", cookieKeys, onRedirect, } = {}) {
|
|
4
5
|
return useCallback(async () => {
|
|
5
6
|
try {
|
|
6
|
-
|
|
7
|
+
let sessionId = "";
|
|
8
|
+
try {
|
|
9
|
+
sessionId = window.sessionStorage.getItem(TELEMETRY_SESSION_STORAGE_KEY) || "";
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
sessionId = "";
|
|
13
|
+
}
|
|
14
|
+
await fetch(logoutRoute, {
|
|
15
|
+
method: "POST",
|
|
16
|
+
headers: sessionId ? { "x-session-id": sessionId } : undefined,
|
|
17
|
+
});
|
|
7
18
|
}
|
|
8
19
|
catch {
|
|
9
20
|
// ignore logout sync failures
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSessionRevocationPing.d.ts","sourceRoot":"","sources":["../src/useSessionRevocationPing.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useSessionRevocationPing.d.ts","sourceRoot":"","sources":["../src/useSessionRevocationPing.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,+BAA+B,GAAG;IAC5C,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB,CAAC;AAEF,wBAAgB,wBAAwB,CAAC,EACvC,OAAO,EACP,SAAoC,EACpC,UAAmB,EACnB,SAAS,GACV,EAAE,+BAA+B,QAsCjC"}
|
|
@@ -1,16 +1,29 @@
|
|
|
1
1
|
import { useEffect } from "react";
|
|
2
|
+
const TELEMETRY_SESSION_STORAGE_KEY = "telemetry:session-id";
|
|
2
3
|
export function useSessionRevocationPing({ enabled, pingRoute = "/api/auth/session/ping", intervalMs = 60_000, onRevoked, }) {
|
|
3
4
|
useEffect(() => {
|
|
4
5
|
if (!enabled)
|
|
5
6
|
return;
|
|
6
7
|
let active = true;
|
|
8
|
+
const resolveTelemetrySessionId = () => {
|
|
9
|
+
try {
|
|
10
|
+
return window.sessionStorage.getItem(TELEMETRY_SESSION_STORAGE_KEY) || "";
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return "";
|
|
14
|
+
}
|
|
15
|
+
};
|
|
7
16
|
const ping = async () => {
|
|
8
17
|
try {
|
|
9
|
-
const
|
|
18
|
+
const sessionId = resolveTelemetrySessionId();
|
|
19
|
+
const response = await fetch(pingRoute, {
|
|
20
|
+
method: "POST",
|
|
21
|
+
headers: sessionId ? { "x-session-id": sessionId } : undefined,
|
|
22
|
+
});
|
|
10
23
|
const data = await response.json().catch(() => null);
|
|
11
24
|
if (!active)
|
|
12
25
|
return;
|
|
13
|
-
if (data?.revoked) {
|
|
26
|
+
if (data?.revoked || response.status === 401) {
|
|
14
27
|
onRevoked?.();
|
|
15
28
|
}
|
|
16
29
|
}
|
|
@@ -1,12 +1,18 @@
|
|
|
1
|
+
export declare const PANEL_COLLAPSE_BODY_CLASS = "panels-collapsed";
|
|
2
|
+
export declare const PANEL_COLLAPSE_EVENT = "treasury:panels-toggle";
|
|
3
|
+
export declare const NAV_COLLAPSE_BODY_CLASS = "nav-collapsed";
|
|
4
|
+
export declare const NAV_COLLAPSE_EVENT = "treasury:nav-toggle";
|
|
1
5
|
export type UseShellPanelToggleOptions = {
|
|
2
6
|
enabled?: boolean;
|
|
3
7
|
bodyClassName?: string;
|
|
4
8
|
eventName?: string;
|
|
9
|
+
navBodyClassName?: string;
|
|
10
|
+
navEventName?: string;
|
|
5
11
|
};
|
|
6
12
|
export type ShellPanelToggleState = {
|
|
7
13
|
collapsed: boolean;
|
|
8
14
|
toggle: () => void;
|
|
9
15
|
setCollapsed: (next: boolean) => void;
|
|
10
16
|
};
|
|
11
|
-
export declare function useShellPanelToggle({ enabled, bodyClassName, eventName, }?: UseShellPanelToggleOptions): ShellPanelToggleState;
|
|
17
|
+
export declare function useShellPanelToggle({ enabled, bodyClassName, eventName, navBodyClassName, navEventName, }?: UseShellPanelToggleOptions): ShellPanelToggleState;
|
|
12
18
|
//# sourceMappingURL=useShellPanelToggle.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useShellPanelToggle.d.ts","sourceRoot":"","sources":["../src/useShellPanelToggle.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,0BAA0B,GAAG;IACvC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"useShellPanelToggle.d.ts","sourceRoot":"","sources":["../src/useShellPanelToggle.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,yBAAyB,qBAAqB,CAAC;AAC5D,eAAO,MAAM,oBAAoB,2BAA2B,CAAC;AAC7D,eAAO,MAAM,uBAAuB,kBAAkB,CAAC;AACvD,eAAO,MAAM,kBAAkB,wBAAwB,CAAC;AAExD,MAAM,MAAM,0BAA0B,GAAG;IACvC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CACvC,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,EAClC,OAAc,EACd,aAAyC,EACzC,SAAgC,EAChC,gBAA0C,EAC1C,YAAiC,GAClC,GAAE,0BAA+B,GAAG,qBAAqB,CAiDzD"}
|
|
@@ -1,15 +1,21 @@
|
|
|
1
1
|
import { useCallback, useEffect, useState } from "react";
|
|
2
|
-
export
|
|
2
|
+
export const PANEL_COLLAPSE_BODY_CLASS = "panels-collapsed";
|
|
3
|
+
export const PANEL_COLLAPSE_EVENT = "treasury:panels-toggle";
|
|
4
|
+
export const NAV_COLLAPSE_BODY_CLASS = "nav-collapsed";
|
|
5
|
+
export const NAV_COLLAPSE_EVENT = "treasury:nav-toggle";
|
|
6
|
+
export function useShellPanelToggle({ enabled = true, bodyClassName = PANEL_COLLAPSE_BODY_CLASS, eventName = PANEL_COLLAPSE_EVENT, navBodyClassName = NAV_COLLAPSE_BODY_CLASS, navEventName = NAV_COLLAPSE_EVENT, } = {}) {
|
|
3
7
|
const [collapsed, setCollapsedState] = useState(false);
|
|
4
8
|
const setCollapsed = useCallback((next) => {
|
|
5
9
|
setCollapsedState(next);
|
|
6
10
|
if (typeof document !== "undefined") {
|
|
7
11
|
document.body.classList.toggle(bodyClassName, next);
|
|
12
|
+
document.body.classList.toggle(navBodyClassName, next);
|
|
8
13
|
}
|
|
9
14
|
if (typeof window !== "undefined") {
|
|
10
|
-
window.dispatchEvent(new CustomEvent(eventName, { detail: {
|
|
15
|
+
window.dispatchEvent(new CustomEvent(eventName, { detail: { collapsed: next } }));
|
|
16
|
+
window.dispatchEvent(new CustomEvent(navEventName, { detail: { hidden: next, collapsed: next } }));
|
|
11
17
|
}
|
|
12
|
-
}, [bodyClassName, eventName]);
|
|
18
|
+
}, [bodyClassName, eventName, navBodyClassName, navEventName]);
|
|
13
19
|
useEffect(() => {
|
|
14
20
|
if (!enabled) {
|
|
15
21
|
setCollapsed(false);
|
|
@@ -17,16 +23,18 @@ export function useShellPanelToggle({ enabled = true, bodyClassName = "nav-colla
|
|
|
17
23
|
}
|
|
18
24
|
if (typeof document === "undefined" || typeof window === "undefined")
|
|
19
25
|
return;
|
|
20
|
-
setCollapsedState(document.body.classList.contains(bodyClassName));
|
|
26
|
+
setCollapsedState(document.body.classList.contains(bodyClassName) || document.body.classList.contains(navBodyClassName));
|
|
21
27
|
const handleToggle = (event) => {
|
|
22
28
|
const detail = event.detail;
|
|
23
|
-
setCollapsedState(Boolean(detail?.hidden));
|
|
29
|
+
setCollapsedState(Boolean(detail?.collapsed ?? detail?.hidden));
|
|
24
30
|
};
|
|
25
31
|
window.addEventListener(eventName, handleToggle);
|
|
32
|
+
window.addEventListener(navEventName, handleToggle);
|
|
26
33
|
return () => {
|
|
27
34
|
window.removeEventListener(eventName, handleToggle);
|
|
35
|
+
window.removeEventListener(navEventName, handleToggle);
|
|
28
36
|
};
|
|
29
|
-
}, [bodyClassName, enabled, eventName, setCollapsed]);
|
|
37
|
+
}, [bodyClassName, enabled, eventName, navBodyClassName, navEventName, setCollapsed]);
|
|
30
38
|
const toggle = useCallback(() => {
|
|
31
39
|
if (!enabled)
|
|
32
40
|
return;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { PromptPackRef } from "@treasuryspatial/render-kit";
|
|
2
|
+
export declare const WORKSPACE_SESSION_SCHEMA_VERSION = "2026-05-08";
|
|
3
|
+
export type ComposerWorkspaceUiState = {
|
|
4
|
+
primaryTabByMode: Record<string, string>;
|
|
5
|
+
promptKitOpenByMode: Record<string, boolean>;
|
|
6
|
+
moduleKitOpenByMode: Record<string, boolean>;
|
|
7
|
+
activeImaginePresetIdByMode: Record<string, string | null>;
|
|
8
|
+
autoGenerateEnabledByMode: Record<string, boolean>;
|
|
9
|
+
controlPanelOpenByMode: Record<string, boolean>;
|
|
10
|
+
rightPanelOpenByMode: Record<string, boolean>;
|
|
11
|
+
rightPanelTabByMode: Record<string, string>;
|
|
12
|
+
};
|
|
13
|
+
export type ComposerWorkspaceSession<TDraft> = {
|
|
14
|
+
schemaVersion: string;
|
|
15
|
+
workspaceSessionId?: string;
|
|
16
|
+
label?: string;
|
|
17
|
+
activeMode: string;
|
|
18
|
+
uiState: ComposerWorkspaceUiState;
|
|
19
|
+
modeDraftState: Record<string, TDraft>;
|
|
20
|
+
promptPackSelectionByMode: Record<string, PromptPackRef | null>;
|
|
21
|
+
renderStateByMode: Record<string, unknown>;
|
|
22
|
+
updatedAt?: string;
|
|
23
|
+
};
|
|
24
|
+
export type ComposerWorkspaceSessionUpdater<TDraft> = (session: ComposerWorkspaceSession<TDraft>) => ComposerWorkspaceSession<TDraft>;
|
|
25
|
+
export declare const createEmptyComposerWorkspaceUiState: () => ComposerWorkspaceUiState;
|
|
26
|
+
export declare const createEmptyComposerWorkspaceSession: <TDraft>(createDraft: () => TDraft, options?: {
|
|
27
|
+
activeMode?: string;
|
|
28
|
+
modeIds?: string[];
|
|
29
|
+
}) => ComposerWorkspaceSession<TDraft>;
|
|
30
|
+
export declare const restoreComposerWorkspaceSession: <TDraft>(raw: unknown, options: {
|
|
31
|
+
createDraft: () => TDraft;
|
|
32
|
+
restoreDraft: (rawDraft: unknown) => TDraft;
|
|
33
|
+
activeMode?: string;
|
|
34
|
+
modeIds?: string[];
|
|
35
|
+
}) => ComposerWorkspaceSession<TDraft>;
|
|
36
|
+
//# sourceMappingURL=workspaceSession.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspaceSession.d.ts","sourceRoot":"","sources":["../src/workspaceSession.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAEjE,eAAO,MAAM,gCAAgC,eAAe,CAAC;AAE7D,MAAM,MAAM,wBAAwB,GAAG;IACrC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C,2BAA2B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;IAC3D,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnD,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChD,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9C,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7C,CAAC;AAEF,MAAM,MAAM,wBAAwB,CAAC,MAAM,IAAI;IAC7C,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,wBAAwB,CAAC;IAClC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC,CAAC;IAChE,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,+BAA+B,CAAC,MAAM,IAAI,CACpD,OAAO,EAAE,wBAAwB,CAAC,MAAM,CAAC,KACtC,wBAAwB,CAAC,MAAM,CAAC,CAAC;AAiFtC,eAAO,MAAM,mCAAmC,QAAO,wBASrD,CAAC;AAEH,eAAO,MAAM,mCAAmC,GAAI,MAAM,EACxD,aAAa,MAAM,MAAM,EACzB,UAAS;IACP,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACf,KACL,wBAAwB,CAAC,MAAM,CAejC,CAAC;AAEF,eAAO,MAAM,+BAA+B,GAAI,MAAM,EACpD,KAAK,OAAO,EACZ,SAAS;IACP,WAAW,EAAE,MAAM,MAAM,CAAC;IAC1B,YAAY,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,MAAM,CAAC;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB,KACA,wBAAwB,CAAC,MAAM,CAyDjC,CAAC"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
export const WORKSPACE_SESSION_SCHEMA_VERSION = "2026-05-08";
|
|
2
|
+
const asRecord = (value) => value && typeof value === "object" && !Array.isArray(value) ? value : null;
|
|
3
|
+
const normalizeStringRecord = (value) => {
|
|
4
|
+
const record = asRecord(value);
|
|
5
|
+
if (!record)
|
|
6
|
+
return {};
|
|
7
|
+
return Object.fromEntries(Object.entries(record).filter(([, entry]) => typeof entry === "string" && entry.length > 0));
|
|
8
|
+
};
|
|
9
|
+
const normalizeBooleanRecord = (value) => {
|
|
10
|
+
const record = asRecord(value);
|
|
11
|
+
if (!record)
|
|
12
|
+
return {};
|
|
13
|
+
return Object.fromEntries(Object.entries(record).filter(([, entry]) => typeof entry === "boolean"));
|
|
14
|
+
};
|
|
15
|
+
const normalizeNullableStringRecord = (value) => {
|
|
16
|
+
const record = asRecord(value);
|
|
17
|
+
if (!record)
|
|
18
|
+
return {};
|
|
19
|
+
return Object.fromEntries(Object.entries(record).filter(([, entry]) => typeof entry === "string" || entry === null));
|
|
20
|
+
};
|
|
21
|
+
const normalizeUnknownRecord = (value) => {
|
|
22
|
+
const record = asRecord(value);
|
|
23
|
+
if (!record)
|
|
24
|
+
return {};
|
|
25
|
+
return Object.fromEntries(Object.entries(record));
|
|
26
|
+
};
|
|
27
|
+
const isInlineDataUrl = (value) => typeof value === "string" && /^data:[^;]+;base64,/i.test(value);
|
|
28
|
+
const stripInlineDataUrls = (value) => {
|
|
29
|
+
if (isInlineDataUrl(value))
|
|
30
|
+
return null;
|
|
31
|
+
if (Array.isArray(value))
|
|
32
|
+
return value.map(stripInlineDataUrls);
|
|
33
|
+
const record = asRecord(value);
|
|
34
|
+
if (!record)
|
|
35
|
+
return value;
|
|
36
|
+
return Object.fromEntries(Object.entries(record).map(([key, entry]) => [key, stripInlineDataUrls(entry)]));
|
|
37
|
+
};
|
|
38
|
+
const normalizeRenderStateRecord = (value) => {
|
|
39
|
+
const record = normalizeUnknownRecord(value);
|
|
40
|
+
return Object.fromEntries(Object.entries(record).map(([modeId, entry]) => [modeId, stripInlineDataUrls(entry)]));
|
|
41
|
+
};
|
|
42
|
+
const trimOptional = (value) => {
|
|
43
|
+
const trimmed = value?.trim();
|
|
44
|
+
return trimmed ? trimmed : undefined;
|
|
45
|
+
};
|
|
46
|
+
const normalizePromptPackRef = (value) => {
|
|
47
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
48
|
+
return null;
|
|
49
|
+
const id = trimOptional(value.id);
|
|
50
|
+
const version = trimOptional(value.version);
|
|
51
|
+
if (!id && !version)
|
|
52
|
+
return null;
|
|
53
|
+
return {
|
|
54
|
+
...(id ? { id } : {}),
|
|
55
|
+
...(version ? { version } : {}),
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
const normalizePromptPackRecord = (value) => {
|
|
59
|
+
const record = asRecord(value);
|
|
60
|
+
if (!record)
|
|
61
|
+
return {};
|
|
62
|
+
return Object.fromEntries(Object.entries(record)
|
|
63
|
+
.map(([modeId, entry]) => [modeId, normalizePromptPackRef(entry)])
|
|
64
|
+
.filter(([, entry]) => entry !== null));
|
|
65
|
+
};
|
|
66
|
+
export const createEmptyComposerWorkspaceUiState = () => ({
|
|
67
|
+
primaryTabByMode: {},
|
|
68
|
+
promptKitOpenByMode: {},
|
|
69
|
+
moduleKitOpenByMode: {},
|
|
70
|
+
activeImaginePresetIdByMode: {},
|
|
71
|
+
autoGenerateEnabledByMode: {},
|
|
72
|
+
controlPanelOpenByMode: {},
|
|
73
|
+
rightPanelOpenByMode: {},
|
|
74
|
+
rightPanelTabByMode: {},
|
|
75
|
+
});
|
|
76
|
+
export const createEmptyComposerWorkspaceSession = (createDraft, options = {}) => {
|
|
77
|
+
const activeMode = options.activeMode || "imagine";
|
|
78
|
+
const normalizedModeIds = Array.from(new Set([activeMode, ...(options.modeIds ?? [])])).filter(Boolean);
|
|
79
|
+
const modeDraftState = normalizedModeIds.reduce((acc, modeId) => {
|
|
80
|
+
acc[modeId] = createDraft();
|
|
81
|
+
return acc;
|
|
82
|
+
}, {});
|
|
83
|
+
return {
|
|
84
|
+
schemaVersion: WORKSPACE_SESSION_SCHEMA_VERSION,
|
|
85
|
+
activeMode,
|
|
86
|
+
uiState: createEmptyComposerWorkspaceUiState(),
|
|
87
|
+
modeDraftState,
|
|
88
|
+
promptPackSelectionByMode: {},
|
|
89
|
+
renderStateByMode: {},
|
|
90
|
+
};
|
|
91
|
+
};
|
|
92
|
+
export const restoreComposerWorkspaceSession = (raw, options) => {
|
|
93
|
+
const fallback = createEmptyComposerWorkspaceSession(options.createDraft, {
|
|
94
|
+
activeMode: options.activeMode,
|
|
95
|
+
modeIds: options.modeIds,
|
|
96
|
+
});
|
|
97
|
+
const record = asRecord(raw);
|
|
98
|
+
if (!record)
|
|
99
|
+
return fallback;
|
|
100
|
+
const rawUiState = asRecord(record.uiState);
|
|
101
|
+
const rawDraftState = asRecord(record.modeDraftState);
|
|
102
|
+
const rawPromptPackState = asRecord(record.promptPackSelectionByMode);
|
|
103
|
+
const rawRenderState = asRecord(record.renderStateByMode);
|
|
104
|
+
const normalizedModeIds = Array.from(new Set([
|
|
105
|
+
fallback.activeMode,
|
|
106
|
+
...(options.modeIds ?? []),
|
|
107
|
+
...Object.keys(rawDraftState ?? {}),
|
|
108
|
+
...Object.keys(rawPromptPackState ?? {}),
|
|
109
|
+
...Object.keys(rawRenderState ?? {}),
|
|
110
|
+
])).filter(Boolean);
|
|
111
|
+
const modeDraftState = normalizedModeIds.reduce((acc, modeId) => {
|
|
112
|
+
acc[modeId] = options.restoreDraft(rawDraftState?.[modeId]);
|
|
113
|
+
return acc;
|
|
114
|
+
}, {});
|
|
115
|
+
return {
|
|
116
|
+
schemaVersion: typeof record.schemaVersion === "string" && record.schemaVersion.trim().length > 0
|
|
117
|
+
? record.schemaVersion
|
|
118
|
+
: fallback.schemaVersion,
|
|
119
|
+
workspaceSessionId: typeof record.workspaceSessionId === "string" && record.workspaceSessionId.trim().length > 0
|
|
120
|
+
? record.workspaceSessionId
|
|
121
|
+
: undefined,
|
|
122
|
+
label: typeof record.label === "string" && record.label.trim().length > 0 ? record.label : undefined,
|
|
123
|
+
activeMode: typeof record.activeMode === "string" && record.activeMode.trim().length > 0
|
|
124
|
+
? record.activeMode
|
|
125
|
+
: fallback.activeMode,
|
|
126
|
+
uiState: {
|
|
127
|
+
primaryTabByMode: normalizeStringRecord(rawUiState?.primaryTabByMode),
|
|
128
|
+
promptKitOpenByMode: normalizeBooleanRecord(rawUiState?.promptKitOpenByMode),
|
|
129
|
+
moduleKitOpenByMode: normalizeBooleanRecord(rawUiState?.moduleKitOpenByMode),
|
|
130
|
+
activeImaginePresetIdByMode: normalizeNullableStringRecord(rawUiState?.activeImaginePresetIdByMode),
|
|
131
|
+
autoGenerateEnabledByMode: normalizeBooleanRecord(rawUiState?.autoGenerateEnabledByMode),
|
|
132
|
+
controlPanelOpenByMode: normalizeBooleanRecord(rawUiState?.controlPanelOpenByMode),
|
|
133
|
+
rightPanelOpenByMode: normalizeBooleanRecord(rawUiState?.rightPanelOpenByMode),
|
|
134
|
+
rightPanelTabByMode: normalizeStringRecord(rawUiState?.rightPanelTabByMode),
|
|
135
|
+
},
|
|
136
|
+
modeDraftState,
|
|
137
|
+
promptPackSelectionByMode: normalizePromptPackRecord(rawPromptPackState),
|
|
138
|
+
renderStateByMode: normalizeRenderStateRecord(rawRenderState),
|
|
139
|
+
updatedAt: typeof record.updatedAt === "string" && record.updatedAt.trim().length > 0 ? record.updatedAt : undefined,
|
|
140
|
+
};
|
|
141
|
+
};
|
package/package.json
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@treasuryspatial/viewer-react",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.48",
|
|
4
4
|
"type": "module",
|
|
5
|
-
"license": "
|
|
5
|
+
"license": "MIT",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"types": "./dist/index.d.ts",
|
|
8
8
|
"exports": {
|
|
9
9
|
".": {
|
|
10
|
+
"development": "./src/index.ts",
|
|
10
11
|
"types": "./dist/index.d.ts",
|
|
11
12
|
"default": "./dist/index.js"
|
|
12
13
|
}
|
|
@@ -18,12 +19,12 @@
|
|
|
18
19
|
"access": "public"
|
|
19
20
|
},
|
|
20
21
|
"dependencies": {
|
|
21
|
-
"@treasuryspatial/mode-policy": "^0.1.
|
|
22
|
-
"@treasuryspatial/panel-core": "^0.1.
|
|
23
|
-
"@treasuryspatial/plugin-manifest": "^0.1.
|
|
24
|
-
"@treasuryspatial/render-kit": "^0.1.
|
|
25
|
-
"@treasuryspatial/surface-kit": "^0.1.
|
|
26
|
-
"@treasuryspatial/viewer-kit": "^0.2.
|
|
22
|
+
"@treasuryspatial/mode-policy": "^0.1.7",
|
|
23
|
+
"@treasuryspatial/panel-core": "^0.1.14",
|
|
24
|
+
"@treasuryspatial/plugin-manifest": "^0.1.13",
|
|
25
|
+
"@treasuryspatial/render-kit": "^0.1.23",
|
|
26
|
+
"@treasuryspatial/surface-kit": "^0.1.16",
|
|
27
|
+
"@treasuryspatial/viewer-kit": "^0.2.54"
|
|
27
28
|
},
|
|
28
29
|
"peerDependencies": {
|
|
29
30
|
"react": ">=18"
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { type PromptPackCatalogEntry, type PromptPackRef } from "@treasuryspatial/render-kit";
|
|
2
|
-
export type PromptPackMode = string;
|
|
3
|
-
export type PromptPackSelectionByMode = Partial<Record<PromptPackMode, PromptPackRef>>;
|
|
4
|
-
export type UsePromptPackSelectionByModeOptions = {
|
|
5
|
-
mode: PromptPackMode;
|
|
6
|
-
modes?: PromptPackMode[];
|
|
7
|
-
catalog: PromptPackCatalogEntry[];
|
|
8
|
-
envSelection: PromptPackSelectionByMode;
|
|
9
|
-
overrideSelection?: PromptPackSelectionByMode | null;
|
|
10
|
-
sessionContext?: Record<string, unknown> | null;
|
|
11
|
-
setSessionContext?: (partial: Record<string, unknown>) => void;
|
|
12
|
-
contextKey?: string;
|
|
13
|
-
legacyContextKey?: string;
|
|
14
|
-
};
|
|
15
|
-
export declare const DEFAULT_PROMPT_PACK_MODES: PromptPackMode[];
|
|
16
|
-
export declare const PROMPT_PACK_MODES: string[];
|
|
17
|
-
export declare function usePromptPackSelectionByMode({ mode, modes, catalog, envSelection, overrideSelection, sessionContext, setSessionContext, contextKey, legacyContextKey, }: UsePromptPackSelectionByModeOptions): {
|
|
18
|
-
activeRef: PromptPackRef | undefined;
|
|
19
|
-
activeLabel: string;
|
|
20
|
-
labelsByMode: Record<PromptPackMode, string>;
|
|
21
|
-
catalogById: Record<string, PromptPackCatalogEntry>;
|
|
22
|
-
setSelection: (mode: PromptPackMode, packId: string) => void;
|
|
23
|
-
resetSelection: () => void;
|
|
24
|
-
mergedSelection: PromptPackSelectionByMode;
|
|
25
|
-
};
|
|
26
|
-
//# sourceMappingURL=usePromptPackSelectionByMode.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"usePromptPackSelectionByMode.d.ts","sourceRoot":"","sources":["../src/usePromptPackSelectionByMode.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,sBAAsB,EAE3B,KAAK,aAAa,EACnB,MAAM,6BAA6B,CAAC;AAErC,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC;AAEpC,MAAM,MAAM,yBAAyB,GAAG,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC,CAAC;AAEvF,MAAM,MAAM,mCAAmC,GAAG;IAChD,IAAI,EAAE,cAAc,CAAC;IACrB,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;IACzB,OAAO,EAAE,sBAAsB,EAAE,CAAC;IAClC,YAAY,EAAE,yBAAyB,CAAC;IACxC,iBAAiB,CAAC,EAAE,yBAAyB,GAAG,IAAI,CAAC;IACrD,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAChD,iBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAC/D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,cAAc,EAAO,CAAC;AAC9D,eAAO,MAAM,iBAAiB,UAA4B,CAAC;AAiC3D,wBAAgB,4BAA4B,CAAC,EAC3C,IAAI,EACJ,KAAiC,EACjC,OAAO,EACP,YAAY,EACZ,iBAAwB,EACxB,cAAqB,EACrB,iBAAiB,EACjB,UAAkC,EAClC,gBAAgD,GACjD,EAAE,mCAAmC,GAAG;IACvC,SAAS,EAAE,aAAa,GAAG,SAAS,CAAC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IAC7C,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;IACpD,YAAY,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7D,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,eAAe,EAAE,yBAAyB,CAAC;CAC5C,CA0FA"}
|