@almadar/ui 2.17.0 → 2.18.0
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/components/index.cjs +996 -996
- package/dist/components/index.js +134 -134
- package/dist/components/organisms/game/three/index.cjs +121 -121
- package/dist/components/organisms/game/three/index.js +3 -3
- package/dist/docs/index.cjs +33 -33
- package/dist/docs/index.js +11 -11
- package/dist/hooks/index.cjs +221 -221
- package/dist/hooks/index.js +2 -2
- package/dist/internals/event-bus-context.d.ts +15 -0
- package/dist/marketing/index.cjs +26 -26
- package/dist/marketing/index.js +13 -13
- package/dist/providers/EventBusProvider.d.ts +4 -20
- package/dist/providers/index.cjs +3 -1
- package/dist/providers/index.js +3 -1
- package/package.json +1 -1
package/dist/hooks/index.cjs
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var React2 = require('react');
|
|
4
4
|
require('react/jsx-runtime');
|
|
5
5
|
var reactQuery = require('@tanstack/react-query');
|
|
6
6
|
|
|
7
7
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
8
8
|
|
|
9
|
-
var
|
|
9
|
+
var React2__default = /*#__PURE__*/_interopDefault(React2);
|
|
10
10
|
|
|
11
11
|
function useOrbitalHistory(options) {
|
|
12
12
|
const { appId, authToken, userId, onHistoryChange, onRevertSuccess } = options;
|
|
13
|
-
const getHeaders2 =
|
|
13
|
+
const getHeaders2 = React2.useCallback(() => {
|
|
14
14
|
const headers = {
|
|
15
15
|
"Content-Type": "application/json"
|
|
16
16
|
};
|
|
@@ -22,11 +22,11 @@ function useOrbitalHistory(options) {
|
|
|
22
22
|
}
|
|
23
23
|
return headers;
|
|
24
24
|
}, [authToken, userId]);
|
|
25
|
-
const [timeline, setTimeline] =
|
|
26
|
-
const [currentVersion, setCurrentVersion] =
|
|
27
|
-
const [isLoading, setIsLoading] =
|
|
28
|
-
const [error, setError] =
|
|
29
|
-
const refresh =
|
|
25
|
+
const [timeline, setTimeline] = React2.useState([]);
|
|
26
|
+
const [currentVersion, setCurrentVersion] = React2.useState(1);
|
|
27
|
+
const [isLoading, setIsLoading] = React2.useState(false);
|
|
28
|
+
const [error, setError] = React2.useState(null);
|
|
29
|
+
const refresh = React2.useCallback(async () => {
|
|
30
30
|
if (!appId) return;
|
|
31
31
|
setIsLoading(true);
|
|
32
32
|
setError(null);
|
|
@@ -75,7 +75,7 @@ function useOrbitalHistory(options) {
|
|
|
75
75
|
setIsLoading(false);
|
|
76
76
|
}
|
|
77
77
|
}, [appId, getHeaders2]);
|
|
78
|
-
const revertToSnapshot =
|
|
78
|
+
const revertToSnapshot = React2.useCallback(async (snapshotId) => {
|
|
79
79
|
if (!appId) {
|
|
80
80
|
return { success: false, error: "No app ID provided" };
|
|
81
81
|
}
|
|
@@ -109,12 +109,12 @@ function useOrbitalHistory(options) {
|
|
|
109
109
|
};
|
|
110
110
|
}
|
|
111
111
|
}, [appId, getHeaders2, refresh, onRevertSuccess]);
|
|
112
|
-
|
|
112
|
+
React2.useEffect(() => {
|
|
113
113
|
if (appId && authToken && userId) {
|
|
114
114
|
refresh();
|
|
115
115
|
}
|
|
116
116
|
}, [appId, authToken, userId]);
|
|
117
|
-
|
|
117
|
+
React2.useEffect(() => {
|
|
118
118
|
onHistoryChange?.(timeline);
|
|
119
119
|
}, [timeline]);
|
|
120
120
|
return {
|
|
@@ -127,15 +127,15 @@ function useOrbitalHistory(options) {
|
|
|
127
127
|
};
|
|
128
128
|
}
|
|
129
129
|
function useFileSystem() {
|
|
130
|
-
const [status, setStatus] =
|
|
131
|
-
const [error, setError] =
|
|
132
|
-
const [isLoading, setIsLoading] =
|
|
133
|
-
const [files, setFiles] =
|
|
134
|
-
const [selectedFile, setSelectedFile] =
|
|
135
|
-
const [selectedPath, setSelectedPath] =
|
|
136
|
-
const [previewUrl, setPreviewUrl] =
|
|
137
|
-
const [fileContents, setFileContents] =
|
|
138
|
-
const boot =
|
|
130
|
+
const [status, setStatus] = React2.useState("idle");
|
|
131
|
+
const [error, setError] = React2.useState(null);
|
|
132
|
+
const [isLoading, setIsLoading] = React2.useState(false);
|
|
133
|
+
const [files, setFiles] = React2.useState([]);
|
|
134
|
+
const [selectedFile, setSelectedFile] = React2.useState(null);
|
|
135
|
+
const [selectedPath, setSelectedPath] = React2.useState(null);
|
|
136
|
+
const [previewUrl, setPreviewUrl] = React2.useState(null);
|
|
137
|
+
const [fileContents, setFileContents] = React2.useState(/* @__PURE__ */ new Map());
|
|
138
|
+
const boot = React2.useCallback(async () => {
|
|
139
139
|
setStatus("booting");
|
|
140
140
|
setError(null);
|
|
141
141
|
setIsLoading(true);
|
|
@@ -150,7 +150,7 @@ function useFileSystem() {
|
|
|
150
150
|
setIsLoading(false);
|
|
151
151
|
}
|
|
152
152
|
}, []);
|
|
153
|
-
const mountFiles =
|
|
153
|
+
const mountFiles = React2.useCallback(async (filesToMount) => {
|
|
154
154
|
setIsLoading(true);
|
|
155
155
|
try {
|
|
156
156
|
let filesArray;
|
|
@@ -208,17 +208,17 @@ function useFileSystem() {
|
|
|
208
208
|
setIsLoading(false);
|
|
209
209
|
}
|
|
210
210
|
}, []);
|
|
211
|
-
const readFile =
|
|
211
|
+
const readFile = React2.useCallback(async (path) => {
|
|
212
212
|
return fileContents.get(path) || "";
|
|
213
213
|
}, [fileContents]);
|
|
214
|
-
const writeFile =
|
|
214
|
+
const writeFile = React2.useCallback(async (path, content) => {
|
|
215
215
|
setFileContents((prev) => {
|
|
216
216
|
const next = new Map(prev);
|
|
217
217
|
next.set(path, content);
|
|
218
218
|
return next;
|
|
219
219
|
});
|
|
220
220
|
}, []);
|
|
221
|
-
const selectFile =
|
|
221
|
+
const selectFile = React2.useCallback(async (path) => {
|
|
222
222
|
const content = fileContents.get(path) || "";
|
|
223
223
|
const ext = path.split(".").pop()?.toLowerCase() || "";
|
|
224
224
|
const languageMap = {
|
|
@@ -240,7 +240,7 @@ function useFileSystem() {
|
|
|
240
240
|
isDirty: false
|
|
241
241
|
});
|
|
242
242
|
}, [fileContents]);
|
|
243
|
-
const updateContent =
|
|
243
|
+
const updateContent = React2.useCallback((pathOrContent, contentArg) => {
|
|
244
244
|
const path = contentArg !== void 0 ? pathOrContent : selectedPath;
|
|
245
245
|
const content = contentArg !== void 0 ? contentArg : pathOrContent;
|
|
246
246
|
if (!path) {
|
|
@@ -256,17 +256,17 @@ function useFileSystem() {
|
|
|
256
256
|
setSelectedFile((prev) => prev ? { ...prev, content, isDirty: true } : null);
|
|
257
257
|
}
|
|
258
258
|
}, [selectedPath]);
|
|
259
|
-
const updateSelectedContent =
|
|
259
|
+
const updateSelectedContent = React2.useCallback((content) => {
|
|
260
260
|
setSelectedFile((prev) => prev ? { ...prev, content, isDirty: true } : null);
|
|
261
261
|
}, []);
|
|
262
|
-
const refreshTree =
|
|
262
|
+
const refreshTree = React2.useCallback(async () => {
|
|
263
263
|
console.log("[useFileSystem] Refreshing tree");
|
|
264
264
|
}, []);
|
|
265
|
-
const runCommand =
|
|
265
|
+
const runCommand = React2.useCallback(async (command) => {
|
|
266
266
|
console.log("[useFileSystem] Running command:", command);
|
|
267
267
|
return { exitCode: 0, output: "" };
|
|
268
268
|
}, []);
|
|
269
|
-
const startDevServer =
|
|
269
|
+
const startDevServer = React2.useCallback(async () => {
|
|
270
270
|
console.log("[useFileSystem] Starting dev server");
|
|
271
271
|
setPreviewUrl("http://localhost:5173");
|
|
272
272
|
}, []);
|
|
@@ -303,14 +303,14 @@ var defaultManifest = {
|
|
|
303
303
|
};
|
|
304
304
|
function useExtensions(options) {
|
|
305
305
|
const { appId, loadOnMount = true } = options;
|
|
306
|
-
const [extensions, setExtensions] =
|
|
307
|
-
const [manifest] =
|
|
308
|
-
const [isLoading, setIsLoading] =
|
|
309
|
-
const [error, setError] =
|
|
310
|
-
const loadExtension =
|
|
306
|
+
const [extensions, setExtensions] = React2.useState([]);
|
|
307
|
+
const [manifest] = React2.useState(defaultManifest);
|
|
308
|
+
const [isLoading, setIsLoading] = React2.useState(false);
|
|
309
|
+
const [error, setError] = React2.useState(null);
|
|
310
|
+
const loadExtension = React2.useCallback(async (extensionId) => {
|
|
311
311
|
console.log("[useExtensions] Loading extension:", extensionId);
|
|
312
312
|
}, []);
|
|
313
|
-
const loadExtensions =
|
|
313
|
+
const loadExtensions = React2.useCallback(async () => {
|
|
314
314
|
setIsLoading(true);
|
|
315
315
|
setError(null);
|
|
316
316
|
try {
|
|
@@ -329,7 +329,7 @@ function useExtensions(options) {
|
|
|
329
329
|
setIsLoading(false);
|
|
330
330
|
}
|
|
331
331
|
}, []);
|
|
332
|
-
const getExtensionForFile =
|
|
332
|
+
const getExtensionForFile = React2.useCallback((filename) => {
|
|
333
333
|
const ext = filename.split(".").pop()?.toLowerCase();
|
|
334
334
|
if (!ext) return null;
|
|
335
335
|
const languageMap = {
|
|
@@ -347,7 +347,7 @@ function useExtensions(options) {
|
|
|
347
347
|
if (!language) return null;
|
|
348
348
|
return extensions.find((e) => e.language === language) || null;
|
|
349
349
|
}, [extensions]);
|
|
350
|
-
|
|
350
|
+
React2.useEffect(() => {
|
|
351
351
|
if (!appId || !loadOnMount) return;
|
|
352
352
|
const loadExtensions2 = async () => {
|
|
353
353
|
setIsLoading(true);
|
|
@@ -382,11 +382,11 @@ function useExtensions(options) {
|
|
|
382
382
|
}
|
|
383
383
|
function useFileEditor(options) {
|
|
384
384
|
const { extensions, fileSystem, onSchemaUpdate } = options;
|
|
385
|
-
const [openFiles, setOpenFiles] =
|
|
386
|
-
const [activeFilePath, setActiveFilePath] =
|
|
387
|
-
const [isSaving, setIsSaving] =
|
|
385
|
+
const [openFiles, setOpenFiles] = React2.useState([]);
|
|
386
|
+
const [activeFilePath, setActiveFilePath] = React2.useState(null);
|
|
387
|
+
const [isSaving, setIsSaving] = React2.useState(false);
|
|
388
388
|
const activeFile = openFiles.find((f) => f.path === activeFilePath) || null;
|
|
389
|
-
const openFile =
|
|
389
|
+
const openFile = React2.useCallback(async (path) => {
|
|
390
390
|
const existing = openFiles.find((f) => f.path === path);
|
|
391
391
|
if (existing) {
|
|
392
392
|
setActiveFilePath(path);
|
|
@@ -407,24 +407,24 @@ function useFileEditor(options) {
|
|
|
407
407
|
console.error("[useFileEditor] Failed to open file:", err);
|
|
408
408
|
}
|
|
409
409
|
}, [openFiles, fileSystem, extensions]);
|
|
410
|
-
const closeFile =
|
|
410
|
+
const closeFile = React2.useCallback((path) => {
|
|
411
411
|
setOpenFiles((prev) => prev.filter((f) => f.path !== path));
|
|
412
412
|
if (activeFilePath === path) {
|
|
413
413
|
const remaining = openFiles.filter((f) => f.path !== path);
|
|
414
414
|
setActiveFilePath(remaining.length > 0 ? remaining[0].path : null);
|
|
415
415
|
}
|
|
416
416
|
}, [activeFilePath, openFiles]);
|
|
417
|
-
const setActiveFile =
|
|
417
|
+
const setActiveFile = React2.useCallback((path) => {
|
|
418
418
|
setActiveFilePath(path);
|
|
419
419
|
}, []);
|
|
420
|
-
const updateFileContent =
|
|
420
|
+
const updateFileContent = React2.useCallback((path, content) => {
|
|
421
421
|
setOpenFiles(
|
|
422
422
|
(prev) => prev.map(
|
|
423
423
|
(f) => f.path === path ? { ...f, content, isDirty: true } : f
|
|
424
424
|
)
|
|
425
425
|
);
|
|
426
426
|
}, []);
|
|
427
|
-
const handleFileEdit =
|
|
427
|
+
const handleFileEdit = React2.useCallback(async (path, content) => {
|
|
428
428
|
try {
|
|
429
429
|
await fileSystem.writeFile(path, content);
|
|
430
430
|
let action = "saved";
|
|
@@ -446,7 +446,7 @@ function useFileEditor(options) {
|
|
|
446
446
|
};
|
|
447
447
|
}
|
|
448
448
|
}, [fileSystem, onSchemaUpdate]);
|
|
449
|
-
const saveFile =
|
|
449
|
+
const saveFile = React2.useCallback(async (path) => {
|
|
450
450
|
const file = openFiles.find((f) => f.path === path);
|
|
451
451
|
if (!file) return;
|
|
452
452
|
setIsSaving(true);
|
|
@@ -470,7 +470,7 @@ function useFileEditor(options) {
|
|
|
470
470
|
setIsSaving(false);
|
|
471
471
|
}
|
|
472
472
|
}, [openFiles, fileSystem, onSchemaUpdate]);
|
|
473
|
-
const saveAllFiles =
|
|
473
|
+
const saveAllFiles = React2.useCallback(async () => {
|
|
474
474
|
setIsSaving(true);
|
|
475
475
|
try {
|
|
476
476
|
const dirtyFiles = openFiles.filter((f) => f.isDirty);
|
|
@@ -495,11 +495,11 @@ function useFileEditor(options) {
|
|
|
495
495
|
};
|
|
496
496
|
}
|
|
497
497
|
function useCompile() {
|
|
498
|
-
const [isCompiling, setIsCompiling] =
|
|
499
|
-
const [stage, setStage] =
|
|
500
|
-
const [lastResult, setLastResult] =
|
|
501
|
-
const [error, setError] =
|
|
502
|
-
const compileSchema =
|
|
498
|
+
const [isCompiling, setIsCompiling] = React2.useState(false);
|
|
499
|
+
const [stage, setStage] = React2.useState("idle");
|
|
500
|
+
const [lastResult, setLastResult] = React2.useState(null);
|
|
501
|
+
const [error, setError] = React2.useState(null);
|
|
502
|
+
const compileSchema = React2.useCallback(async (schema) => {
|
|
503
503
|
setIsCompiling(true);
|
|
504
504
|
setStage("compiling");
|
|
505
505
|
setError(null);
|
|
@@ -531,18 +531,18 @@ function useCompile() {
|
|
|
531
531
|
};
|
|
532
532
|
}
|
|
533
533
|
function usePreview(options) {
|
|
534
|
-
const [previewUrl, setPreviewUrl] =
|
|
535
|
-
const [isLoading, setIsLoading] =
|
|
536
|
-
const [error, setError] =
|
|
537
|
-
const [loadError, setLoadError] =
|
|
538
|
-
const [app, setApp] =
|
|
539
|
-
const [isFullscreen, setIsFullscreen] =
|
|
540
|
-
const [isExecutingEvent, setIsExecutingEvent] =
|
|
541
|
-
const [errorToast, setErrorToast] =
|
|
542
|
-
const [currentStateName, setCurrentStateName] =
|
|
543
|
-
const [notificationsList, setNotificationsList] =
|
|
544
|
-
const [isPanelOpen, setIsPanelOpen] =
|
|
545
|
-
const notifications =
|
|
534
|
+
const [previewUrl, setPreviewUrl] = React2.useState(null);
|
|
535
|
+
const [isLoading, setIsLoading] = React2.useState(!!options?.appId);
|
|
536
|
+
const [error, setError] = React2.useState(null);
|
|
537
|
+
const [loadError, setLoadError] = React2.useState(null);
|
|
538
|
+
const [app, setApp] = React2.useState(null);
|
|
539
|
+
const [isFullscreen, setIsFullscreen] = React2.useState(false);
|
|
540
|
+
const [isExecutingEvent, setIsExecutingEvent] = React2.useState(false);
|
|
541
|
+
const [errorToast, setErrorToast] = React2.useState(null);
|
|
542
|
+
const [currentStateName, setCurrentStateName] = React2.useState(null);
|
|
543
|
+
const [notificationsList, setNotificationsList] = React2.useState([]);
|
|
544
|
+
const [isPanelOpen, setIsPanelOpen] = React2.useState(false);
|
|
545
|
+
const notifications = React2.useMemo(() => ({
|
|
546
546
|
notifications: notificationsList,
|
|
547
547
|
isPanelOpen,
|
|
548
548
|
closePanel: () => setIsPanelOpen(false),
|
|
@@ -556,7 +556,7 @@ function usePreview(options) {
|
|
|
556
556
|
},
|
|
557
557
|
clearAll: () => setNotificationsList([])
|
|
558
558
|
}), [notificationsList, isPanelOpen]);
|
|
559
|
-
|
|
559
|
+
React2.useEffect(() => {
|
|
560
560
|
const appId = options?.appId;
|
|
561
561
|
if (!appId) {
|
|
562
562
|
setApp(null);
|
|
@@ -567,10 +567,10 @@ function usePreview(options) {
|
|
|
567
567
|
setPreviewUrl(`/api/orbitals/${appId}`);
|
|
568
568
|
setIsLoading(false);
|
|
569
569
|
}, [options?.appId]);
|
|
570
|
-
const startPreview =
|
|
570
|
+
const startPreview = React2.useCallback(async () => {
|
|
571
571
|
console.log("[usePreview] startPreview called");
|
|
572
572
|
}, []);
|
|
573
|
-
const stopPreview =
|
|
573
|
+
const stopPreview = React2.useCallback(async () => {
|
|
574
574
|
setIsLoading(true);
|
|
575
575
|
try {
|
|
576
576
|
console.log("[usePreview] Stopping preview server...");
|
|
@@ -580,16 +580,16 @@ function usePreview(options) {
|
|
|
580
580
|
setIsLoading(false);
|
|
581
581
|
}
|
|
582
582
|
}, []);
|
|
583
|
-
const refresh =
|
|
583
|
+
const refresh = React2.useCallback(async () => {
|
|
584
584
|
if (!previewUrl) return;
|
|
585
585
|
console.log("[usePreview] Refreshing preview...");
|
|
586
586
|
setPreviewUrl(`${previewUrl.split("?")[0]}?t=${Date.now()}`);
|
|
587
587
|
}, [previewUrl]);
|
|
588
|
-
const handleRefresh =
|
|
588
|
+
const handleRefresh = React2.useCallback(async () => {
|
|
589
589
|
console.log("[usePreview] Handle refresh...");
|
|
590
590
|
await refresh();
|
|
591
591
|
}, [refresh]);
|
|
592
|
-
const handleReset =
|
|
592
|
+
const handleReset = React2.useCallback(async () => {
|
|
593
593
|
console.log("[usePreview] Resetting preview...");
|
|
594
594
|
setError(null);
|
|
595
595
|
setLoadError(null);
|
|
@@ -597,10 +597,10 @@ function usePreview(options) {
|
|
|
597
597
|
setIsExecutingEvent(false);
|
|
598
598
|
setCurrentStateName(null);
|
|
599
599
|
}, []);
|
|
600
|
-
const toggleFullscreen =
|
|
600
|
+
const toggleFullscreen = React2.useCallback(() => {
|
|
601
601
|
setIsFullscreen((prev) => !prev);
|
|
602
602
|
}, []);
|
|
603
|
-
const dismissErrorToast =
|
|
603
|
+
const dismissErrorToast = React2.useCallback(() => {
|
|
604
604
|
setErrorToast(null);
|
|
605
605
|
}, []);
|
|
606
606
|
return {
|
|
@@ -625,16 +625,16 @@ function usePreview(options) {
|
|
|
625
625
|
};
|
|
626
626
|
}
|
|
627
627
|
function useAgentChat(options) {
|
|
628
|
-
const [messages, setMessages] =
|
|
629
|
-
const [status, setStatus] =
|
|
630
|
-
const [activities, setActivities] =
|
|
631
|
-
const [todos, setTodos] =
|
|
632
|
-
const [schemaDiffs, setSchemaDiffs] =
|
|
633
|
-
const [isLoading, setIsLoading] =
|
|
634
|
-
const [error, setError] =
|
|
635
|
-
const [threadId] =
|
|
636
|
-
const [interrupt, setInterrupt] =
|
|
637
|
-
const sendMessage =
|
|
628
|
+
const [messages, setMessages] = React2.useState([]);
|
|
629
|
+
const [status, setStatus] = React2.useState("idle");
|
|
630
|
+
const [activities, setActivities] = React2.useState([]);
|
|
631
|
+
const [todos, setTodos] = React2.useState([]);
|
|
632
|
+
const [schemaDiffs, setSchemaDiffs] = React2.useState([]);
|
|
633
|
+
const [isLoading, setIsLoading] = React2.useState(false);
|
|
634
|
+
const [error, setError] = React2.useState(null);
|
|
635
|
+
const [threadId] = React2.useState(null);
|
|
636
|
+
const [interrupt, setInterrupt] = React2.useState(null);
|
|
637
|
+
const sendMessage = React2.useCallback(async (content) => {
|
|
638
638
|
setIsLoading(true);
|
|
639
639
|
setStatus("running");
|
|
640
640
|
setError(null);
|
|
@@ -663,7 +663,7 @@ function useAgentChat(options) {
|
|
|
663
663
|
setIsLoading(false);
|
|
664
664
|
}
|
|
665
665
|
}, [options]);
|
|
666
|
-
const startGeneration =
|
|
666
|
+
const startGeneration = React2.useCallback(async (skill, prompt, genOptions) => {
|
|
667
667
|
setStatus("running");
|
|
668
668
|
setIsLoading(true);
|
|
669
669
|
setError(null);
|
|
@@ -680,22 +680,22 @@ function useAgentChat(options) {
|
|
|
680
680
|
setIsLoading(false);
|
|
681
681
|
}
|
|
682
682
|
}, [options]);
|
|
683
|
-
const continueConversation =
|
|
683
|
+
const continueConversation = React2.useCallback(async (message) => {
|
|
684
684
|
console.log("[useAgentChat] Continue conversation", message);
|
|
685
685
|
}, []);
|
|
686
|
-
const resumeWithDecision =
|
|
686
|
+
const resumeWithDecision = React2.useCallback(async (decisions) => {
|
|
687
687
|
console.log("[useAgentChat] Resume with decision:", decisions);
|
|
688
688
|
setInterrupt(null);
|
|
689
689
|
}, []);
|
|
690
|
-
const cancel =
|
|
690
|
+
const cancel = React2.useCallback(() => {
|
|
691
691
|
setStatus("idle");
|
|
692
692
|
setIsLoading(false);
|
|
693
693
|
setInterrupt(null);
|
|
694
694
|
}, []);
|
|
695
|
-
const clearMessages =
|
|
695
|
+
const clearMessages = React2.useCallback(() => {
|
|
696
696
|
setMessages([]);
|
|
697
697
|
}, []);
|
|
698
|
-
const clearHistory =
|
|
698
|
+
const clearHistory = React2.useCallback(() => {
|
|
699
699
|
setMessages([]);
|
|
700
700
|
setActivities([]);
|
|
701
701
|
setTodos([]);
|
|
@@ -722,13 +722,13 @@ function useAgentChat(options) {
|
|
|
722
722
|
};
|
|
723
723
|
}
|
|
724
724
|
function useValidation() {
|
|
725
|
-
const [result, setResult] =
|
|
726
|
-
const [isValidating, setIsValidating] =
|
|
727
|
-
const [error, setError] =
|
|
728
|
-
const [stage, setStage] =
|
|
729
|
-
const [isFixing, setIsFixing] =
|
|
730
|
-
const [progressMessage, setProgressMessage] =
|
|
731
|
-
const validate =
|
|
725
|
+
const [result, setResult] = React2.useState(null);
|
|
726
|
+
const [isValidating, setIsValidating] = React2.useState(false);
|
|
727
|
+
const [error, setError] = React2.useState(null);
|
|
728
|
+
const [stage, setStage] = React2.useState("idle");
|
|
729
|
+
const [isFixing, setIsFixing] = React2.useState(false);
|
|
730
|
+
const [progressMessage, setProgressMessage] = React2.useState(null);
|
|
731
|
+
const validate = React2.useCallback(async (appId) => {
|
|
732
732
|
setIsValidating(true);
|
|
733
733
|
setError(null);
|
|
734
734
|
setStage("validating");
|
|
@@ -760,11 +760,11 @@ function useValidation() {
|
|
|
760
760
|
setIsValidating(false);
|
|
761
761
|
}
|
|
762
762
|
}, []);
|
|
763
|
-
const clearResult =
|
|
763
|
+
const clearResult = React2.useCallback(() => {
|
|
764
764
|
setResult(null);
|
|
765
765
|
setError(null);
|
|
766
766
|
}, []);
|
|
767
|
-
const reset =
|
|
767
|
+
const reset = React2.useCallback(() => {
|
|
768
768
|
setResult(null);
|
|
769
769
|
setError(null);
|
|
770
770
|
setStage("idle");
|
|
@@ -788,15 +788,15 @@ function useValidation() {
|
|
|
788
788
|
};
|
|
789
789
|
}
|
|
790
790
|
function useDeepAgentGeneration() {
|
|
791
|
-
const [requests, setRequests] =
|
|
792
|
-
const [currentRequest, setCurrentRequest] =
|
|
793
|
-
const [isGenerating, setIsGenerating] =
|
|
794
|
-
const [isLoading, setIsLoading] =
|
|
795
|
-
const [isComplete, setIsComplete] =
|
|
796
|
-
const [progress, setProgress] =
|
|
797
|
-
const [error, setError] =
|
|
798
|
-
const [interrupt, setInterrupt] =
|
|
799
|
-
const generate =
|
|
791
|
+
const [requests, setRequests] = React2.useState([]);
|
|
792
|
+
const [currentRequest, setCurrentRequest] = React2.useState(null);
|
|
793
|
+
const [isGenerating, setIsGenerating] = React2.useState(false);
|
|
794
|
+
const [isLoading, setIsLoading] = React2.useState(false);
|
|
795
|
+
const [isComplete, setIsComplete] = React2.useState(false);
|
|
796
|
+
const [progress, setProgress] = React2.useState({ stage: "idle", percent: 0, message: "" });
|
|
797
|
+
const [error, setError] = React2.useState(null);
|
|
798
|
+
const [interrupt, setInterrupt] = React2.useState(null);
|
|
799
|
+
const generate = React2.useCallback(async (prompt) => {
|
|
800
800
|
setIsGenerating(true);
|
|
801
801
|
setIsLoading(true);
|
|
802
802
|
setIsComplete(false);
|
|
@@ -829,11 +829,11 @@ function useDeepAgentGeneration() {
|
|
|
829
829
|
setIsLoading(false);
|
|
830
830
|
}
|
|
831
831
|
}, []);
|
|
832
|
-
const startGeneration =
|
|
832
|
+
const startGeneration = React2.useCallback(async (skill, prompt, _options) => {
|
|
833
833
|
console.log("[useDeepAgentGeneration] Starting generation with skill:", skill);
|
|
834
834
|
await generate(prompt);
|
|
835
835
|
}, [generate]);
|
|
836
|
-
const cancelGeneration =
|
|
836
|
+
const cancelGeneration = React2.useCallback(() => {
|
|
837
837
|
if (currentRequest) {
|
|
838
838
|
currentRequest.status = "failed";
|
|
839
839
|
currentRequest.error = "Cancelled by user";
|
|
@@ -844,14 +844,14 @@ function useDeepAgentGeneration() {
|
|
|
844
844
|
setIsComplete(false);
|
|
845
845
|
setProgress({ stage: "idle", percent: 0, message: "" });
|
|
846
846
|
}, [currentRequest]);
|
|
847
|
-
const clearRequests =
|
|
847
|
+
const clearRequests = React2.useCallback(() => {
|
|
848
848
|
setRequests([]);
|
|
849
849
|
setCurrentRequest(null);
|
|
850
850
|
setError(null);
|
|
851
851
|
setProgress({ stage: "idle", percent: 0, message: "" });
|
|
852
852
|
setIsComplete(false);
|
|
853
853
|
}, []);
|
|
854
|
-
const submitInterruptDecisions =
|
|
854
|
+
const submitInterruptDecisions = React2.useCallback((decisions) => {
|
|
855
855
|
console.log("[useDeepAgentGeneration] Submitting interrupt decisions:", decisions);
|
|
856
856
|
setInterrupt(null);
|
|
857
857
|
}, []);
|
|
@@ -871,7 +871,7 @@ function useDeepAgentGeneration() {
|
|
|
871
871
|
submitInterruptDecisions
|
|
872
872
|
};
|
|
873
873
|
}
|
|
874
|
-
var EventBusContext =
|
|
874
|
+
var EventBusContext = React2.createContext(null);
|
|
875
875
|
|
|
876
876
|
// hooks/useEventBus.ts
|
|
877
877
|
function getGlobalEventBus() {
|
|
@@ -941,14 +941,14 @@ var fallbackEventBus = {
|
|
|
941
941
|
}
|
|
942
942
|
};
|
|
943
943
|
function useEventBus() {
|
|
944
|
-
const context =
|
|
944
|
+
const context = React2.useContext(EventBusContext);
|
|
945
945
|
return context ?? getGlobalEventBus() ?? fallbackEventBus;
|
|
946
946
|
}
|
|
947
947
|
function useEventListener(event, handler) {
|
|
948
948
|
const eventBus = useEventBus();
|
|
949
|
-
const handlerRef =
|
|
949
|
+
const handlerRef = React2.useRef(handler);
|
|
950
950
|
handlerRef.current = handler;
|
|
951
|
-
|
|
951
|
+
React2.useEffect(() => {
|
|
952
952
|
const wrappedHandler = (evt) => {
|
|
953
953
|
handlerRef.current(evt);
|
|
954
954
|
};
|
|
@@ -960,7 +960,7 @@ function useEventListener(event, handler) {
|
|
|
960
960
|
}
|
|
961
961
|
function useEmitEvent() {
|
|
962
962
|
const eventBus = useEventBus();
|
|
963
|
-
return
|
|
963
|
+
return React2.useCallback(
|
|
964
964
|
(type, payload) => {
|
|
965
965
|
eventBus.emit(type, payload);
|
|
966
966
|
},
|
|
@@ -986,16 +986,16 @@ function generateId() {
|
|
|
986
986
|
return `slot-content-${++idCounter}-${Date.now()}`;
|
|
987
987
|
}
|
|
988
988
|
function useUISlotManager() {
|
|
989
|
-
const [slots, setSlots] =
|
|
990
|
-
const subscribersRef =
|
|
991
|
-
const timersRef =
|
|
992
|
-
|
|
989
|
+
const [slots, setSlots] = React2.useState(DEFAULT_SLOTS);
|
|
990
|
+
const subscribersRef = React2.useRef(/* @__PURE__ */ new Set());
|
|
991
|
+
const timersRef = React2.useRef(/* @__PURE__ */ new Map());
|
|
992
|
+
React2.useEffect(() => {
|
|
993
993
|
return () => {
|
|
994
994
|
timersRef.current.forEach((timer) => clearTimeout(timer));
|
|
995
995
|
timersRef.current.clear();
|
|
996
996
|
};
|
|
997
997
|
}, []);
|
|
998
|
-
const notifySubscribers =
|
|
998
|
+
const notifySubscribers = React2.useCallback((slot, content) => {
|
|
999
999
|
subscribersRef.current.forEach((callback) => {
|
|
1000
1000
|
try {
|
|
1001
1001
|
callback(slot, content);
|
|
@@ -1004,7 +1004,7 @@ function useUISlotManager() {
|
|
|
1004
1004
|
}
|
|
1005
1005
|
});
|
|
1006
1006
|
}, []);
|
|
1007
|
-
const render =
|
|
1007
|
+
const render = React2.useCallback((config) => {
|
|
1008
1008
|
const id = generateId();
|
|
1009
1009
|
const content = {
|
|
1010
1010
|
id,
|
|
@@ -1043,7 +1043,7 @@ function useUISlotManager() {
|
|
|
1043
1043
|
});
|
|
1044
1044
|
return id;
|
|
1045
1045
|
}, [notifySubscribers]);
|
|
1046
|
-
const clear =
|
|
1046
|
+
const clear = React2.useCallback((slot) => {
|
|
1047
1047
|
setSlots((prev) => {
|
|
1048
1048
|
const content = prev[slot];
|
|
1049
1049
|
if (content) {
|
|
@@ -1058,7 +1058,7 @@ function useUISlotManager() {
|
|
|
1058
1058
|
return { ...prev, [slot]: null };
|
|
1059
1059
|
});
|
|
1060
1060
|
}, [notifySubscribers]);
|
|
1061
|
-
const clearById =
|
|
1061
|
+
const clearById = React2.useCallback((id) => {
|
|
1062
1062
|
setSlots((prev) => {
|
|
1063
1063
|
const entry = Object.entries(prev).find(([, content]) => content?.id === id);
|
|
1064
1064
|
if (entry) {
|
|
@@ -1075,7 +1075,7 @@ function useUISlotManager() {
|
|
|
1075
1075
|
return prev;
|
|
1076
1076
|
});
|
|
1077
1077
|
}, [notifySubscribers]);
|
|
1078
|
-
const clearAll =
|
|
1078
|
+
const clearAll = React2.useCallback(() => {
|
|
1079
1079
|
timersRef.current.forEach((timer) => clearTimeout(timer));
|
|
1080
1080
|
timersRef.current.clear();
|
|
1081
1081
|
setSlots((prev) => {
|
|
@@ -1088,16 +1088,16 @@ function useUISlotManager() {
|
|
|
1088
1088
|
return DEFAULT_SLOTS;
|
|
1089
1089
|
});
|
|
1090
1090
|
}, [notifySubscribers]);
|
|
1091
|
-
const subscribe2 =
|
|
1091
|
+
const subscribe2 = React2.useCallback((callback) => {
|
|
1092
1092
|
subscribersRef.current.add(callback);
|
|
1093
1093
|
return () => {
|
|
1094
1094
|
subscribersRef.current.delete(callback);
|
|
1095
1095
|
};
|
|
1096
1096
|
}, []);
|
|
1097
|
-
const hasContent =
|
|
1097
|
+
const hasContent = React2.useCallback((slot) => {
|
|
1098
1098
|
return slots[slot] !== null;
|
|
1099
1099
|
}, [slots]);
|
|
1100
|
-
const getContent =
|
|
1100
|
+
const getContent = React2.useCallback((slot) => {
|
|
1101
1101
|
return slots[slot];
|
|
1102
1102
|
}, [slots]);
|
|
1103
1103
|
return {
|
|
@@ -1111,7 +1111,7 @@ function useUISlotManager() {
|
|
|
1111
1111
|
getContent
|
|
1112
1112
|
};
|
|
1113
1113
|
}
|
|
1114
|
-
var SelectionContext =
|
|
1114
|
+
var SelectionContext = React2.createContext(null);
|
|
1115
1115
|
|
|
1116
1116
|
// hooks/useUIEvents.ts
|
|
1117
1117
|
var UI_EVENT_MAP = {
|
|
@@ -1143,12 +1143,12 @@ function useUIEvents(dispatch, validEvents, eventBusInstance) {
|
|
|
1143
1143
|
const defaultEventBus = useEventBus();
|
|
1144
1144
|
const eventBus = eventBusInstance ?? defaultEventBus;
|
|
1145
1145
|
const validEventsKey = validEvents ? validEvents.slice().sort().join(",") : "";
|
|
1146
|
-
const stableValidEvents =
|
|
1146
|
+
const stableValidEvents = React2.useMemo(
|
|
1147
1147
|
() => validEvents,
|
|
1148
1148
|
[validEventsKey]
|
|
1149
1149
|
// intentional — validEventsKey is the stable dep, not validEvents array ref
|
|
1150
1150
|
);
|
|
1151
|
-
|
|
1151
|
+
React2.useEffect(() => {
|
|
1152
1152
|
const unsubscribes = [];
|
|
1153
1153
|
Object.entries(UI_EVENT_MAP).forEach(([uiEvent, smEvent]) => {
|
|
1154
1154
|
const handler = (event) => {
|
|
@@ -1199,9 +1199,9 @@ function useSelectedEntity(eventBusInstance) {
|
|
|
1199
1199
|
const defaultEventBus = useEventBus();
|
|
1200
1200
|
const eventBus = eventBusInstance ?? defaultEventBus;
|
|
1201
1201
|
const selectionContext = useSelectionContext();
|
|
1202
|
-
const [localSelected, setLocalSelected] =
|
|
1202
|
+
const [localSelected, setLocalSelected] = React2.useState(null);
|
|
1203
1203
|
const usingContext = selectionContext !== null;
|
|
1204
|
-
|
|
1204
|
+
React2.useEffect(() => {
|
|
1205
1205
|
if (usingContext) return;
|
|
1206
1206
|
const handleSelect = (event) => {
|
|
1207
1207
|
const row = event.payload?.row;
|
|
@@ -1231,22 +1231,22 @@ function useSelectedEntity(eventBusInstance) {
|
|
|
1231
1231
|
return [localSelected, setLocalSelected];
|
|
1232
1232
|
}
|
|
1233
1233
|
function useSelectionContext() {
|
|
1234
|
-
const context =
|
|
1234
|
+
const context = React2.useContext(SelectionContext);
|
|
1235
1235
|
return context;
|
|
1236
1236
|
}
|
|
1237
|
-
var EntityDataContext =
|
|
1237
|
+
var EntityDataContext = React2.createContext(null);
|
|
1238
1238
|
function EntityDataProvider({
|
|
1239
1239
|
adapter,
|
|
1240
1240
|
children
|
|
1241
1241
|
}) {
|
|
1242
|
-
return
|
|
1242
|
+
return React2__default.default.createElement(
|
|
1243
1243
|
EntityDataContext.Provider,
|
|
1244
1244
|
{ value: adapter },
|
|
1245
1245
|
children
|
|
1246
1246
|
);
|
|
1247
1247
|
}
|
|
1248
1248
|
function useEntityDataAdapter() {
|
|
1249
|
-
return
|
|
1249
|
+
return React2.useContext(EntityDataContext);
|
|
1250
1250
|
}
|
|
1251
1251
|
var entityDataKeys = {
|
|
1252
1252
|
all: ["entities"],
|
|
@@ -1257,15 +1257,15 @@ var entityDataKeys = {
|
|
|
1257
1257
|
};
|
|
1258
1258
|
function useEntityList(entity, options = {}) {
|
|
1259
1259
|
const { skip = false } = options;
|
|
1260
|
-
const adapter =
|
|
1261
|
-
const adapterData =
|
|
1260
|
+
const adapter = React2.useContext(EntityDataContext);
|
|
1261
|
+
const adapterData = React2.useMemo(() => {
|
|
1262
1262
|
if (!adapter || !entity || skip) return [];
|
|
1263
1263
|
return adapter.getData(entity);
|
|
1264
1264
|
}, [adapter, entity, skip, adapter?.isLoading]);
|
|
1265
|
-
const [stubData, setStubData] =
|
|
1266
|
-
const [stubLoading, setStubLoading] =
|
|
1267
|
-
const [stubError, setStubError] =
|
|
1268
|
-
|
|
1265
|
+
const [stubData, setStubData] = React2.useState([]);
|
|
1266
|
+
const [stubLoading, setStubLoading] = React2.useState(!skip && !!entity && !adapter);
|
|
1267
|
+
const [stubError, setStubError] = React2.useState(null);
|
|
1268
|
+
React2.useEffect(() => {
|
|
1269
1269
|
if (adapter || skip || !entity) {
|
|
1270
1270
|
setStubLoading(false);
|
|
1271
1271
|
return;
|
|
@@ -1290,15 +1290,15 @@ function useEntityList(entity, options = {}) {
|
|
|
1290
1290
|
} };
|
|
1291
1291
|
}
|
|
1292
1292
|
function useEntity(entity, id) {
|
|
1293
|
-
const adapter =
|
|
1294
|
-
const adapterData =
|
|
1293
|
+
const adapter = React2.useContext(EntityDataContext);
|
|
1294
|
+
const adapterData = React2.useMemo(() => {
|
|
1295
1295
|
if (!adapter || !entity || !id) return null;
|
|
1296
1296
|
return adapter.getById(entity, id) ?? null;
|
|
1297
1297
|
}, [adapter, entity, id, adapter?.isLoading]);
|
|
1298
|
-
const [stubData, setStubData] =
|
|
1299
|
-
const [stubLoading, setStubLoading] =
|
|
1300
|
-
const [stubError, setStubError] =
|
|
1301
|
-
|
|
1298
|
+
const [stubData, setStubData] = React2.useState(null);
|
|
1299
|
+
const [stubLoading, setStubLoading] = React2.useState(!!entity && !!id && !adapter);
|
|
1300
|
+
const [stubError, setStubError] = React2.useState(null);
|
|
1301
|
+
React2.useEffect(() => {
|
|
1302
1302
|
if (adapter || !entity || !id) {
|
|
1303
1303
|
setStubLoading(false);
|
|
1304
1304
|
return;
|
|
@@ -1329,7 +1329,7 @@ function getSuspenseCacheKey(entity, type, id) {
|
|
|
1329
1329
|
return id ? `${type}:${entity}:${id}` : `${type}:${entity}`;
|
|
1330
1330
|
}
|
|
1331
1331
|
function useEntityListSuspense(entity) {
|
|
1332
|
-
const adapter =
|
|
1332
|
+
const adapter = React2.useContext(EntityDataContext);
|
|
1333
1333
|
if (adapter) {
|
|
1334
1334
|
if (adapter.isLoading) {
|
|
1335
1335
|
const cacheKey2 = getSuspenseCacheKey(entity, "list");
|
|
@@ -1383,7 +1383,7 @@ function useEntityListSuspense(entity) {
|
|
|
1383
1383
|
} };
|
|
1384
1384
|
}
|
|
1385
1385
|
function useEntitySuspense(entity, id) {
|
|
1386
|
-
const adapter =
|
|
1386
|
+
const adapter = React2.useContext(EntityDataContext);
|
|
1387
1387
|
if (adapter) {
|
|
1388
1388
|
if (adapter.isLoading) {
|
|
1389
1389
|
const cacheKey2 = getSuspenseCacheKey(entity, "detail", id);
|
|
@@ -1450,35 +1450,35 @@ function getOrCreateStore(query) {
|
|
|
1450
1450
|
return queryStores.get(query);
|
|
1451
1451
|
}
|
|
1452
1452
|
function useQuerySingleton(query) {
|
|
1453
|
-
const [, forceUpdate] =
|
|
1453
|
+
const [, forceUpdate] = React2.useState({});
|
|
1454
1454
|
if (!query) {
|
|
1455
1455
|
return null;
|
|
1456
1456
|
}
|
|
1457
|
-
const store =
|
|
1458
|
-
|
|
1457
|
+
const store = React2.useMemo(() => getOrCreateStore(query), [query]);
|
|
1458
|
+
React2.useMemo(() => {
|
|
1459
1459
|
const listener = () => forceUpdate({});
|
|
1460
1460
|
store.listeners.add(listener);
|
|
1461
1461
|
return () => {
|
|
1462
1462
|
store.listeners.delete(listener);
|
|
1463
1463
|
};
|
|
1464
1464
|
}, [store]);
|
|
1465
|
-
const notifyListeners =
|
|
1465
|
+
const notifyListeners = React2.useCallback(() => {
|
|
1466
1466
|
store.listeners.forEach((listener) => listener());
|
|
1467
1467
|
}, [store]);
|
|
1468
|
-
const setSearch =
|
|
1468
|
+
const setSearch = React2.useCallback((value) => {
|
|
1469
1469
|
store.search = value;
|
|
1470
1470
|
notifyListeners();
|
|
1471
1471
|
}, [store, notifyListeners]);
|
|
1472
|
-
const setFilter =
|
|
1472
|
+
const setFilter = React2.useCallback((key, value) => {
|
|
1473
1473
|
store.filters = { ...store.filters, [key]: value };
|
|
1474
1474
|
notifyListeners();
|
|
1475
1475
|
}, [store, notifyListeners]);
|
|
1476
|
-
const clearFilters =
|
|
1476
|
+
const clearFilters = React2.useCallback(() => {
|
|
1477
1477
|
store.filters = {};
|
|
1478
1478
|
store.search = "";
|
|
1479
1479
|
notifyListeners();
|
|
1480
1480
|
}, [store, notifyListeners]);
|
|
1481
|
-
const setSort =
|
|
1481
|
+
const setSort = React2.useCallback((field, direction) => {
|
|
1482
1482
|
store.sortField = field;
|
|
1483
1483
|
store.sortDirection = direction;
|
|
1484
1484
|
notifyListeners();
|
|
@@ -1945,7 +1945,7 @@ function getSnapshot() {
|
|
|
1945
1945
|
|
|
1946
1946
|
// hooks/useEntities.ts
|
|
1947
1947
|
function useEntities() {
|
|
1948
|
-
const entities2 =
|
|
1948
|
+
const entities2 = React2.useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
|
|
1949
1949
|
return {
|
|
1950
1950
|
entities: entities2,
|
|
1951
1951
|
getEntity,
|
|
@@ -1960,34 +1960,34 @@ function useEntities() {
|
|
|
1960
1960
|
};
|
|
1961
1961
|
}
|
|
1962
1962
|
function useEntity2(id) {
|
|
1963
|
-
const entities2 =
|
|
1963
|
+
const entities2 = React2.useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
|
|
1964
1964
|
return entities2.get(id);
|
|
1965
1965
|
}
|
|
1966
1966
|
function useEntitiesByType(type) {
|
|
1967
|
-
const entities2 =
|
|
1967
|
+
const entities2 = React2.useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
|
|
1968
1968
|
return [...entities2.values()].filter((e) => e.type === type);
|
|
1969
1969
|
}
|
|
1970
1970
|
function useSingletonEntity(type) {
|
|
1971
|
-
const entities2 =
|
|
1971
|
+
const entities2 = React2.useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
|
|
1972
1972
|
return [...entities2.values()].find((e) => e.type === type);
|
|
1973
1973
|
}
|
|
1974
1974
|
function usePlayer() {
|
|
1975
1975
|
const player = useSingletonEntity("Player");
|
|
1976
|
-
const update =
|
|
1976
|
+
const update = React2.useCallback((updates) => {
|
|
1977
1977
|
if (player) updateEntity(player.id, updates);
|
|
1978
1978
|
}, [player?.id]);
|
|
1979
1979
|
return { player, updatePlayer: update };
|
|
1980
1980
|
}
|
|
1981
1981
|
function usePhysics() {
|
|
1982
1982
|
const physics = useSingletonEntity("Physics");
|
|
1983
|
-
const update =
|
|
1983
|
+
const update = React2.useCallback((updates) => {
|
|
1984
1984
|
if (physics) updateEntity(physics.id, updates);
|
|
1985
1985
|
}, [physics?.id]);
|
|
1986
1986
|
return { physics, updatePhysics: update };
|
|
1987
1987
|
}
|
|
1988
1988
|
function useInput() {
|
|
1989
1989
|
const input = useSingletonEntity("Input");
|
|
1990
|
-
const update =
|
|
1990
|
+
const update = React2.useCallback((updates) => {
|
|
1991
1991
|
if (input) updateEntity(input.id, updates);
|
|
1992
1992
|
}, [input?.id]);
|
|
1993
1993
|
return { input, updateInput: update };
|
|
@@ -2102,7 +2102,7 @@ var en_default = {
|
|
|
2102
2102
|
// hooks/useTranslate.ts
|
|
2103
2103
|
var { $meta: _meta, ...coreMessages } = en_default;
|
|
2104
2104
|
var coreLocale = coreMessages;
|
|
2105
|
-
var I18nContext =
|
|
2105
|
+
var I18nContext = React2.createContext({
|
|
2106
2106
|
locale: "en",
|
|
2107
2107
|
direction: "ltr",
|
|
2108
2108
|
t: (key) => coreLocale[key] ?? key
|
|
@@ -2111,7 +2111,7 @@ var I18nContext = React3.createContext({
|
|
|
2111
2111
|
I18nContext.displayName = "I18nContext";
|
|
2112
2112
|
var I18nProvider = I18nContext.Provider;
|
|
2113
2113
|
function useTranslate() {
|
|
2114
|
-
return
|
|
2114
|
+
return React2.useContext(I18nContext);
|
|
2115
2115
|
}
|
|
2116
2116
|
function createTranslate(messages) {
|
|
2117
2117
|
return (key, params) => {
|
|
@@ -2127,7 +2127,7 @@ function createTranslate(messages) {
|
|
|
2127
2127
|
function useResolvedEntity(entity, data) {
|
|
2128
2128
|
const shouldFetch = !data && !!entity;
|
|
2129
2129
|
const fetched = useEntityList(entity, { skip: !shouldFetch });
|
|
2130
|
-
return
|
|
2130
|
+
return React2.useMemo(() => {
|
|
2131
2131
|
if (data) {
|
|
2132
2132
|
return {
|
|
2133
2133
|
data,
|
|
@@ -2156,14 +2156,14 @@ function useAuthContext() {
|
|
|
2156
2156
|
}
|
|
2157
2157
|
function useSwipeGesture(callbacks, options = {}) {
|
|
2158
2158
|
const { threshold = 50, velocityThreshold = 0.3, preventDefault = false } = options;
|
|
2159
|
-
const startX =
|
|
2160
|
-
const startY =
|
|
2161
|
-
const startTime =
|
|
2162
|
-
const currentX =
|
|
2163
|
-
const tracking =
|
|
2164
|
-
const offsetXRef =
|
|
2165
|
-
const isSwipingRef =
|
|
2166
|
-
const onPointerDown =
|
|
2159
|
+
const startX = React2.useRef(0);
|
|
2160
|
+
const startY = React2.useRef(0);
|
|
2161
|
+
const startTime = React2.useRef(0);
|
|
2162
|
+
const currentX = React2.useRef(0);
|
|
2163
|
+
const tracking = React2.useRef(false);
|
|
2164
|
+
const offsetXRef = React2.useRef(0);
|
|
2165
|
+
const isSwipingRef = React2.useRef(false);
|
|
2166
|
+
const onPointerDown = React2.useCallback((e) => {
|
|
2167
2167
|
startX.current = e.clientX;
|
|
2168
2168
|
startY.current = e.clientY;
|
|
2169
2169
|
currentX.current = e.clientX;
|
|
@@ -2173,7 +2173,7 @@ function useSwipeGesture(callbacks, options = {}) {
|
|
|
2173
2173
|
offsetXRef.current = 0;
|
|
2174
2174
|
e.target.setPointerCapture?.(e.pointerId);
|
|
2175
2175
|
}, []);
|
|
2176
|
-
const onPointerMove =
|
|
2176
|
+
const onPointerMove = React2.useCallback((e) => {
|
|
2177
2177
|
if (!tracking.current) return;
|
|
2178
2178
|
if (preventDefault) e.preventDefault();
|
|
2179
2179
|
currentX.current = e.clientX;
|
|
@@ -2184,7 +2184,7 @@ function useSwipeGesture(callbacks, options = {}) {
|
|
|
2184
2184
|
offsetXRef.current = dx;
|
|
2185
2185
|
}
|
|
2186
2186
|
}, [preventDefault]);
|
|
2187
|
-
const onPointerUp =
|
|
2187
|
+
const onPointerUp = React2.useCallback((e) => {
|
|
2188
2188
|
if (!tracking.current) return;
|
|
2189
2189
|
tracking.current = false;
|
|
2190
2190
|
const dx = e.clientX - startX.current;
|
|
@@ -2202,7 +2202,7 @@ function useSwipeGesture(callbacks, options = {}) {
|
|
|
2202
2202
|
else if (dy > threshold) callbacks.onSwipeDown?.();
|
|
2203
2203
|
}
|
|
2204
2204
|
}, [threshold, velocityThreshold, callbacks]);
|
|
2205
|
-
const onPointerCancel =
|
|
2205
|
+
const onPointerCancel = React2.useCallback(() => {
|
|
2206
2206
|
tracking.current = false;
|
|
2207
2207
|
offsetXRef.current = 0;
|
|
2208
2208
|
isSwipingRef.current = false;
|
|
@@ -2218,18 +2218,18 @@ function useSwipeGesture(callbacks, options = {}) {
|
|
|
2218
2218
|
}
|
|
2219
2219
|
function useLongPress(onLongPress, options = {}) {
|
|
2220
2220
|
const { duration = 500, moveThreshold = 10 } = options;
|
|
2221
|
-
const timerRef =
|
|
2222
|
-
const startPos =
|
|
2223
|
-
const isPressedRef =
|
|
2224
|
-
const firedRef =
|
|
2225
|
-
const cancel =
|
|
2221
|
+
const timerRef = React2.useRef(null);
|
|
2222
|
+
const startPos = React2.useRef({ x: 0, y: 0 });
|
|
2223
|
+
const isPressedRef = React2.useRef(false);
|
|
2224
|
+
const firedRef = React2.useRef(false);
|
|
2225
|
+
const cancel = React2.useCallback(() => {
|
|
2226
2226
|
if (timerRef.current) {
|
|
2227
2227
|
clearTimeout(timerRef.current);
|
|
2228
2228
|
timerRef.current = null;
|
|
2229
2229
|
}
|
|
2230
2230
|
isPressedRef.current = false;
|
|
2231
2231
|
}, []);
|
|
2232
|
-
const onPointerDown =
|
|
2232
|
+
const onPointerDown = React2.useCallback((e) => {
|
|
2233
2233
|
firedRef.current = false;
|
|
2234
2234
|
startPos.current = { x: e.clientX, y: e.clientY };
|
|
2235
2235
|
isPressedRef.current = true;
|
|
@@ -2239,7 +2239,7 @@ function useLongPress(onLongPress, options = {}) {
|
|
|
2239
2239
|
onLongPress();
|
|
2240
2240
|
}, duration);
|
|
2241
2241
|
}, [duration, onLongPress]);
|
|
2242
|
-
const onPointerMove =
|
|
2242
|
+
const onPointerMove = React2.useCallback((e) => {
|
|
2243
2243
|
if (!isPressedRef.current) return;
|
|
2244
2244
|
const dx = e.clientX - startPos.current.x;
|
|
2245
2245
|
const dy = e.clientY - startPos.current.y;
|
|
@@ -2247,10 +2247,10 @@ function useLongPress(onLongPress, options = {}) {
|
|
|
2247
2247
|
cancel();
|
|
2248
2248
|
}
|
|
2249
2249
|
}, [moveThreshold, cancel]);
|
|
2250
|
-
const onPointerUp =
|
|
2250
|
+
const onPointerUp = React2.useCallback(() => {
|
|
2251
2251
|
cancel();
|
|
2252
2252
|
}, [cancel]);
|
|
2253
|
-
const onPointerCancel =
|
|
2253
|
+
const onPointerCancel = React2.useCallback(() => {
|
|
2254
2254
|
cancel();
|
|
2255
2255
|
}, [cancel]);
|
|
2256
2256
|
return {
|
|
@@ -2262,22 +2262,22 @@ function useLongPress(onLongPress, options = {}) {
|
|
|
2262
2262
|
};
|
|
2263
2263
|
}
|
|
2264
2264
|
function useDragReorder(initialItems, onReorder) {
|
|
2265
|
-
const [items, setItems] =
|
|
2266
|
-
const [dragIndex, setDragIndex] =
|
|
2267
|
-
const [dragOverIndex, setDragOverIndex] =
|
|
2268
|
-
const itemsRef =
|
|
2265
|
+
const [items, setItems] = React2.useState(initialItems);
|
|
2266
|
+
const [dragIndex, setDragIndex] = React2.useState(-1);
|
|
2267
|
+
const [dragOverIndex, setDragOverIndex] = React2.useState(-1);
|
|
2268
|
+
const itemsRef = React2.useRef(initialItems);
|
|
2269
2269
|
if (initialItems !== itemsRef.current) {
|
|
2270
2270
|
itemsRef.current = initialItems;
|
|
2271
2271
|
setItems(initialItems);
|
|
2272
2272
|
}
|
|
2273
2273
|
const isDragging = dragIndex >= 0;
|
|
2274
|
-
const handleDragStart =
|
|
2274
|
+
const handleDragStart = React2.useCallback((index) => (e) => {
|
|
2275
2275
|
e.preventDefault();
|
|
2276
2276
|
setDragIndex(index);
|
|
2277
2277
|
setDragOverIndex(index);
|
|
2278
2278
|
e.target.setPointerCapture?.(e.pointerId);
|
|
2279
2279
|
}, []);
|
|
2280
|
-
const handleDragMove =
|
|
2280
|
+
const handleDragMove = React2.useCallback((index) => (e) => {
|
|
2281
2281
|
if (dragIndex < 0) return;
|
|
2282
2282
|
const target = document.elementFromPoint(e.clientX, e.clientY);
|
|
2283
2283
|
if (!target) return;
|
|
@@ -2292,7 +2292,7 @@ function useDragReorder(initialItems, onReorder) {
|
|
|
2292
2292
|
}
|
|
2293
2293
|
}
|
|
2294
2294
|
}, [dragIndex, dragOverIndex]);
|
|
2295
|
-
const handleDragEnd =
|
|
2295
|
+
const handleDragEnd = React2.useCallback(() => {
|
|
2296
2296
|
if (dragIndex >= 0 && dragOverIndex >= 0 && dragIndex !== dragOverIndex) {
|
|
2297
2297
|
const newItems = [...items];
|
|
2298
2298
|
const [movedItem] = newItems.splice(dragIndex, 1);
|
|
@@ -2303,13 +2303,13 @@ function useDragReorder(initialItems, onReorder) {
|
|
|
2303
2303
|
setDragIndex(-1);
|
|
2304
2304
|
setDragOverIndex(-1);
|
|
2305
2305
|
}, [dragIndex, dragOverIndex, items, onReorder]);
|
|
2306
|
-
const getDragHandleProps =
|
|
2306
|
+
const getDragHandleProps = React2.useCallback((index) => ({
|
|
2307
2307
|
onPointerDown: handleDragStart(index),
|
|
2308
2308
|
style: { cursor: "grab", touchAction: "none" },
|
|
2309
2309
|
"aria-grabbed": dragIndex === index,
|
|
2310
2310
|
role: "button"
|
|
2311
2311
|
}), [handleDragStart, dragIndex]);
|
|
2312
|
-
const getItemProps =
|
|
2312
|
+
const getItemProps = React2.useCallback((index) => ({
|
|
2313
2313
|
onPointerMove: handleDragMove(index),
|
|
2314
2314
|
onPointerUp: handleDragEnd,
|
|
2315
2315
|
"aria-dropeffect": "move",
|
|
@@ -2331,19 +2331,19 @@ function useDragReorder(initialItems, onReorder) {
|
|
|
2331
2331
|
}
|
|
2332
2332
|
function useInfiniteScroll(onLoadMore, options = {}) {
|
|
2333
2333
|
const { rootMargin = "200px", hasMore = true, isLoading = false } = options;
|
|
2334
|
-
const observerRef =
|
|
2335
|
-
const callbackRef =
|
|
2334
|
+
const observerRef = React2.useRef(null);
|
|
2335
|
+
const callbackRef = React2.useRef(onLoadMore);
|
|
2336
2336
|
callbackRef.current = onLoadMore;
|
|
2337
|
-
const hasMoreRef =
|
|
2337
|
+
const hasMoreRef = React2.useRef(hasMore);
|
|
2338
2338
|
hasMoreRef.current = hasMore;
|
|
2339
|
-
const isLoadingRef =
|
|
2339
|
+
const isLoadingRef = React2.useRef(isLoading);
|
|
2340
2340
|
isLoadingRef.current = isLoading;
|
|
2341
|
-
|
|
2341
|
+
React2.useEffect(() => {
|
|
2342
2342
|
return () => {
|
|
2343
2343
|
observerRef.current?.disconnect();
|
|
2344
2344
|
};
|
|
2345
2345
|
}, []);
|
|
2346
|
-
const sentinelRef =
|
|
2346
|
+
const sentinelRef = React2.useCallback((node) => {
|
|
2347
2347
|
observerRef.current?.disconnect();
|
|
2348
2348
|
if (!node) return;
|
|
2349
2349
|
observerRef.current = new IntersectionObserver(
|
|
@@ -2361,12 +2361,12 @@ function useInfiniteScroll(onLoadMore, options = {}) {
|
|
|
2361
2361
|
}
|
|
2362
2362
|
function usePullToRefresh(onRefresh, options = {}) {
|
|
2363
2363
|
const { threshold = 60, maxPull = 120 } = options;
|
|
2364
|
-
const [pullDistance, setPullDistance] =
|
|
2365
|
-
const [isPulling, setIsPulling] =
|
|
2366
|
-
const [isRefreshing, setIsRefreshing] =
|
|
2367
|
-
const startY =
|
|
2368
|
-
const scrollTopRef =
|
|
2369
|
-
const onTouchStart =
|
|
2364
|
+
const [pullDistance, setPullDistance] = React2.useState(0);
|
|
2365
|
+
const [isPulling, setIsPulling] = React2.useState(false);
|
|
2366
|
+
const [isRefreshing, setIsRefreshing] = React2.useState(false);
|
|
2367
|
+
const startY = React2.useRef(0);
|
|
2368
|
+
const scrollTopRef = React2.useRef(0);
|
|
2369
|
+
const onTouchStart = React2.useCallback((e) => {
|
|
2370
2370
|
const container = e.currentTarget;
|
|
2371
2371
|
scrollTopRef.current = container.scrollTop;
|
|
2372
2372
|
if (scrollTopRef.current <= 0) {
|
|
@@ -2374,7 +2374,7 @@ function usePullToRefresh(onRefresh, options = {}) {
|
|
|
2374
2374
|
setIsPulling(true);
|
|
2375
2375
|
}
|
|
2376
2376
|
}, []);
|
|
2377
|
-
const onTouchMove =
|
|
2377
|
+
const onTouchMove = React2.useCallback((e) => {
|
|
2378
2378
|
if (!isPulling || isRefreshing) return;
|
|
2379
2379
|
const container = e.currentTarget;
|
|
2380
2380
|
if (container.scrollTop > 0) {
|
|
@@ -2387,7 +2387,7 @@ function usePullToRefresh(onRefresh, options = {}) {
|
|
|
2387
2387
|
setPullDistance(distance);
|
|
2388
2388
|
}
|
|
2389
2389
|
}, [isPulling, isRefreshing, maxPull]);
|
|
2390
|
-
const onTouchEnd =
|
|
2390
|
+
const onTouchEnd = React2.useCallback(() => {
|
|
2391
2391
|
if (!isPulling) return;
|
|
2392
2392
|
setIsPulling(false);
|
|
2393
2393
|
if (pullDistance >= threshold && !isRefreshing) {
|
|
@@ -2398,7 +2398,7 @@ function usePullToRefresh(onRefresh, options = {}) {
|
|
|
2398
2398
|
setPullDistance(0);
|
|
2399
2399
|
}
|
|
2400
2400
|
}, [isPulling, pullDistance, threshold, isRefreshing, onRefresh]);
|
|
2401
|
-
const endRefresh =
|
|
2401
|
+
const endRefresh = React2.useCallback(() => {
|
|
2402
2402
|
setIsRefreshing(false);
|
|
2403
2403
|
setPullDistance(0);
|
|
2404
2404
|
}, []);
|
|
@@ -2426,18 +2426,18 @@ function getDistance(touches) {
|
|
|
2426
2426
|
}
|
|
2427
2427
|
function usePinchZoom(options = {}) {
|
|
2428
2428
|
const { minScale = 0.5, maxScale = 4 } = options;
|
|
2429
|
-
const [scale, setScale] =
|
|
2430
|
-
const [isPinching, setIsPinching] =
|
|
2431
|
-
const initialDistance =
|
|
2432
|
-
const initialScale =
|
|
2433
|
-
const onTouchStart =
|
|
2429
|
+
const [scale, setScale] = React2.useState(1);
|
|
2430
|
+
const [isPinching, setIsPinching] = React2.useState(false);
|
|
2431
|
+
const initialDistance = React2.useRef(0);
|
|
2432
|
+
const initialScale = React2.useRef(1);
|
|
2433
|
+
const onTouchStart = React2.useCallback((e) => {
|
|
2434
2434
|
if (e.touches.length === 2) {
|
|
2435
2435
|
initialDistance.current = getDistance(e.touches);
|
|
2436
2436
|
initialScale.current = scale;
|
|
2437
2437
|
setIsPinching(true);
|
|
2438
2438
|
}
|
|
2439
2439
|
}, [scale]);
|
|
2440
|
-
const onTouchMove =
|
|
2440
|
+
const onTouchMove = React2.useCallback((e) => {
|
|
2441
2441
|
if (e.touches.length !== 2 || !isPinching) return;
|
|
2442
2442
|
e.preventDefault();
|
|
2443
2443
|
const currentDistance = getDistance(e.touches);
|
|
@@ -2445,10 +2445,10 @@ function usePinchZoom(options = {}) {
|
|
|
2445
2445
|
const newScale = Math.min(maxScale, Math.max(minScale, initialScale.current * ratio));
|
|
2446
2446
|
setScale(newScale);
|
|
2447
2447
|
}, [isPinching, minScale, maxScale]);
|
|
2448
|
-
const onTouchEnd =
|
|
2448
|
+
const onTouchEnd = React2.useCallback(() => {
|
|
2449
2449
|
setIsPinching(false);
|
|
2450
2450
|
}, []);
|
|
2451
|
-
const resetZoom =
|
|
2451
|
+
const resetZoom = React2.useCallback(() => {
|
|
2452
2452
|
setScale(1);
|
|
2453
2453
|
}, []);
|
|
2454
2454
|
return {
|
|
@@ -2492,7 +2492,7 @@ function useGitHubStatus() {
|
|
|
2492
2492
|
});
|
|
2493
2493
|
}
|
|
2494
2494
|
function useConnectGitHub() {
|
|
2495
|
-
const connectGitHub =
|
|
2495
|
+
const connectGitHub = React2.useCallback(() => {
|
|
2496
2496
|
const userId = getUserId();
|
|
2497
2497
|
const state = btoa(JSON.stringify({ userId, returnUrl: window.location.href }));
|
|
2498
2498
|
window.location.href = `${API_BASE}/api/github/oauth/authorize?state=${state}`;
|