@treasuryspatial/viewer-react 0.1.44 → 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 +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 +8 -8
|
@@ -1,33 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
shortId?: string;
|
|
4
|
-
key: string;
|
|
5
|
-
createdAt?: string;
|
|
6
|
-
user?: string;
|
|
7
|
-
name?: string;
|
|
8
|
-
prompt?: string;
|
|
9
|
-
title?: string;
|
|
10
|
-
imageKey?: string;
|
|
11
|
-
metaKey?: string | null;
|
|
12
|
-
status?: string;
|
|
13
|
-
renderMeta?: {
|
|
14
|
-
requestKind?: string;
|
|
15
|
-
model?: string;
|
|
16
|
-
promptChars?: number;
|
|
17
|
-
referenceImageCount?: number;
|
|
18
|
-
hasBaseImage?: boolean;
|
|
19
|
-
imageDimensions?: {
|
|
20
|
-
width?: number;
|
|
21
|
-
height?: number;
|
|
22
|
-
};
|
|
23
|
-
createdAt?: string;
|
|
24
|
-
geo?: any | null;
|
|
25
|
-
interactionId?: string | null;
|
|
26
|
-
previousInteractionId?: string | null;
|
|
27
|
-
stamped?: boolean;
|
|
28
|
-
meta?: any;
|
|
29
|
-
} | null;
|
|
30
|
-
};
|
|
1
|
+
import type { GalleryRecord } from "@treasuryspatial/render-kit";
|
|
2
|
+
export type GalleryEntry = GalleryRecord;
|
|
31
3
|
export type UseAdminGalleryOptions = {
|
|
32
4
|
endpoint?: string;
|
|
33
5
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAdminGallery.d.ts","sourceRoot":"","sources":["../src/useAdminGallery.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useAdminGallery.d.ts","sourceRoot":"","sources":["../src/useAdminGallery.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAEjE,MAAM,MAAM,YAAY,GAAG,aAAa,CAAC;AAEzC,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5D,CAAC;AAUF,wBAAgB,eAAe,CAAC,EAAE,QAA+B,EAAE,GAAE,sBAA2B,GAAG,iBAAiB,CAgEnH"}
|
package/dist/useAdminGallery.js
CHANGED
|
@@ -33,12 +33,21 @@ export function useAdminGallery({ endpoint = "/api/admin/gallery" } = {}) {
|
|
|
33
33
|
}
|
|
34
34
|
}, [endpoint]);
|
|
35
35
|
const post = useCallback(async (action, payload) => {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
36
|
+
try {
|
|
37
|
+
const response = await fetch(endpoint, {
|
|
38
|
+
method: "POST",
|
|
39
|
+
headers: { "Content-Type": "application/json" },
|
|
40
|
+
body: JSON.stringify({ action, ...payload }),
|
|
41
|
+
});
|
|
42
|
+
const data = await response.json().catch(() => null);
|
|
43
|
+
if (!response.ok || !data?.success) {
|
|
44
|
+
throw new Error(data?.error || `failed to ${action} gallery item`);
|
|
45
|
+
}
|
|
46
|
+
await reload();
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
setError(err?.message || `failed to ${action} gallery item`);
|
|
50
|
+
}
|
|
42
51
|
}, [endpoint, reload]);
|
|
43
52
|
const approve = useCallback(async (key) => post("approve", { key }), [post]);
|
|
44
53
|
const reject = useCallback(async (key) => post("reject", { key }), [post]);
|
|
@@ -1,34 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
bucket?: string;
|
|
4
|
-
key: string;
|
|
5
|
-
metaKey?: string | null;
|
|
6
|
-
createdAt?: string;
|
|
7
|
-
user?: string;
|
|
8
|
-
name?: string;
|
|
9
|
-
prompt?: string;
|
|
10
|
-
fullPrompt?: string;
|
|
11
|
-
title?: string;
|
|
12
|
-
promptHash?: string;
|
|
13
|
-
requestKind?: string;
|
|
14
|
-
model?: string;
|
|
15
|
-
stamped?: boolean;
|
|
16
|
-
imageDimensions?: {
|
|
17
|
-
width?: number;
|
|
18
|
-
height?: number;
|
|
19
|
-
} | null;
|
|
20
|
-
sizeBytes?: number;
|
|
21
|
-
format?: string;
|
|
22
|
-
geo?: any | null;
|
|
23
|
-
mode?: string;
|
|
24
|
-
location?: string;
|
|
25
|
-
timeOfDay?: string;
|
|
26
|
-
era?: string;
|
|
27
|
-
style?: string;
|
|
28
|
-
referenceImageCount?: number;
|
|
29
|
-
hasBaseImage?: boolean;
|
|
30
|
-
promptChars?: number;
|
|
31
|
-
};
|
|
1
|
+
import type { ImageRecord } from "@treasuryspatial/render-kit";
|
|
2
|
+
export type AdminImageEntry = ImageRecord;
|
|
32
3
|
export type UseAdminImageStreamOptions = {
|
|
33
4
|
endpoint?: string;
|
|
34
5
|
limit?: number;
|
|
@@ -42,6 +13,7 @@ export type AdminImageStreamState = {
|
|
|
42
13
|
loading: boolean;
|
|
43
14
|
loadingMore: boolean;
|
|
44
15
|
error: string;
|
|
16
|
+
warnings: string[];
|
|
45
17
|
cursor: string | null;
|
|
46
18
|
hasMore: boolean;
|
|
47
19
|
load: (reset?: boolean) => Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAdminImageStream.d.ts","sourceRoot":"","sources":["../src/useAdminImageStream.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useAdminImageStream.d.ts","sourceRoot":"","sources":["../src/useAdminImageStream.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAE/D,MAAM,MAAM,eAAe,GAAG,WAAW,CAAC;AAE1C,MAAM,MAAM,0BAA0B,GAAG;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB,CAAC;AAqCF,wBAAgB,mBAAmB,CAAC,EAClC,QAA8B,EAC9B,KAAW,EACX,KAAU,EACV,UAAe,EACf,IAAa,EACb,SAAkB,GACnB,GAAE,0BAA+B,GAAG,qBAAqB,CA2FzD"}
|
|
@@ -37,9 +37,11 @@ export function useAdminImageStream({ endpoint = "/api/admin/images", limit = 10
|
|
|
37
37
|
const [loading, setLoading] = useState(true);
|
|
38
38
|
const [loadingMore, setLoadingMore] = useState(false);
|
|
39
39
|
const [error, setError] = useState("");
|
|
40
|
+
const [warnings, setWarnings] = useState([]);
|
|
40
41
|
const [cursor, setCursor] = useState(null);
|
|
41
42
|
const [hasMore, setHasMore] = useState(true);
|
|
42
43
|
const inFlightRef = useRef(false);
|
|
44
|
+
const cursorRef = useRef(null);
|
|
43
45
|
const buildUrl = useCallback((cursorValue) => {
|
|
44
46
|
const params = new URLSearchParams();
|
|
45
47
|
params.set("limit", String(limit));
|
|
@@ -63,33 +65,42 @@ export function useAdminImageStream({ endpoint = "/api/admin/images", limit = 10
|
|
|
63
65
|
if (reset) {
|
|
64
66
|
setLoading(true);
|
|
65
67
|
setError("");
|
|
68
|
+
setWarnings([]);
|
|
66
69
|
}
|
|
67
70
|
else {
|
|
68
71
|
setLoadingMore(true);
|
|
69
72
|
}
|
|
70
|
-
const response = await fetch(buildUrl(reset ? null :
|
|
73
|
+
const response = await fetch(buildUrl(reset ? null : cursorRef.current));
|
|
71
74
|
const data = await response.json();
|
|
72
75
|
if (!response.ok || !data?.success) {
|
|
73
|
-
throw new Error(data?.error || "failed to load
|
|
76
|
+
throw new Error(data?.error || "failed to load images");
|
|
74
77
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
setEntries(
|
|
79
|
-
|
|
80
|
-
|
|
78
|
+
setWarnings(Array.isArray(data?.warnings)
|
|
79
|
+
? data.warnings.filter((entry) => typeof entry === "string" && Boolean(entry.trim()))
|
|
80
|
+
: []);
|
|
81
|
+
setEntries((prev) => {
|
|
82
|
+
const next = reset ? data.entries || [] : [...prev, ...(data.entries || [])];
|
|
83
|
+
const deduped = dedupeEntries(next);
|
|
84
|
+
return sortEntries(deduped, sort, direction);
|
|
85
|
+
});
|
|
86
|
+
const nextCursor = data.nextCursor || null;
|
|
87
|
+
cursorRef.current = nextCursor;
|
|
88
|
+
setCursor(nextCursor);
|
|
89
|
+
setHasMore(Boolean(nextCursor));
|
|
81
90
|
}
|
|
82
91
|
catch (err) {
|
|
83
|
-
setError(err?.message || "failed to load
|
|
92
|
+
setError(err?.message || "failed to load images");
|
|
84
93
|
}
|
|
85
94
|
finally {
|
|
86
95
|
setLoading(false);
|
|
87
96
|
setLoadingMore(false);
|
|
88
97
|
inFlightRef.current = false;
|
|
89
98
|
}
|
|
90
|
-
}, [buildUrl,
|
|
99
|
+
}, [buildUrl, direction, sort]);
|
|
91
100
|
const reset = useCallback(() => {
|
|
92
101
|
setEntries([]);
|
|
102
|
+
setWarnings([]);
|
|
103
|
+
cursorRef.current = null;
|
|
93
104
|
setCursor(null);
|
|
94
105
|
setHasMore(true);
|
|
95
106
|
void load(true);
|
|
@@ -102,6 +113,7 @@ export function useAdminImageStream({ endpoint = "/api/admin/images", limit = 10
|
|
|
102
113
|
loading,
|
|
103
114
|
loadingMore,
|
|
104
115
|
error,
|
|
116
|
+
warnings,
|
|
105
117
|
cursor,
|
|
106
118
|
hasMore,
|
|
107
119
|
load,
|
|
@@ -2,15 +2,15 @@ import { useCallback, useMemo, useState } from "react";
|
|
|
2
2
|
import { useComposerAuthState } from "./useComposerAuthState";
|
|
3
3
|
export function useComposerAccessGate(options) {
|
|
4
4
|
const { mode, allowAdminOnly = true, allowUnauthedImagine = false, restrictedModes = ["design", "map"], trackTelemetry, requestEvent = "beta_access_request", } = options;
|
|
5
|
-
const { auth } = useComposerAuthState();
|
|
5
|
+
const { auth, authHydrated } = useComposerAuthState();
|
|
6
6
|
const [requestStatus, setRequestStatus] = useState("idle");
|
|
7
7
|
const isRestricted = restrictedModes.includes(mode);
|
|
8
8
|
const isAuthed = auth.isAuthenticated;
|
|
9
9
|
const isAdmin = auth.isAdmin;
|
|
10
10
|
const allowRestricted = !allowAdminOnly || isAdmin;
|
|
11
|
-
const showGate = isRestricted && (!isAuthed || !allowRestricted);
|
|
12
|
-
const lockImagine = !allowUnauthedImagine && mode === "imagine" && !isAuthed;
|
|
13
|
-
const canRequestAccess = isAuthed && !isAdmin && isRestricted;
|
|
11
|
+
const showGate = authHydrated && isRestricted && (!isAuthed || !allowRestricted);
|
|
12
|
+
const lockImagine = authHydrated && !allowUnauthedImagine && mode === "imagine" && !isAuthed;
|
|
13
|
+
const canRequestAccess = authHydrated && isAuthed && !isAdmin && isRestricted;
|
|
14
14
|
const requestAccess = useCallback(() => {
|
|
15
15
|
if (!canRequestAccess)
|
|
16
16
|
return;
|
|
@@ -15,6 +15,7 @@ export type UseComposerAuthStateOptions = {
|
|
|
15
15
|
};
|
|
16
16
|
export declare function useComposerAuthState(options?: UseComposerAuthStateOptions): {
|
|
17
17
|
auth: ComposerAuthState;
|
|
18
|
+
authHydrated: boolean;
|
|
18
19
|
refresh: () => void;
|
|
19
20
|
};
|
|
20
21
|
//# sourceMappingURL=useComposerAuthState.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useComposerAuthState.d.ts","sourceRoot":"","sources":["../src/useComposerAuthState.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,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;CAChE,CAAC;AASF,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,2BAAgC,GAAG;IAC/E,IAAI,EAAE,iBAAiB,CAAC;IACxB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,
|
|
1
|
+
{"version":3,"file":"useComposerAuthState.d.ts","sourceRoot":"","sources":["../src/useComposerAuthState.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,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;CAChE,CAAC;AASF,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,2BAAgC,GAAG;IAC/E,IAAI,EAAE,iBAAiB,CAAC;IACxB,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAsFA"}
|
|
@@ -25,6 +25,7 @@ export function useComposerAuthState(options = {}) {
|
|
|
25
25
|
isAdmin: false,
|
|
26
26
|
isAuthenticated: false,
|
|
27
27
|
});
|
|
28
|
+
const [authHydrated, setAuthHydrated] = useState(Boolean(contextAuth));
|
|
28
29
|
const syncContext = useCallback((next) => {
|
|
29
30
|
if (!setSessionContext)
|
|
30
31
|
return;
|
|
@@ -59,6 +60,7 @@ export function useComposerAuthState(options = {}) {
|
|
|
59
60
|
next = EMPTY_AUTH;
|
|
60
61
|
}
|
|
61
62
|
setAuth(next);
|
|
63
|
+
setAuthHydrated(true);
|
|
62
64
|
syncContext(next);
|
|
63
65
|
}, [authEndpoint, syncContext]);
|
|
64
66
|
const refresh = useCallback(() => {
|
|
@@ -68,9 +70,10 @@ export function useComposerAuthState(options = {}) {
|
|
|
68
70
|
if (!contextAuth)
|
|
69
71
|
return;
|
|
70
72
|
setAuth(contextAuth);
|
|
73
|
+
setAuthHydrated(true);
|
|
71
74
|
}, [contextAuth]);
|
|
72
75
|
useEffect(() => {
|
|
73
76
|
refresh();
|
|
74
77
|
}, [refresh]);
|
|
75
|
-
return { auth, refresh };
|
|
78
|
+
return { auth, authHydrated, refresh };
|
|
76
79
|
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type SetStateAction } from 'react';
|
|
2
|
+
import type { ComposerWorkspaceSession, ComposerWorkspaceSessionUpdater } from "./workspaceSession";
|
|
3
|
+
export type ComposerModeDraftUpdater<TDraft> = (draft: TDraft) => TDraft;
|
|
4
|
+
export type UseComposerModeDraftStateOptions<TDraft> = {
|
|
5
|
+
mode: string;
|
|
6
|
+
workspaceSession?: ComposerWorkspaceSession<TDraft> | null;
|
|
7
|
+
workspaceSessionHydrated?: boolean;
|
|
8
|
+
setWorkspaceSession?: (updater: ComposerWorkspaceSessionUpdater<TDraft>) => void;
|
|
9
|
+
createDraft: () => TDraft;
|
|
10
|
+
restoreDraft: (raw: unknown) => TDraft;
|
|
11
|
+
modeIds?: string[];
|
|
12
|
+
};
|
|
13
|
+
export declare function useComposerModeDraftState<TDraft>({ mode, workspaceSession, workspaceSessionHydrated, setWorkspaceSession, createDraft, restoreDraft, modeIds, }: UseComposerModeDraftStateOptions<TDraft>): {
|
|
14
|
+
draftByMode: Record<string, TDraft>;
|
|
15
|
+
currentModeDraft: TDraft;
|
|
16
|
+
setModeDraft: (modeId: string, next: SetStateAction<TDraft>) => void;
|
|
17
|
+
setCurrentModeDraft: (next: SetStateAction<TDraft>) => void;
|
|
18
|
+
updateModeDraft: (modeId: string, updater: ComposerModeDraftUpdater<TDraft>) => void;
|
|
19
|
+
updateCurrentModeDraft: (updater: ComposerModeDraftUpdater<TDraft>) => void;
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=useComposerModeDraftState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useComposerModeDraftState.d.ts","sourceRoot":"","sources":["../src/useComposerModeDraftState.ts"],"names":[],"mappings":"AAEA,OAAO,EAA6C,KAAK,cAAc,EAAE,MAAM,OAAO,CAAC;AAEvF,OAAO,KAAK,EAAE,wBAAwB,EAAE,+BAA+B,EAAE,MAAM,oBAAoB,CAAC;AAEpG,MAAM,MAAM,wBAAwB,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;AAEzE,MAAM,MAAM,gCAAgC,CAAC,MAAM,IAAI;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,wBAAwB,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IAC3D,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,mBAAmB,CAAC,EAAE,CAAC,OAAO,EAAE,+BAA+B,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;IACjF,WAAW,EAAE,MAAM,MAAM,CAAC;IAC1B,YAAY,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,CAAC;IACvC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC;AAKF,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,EAChD,IAAI,EACJ,gBAAgB,EAChB,wBAA+B,EAC/B,mBAAmB,EACnB,WAAW,EACX,YAAY,EACZ,OAAY,GACb,EAAE,gCAAgC,CAAC,MAAM,CAAC,GAAG;IAC5C,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;IACrE,mBAAmB,EAAE,CAAC,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;IAC5D,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,wBAAwB,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;IACrF,sBAAsB,EAAE,CAAC,OAAO,EAAE,wBAAwB,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;CAC7E,CA6GA"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { useCallback, useEffect, useMemo, useState } from 'react';
|
|
3
|
+
const resolveNextState = (previous, next) => typeof next === 'function' ? next(previous) : next;
|
|
4
|
+
export function useComposerModeDraftState({ mode, workspaceSession, workspaceSessionHydrated = true, setWorkspaceSession, createDraft, restoreDraft, modeIds = [], }) {
|
|
5
|
+
const normalizedModeIds = useMemo(() => Array.from(new Set([...modeIds, mode])).filter(Boolean), [mode, modeIds]);
|
|
6
|
+
const emptyDraftSignature = useMemo(() => JSON.stringify(createDraft()), [createDraft]);
|
|
7
|
+
const [draftByMode, setDraftByMode] = useState(() => normalizedModeIds.reduce((acc, modeId) => {
|
|
8
|
+
acc[modeId] = createDraft();
|
|
9
|
+
return acc;
|
|
10
|
+
}, {}));
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
setDraftByMode((prev) => {
|
|
13
|
+
const next = { ...prev };
|
|
14
|
+
let changed = false;
|
|
15
|
+
normalizedModeIds.forEach((modeId) => {
|
|
16
|
+
if (next[modeId])
|
|
17
|
+
return;
|
|
18
|
+
next[modeId] = createDraft();
|
|
19
|
+
changed = true;
|
|
20
|
+
});
|
|
21
|
+
return changed ? next : prev;
|
|
22
|
+
});
|
|
23
|
+
}, [createDraft, normalizedModeIds]);
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
if (!workspaceSessionHydrated)
|
|
26
|
+
return;
|
|
27
|
+
setDraftByMode((prev) => {
|
|
28
|
+
const hydratedModeIds = Array.from(new Set([...normalizedModeIds, ...Object.keys(workspaceSession?.modeDraftState ?? {})]));
|
|
29
|
+
const next = { ...prev };
|
|
30
|
+
let changed = false;
|
|
31
|
+
hydratedModeIds.forEach((modeId) => {
|
|
32
|
+
const restored = restoreDraft(workspaceSession?.modeDraftState?.[modeId]);
|
|
33
|
+
const current = prev[modeId];
|
|
34
|
+
const currentSignature = current ? JSON.stringify(current) : "";
|
|
35
|
+
const restoredSignature = JSON.stringify(restored);
|
|
36
|
+
const canSeedFromWorkspace = !current || currentSignature === emptyDraftSignature || currentSignature === restoredSignature;
|
|
37
|
+
if (!canSeedFromWorkspace)
|
|
38
|
+
return;
|
|
39
|
+
if (currentSignature === restoredSignature)
|
|
40
|
+
return;
|
|
41
|
+
next[modeId] = restored;
|
|
42
|
+
changed = true;
|
|
43
|
+
});
|
|
44
|
+
return changed ? next : prev;
|
|
45
|
+
});
|
|
46
|
+
}, [emptyDraftSignature, normalizedModeIds, restoreDraft, workspaceSession, workspaceSessionHydrated]);
|
|
47
|
+
const updateModeDraft = useCallback((modeId, updater) => {
|
|
48
|
+
setDraftByMode((prev) => {
|
|
49
|
+
const current = prev[modeId] ?? createDraft();
|
|
50
|
+
const nextDraft = updater(current);
|
|
51
|
+
if (nextDraft === current)
|
|
52
|
+
return prev;
|
|
53
|
+
return { ...prev, [modeId]: nextDraft };
|
|
54
|
+
});
|
|
55
|
+
if (!setWorkspaceSession)
|
|
56
|
+
return;
|
|
57
|
+
setWorkspaceSession((session) => {
|
|
58
|
+
const current = session.modeDraftState[modeId] ?? createDraft();
|
|
59
|
+
const nextDraft = updater(current);
|
|
60
|
+
if (nextDraft === current)
|
|
61
|
+
return session;
|
|
62
|
+
return {
|
|
63
|
+
...session,
|
|
64
|
+
modeDraftState: {
|
|
65
|
+
...session.modeDraftState,
|
|
66
|
+
[modeId]: nextDraft,
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
});
|
|
70
|
+
}, [createDraft, setWorkspaceSession]);
|
|
71
|
+
const updateCurrentModeDraft = useCallback((updater) => {
|
|
72
|
+
updateModeDraft(mode, updater);
|
|
73
|
+
}, [mode, updateModeDraft]);
|
|
74
|
+
const setModeDraft = useCallback((modeId, next) => {
|
|
75
|
+
updateModeDraft(modeId, (draft) => resolveNextState(draft, next));
|
|
76
|
+
}, [updateModeDraft]);
|
|
77
|
+
const setCurrentModeDraft = useCallback((next) => {
|
|
78
|
+
setModeDraft(mode, next);
|
|
79
|
+
}, [mode, setModeDraft]);
|
|
80
|
+
const currentModeDraft = useMemo(() => draftByMode[mode] ?? createDraft(), [createDraft, draftByMode, mode]);
|
|
81
|
+
return {
|
|
82
|
+
draftByMode,
|
|
83
|
+
currentModeDraft,
|
|
84
|
+
setModeDraft,
|
|
85
|
+
setCurrentModeDraft,
|
|
86
|
+
updateModeDraft,
|
|
87
|
+
updateCurrentModeDraft,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
@@ -1,34 +1,41 @@
|
|
|
1
|
+
import type { ComposerWorkspaceSession, ComposerWorkspaceSessionUpdater } from "./workspaceSession";
|
|
1
2
|
export type ComposerUiMode = string;
|
|
2
3
|
export type ComposerUiState = {
|
|
3
4
|
primaryTab: string;
|
|
4
5
|
promptKitOpen: boolean;
|
|
5
6
|
moduleKitOpen: boolean;
|
|
7
|
+
chooserOpen: boolean;
|
|
6
8
|
activeImaginePresetId: string | null;
|
|
9
|
+
autoGenerateEnabled: boolean;
|
|
7
10
|
controlPanelOpen: boolean;
|
|
8
11
|
rightPanelOpen: boolean;
|
|
9
12
|
rightPanelTab: string;
|
|
10
13
|
};
|
|
11
|
-
export type UseComposerUiStateOptions = {
|
|
14
|
+
export type UseComposerUiStateOptions<TDraft = unknown> = {
|
|
12
15
|
mode: ComposerUiMode;
|
|
13
|
-
|
|
14
|
-
|
|
16
|
+
workspaceSession?: ComposerWorkspaceSession<TDraft> | null;
|
|
17
|
+
setWorkspaceSession?: (updater: ComposerWorkspaceSessionUpdater<TDraft>) => void;
|
|
15
18
|
defaults?: Partial<ComposerUiState>;
|
|
16
19
|
promptKitModes?: string[];
|
|
17
20
|
moduleKitModes?: string[];
|
|
18
21
|
defaultPrimaryTabByMode?: Record<string, string>;
|
|
19
22
|
};
|
|
20
|
-
export declare function useComposerUiState({ mode,
|
|
23
|
+
export declare function useComposerUiState<TDraft = unknown>({ mode, workspaceSession, setWorkspaceSession, defaults, promptKitModes, moduleKitModes, defaultPrimaryTabByMode, }: UseComposerUiStateOptions<TDraft>): {
|
|
21
24
|
primaryTab: string;
|
|
22
25
|
promptKitOpen: boolean;
|
|
23
26
|
moduleKitOpen: boolean;
|
|
27
|
+
chooserOpen: boolean;
|
|
24
28
|
activeImaginePresetId: string | null;
|
|
29
|
+
autoGenerateEnabled: boolean;
|
|
25
30
|
controlPanelOpen: boolean;
|
|
26
31
|
rightPanelOpen: boolean;
|
|
27
32
|
rightPanelTab: string;
|
|
28
33
|
setPrimaryTab: (next: string) => void;
|
|
29
34
|
setPromptKitOpen: (next: boolean) => void;
|
|
30
35
|
setModuleKitOpen: (next: boolean) => void;
|
|
36
|
+
setChooserOpen: (next: boolean) => void;
|
|
31
37
|
setActiveImaginePresetId: (next: string | null) => void;
|
|
38
|
+
setAutoGenerateEnabled: (next: boolean) => void;
|
|
32
39
|
setControlPanelOpen: (next: boolean) => void;
|
|
33
40
|
setRightPanelOpen: (next: boolean) => void;
|
|
34
41
|
setRightPanelTab: (next: string) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useComposerUiState.d.ts","sourceRoot":"","sources":["../src/useComposerUiState.ts"],"names":[],"mappings":"AAEA,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,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,cAAc,EAAE,OAAO,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;
|
|
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,CA+MA"}
|