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