@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.
Files changed (58) hide show
  1. package/dist/AccessAssetsMenu.d.ts.map +1 -1
  2. package/dist/AccessAssetsMenu.js +53 -45
  3. package/dist/AssetUploadCard.d.ts +2 -1
  4. package/dist/AssetUploadCard.d.ts.map +1 -1
  5. package/dist/AssetUploadCard.js +3 -2
  6. package/dist/ViewControls.d.ts +19 -2
  7. package/dist/ViewControls.d.ts.map +1 -1
  8. package/dist/ViewControls.js +65 -16
  9. package/dist/ViewerCanvas.d.ts.map +1 -1
  10. package/dist/ViewerCanvas.js +15 -40
  11. package/dist/composerRouting.d.ts +6 -0
  12. package/dist/composerRouting.d.ts.map +1 -1
  13. package/dist/composerRouting.js +18 -9
  14. package/dist/index.d.ts +13 -6
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +6 -4
  17. package/dist/tsconfig.tsbuildinfo +1 -1
  18. package/dist/useAdminGallery.d.ts +2 -30
  19. package/dist/useAdminGallery.d.ts.map +1 -1
  20. package/dist/useAdminGallery.js +15 -6
  21. package/dist/useAdminImageStream.d.ts +3 -31
  22. package/dist/useAdminImageStream.d.ts.map +1 -1
  23. package/dist/useAdminImageStream.js +22 -10
  24. package/dist/useComposerAccessGate.js +4 -4
  25. package/dist/useComposerAuthState.d.ts +1 -0
  26. package/dist/useComposerAuthState.d.ts.map +1 -1
  27. package/dist/useComposerAuthState.js +4 -1
  28. package/dist/useComposerModeDraftState.d.ts +21 -0
  29. package/dist/useComposerModeDraftState.d.ts.map +1 -0
  30. package/dist/useComposerModeDraftState.js +89 -0
  31. package/dist/useComposerUiState.d.ts +11 -4
  32. package/dist/useComposerUiState.d.ts.map +1 -1
  33. package/dist/useComposerUiState.js +103 -79
  34. package/dist/useComposerWorkspaceSession.d.ts +21 -0
  35. package/dist/useComposerWorkspaceSession.d.ts.map +1 -0
  36. package/dist/useComposerWorkspaceSession.js +291 -0
  37. package/dist/useGrasshopperSession.d.ts.map +1 -1
  38. package/dist/useGrasshopperSession.js +10 -4
  39. package/dist/useModeShellState.d.ts.map +1 -1
  40. package/dist/useModeShellState.js +52 -6
  41. package/dist/usePromptPackSelection.d.ts +20 -0
  42. package/dist/usePromptPackSelection.d.ts.map +1 -0
  43. package/dist/usePromptPackSelection.js +81 -0
  44. package/dist/usePromptPackSelectionByMode.d.ts +2 -1
  45. package/dist/usePromptPackSelectionByMode.d.ts.map +1 -1
  46. package/dist/usePromptPackSelectionByMode.js +35 -22
  47. package/dist/useRightRailTabs.js +1 -1
  48. package/dist/useSessionLogout.d.ts.map +1 -1
  49. package/dist/useSessionLogout.js +12 -1
  50. package/dist/useSessionRevocationPing.d.ts.map +1 -1
  51. package/dist/useSessionRevocationPing.js +15 -2
  52. package/dist/useShellPanelToggle.d.ts +7 -1
  53. package/dist/useShellPanelToggle.d.ts.map +1 -1
  54. package/dist/useShellPanelToggle.js +14 -6
  55. package/dist/workspaceSession.d.ts +36 -0
  56. package/dist/workspaceSession.d.ts.map +1 -0
  57. package/dist/workspaceSession.js +141 -0
  58. package/package.json +8 -8
@@ -1,33 +1,5 @@
1
- export type GalleryEntry = {
2
- id: string;
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":"AAEA,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE;QACX,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,eAAe,CAAC,EAAE;YAAE,KAAK,CAAC,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QACtD,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC;QACjB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9B,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACtC,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,IAAI,CAAC,EAAE,GAAG,CAAC;KACZ,GAAG,IAAI,CAAC;CACV,CAAC;AAEF,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,CAwDnH"}
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"}
@@ -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
- await fetch(endpoint, {
37
- method: "POST",
38
- headers: { "Content-Type": "application/json" },
39
- body: JSON.stringify({ action, ...payload }),
40
- });
41
- await reload();
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
- export type AdminImageEntry = {
2
- id: string;
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":"AAEA,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,eAAe,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,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,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,CA6EzD"}
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 : cursor));
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 image stream");
76
+ throw new Error(data?.error || "failed to load images");
74
77
  }
75
- const next = reset ? data.entries || [] : [...entries, ...(data.entries || [])];
76
- const deduped = dedupeEntries(next);
77
- const sorted = sortEntries(deduped, sort, direction);
78
- setEntries(sorted);
79
- setCursor(data.nextCursor || null);
80
- setHasMore(Boolean(data.nextCursor));
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 image stream");
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, cursor, direction, entries, sort]);
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,CAmFA"}
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
- sessionContext?: Record<string, unknown> | null;
14
- setSessionContext?: (partial: Record<string, unknown>) => void;
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, sessionContext, setSessionContext, defaults, promptKitModes, moduleKitModes, defaultPrimaryTabByMode, }: UseComposerUiStateOptions): {
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;IACtC,IAAI,EAAE,cAAc,CAAC;IACrB,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,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;AAkBF,wBAAgB,kBAAkB,CAAC,EACjC,IAAI,EACJ,cAAc,EACd,iBAAiB,EACjB,QAAQ,EACR,cAA4B,EAC5B,cAAkC,EAClC,uBAAuB,GACxB,EAAE,yBAAyB,GAAG;IAC7B,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;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,wBAAwB,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACxD,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"}
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"}