@treasuryspatial/viewer-react 0.1.47 → 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/ViewControls.d.ts +18 -1
- package/dist/ViewControls.d.ts.map +1 -1
- package/dist/ViewControls.js +101 -41
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/useComposerUiState.d.ts.map +1 -1
- package/dist/useComposerUiState.js +27 -13
- package/dist/useRightRailTabs.d.ts.map +1 -1
- package/dist/useRightRailTabs.js +3 -2
- package/package.json +3 -2
- package/dist/usePromptPackSelectionByMode.d.ts +0 -27
- package/dist/usePromptPackSelectionByMode.d.ts.map +0 -1
- package/dist/usePromptPackSelectionByMode.js +0 -124
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useComposerUiState.d.ts","sourceRoot":"","sources":["../src/useComposerUiState.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,wBAAwB,EAAE,+BAA+B,EAAE,MAAM,oBAAoB,CAAC;AAEpG,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC;AAEpC,MAAM,MAAM,eAAe,GAAG;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,mBAAmB,EAAE,OAAO,CAAC;IAC7B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,cAAc,EAAE,OAAO,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,yBAAyB,CAAC,MAAM,GAAG,OAAO,IAAI;IACxD,IAAI,EAAE,cAAc,CAAC;IACrB,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;IACjF,QAAQ,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IACpC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,uBAAuB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClD,CAAC;AAoBF,wBAAgB,kBAAkB,CAAC,MAAM,GAAG,OAAO,EAAE,EACnD,IAAI,EACJ,gBAAgB,EAChB,mBAAmB,EACnB,QAAQ,EACR,cAA4B,EAC5B,cAAkC,EAClC,uBAAuB,GACxB,EAAE,yBAAyB,CAAC,MAAM,CAAC,GAAG;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,mBAAmB,EAAE,OAAO,CAAC;IAC7B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,cAAc,EAAE,OAAO,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,gBAAgB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1C,gBAAgB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1C,cAAc,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACxC,wBAAwB,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACxD,sBAAsB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAChD,mBAAmB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,iBAAiB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C,gBAAgB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1C,
|
|
1
|
+
{"version":3,"file":"useComposerUiState.d.ts","sourceRoot":"","sources":["../src/useComposerUiState.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,wBAAwB,EAAE,+BAA+B,EAAE,MAAM,oBAAoB,CAAC;AAEpG,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC;AAEpC,MAAM,MAAM,eAAe,GAAG;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,mBAAmB,EAAE,OAAO,CAAC;IAC7B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,cAAc,EAAE,OAAO,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,yBAAyB,CAAC,MAAM,GAAG,OAAO,IAAI;IACxD,IAAI,EAAE,cAAc,CAAC;IACrB,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;IACjF,QAAQ,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IACpC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,uBAAuB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClD,CAAC;AAoBF,wBAAgB,kBAAkB,CAAC,MAAM,GAAG,OAAO,EAAE,EACnD,IAAI,EACJ,gBAAgB,EAChB,mBAAmB,EACnB,QAAQ,EACR,cAA4B,EAC5B,cAAkC,EAClC,uBAAuB,GACxB,EAAE,yBAAyB,CAAC,MAAM,CAAC,GAAG;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,mBAAmB,EAAE,OAAO,CAAC;IAC7B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,cAAc,EAAE,OAAO,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,gBAAgB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1C,gBAAgB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1C,cAAc,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACxC,wBAAwB,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACxD,sBAAsB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAChD,mBAAmB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,iBAAiB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C,gBAAgB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1C,CAqNA"}
|
|
@@ -31,21 +31,35 @@ export function useComposerUiState({ mode, workspaceSession, setWorkspaceSession
|
|
|
31
31
|
const [controlPanelOpen, setControlPanelOpenState] = useState(initialValue.controlPanelOpen);
|
|
32
32
|
const [rightPanelOpen, setRightPanelOpenState] = useState(initialValue.rightPanelOpen);
|
|
33
33
|
const [rightPanelTab, setRightPanelTabState] = useState(initialValue.rightPanelTab);
|
|
34
|
-
|
|
34
|
+
// Per-field delta sync: only apply a session value when the SESSION
|
|
35
|
+
// changed that field. The previous whole-snapshot stomp raced local
|
|
36
|
+
// writes — clicking a toggle (e.g. the module chooser) opened it locally
|
|
37
|
+
// while the session write was still in flight; any unrelated session
|
|
38
|
+
// churn (draft saves, hydration) then re-applied the stale session value
|
|
39
|
+
// and instantly reverted the click.
|
|
40
|
+
const lastResolvedRef = useRef(null);
|
|
35
41
|
useEffect(() => {
|
|
36
42
|
const next = resolveWorkspaceValue();
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
43
|
+
const prev = lastResolvedRef.current;
|
|
44
|
+
lastResolvedRef.current = next;
|
|
45
|
+
if (!prev)
|
|
46
|
+
return; // initial useState already seeded from the session
|
|
47
|
+
if (next.primaryTab !== prev.primaryTab)
|
|
48
|
+
setPrimaryTabState(next.primaryTab);
|
|
49
|
+
if (next.promptKitOpen !== prev.promptKitOpen)
|
|
50
|
+
setPromptKitOpenState(next.promptKitOpen);
|
|
51
|
+
if (next.moduleKitOpen !== prev.moduleKitOpen)
|
|
52
|
+
setModuleKitOpenState(next.moduleKitOpen);
|
|
53
|
+
if (next.activeImaginePresetId !== prev.activeImaginePresetId)
|
|
54
|
+
setActiveImaginePresetIdState(next.activeImaginePresetId);
|
|
55
|
+
if (next.autoGenerateEnabled !== prev.autoGenerateEnabled)
|
|
56
|
+
setAutoGenerateEnabledState(next.autoGenerateEnabled);
|
|
57
|
+
if (next.controlPanelOpen !== prev.controlPanelOpen)
|
|
58
|
+
setControlPanelOpenState(next.controlPanelOpen);
|
|
59
|
+
if (next.rightPanelOpen !== prev.rightPanelOpen)
|
|
60
|
+
setRightPanelOpenState(next.rightPanelOpen);
|
|
61
|
+
if (next.rightPanelTab !== prev.rightPanelTab)
|
|
62
|
+
setRightPanelTabState(next.rightPanelTab);
|
|
49
63
|
}, [resolveWorkspaceValue]);
|
|
50
64
|
const updateWorkspaceUiState = useCallback((updater) => {
|
|
51
65
|
if (!setWorkspaceSession)
|
|
@@ -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,11 +1,12 @@
|
|
|
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
11
|
const modeDefaultTab = useMemo(() => tabs[0]?.id ?? defaultTab ?? "feed", [defaultTab, tabs]);
|
|
11
12
|
const [activeTab, setActiveTab] = useState(() => modeDefaultTab);
|
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
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
|
}
|
|
@@ -23,7 +24,7 @@
|
|
|
23
24
|
"@treasuryspatial/plugin-manifest": "^0.1.13",
|
|
24
25
|
"@treasuryspatial/render-kit": "^0.1.23",
|
|
25
26
|
"@treasuryspatial/surface-kit": "^0.1.16",
|
|
26
|
-
"@treasuryspatial/viewer-kit": "^0.2.
|
|
27
|
+
"@treasuryspatial/viewer-kit": "^0.2.54"
|
|
27
28
|
},
|
|
28
29
|
"peerDependencies": {
|
|
29
30
|
"react": ">=18"
|
|
@@ -1,27 +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
|
-
lockedModes?: PromptPackMode[];
|
|
11
|
-
sessionContext?: Record<string, unknown> | null;
|
|
12
|
-
setSessionContext?: (partial: Record<string, unknown>) => void;
|
|
13
|
-
contextKey?: string;
|
|
14
|
-
legacyContextKey?: string;
|
|
15
|
-
};
|
|
16
|
-
export declare const DEFAULT_PROMPT_PACK_MODES: PromptPackMode[];
|
|
17
|
-
export declare const PROMPT_PACK_MODES: string[];
|
|
18
|
-
export declare function usePromptPackSelectionByMode({ mode, modes, catalog, envSelection, overrideSelection, lockedModes, sessionContext, setSessionContext, contextKey, legacyContextKey, }: UsePromptPackSelectionByModeOptions): {
|
|
19
|
-
activeRef: PromptPackRef | undefined;
|
|
20
|
-
activeLabel: string;
|
|
21
|
-
labelsByMode: Record<PromptPackMode, string>;
|
|
22
|
-
catalogById: Record<string, PromptPackCatalogEntry>;
|
|
23
|
-
setSelection: (mode: PromptPackMode, packId: string) => void;
|
|
24
|
-
resetSelection: () => void;
|
|
25
|
-
mergedSelection: PromptPackSelectionByMode;
|
|
26
|
-
};
|
|
27
|
-
//# sourceMappingURL=usePromptPackSelectionByMode.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
import { useCallback, useMemo } from "react";
|
|
2
|
-
export const DEFAULT_PROMPT_PACK_MODES = [];
|
|
3
|
-
export const PROMPT_PACK_MODES = DEFAULT_PROMPT_PACK_MODES;
|
|
4
|
-
const normalizeSelection = (raw, modes) => {
|
|
5
|
-
if (!raw || typeof raw !== "object" || Array.isArray(raw))
|
|
6
|
-
return null;
|
|
7
|
-
const next = {};
|
|
8
|
-
modes.forEach((mode) => {
|
|
9
|
-
const entry = raw[mode];
|
|
10
|
-
if (!entry || typeof entry !== "object" || Array.isArray(entry))
|
|
11
|
-
return;
|
|
12
|
-
const id = typeof entry.id === "string" ? entry.id?.trim() : undefined;
|
|
13
|
-
const version = typeof entry.version === "string" ? entry.version?.trim() : undefined;
|
|
14
|
-
if (id || version) {
|
|
15
|
-
next[mode] = { id: id || undefined, version: version || undefined };
|
|
16
|
-
}
|
|
17
|
-
});
|
|
18
|
-
return Object.keys(next).length ? next : null;
|
|
19
|
-
};
|
|
20
|
-
const mergeRef = (base, override) => {
|
|
21
|
-
const id = override?.id ?? base?.id;
|
|
22
|
-
const version = override?.version ?? base?.version;
|
|
23
|
-
if (!id && !version)
|
|
24
|
-
return undefined;
|
|
25
|
-
return { id, version };
|
|
26
|
-
};
|
|
27
|
-
const formatLabel = (ref, catalogById) => {
|
|
28
|
-
if (!ref?.id)
|
|
29
|
-
return "";
|
|
30
|
-
const entry = catalogById[ref.id];
|
|
31
|
-
return entry?.label || ref.id;
|
|
32
|
-
};
|
|
33
|
-
export function usePromptPackSelectionByMode({ mode, modes = DEFAULT_PROMPT_PACK_MODES, catalog, envSelection, overrideSelection = null, lockedModes = [], sessionContext = null, setSessionContext, contextKey = "promptPackRefByMode", legacyContextKey = "promptPackRefByModeOverride", }) {
|
|
34
|
-
const catalogById = useMemo(() => Object.fromEntries(catalog.map((entry) => [entry.id, entry])), [catalog]);
|
|
35
|
-
const activeModes = useMemo(() => {
|
|
36
|
-
const values = new Set();
|
|
37
|
-
modes.forEach((entry) => {
|
|
38
|
-
const normalized = entry.trim();
|
|
39
|
-
if (normalized)
|
|
40
|
-
values.add(normalized);
|
|
41
|
-
});
|
|
42
|
-
const normalizedMode = mode.trim();
|
|
43
|
-
if (normalizedMode)
|
|
44
|
-
values.add(normalizedMode);
|
|
45
|
-
return Array.from(values);
|
|
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]);
|
|
56
|
-
const sessionSelection = useMemo(() => {
|
|
57
|
-
const raw = (sessionContext ?? {})[contextKey];
|
|
58
|
-
return normalizeSelection(raw, activeModes);
|
|
59
|
-
}, [activeModes, contextKey, sessionContext]);
|
|
60
|
-
const mergedSelection = useMemo(() => {
|
|
61
|
-
const next = { ...envSelection };
|
|
62
|
-
activeModes.forEach((modeId) => {
|
|
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
|
-
}
|
|
73
|
-
});
|
|
74
|
-
return next;
|
|
75
|
-
}, [activeModes, envSelection, lockedModeSet, overrideSelection, sessionSelection]);
|
|
76
|
-
const activeRef = useMemo(() => mergedSelection[mode], [mergedSelection, mode]);
|
|
77
|
-
const activeLabel = useMemo(() => formatLabel(activeRef, catalogById), [activeRef, catalogById]);
|
|
78
|
-
const labelsByMode = useMemo(() => Object.fromEntries(activeModes.map((modeId) => [modeId, formatLabel(mergedSelection[modeId], catalogById)])), [activeModes, catalogById, mergedSelection]);
|
|
79
|
-
const setSelection = useCallback((modeKey, packId) => {
|
|
80
|
-
if (!setSessionContext)
|
|
81
|
-
return;
|
|
82
|
-
if (lockedModeSet.has(modeKey))
|
|
83
|
-
return;
|
|
84
|
-
const trimmedPackId = packId.trim();
|
|
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
|
-
}
|
|
92
|
-
const next = { ...existing };
|
|
93
|
-
if (!trimmedPackId) {
|
|
94
|
-
delete next[modeKey];
|
|
95
|
-
}
|
|
96
|
-
else {
|
|
97
|
-
next[modeKey] = {
|
|
98
|
-
id: trimmedPackId,
|
|
99
|
-
version: nextVersion,
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
setSessionContext({
|
|
103
|
-
[contextKey]: Object.keys(next).length ? next : null,
|
|
104
|
-
[legacyContextKey]: null,
|
|
105
|
-
});
|
|
106
|
-
}, [catalogById, contextKey, legacyContextKey, lockedModeSet, sessionSelection, setSessionContext]);
|
|
107
|
-
const resetSelection = useCallback(() => {
|
|
108
|
-
if (!setSessionContext)
|
|
109
|
-
return;
|
|
110
|
-
setSessionContext({
|
|
111
|
-
[contextKey]: null,
|
|
112
|
-
[legacyContextKey]: null,
|
|
113
|
-
});
|
|
114
|
-
}, [contextKey, legacyContextKey, setSessionContext]);
|
|
115
|
-
return {
|
|
116
|
-
activeRef,
|
|
117
|
-
activeLabel,
|
|
118
|
-
labelsByMode,
|
|
119
|
-
catalogById,
|
|
120
|
-
setSelection,
|
|
121
|
-
resetSelection,
|
|
122
|
-
mergedSelection,
|
|
123
|
-
};
|
|
124
|
-
}
|