@treasuryspatial/viewer-react 0.1.43 → 0.1.47
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 +19 -2
- package/dist/ViewControls.d.ts.map +1 -1
- package/dist/ViewControls.js +65 -16
- 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 +103 -79
- 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/usePromptPackSelectionByMode.d.ts +2 -1
- package/dist/usePromptPackSelectionByMode.d.ts.map +1 -1
- package/dist/usePromptPackSelectionByMode.js +35 -22
- package/dist/useRightRailTabs.js +1 -1
- package/dist/useSessionLogout.d.ts.map +1 -1
- package/dist/useSessionLogout.js +13 -2
- 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/useSurfaceLogin.d.ts.map +1 -1
- package/dist/useSurfaceLogin.js +4 -19
- package/dist/workspaceSession.d.ts +36 -0
- package/dist/workspaceSession.d.ts.map +1 -0
- package/dist/workspaceSession.js +141 -0
- package/package.json +8 -8
|
@@ -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
|
+
}
|
|
@@ -7,6 +7,7 @@ export type UsePromptPackSelectionByModeOptions = {
|
|
|
7
7
|
catalog: PromptPackCatalogEntry[];
|
|
8
8
|
envSelection: PromptPackSelectionByMode;
|
|
9
9
|
overrideSelection?: PromptPackSelectionByMode | null;
|
|
10
|
+
lockedModes?: PromptPackMode[];
|
|
10
11
|
sessionContext?: Record<string, unknown> | null;
|
|
11
12
|
setSessionContext?: (partial: Record<string, unknown>) => void;
|
|
12
13
|
contextKey?: string;
|
|
@@ -14,7 +15,7 @@ export type UsePromptPackSelectionByModeOptions = {
|
|
|
14
15
|
};
|
|
15
16
|
export declare const DEFAULT_PROMPT_PACK_MODES: PromptPackMode[];
|
|
16
17
|
export declare const PROMPT_PACK_MODES: string[];
|
|
17
|
-
export declare function usePromptPackSelectionByMode({ mode, modes, catalog, envSelection, overrideSelection, sessionContext, setSessionContext, contextKey, legacyContextKey, }: UsePromptPackSelectionByModeOptions): {
|
|
18
|
+
export declare function usePromptPackSelectionByMode({ mode, modes, catalog, envSelection, overrideSelection, lockedModes, sessionContext, setSessionContext, contextKey, legacyContextKey, }: UsePromptPackSelectionByModeOptions): {
|
|
18
19
|
activeRef: PromptPackRef | undefined;
|
|
19
20
|
activeLabel: string;
|
|
20
21
|
labelsByMode: Record<PromptPackMode, string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePromptPackSelectionByMode.d.ts","sourceRoot":"","sources":["../src/usePromptPackSelectionByMode.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"usePromptPackSelectionByMode.d.ts","sourceRoot":"","sources":["../src/usePromptPackSelectionByMode.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,sBAAsB,EAC3B,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,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAC/B,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;AA+B3D,wBAAgB,4BAA4B,CAAC,EAC3C,IAAI,EACJ,KAAiC,EACjC,OAAO,EACP,YAAY,EACZ,iBAAwB,EACxB,WAAgB,EAChB,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,CAwGA"}
|
|
@@ -26,13 +26,11 @@ const mergeRef = (base, override) => {
|
|
|
26
26
|
};
|
|
27
27
|
const formatLabel = (ref, catalogById) => {
|
|
28
28
|
if (!ref?.id)
|
|
29
|
-
return "
|
|
29
|
+
return "";
|
|
30
30
|
const entry = catalogById[ref.id];
|
|
31
|
-
|
|
32
|
-
const version = ref.version ?? entry?.version;
|
|
33
|
-
return version ? `${label}@${version}` : label;
|
|
31
|
+
return entry?.label || ref.id;
|
|
34
32
|
};
|
|
35
|
-
export function usePromptPackSelectionByMode({ mode, modes = DEFAULT_PROMPT_PACK_MODES, catalog, envSelection, overrideSelection = null, sessionContext = null, setSessionContext, contextKey = "promptPackRefByMode", legacyContextKey = "promptPackRefByModeOverride", }) {
|
|
33
|
+
export function usePromptPackSelectionByMode({ mode, modes = DEFAULT_PROMPT_PACK_MODES, catalog, envSelection, overrideSelection = null, lockedModes = [], sessionContext = null, setSessionContext, contextKey = "promptPackRefByMode", legacyContextKey = "promptPackRefByModeOverride", }) {
|
|
36
34
|
const catalogById = useMemo(() => Object.fromEntries(catalog.map((entry) => [entry.id, entry])), [catalog]);
|
|
37
35
|
const activeModes = useMemo(() => {
|
|
38
36
|
const values = new Set();
|
|
@@ -46,51 +44,66 @@ export function usePromptPackSelectionByMode({ mode, modes = DEFAULT_PROMPT_PACK
|
|
|
46
44
|
values.add(normalizedMode);
|
|
47
45
|
return Array.from(values);
|
|
48
46
|
}, [mode, modes]);
|
|
47
|
+
const lockedModeSet = useMemo(() => {
|
|
48
|
+
const values = new Set();
|
|
49
|
+
lockedModes.forEach((entry) => {
|
|
50
|
+
const normalized = entry.trim();
|
|
51
|
+
if (normalized)
|
|
52
|
+
values.add(normalized);
|
|
53
|
+
});
|
|
54
|
+
return values;
|
|
55
|
+
}, [lockedModes]);
|
|
49
56
|
const sessionSelection = useMemo(() => {
|
|
50
|
-
const raw = (sessionContext ?? {})[contextKey]
|
|
57
|
+
const raw = (sessionContext ?? {})[contextKey];
|
|
51
58
|
return normalizeSelection(raw, activeModes);
|
|
52
|
-
}, [activeModes, contextKey,
|
|
53
|
-
const mergedOverrides = useMemo(() => {
|
|
54
|
-
if (!overrideSelection && !sessionSelection)
|
|
55
|
-
return null;
|
|
56
|
-
return {
|
|
57
|
-
...(overrideSelection ?? {}),
|
|
58
|
-
...(sessionSelection ?? {}),
|
|
59
|
-
};
|
|
60
|
-
}, [overrideSelection, sessionSelection]);
|
|
59
|
+
}, [activeModes, contextKey, sessionContext]);
|
|
61
60
|
const mergedSelection = useMemo(() => {
|
|
62
|
-
if (!mergedOverrides)
|
|
63
|
-
return envSelection;
|
|
64
61
|
const next = { ...envSelection };
|
|
65
62
|
activeModes.forEach((modeId) => {
|
|
66
|
-
|
|
63
|
+
const overrideRef = overrideSelection?.[modeId];
|
|
64
|
+
const sessionRef = lockedModeSet.has(modeId) ? undefined : sessionSelection?.[modeId];
|
|
65
|
+
const mergedOverride = mergeRef(overrideRef, sessionRef);
|
|
66
|
+
const mergedRef = mergeRef(envSelection[modeId], mergedOverride);
|
|
67
|
+
if (mergedRef) {
|
|
68
|
+
next[modeId] = mergedRef;
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
delete next[modeId];
|
|
72
|
+
}
|
|
67
73
|
});
|
|
68
74
|
return next;
|
|
69
|
-
}, [activeModes, envSelection,
|
|
75
|
+
}, [activeModes, envSelection, lockedModeSet, overrideSelection, sessionSelection]);
|
|
70
76
|
const activeRef = useMemo(() => mergedSelection[mode], [mergedSelection, mode]);
|
|
71
77
|
const activeLabel = useMemo(() => formatLabel(activeRef, catalogById), [activeRef, catalogById]);
|
|
72
78
|
const labelsByMode = useMemo(() => Object.fromEntries(activeModes.map((modeId) => [modeId, formatLabel(mergedSelection[modeId], catalogById)])), [activeModes, catalogById, mergedSelection]);
|
|
73
79
|
const setSelection = useCallback((modeKey, packId) => {
|
|
74
80
|
if (!setSessionContext)
|
|
75
81
|
return;
|
|
82
|
+
if (lockedModeSet.has(modeKey))
|
|
83
|
+
return;
|
|
76
84
|
const trimmedPackId = packId.trim();
|
|
77
85
|
const existing = (sessionSelection ?? {});
|
|
86
|
+
const existingEntry = existing[modeKey];
|
|
87
|
+
const existingCatalogEntry = trimmedPackId ? catalogById[trimmedPackId] : undefined;
|
|
88
|
+
const nextVersion = existingCatalogEntry?.version || undefined;
|
|
89
|
+
if ((existingEntry?.id ?? '') === trimmedPackId && (existingEntry?.version ?? undefined) === nextVersion) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
78
92
|
const next = { ...existing };
|
|
79
93
|
if (!trimmedPackId) {
|
|
80
94
|
delete next[modeKey];
|
|
81
95
|
}
|
|
82
96
|
else {
|
|
83
|
-
const catalogEntry = catalogById[trimmedPackId];
|
|
84
97
|
next[modeKey] = {
|
|
85
98
|
id: trimmedPackId,
|
|
86
|
-
version:
|
|
99
|
+
version: nextVersion,
|
|
87
100
|
};
|
|
88
101
|
}
|
|
89
102
|
setSessionContext({
|
|
90
103
|
[contextKey]: Object.keys(next).length ? next : null,
|
|
91
104
|
[legacyContextKey]: null,
|
|
92
105
|
});
|
|
93
|
-
}, [catalogById, contextKey, legacyContextKey, sessionSelection, setSessionContext]);
|
|
106
|
+
}, [catalogById, contextKey, legacyContextKey, lockedModeSet, sessionSelection, setSessionContext]);
|
|
94
107
|
const resetSelection = useCallback(() => {
|
|
95
108
|
if (!setSessionContext)
|
|
96
109
|
return;
|
package/dist/useRightRailTabs.js
CHANGED
|
@@ -7,7 +7,7 @@ export function useRightRailTabs({ mode, modePolicy, baseTabs, defaultTab, }) {
|
|
|
7
7
|
const selected = new Set(resolvedTabs);
|
|
8
8
|
return baseTabs.filter((tab) => selected.has(tab.id));
|
|
9
9
|
}, [baseTabs, mode, modePolicy]);
|
|
10
|
-
const modeDefaultTab = useMemo(() => tabs[0]?.id ?? defaultTab ?? "
|
|
10
|
+
const modeDefaultTab = useMemo(() => tabs[0]?.id ?? defaultTab ?? "feed", [defaultTab, tabs]);
|
|
11
11
|
const [activeTab, setActiveTab] = useState(() => modeDefaultTab);
|
|
12
12
|
useEffect(() => {
|
|
13
13
|
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
|
|
@@ -14,7 +25,7 @@ export function useSessionLogout({ logoutRoute = "/api/auth/logout", redirectPat
|
|
|
14
25
|
return;
|
|
15
26
|
}
|
|
16
27
|
if (typeof window !== "undefined") {
|
|
17
|
-
window.location.
|
|
28
|
+
window.location.assign(redirectPath);
|
|
18
29
|
}
|
|
19
30
|
}, [cookieKeys, logoutRoute, onRedirect, redirectPath]);
|
|
20
31
|
}
|
|
@@ -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;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSurfaceLogin.d.ts","sourceRoot":"","sources":["../src/useSurfaceLogin.ts"],"names":[],"mappings":"AAEA,OAAO,EAA6C,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGlF,MAAM,MAAM,sBAAsB,GAAG;IACnC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,CAAC,EAAE,CAAC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;CAC9C,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,OAAO,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,eAAe,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAChE,CAAC;AAEF,wBAAgB,eAAe,CAAC,EAC9B,iBAAiB,EACjB,MAAa,GACd,EAAE,sBAAsB,GAAG,qBAAqB,
|
|
1
|
+
{"version":3,"file":"useSurfaceLogin.d.ts","sourceRoot":"","sources":["../src/useSurfaceLogin.ts"],"names":[],"mappings":"AAEA,OAAO,EAA6C,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGlF,MAAM,MAAM,sBAAsB,GAAG;IACnC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,CAAC,EAAE,CAAC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;CAC9C,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,OAAO,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,eAAe,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAChE,CAAC;AAEF,wBAAgB,eAAe,CAAC,EAC9B,iBAAiB,EACjB,MAAa,GACd,EAAE,sBAAsB,GAAG,qBAAqB,CAsEhD"}
|
package/dist/useSurfaceLogin.js
CHANGED
|
@@ -13,25 +13,10 @@ export function useSurfaceLogin({ defaultRedirectTo, warmup = null, }) {
|
|
|
13
13
|
return fromParam.startsWith('/') && !fromParam.startsWith('//') ? fromParam : defaultRedirectTo;
|
|
14
14
|
}, [defaultRedirectTo, searchParams]);
|
|
15
15
|
useEffect(() => {
|
|
16
|
-
if (warmup)
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
.then(async (response) => {
|
|
21
|
-
if (!response.ok)
|
|
22
|
-
return null;
|
|
23
|
-
return response.json().catch(() => null);
|
|
24
|
-
})
|
|
25
|
-
.then((payload) => {
|
|
26
|
-
if (payload?.success) {
|
|
27
|
-
if (typeof window !== 'undefined') {
|
|
28
|
-
window.location.assign(redirectTarget);
|
|
29
|
-
return;
|
|
30
|
-
}
|
|
31
|
-
router.push(redirectTarget);
|
|
32
|
-
}
|
|
33
|
-
});
|
|
34
|
-
}, [redirectTarget, router, warmup]);
|
|
16
|
+
if (!warmup)
|
|
17
|
+
return;
|
|
18
|
+
void Promise.resolve(warmup()).catch(() => null);
|
|
19
|
+
}, [warmup]);
|
|
35
20
|
const onSubmit = useCallback(async (event) => {
|
|
36
21
|
event.preventDefault();
|
|
37
22
|
const resolvedEmail = email.trim().toLowerCase();
|
|
@@ -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"}
|