@flamingo-stack/openframe-frontend-core 0.0.716 → 0.0.718
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/chat-protocol/index.cjs +23 -14
- package/dist/chat-protocol/index.js +23 -14
- package/dist/chat-protocol/nats-decoder.d.ts.map +1 -1
- package/dist/chat-protocol/source-metadata.d.ts +11 -2
- package/dist/chat-protocol/source-metadata.d.ts.map +1 -1
- package/dist/{chunk-DPX6244M.js → chunk-45F7PXUI.js} +3 -3
- package/dist/{chunk-KYFNFRSV.js → chunk-67QBMN4R.js} +2 -2
- package/dist/{chunk-3RKBJT6K.cjs → chunk-6A43ZDWV.cjs} +2 -2
- package/dist/chunk-A6P6DHEZ.cjs +130 -0
- package/dist/{chunk-KNOZVVCU.cjs → chunk-BOTM373R.cjs} +9 -9
- package/dist/{chunk-DHMO5GI4.cjs → chunk-BWIN42ZA.cjs} +21 -21
- package/dist/{chunk-YTMV4OBY.js → chunk-DCD5WZUF.js} +4 -4
- package/dist/{chunk-V36WGIYR.js → chunk-DEZDMTBM.js} +5 -5
- package/dist/{chunk-YO5JB3WE.cjs → chunk-DXCBOZVT.cjs} +35 -35
- package/dist/{chunk-ZX7SCPLO.cjs → chunk-E7YCPY7K.cjs} +3 -3
- package/dist/{chunk-I5F2OTFE.cjs → chunk-EZC2F5OT.cjs} +33 -33
- package/dist/{chunk-DLEO53NX.cjs → chunk-GN4A7PMB.cjs} +69 -69
- package/dist/{chunk-6T3BTD6Q.js → chunk-IWCPXJEE.js} +201 -327
- package/dist/{chunk-ROBQ5TR7.js → chunk-JH2SIWPQ.js} +28 -17
- package/dist/{chunk-3AJIQPFG.js → chunk-JIWMBIVZ.js} +6 -6
- package/dist/{chunk-DDWFCWOE.js → chunk-JPD4NXH6.js} +1 -1
- package/dist/{chunk-JVCAK4W3.cjs → chunk-LE5WKGJV.cjs} +3 -3
- package/dist/{chunk-NPAQSMRY.js → chunk-LOYPRJWA.js} +1053 -357
- package/dist/{chunk-5IJXM3RU.cjs → chunk-MIQLUUVF.cjs} +10 -10
- package/dist/{chunk-MXPQMQI3.js → chunk-MM7MCIXL.js} +6 -6
- package/dist/{chunk-C5AGSZBT.js → chunk-N2PF5CFX.js} +4837 -5425
- package/dist/{chunk-STCJYO2Z.cjs → chunk-NDZ5ZXOQ.cjs} +11 -11
- package/dist/{chunk-H5R7U2D2.js → chunk-NZ5BHDFZ.js} +1 -1
- package/dist/{chunk-JCA5MBVY.js → chunk-PQ6HBLZ7.js} +4 -4
- package/dist/{chunk-EOKSKJSS.cjs → chunk-QBCDSTLE.cjs} +13 -13
- package/dist/{chunk-NQWJAOHO.js → chunk-QXZCLQNV.js} +1 -1
- package/dist/{chunk-2V7D5GJX.cjs → chunk-S2FUFMLW.cjs} +25 -25
- package/dist/{chunk-64F6OEEV.js → chunk-SGFTTJKO.js} +1 -1
- package/dist/{chunk-P7IL4CX3.js → chunk-TBCZCRQ5.js} +6 -6
- package/dist/{chunk-HETQETPV.cjs → chunk-UWQWMGJ7.cjs} +28 -17
- package/dist/{chunk-X2MNNV5H.cjs → chunk-WALCXC7J.cjs} +3 -3
- package/dist/{chunk-YBS5QGON.js → chunk-XGHGGBM3.js} +2 -2
- package/dist/{chunk-NKILEG3Y.cjs → chunk-YC5COB5V.cjs} +45 -45
- package/dist/{chunk-BVZ7W4HW.js → chunk-YEMCCYIF.js} +4 -4
- package/dist/chunk-YYYVS7CX.js +130 -0
- package/dist/{chunk-S2VWQX6T.cjs → chunk-Z3CVSPO3.cjs} +842 -1430
- package/dist/{chunk-PPXR22YC.cjs → chunk-Z5UWW3Z2.cjs} +707 -11
- package/dist/{chunk-JO5TLJPM.cjs → chunk-ZXCZYMN4.cjs} +37 -163
- package/dist/{cloud-tenants-2J7CPTKT.cjs → cloud-tenants-PFDF7O5U.cjs} +6 -5
- package/dist/{cloud-tenants-YOY2WLGC.js → cloud-tenants-TAKOWXLD.js} +5 -4
- package/dist/components/case-studies/index.cjs +17 -16
- package/dist/components/case-studies/index.js +6 -5
- package/dist/components/chat/index.cjs +2 -2
- package/dist/components/chat/index.js +1 -1
- package/dist/components/chat/types/message.types.d.ts +20 -16
- package/dist/components/chat/types/message.types.d.ts.map +1 -1
- package/dist/components/chat/types/unified-chat-state.types.d.ts +1 -1
- package/dist/components/chat/utils/process-historical-messages.d.ts.map +1 -1
- package/dist/components/contact/index.cjs +7 -6
- package/dist/components/contact/index.js +6 -5
- package/dist/components/docs/index.cjs +10 -9
- package/dist/components/docs/index.js +9 -8
- package/dist/components/embeds/index.cjs +7 -6
- package/dist/components/embeds/index.js +6 -5
- package/dist/components/faq/index.cjs +7 -6
- package/dist/components/faq/index.js +6 -5
- package/dist/components/features/index.cjs +10 -5
- package/dist/components/features/index.js +9 -4
- package/dist/components/features/remote-session/index.d.ts +2 -0
- package/dist/components/features/remote-session/index.d.ts.map +1 -1
- package/dist/components/features/remote-session/remote-session-keep-modals.d.ts +3 -3
- package/dist/components/features/remote-session/remote-session-keep-modals.d.ts.map +1 -1
- package/dist/components/features/remote-session/remote-session-ticket-modals.d.ts +29 -0
- package/dist/components/features/remote-session/remote-session-ticket-modals.d.ts.map +1 -0
- package/dist/components/help-center-pages/index.cjs +71 -70
- package/dist/components/help-center-pages/index.js +17 -16
- package/dist/components/index.cjs +44 -39
- package/dist/components/index.js +22 -17
- package/dist/components/meeting-scheduler/index.cjs +33 -32
- package/dist/components/meeting-scheduler/index.js +5 -4
- package/dist/components/navigation/index.cjs +9 -8
- package/dist/components/navigation/index.js +8 -7
- package/dist/components/onboarding-guides/index.cjs +9 -8
- package/dist/components/onboarding-guides/index.js +8 -7
- package/dist/components/product-demo/index.cjs +7 -7
- package/dist/components/product-demo/index.js +7 -7
- package/dist/components/tickets/index.cjs +10 -9
- package/dist/components/tickets/index.js +9 -8
- package/dist/components/ui/autocomplete.d.ts +6 -0
- package/dist/components/ui/autocomplete.d.ts.map +1 -1
- package/dist/components/ui/index.cjs +8 -7
- package/dist/components/ui/index.js +7 -6
- package/dist/{devices-5NADSKDZ.cjs → devices-KRCGZMGA.cjs} +7 -6
- package/dist/{devices-EQXXILXW.js → devices-LHEX7O5T.js} +5 -4
- package/dist/hooks/index.cjs +6 -4
- package/dist/hooks/index.js +5 -3
- package/dist/index.cjs +17 -11
- package/dist/index.js +18 -12
- package/dist/{knowledge-LHQYZJE7.cjs → knowledge-KLVPVEYZ.cjs} +7 -6
- package/dist/{knowledge-YCQITBJB.js → knowledge-RZSFNR33.js} +5 -4
- package/dist/{logs-LZNXGOSW.js → logs-E5DOV5JO.js} +5 -4
- package/dist/{logs-DUVKSQU3.cjs → logs-OX3XTVL2.cjs} +14 -13
- package/dist/{policies-5H74FS4S.cjs → policies-FOSCIZGK.cjs} +10 -9
- package/dist/{policies-VYWOJ7IF.js → policies-MC2S4S5G.js} +5 -4
- package/dist/{remote-session-R6VAFESR.cjs → remote-session-DRFE5XZE.cjs} +4 -3
- package/dist/{remote-session-GSGZOFDX.js → remote-session-JQ2BPIE3.js} +2 -1
- package/dist/{software-update-MSDY3OLX.js → software-update-D4OEIH65.js} +7 -5
- package/dist/{software-update-VRRX5U4W.cjs → software-update-HOBSTWVO.cjs} +12 -10
- package/package.json +1 -1
- package/src/chat-protocol/nats-decoder.ts +10 -8
- package/src/chat-protocol/source-metadata.ts +25 -2
- package/src/components/chat/types/message.types.ts +21 -15
- package/src/components/chat/types/unified-chat-state.types.ts +1 -1
- package/src/components/chat/utils/process-historical-messages.ts +12 -4
- package/src/components/features/remote-session/index.ts +2 -0
- package/src/components/features/remote-session/remote-session-keep-modals.tsx +4 -4
- package/src/components/features/remote-session/remote-session-ticket-modals.tsx +140 -0
- package/src/components/ui/autocomplete.tsx +18 -4
|
@@ -63,95 +63,22 @@ import {
|
|
|
63
63
|
cn
|
|
64
64
|
} from "./chunk-7RXWKTAP.js";
|
|
65
65
|
|
|
66
|
-
// src/hooks/ui/use-auto-limit-tags.ts
|
|
67
|
-
import { useCallback, useEffect, useRef, useState } from "react";
|
|
68
|
-
function useAutoLimitTags({
|
|
69
|
-
count,
|
|
70
|
-
limitTags = "auto",
|
|
71
|
-
placeholder = "",
|
|
72
|
-
reserveInputWidth = true
|
|
73
|
-
}) {
|
|
74
|
-
const middleRef = useRef(null);
|
|
75
|
-
const measureRef = useRef(null);
|
|
76
|
-
const textMeasureRef = useRef(null);
|
|
77
|
-
const badgeRef = useRef(null);
|
|
78
|
-
const inputRef = useRef(null);
|
|
79
|
-
const [measuredCount, setMeasuredCount] = useState(null);
|
|
80
|
-
const recalculate = useCallback(() => {
|
|
81
|
-
const middle = middleRef.current;
|
|
82
|
-
const measure2 = measureRef.current;
|
|
83
|
-
if (!middle || !measure2) {
|
|
84
|
-
setMeasuredCount(null);
|
|
85
|
-
return;
|
|
86
|
-
}
|
|
87
|
-
if (count === 0) {
|
|
88
|
-
setMeasuredCount(0);
|
|
89
|
-
return;
|
|
90
|
-
}
|
|
91
|
-
const cs = getComputedStyle(middle);
|
|
92
|
-
const padL = parseFloat(cs.paddingLeft) || 0;
|
|
93
|
-
const padR = parseFloat(cs.paddingRight) || 0;
|
|
94
|
-
const gap = parseFloat(cs.gap) || 0;
|
|
95
|
-
const middleW = middle.clientWidth;
|
|
96
|
-
let inputReservedW = 0;
|
|
97
|
-
let trailingGap = 0;
|
|
98
|
-
if (reserveInputWidth) {
|
|
99
|
-
const textW = textMeasureRef.current?.offsetWidth ?? 60;
|
|
100
|
-
const inputMinW = inputRef.current ? parseFloat(getComputedStyle(inputRef.current).minWidth) || 60 : 60;
|
|
101
|
-
inputReservedW = Math.max(textW + 8, inputMinW);
|
|
102
|
-
trailingGap = gap;
|
|
103
|
-
}
|
|
104
|
-
const available = middleW - padL - padR - inputReservedW - trailingGap;
|
|
105
|
-
const tagEls = Array.from(measure2.children);
|
|
106
|
-
const widths = tagEls.map((el) => el.offsetWidth);
|
|
107
|
-
let total = 0;
|
|
108
|
-
for (let i = 0; i < widths.length; i++) {
|
|
109
|
-
total += widths[i] + (i > 0 ? gap : 0);
|
|
110
|
-
}
|
|
111
|
-
if (total <= available) {
|
|
112
|
-
setMeasuredCount(count);
|
|
113
|
-
return;
|
|
114
|
-
}
|
|
115
|
-
const badgeW = badgeRef.current?.offsetWidth ?? 40;
|
|
116
|
-
const spaceWithBadge = available - badgeW - gap;
|
|
117
|
-
let used = 0;
|
|
118
|
-
let fitCount = 0;
|
|
119
|
-
for (let i = 0; i < widths.length; i++) {
|
|
120
|
-
const need = widths[i] + (i > 0 ? gap : 0);
|
|
121
|
-
if (used + need > spaceWithBadge) break;
|
|
122
|
-
used += need;
|
|
123
|
-
fitCount++;
|
|
124
|
-
}
|
|
125
|
-
setMeasuredCount(Math.max(0, fitCount));
|
|
126
|
-
}, [count, placeholder, reserveInputWidth]);
|
|
127
|
-
useEffect(() => {
|
|
128
|
-
if (limitTags !== "auto") return void 0;
|
|
129
|
-
const el = middleRef.current;
|
|
130
|
-
if (!el) return void 0;
|
|
131
|
-
const ro = new ResizeObserver(recalculate);
|
|
132
|
-
ro.observe(el);
|
|
133
|
-
return () => ro.disconnect();
|
|
134
|
-
}, [recalculate, limitTags]);
|
|
135
|
-
const visibleCount = limitTags !== "auto" ? Math.min(limitTags, count) : measuredCount === null ? count : Math.min(measuredCount, count);
|
|
136
|
-
return { visibleCount, middleRef, measureRef, textMeasureRef, badgeRef, inputRef };
|
|
137
|
-
}
|
|
138
|
-
|
|
139
66
|
// src/hooks/ui/use-deferred-error.ts
|
|
140
|
-
import { useState
|
|
67
|
+
import { useState, useEffect, useCallback } from "react";
|
|
141
68
|
function useDeferredError(error, value, delay = 1500) {
|
|
142
|
-
const [touched, setTouched] =
|
|
143
|
-
const [paused, setPaused] =
|
|
144
|
-
const [pausedFor, setPausedFor] =
|
|
69
|
+
const [touched, setTouched] = useState(false);
|
|
70
|
+
const [paused, setPaused] = useState(false);
|
|
71
|
+
const [pausedFor, setPausedFor] = useState(value);
|
|
145
72
|
if (pausedFor !== value) {
|
|
146
73
|
setPausedFor(value);
|
|
147
74
|
setPaused(false);
|
|
148
75
|
}
|
|
149
|
-
|
|
76
|
+
useEffect(() => {
|
|
150
77
|
if (touched) return void 0;
|
|
151
78
|
const timer = setTimeout(() => setPaused(true), delay);
|
|
152
79
|
return () => clearTimeout(timer);
|
|
153
80
|
}, [value, delay, touched]);
|
|
154
|
-
const onBlur =
|
|
81
|
+
const onBlur = useCallback(() => setTouched(true), []);
|
|
155
82
|
return {
|
|
156
83
|
error: error && (touched || paused) ? error : void 0,
|
|
157
84
|
onBlur
|
|
@@ -159,7 +86,7 @@ function useDeferredError(error, value, delay = 1500) {
|
|
|
159
86
|
}
|
|
160
87
|
|
|
161
88
|
// src/hooks/ui/use-focus-trap.ts
|
|
162
|
-
import { useEffect as
|
|
89
|
+
import { useEffect as useEffect2, useRef } from "react";
|
|
163
90
|
var FOCUSABLE_SELECTOR = [
|
|
164
91
|
"a[href]",
|
|
165
92
|
"button:not([disabled])",
|
|
@@ -169,11 +96,11 @@ var FOCUSABLE_SELECTOR = [
|
|
|
169
96
|
'[tabindex]:not([tabindex="-1"])'
|
|
170
97
|
].join(", ");
|
|
171
98
|
function useFocusTrap(containerRef, active, { onEscape, contain = true } = {}) {
|
|
172
|
-
const onEscapeRef =
|
|
173
|
-
|
|
99
|
+
const onEscapeRef = useRef(onEscape);
|
|
100
|
+
useEffect2(() => {
|
|
174
101
|
onEscapeRef.current = onEscape;
|
|
175
102
|
});
|
|
176
|
-
|
|
103
|
+
useEffect2(() => {
|
|
177
104
|
if (!active) return void 0;
|
|
178
105
|
const container = containerRef.current;
|
|
179
106
|
if (!container) return void 0;
|
|
@@ -218,17 +145,17 @@ function useFocusTrap(containerRef, active, { onEscape, contain = true } = {}) {
|
|
|
218
145
|
}
|
|
219
146
|
|
|
220
147
|
// src/hooks/ui/use-sticky-toolbar.ts
|
|
221
|
-
import { useCallback as
|
|
148
|
+
import { useCallback as useCallback2, useEffect as useEffect3, useState as useState2 } from "react";
|
|
222
149
|
function useStickyToolbar() {
|
|
223
|
-
const [node, setNode] =
|
|
224
|
-
const [height, setHeight] =
|
|
225
|
-
const toolbarRef =
|
|
226
|
-
const [lastNode, setLastNode] =
|
|
150
|
+
const [node, setNode] = useState2(null);
|
|
151
|
+
const [height, setHeight] = useState2(0);
|
|
152
|
+
const toolbarRef = useCallback2((el) => setNode(el), []);
|
|
153
|
+
const [lastNode, setLastNode] = useState2(node);
|
|
227
154
|
if (node !== lastNode) {
|
|
228
155
|
setLastNode(node);
|
|
229
156
|
if (!node) setHeight(0);
|
|
230
157
|
}
|
|
231
|
-
|
|
158
|
+
useEffect3(() => {
|
|
232
159
|
if (!node) return void 0;
|
|
233
160
|
const update = () => setHeight(node.offsetHeight);
|
|
234
161
|
update();
|
|
@@ -243,97 +170,46 @@ function useStickyToolbar() {
|
|
|
243
170
|
};
|
|
244
171
|
}
|
|
245
172
|
|
|
246
|
-
// src/hooks/ui/use-keyboard-collision-padding.ts
|
|
247
|
-
import { useSyncExternalStore } from "react";
|
|
248
|
-
var KEYBOARD_INSET_VAR = "--of-keyboard-inset";
|
|
249
|
-
function measure() {
|
|
250
|
-
if (typeof document === "undefined") return 0;
|
|
251
|
-
const inset = Number.parseFloat(getComputedStyle(document.documentElement).getPropertyValue(KEYBOARD_INSET_VAR));
|
|
252
|
-
if (!(inset > 0)) return 0;
|
|
253
|
-
const layoutHeight = document.documentElement.clientHeight;
|
|
254
|
-
const viewport = window.visualViewport;
|
|
255
|
-
const viewportBottom = viewport ? viewport.offsetTop + viewport.height : layoutHeight;
|
|
256
|
-
return Math.max(0, Math.round(viewportBottom - (layoutHeight - inset)));
|
|
257
|
-
}
|
|
258
|
-
var listeners = /* @__PURE__ */ new Set();
|
|
259
|
-
var padding = 0;
|
|
260
|
-
var teardown = null;
|
|
261
|
-
function sync() {
|
|
262
|
-
const next = measure();
|
|
263
|
-
if (next === padding) return;
|
|
264
|
-
padding = next;
|
|
265
|
-
for (const notify of listeners) notify();
|
|
266
|
-
}
|
|
267
|
-
function subscribe(onStoreChange) {
|
|
268
|
-
listeners.add(onStoreChange);
|
|
269
|
-
if (listeners.size === 1) {
|
|
270
|
-
padding = measure();
|
|
271
|
-
const observer = new MutationObserver(sync);
|
|
272
|
-
observer.observe(document.documentElement, { attributes: true, attributeFilter: ["style"] });
|
|
273
|
-
const viewport = window.visualViewport;
|
|
274
|
-
viewport?.addEventListener("resize", sync);
|
|
275
|
-
viewport?.addEventListener("scroll", sync);
|
|
276
|
-
teardown = () => {
|
|
277
|
-
observer.disconnect();
|
|
278
|
-
viewport?.removeEventListener("resize", sync);
|
|
279
|
-
viewport?.removeEventListener("scroll", sync);
|
|
280
|
-
};
|
|
281
|
-
}
|
|
282
|
-
return () => {
|
|
283
|
-
listeners.delete(onStoreChange);
|
|
284
|
-
if (listeners.size > 0) return;
|
|
285
|
-
teardown?.();
|
|
286
|
-
teardown = null;
|
|
287
|
-
};
|
|
288
|
-
}
|
|
289
|
-
function useKeyboardCollisionPadding() {
|
|
290
|
-
return useSyncExternalStore(
|
|
291
|
-
subscribe,
|
|
292
|
-
() => padding,
|
|
293
|
-
() => 0
|
|
294
|
-
);
|
|
295
|
-
}
|
|
296
|
-
|
|
297
173
|
// src/hooks/ui/use-memoized-callback.ts
|
|
298
|
-
import { useCallback as
|
|
174
|
+
import { useCallback as useCallback3, useEffect as useEffect4, useRef as useRef2 } from "react";
|
|
299
175
|
function useMemoizedCallback(callback, _dependencies) {
|
|
300
|
-
const callbackRef =
|
|
301
|
-
|
|
176
|
+
const callbackRef = useRef2(callback);
|
|
177
|
+
useEffect4(() => {
|
|
302
178
|
callbackRef.current = callback;
|
|
303
179
|
});
|
|
304
|
-
const stable =
|
|
180
|
+
const stable = useCallback3((...args) => callbackRef.current(...args), []);
|
|
305
181
|
return stable;
|
|
306
182
|
}
|
|
307
183
|
|
|
308
184
|
// src/hooks/ui/use-notification-permission.ts
|
|
309
|
-
import { useCallback as
|
|
185
|
+
import { useCallback as useCallback4, useEffect as useEffect5, useState as useState3 } from "react";
|
|
310
186
|
function useNotificationPermission() {
|
|
311
|
-
const [supported, setSupported] =
|
|
312
|
-
const [permission, setPermission] =
|
|
313
|
-
|
|
187
|
+
const [supported, setSupported] = useState3(false);
|
|
188
|
+
const [permission, setPermission] = useState3("default");
|
|
189
|
+
useEffect5(() => {
|
|
314
190
|
if (typeof window === "undefined" || !("Notification" in window)) return void 0;
|
|
315
|
-
const
|
|
191
|
+
const sync = () => {
|
|
316
192
|
setSupported(true);
|
|
317
193
|
setPermission(Notification.permission);
|
|
318
194
|
};
|
|
319
|
-
|
|
195
|
+
sync();
|
|
320
196
|
let cancelled = false;
|
|
321
197
|
let status;
|
|
322
198
|
navigator.permissions?.query({ name: "notifications" }).then((s) => {
|
|
323
199
|
if (cancelled) return;
|
|
324
200
|
status = s;
|
|
325
|
-
s.addEventListener("change",
|
|
201
|
+
s.addEventListener("change", sync);
|
|
326
202
|
}).catch(() => void 0);
|
|
327
|
-
document.addEventListener("visibilitychange",
|
|
328
|
-
window.addEventListener("focus",
|
|
203
|
+
document.addEventListener("visibilitychange", sync);
|
|
204
|
+
window.addEventListener("focus", sync);
|
|
329
205
|
return () => {
|
|
330
206
|
cancelled = true;
|
|
331
|
-
status?.removeEventListener("change",
|
|
332
|
-
document.removeEventListener("visibilitychange",
|
|
333
|
-
window.removeEventListener("focus",
|
|
207
|
+
status?.removeEventListener("change", sync);
|
|
208
|
+
document.removeEventListener("visibilitychange", sync);
|
|
209
|
+
window.removeEventListener("focus", sync);
|
|
334
210
|
};
|
|
335
211
|
}, []);
|
|
336
|
-
const request =
|
|
212
|
+
const request = useCallback4(async () => {
|
|
337
213
|
if (typeof window === "undefined" || !("Notification" in window)) {
|
|
338
214
|
return "denied";
|
|
339
215
|
}
|
|
@@ -350,7 +226,7 @@ function useNotificationPermission() {
|
|
|
350
226
|
}
|
|
351
227
|
|
|
352
228
|
// src/hooks/ui/use-onboarding-state.ts
|
|
353
|
-
import { useState as
|
|
229
|
+
import { useState as useState4, useEffect as useEffect6, useCallback as useCallback5 } from "react";
|
|
354
230
|
|
|
355
231
|
// src/utils/onboarding-storage.ts
|
|
356
232
|
var DEFAULT_STATE = {
|
|
@@ -434,9 +310,9 @@ function resetOnboardingState(key) {
|
|
|
434
310
|
|
|
435
311
|
// src/hooks/ui/use-onboarding-state.ts
|
|
436
312
|
function useOnboardingState(storageKey = "openframe-onboarding-state") {
|
|
437
|
-
const [state, setState] =
|
|
438
|
-
const [, forceUpdate] =
|
|
439
|
-
|
|
313
|
+
const [state, setState] = useState4(() => loadOnboardingState(storageKey));
|
|
314
|
+
const [, forceUpdate] = useState4(0);
|
|
315
|
+
useEffect6(() => {
|
|
440
316
|
const handleStorageUpdate = (event) => {
|
|
441
317
|
const detail = readLocalStorageUpdateDetail(event);
|
|
442
318
|
if (detail?.key !== storageKey) return;
|
|
@@ -449,7 +325,7 @@ function useOnboardingState(storageKey = "openframe-onboarding-state") {
|
|
|
449
325
|
window.removeEventListener("localStorageUpdate", handleStorageUpdate);
|
|
450
326
|
};
|
|
451
327
|
}, [storageKey]);
|
|
452
|
-
const markComplete =
|
|
328
|
+
const markComplete = useCallback5(
|
|
453
329
|
(stepId) => {
|
|
454
330
|
const newState = markStepComplete(storageKey, stepId);
|
|
455
331
|
setState(newState);
|
|
@@ -457,7 +333,7 @@ function useOnboardingState(storageKey = "openframe-onboarding-state") {
|
|
|
457
333
|
},
|
|
458
334
|
[storageKey]
|
|
459
335
|
);
|
|
460
|
-
const markSkipped =
|
|
336
|
+
const markSkipped = useCallback5(
|
|
461
337
|
(stepId) => {
|
|
462
338
|
const newState = markStepSkipped(storageKey, stepId);
|
|
463
339
|
setState(newState);
|
|
@@ -465,17 +341,17 @@ function useOnboardingState(storageKey = "openframe-onboarding-state") {
|
|
|
465
341
|
},
|
|
466
342
|
[storageKey]
|
|
467
343
|
);
|
|
468
|
-
const dismissOnboarding2 =
|
|
344
|
+
const dismissOnboarding2 = useCallback5(() => {
|
|
469
345
|
const newState = dismissOnboarding(storageKey);
|
|
470
346
|
setState(newState);
|
|
471
347
|
forceUpdate((prev) => prev + 1);
|
|
472
348
|
}, [storageKey]);
|
|
473
|
-
const resetOnboarding =
|
|
349
|
+
const resetOnboarding = useCallback5(() => {
|
|
474
350
|
const newState = resetOnboardingState(storageKey);
|
|
475
351
|
setState(newState);
|
|
476
352
|
forceUpdate((prev) => prev + 1);
|
|
477
353
|
}, [storageKey]);
|
|
478
|
-
const markMultipleComplete2 =
|
|
354
|
+
const markMultipleComplete2 = useCallback5(
|
|
479
355
|
(stepIds) => {
|
|
480
356
|
const newState = markMultipleComplete(storageKey, stepIds);
|
|
481
357
|
setState(newState);
|
|
@@ -483,19 +359,19 @@ function useOnboardingState(storageKey = "openframe-onboarding-state") {
|
|
|
483
359
|
},
|
|
484
360
|
[storageKey]
|
|
485
361
|
);
|
|
486
|
-
const isStepComplete =
|
|
362
|
+
const isStepComplete = useCallback5(
|
|
487
363
|
(stepId) => {
|
|
488
364
|
return state.completedSteps.includes(stepId);
|
|
489
365
|
},
|
|
490
366
|
[state.completedSteps]
|
|
491
367
|
);
|
|
492
|
-
const isStepSkipped =
|
|
368
|
+
const isStepSkipped = useCallback5(
|
|
493
369
|
(stepId) => {
|
|
494
370
|
return state.skippedSteps.includes(stepId);
|
|
495
371
|
},
|
|
496
372
|
[state.skippedSteps]
|
|
497
373
|
);
|
|
498
|
-
const allStepsComplete =
|
|
374
|
+
const allStepsComplete = useCallback5(
|
|
499
375
|
(steps) => {
|
|
500
376
|
return steps.every((step) => isStepComplete(step.id) || isStepSkipped(step.id));
|
|
501
377
|
},
|
|
@@ -515,27 +391,27 @@ function useOnboardingState(storageKey = "openframe-onboarding-state") {
|
|
|
515
391
|
}
|
|
516
392
|
|
|
517
393
|
// src/hooks/ui/use-search.ts
|
|
518
|
-
import { useState as
|
|
394
|
+
import { useState as useState5, useEffect as useEffect7, useCallback as useCallback6, useRef as useRef3 } from "react";
|
|
519
395
|
var NO_RESULTS = [];
|
|
520
396
|
function useSearch(config) {
|
|
521
397
|
const { searchFn, mapResult, debounceMs = 300, minQueryLength = 2 } = config;
|
|
522
|
-
const [query, setQuery] =
|
|
523
|
-
const [results, setResults] =
|
|
524
|
-
const [isLoading, setIsLoading] =
|
|
525
|
-
const [error, setError] =
|
|
526
|
-
const searchFnRef =
|
|
527
|
-
const mapResultRef =
|
|
528
|
-
|
|
398
|
+
const [query, setQuery] = useState5("");
|
|
399
|
+
const [results, setResults] = useState5(NO_RESULTS);
|
|
400
|
+
const [isLoading, setIsLoading] = useState5(false);
|
|
401
|
+
const [error, setError] = useState5(null);
|
|
402
|
+
const searchFnRef = useRef3(searchFn);
|
|
403
|
+
const mapResultRef = useRef3(mapResult);
|
|
404
|
+
useEffect7(() => {
|
|
529
405
|
searchFnRef.current = searchFn;
|
|
530
406
|
mapResultRef.current = mapResult;
|
|
531
407
|
});
|
|
532
408
|
const debouncedQuery = useDebounce(query, debounceMs);
|
|
533
|
-
const clearResults =
|
|
409
|
+
const clearResults = useCallback6(() => {
|
|
534
410
|
setResults(NO_RESULTS);
|
|
535
411
|
setError(null);
|
|
536
412
|
}, []);
|
|
537
413
|
const searchable = Boolean(debouncedQuery) && debouncedQuery.length >= minQueryLength;
|
|
538
|
-
const [wasSearchable, setWasSearchable] =
|
|
414
|
+
const [wasSearchable, setWasSearchable] = useState5(searchable);
|
|
539
415
|
if (wasSearchable !== searchable) {
|
|
540
416
|
setWasSearchable(searchable);
|
|
541
417
|
if (!searchable) {
|
|
@@ -544,7 +420,7 @@ function useSearch(config) {
|
|
|
544
420
|
setError(null);
|
|
545
421
|
}
|
|
546
422
|
}
|
|
547
|
-
|
|
423
|
+
useEffect7(() => {
|
|
548
424
|
if (!searchable) return void 0;
|
|
549
425
|
let cancelled = false;
|
|
550
426
|
const run = async () => {
|
|
@@ -612,12 +488,12 @@ function useTablePagination(config) {
|
|
|
612
488
|
}
|
|
613
489
|
|
|
614
490
|
// src/hooks/ui/use-throttle.ts
|
|
615
|
-
import { useState as
|
|
491
|
+
import { useState as useState6, useEffect as useEffect8, useRef as useRef4 } from "react";
|
|
616
492
|
function useThrottle(value, limit = 200) {
|
|
617
|
-
const [throttledValue, setThrottledValue] =
|
|
618
|
-
const [mountedAt] =
|
|
619
|
-
const lastUpdated =
|
|
620
|
-
|
|
493
|
+
const [throttledValue, setThrottledValue] = useState6(value);
|
|
494
|
+
const [mountedAt] = useState6(() => Date.now());
|
|
495
|
+
const lastUpdated = useRef4(mountedAt);
|
|
496
|
+
useEffect8(() => {
|
|
621
497
|
const now = Date.now();
|
|
622
498
|
const elapsed = now - lastUpdated.current;
|
|
623
499
|
if (elapsed >= limit) {
|
|
@@ -637,9 +513,9 @@ function useThrottle(value, limit = 200) {
|
|
|
637
513
|
}
|
|
638
514
|
|
|
639
515
|
// src/hooks/ui/use-window-size.ts
|
|
640
|
-
import { useLayoutEffect, useState as
|
|
516
|
+
import { useLayoutEffect, useState as useState7 } from "react";
|
|
641
517
|
function useWindowSize() {
|
|
642
|
-
const [windowSize, setWindowSize] =
|
|
518
|
+
const [windowSize, setWindowSize] = useState7({
|
|
643
519
|
width: 0,
|
|
644
520
|
height: 0
|
|
645
521
|
});
|
|
@@ -690,11 +566,11 @@ function useActiveSection(menus, pathname) {
|
|
|
690
566
|
|
|
691
567
|
// src/hooks/ui/use-nav-menus.ts
|
|
692
568
|
import {
|
|
693
|
-
useCallback as
|
|
694
|
-
useEffect as
|
|
569
|
+
useCallback as useCallback7,
|
|
570
|
+
useEffect as useEffect9,
|
|
695
571
|
useId,
|
|
696
|
-
useRef as
|
|
697
|
-
useState as
|
|
572
|
+
useRef as useRef5,
|
|
573
|
+
useState as useState8
|
|
698
574
|
} from "react";
|
|
699
575
|
function useNavMenus({
|
|
700
576
|
pathname,
|
|
@@ -702,31 +578,31 @@ function useNavMenus({
|
|
|
702
578
|
hoverCloseMs = 300
|
|
703
579
|
}) {
|
|
704
580
|
const baseId = useId();
|
|
705
|
-
const [opened, setOpened] =
|
|
581
|
+
const [opened, setOpened] = useState8(null);
|
|
706
582
|
const stale = opened !== null && opened.pathname !== pathname;
|
|
707
583
|
if (stale) setOpened(null);
|
|
708
584
|
const openId = opened && !stale ? opened.id : null;
|
|
709
|
-
const triggers =
|
|
710
|
-
const panels =
|
|
711
|
-
const openTimer =
|
|
712
|
-
const closeTimer =
|
|
713
|
-
const openedByHover =
|
|
714
|
-
const clearTimers =
|
|
585
|
+
const triggers = useRef5(/* @__PURE__ */ new Map());
|
|
586
|
+
const panels = useRef5(/* @__PURE__ */ new Map());
|
|
587
|
+
const openTimer = useRef5(null);
|
|
588
|
+
const closeTimer = useRef5(null);
|
|
589
|
+
const openedByHover = useRef5(null);
|
|
590
|
+
const clearTimers = useCallback7(() => {
|
|
715
591
|
if (openTimer.current) clearTimeout(openTimer.current);
|
|
716
592
|
if (closeTimer.current) clearTimeout(closeTimer.current);
|
|
717
593
|
openTimer.current = null;
|
|
718
594
|
closeTimer.current = null;
|
|
719
595
|
}, []);
|
|
720
|
-
|
|
721
|
-
const close =
|
|
596
|
+
useEffect9(() => clearTimers, [clearTimers]);
|
|
597
|
+
const close = useCallback7(() => {
|
|
722
598
|
clearTimers();
|
|
723
599
|
setOpened(null);
|
|
724
600
|
}, [clearTimers]);
|
|
725
|
-
const cancelClose =
|
|
601
|
+
const cancelClose = useCallback7(() => {
|
|
726
602
|
if (closeTimer.current) clearTimeout(closeTimer.current);
|
|
727
603
|
closeTimer.current = null;
|
|
728
604
|
}, []);
|
|
729
|
-
const scheduleClose =
|
|
605
|
+
const scheduleClose = useCallback7(() => {
|
|
730
606
|
if (openTimer.current) clearTimeout(openTimer.current);
|
|
731
607
|
openTimer.current = null;
|
|
732
608
|
cancelClose();
|
|
@@ -735,7 +611,7 @@ function useNavMenus({
|
|
|
735
611
|
setOpened(null);
|
|
736
612
|
}, hoverCloseMs);
|
|
737
613
|
}, [cancelClose, hoverCloseMs]);
|
|
738
|
-
|
|
614
|
+
useEffect9(() => {
|
|
739
615
|
if (!openId) return void 0;
|
|
740
616
|
const handleKeyDown = (event) => {
|
|
741
617
|
if (event.key !== "Escape") return;
|
|
@@ -757,7 +633,7 @@ function useNavMenus({
|
|
|
757
633
|
document.removeEventListener("pointerdown", handlePointerDown);
|
|
758
634
|
};
|
|
759
635
|
}, [openId, close]);
|
|
760
|
-
const getTriggerProps =
|
|
636
|
+
const getTriggerProps = useCallback7(
|
|
761
637
|
(id) => ({
|
|
762
638
|
ref: (el) => {
|
|
763
639
|
if (el) triggers.current.set(id, el);
|
|
@@ -793,7 +669,7 @@ function useNavMenus({
|
|
|
793
669
|
}),
|
|
794
670
|
[baseId, openId, pathname, hoverOpenMs, clearTimers, scheduleClose]
|
|
795
671
|
);
|
|
796
|
-
const getPanelProps =
|
|
672
|
+
const getPanelProps = useCallback7(
|
|
797
673
|
(id) => ({
|
|
798
674
|
ref: (el) => {
|
|
799
675
|
if (el) panels.current.set(id, el);
|
|
@@ -811,7 +687,7 @@ function useNavMenus({
|
|
|
811
687
|
}
|
|
812
688
|
|
|
813
689
|
// src/hooks/platform/use-platform-config.ts
|
|
814
|
-
import { useState as
|
|
690
|
+
import { useState as useState9, useEffect as useEffect10 } from "react";
|
|
815
691
|
var platformCache = null;
|
|
816
692
|
var fetchPromise = null;
|
|
817
693
|
function isRecord(value) {
|
|
@@ -847,10 +723,10 @@ function toPlatformConfigs(payload) {
|
|
|
847
723
|
return configs;
|
|
848
724
|
}
|
|
849
725
|
function usePlatformConfig() {
|
|
850
|
-
const [platforms, setPlatforms] =
|
|
851
|
-
const [isLoading, setIsLoading] =
|
|
852
|
-
const [error, setError] =
|
|
853
|
-
|
|
726
|
+
const [platforms, setPlatforms] = useState9(platformCache || []);
|
|
727
|
+
const [isLoading, setIsLoading] = useState9(!platformCache);
|
|
728
|
+
const [error, setError] = useState9(null);
|
|
729
|
+
useEffect10(() => {
|
|
854
730
|
const commit = (data) => {
|
|
855
731
|
setPlatforms((prev) => prev === data ? prev : data);
|
|
856
732
|
setIsLoading(false);
|
|
@@ -918,7 +794,7 @@ function useValidatePlatform(value) {
|
|
|
918
794
|
import { toast as sonnerToast2 } from "sonner";
|
|
919
795
|
|
|
920
796
|
// src/components/ui/toaster.tsx
|
|
921
|
-
import { useState as
|
|
797
|
+
import { useState as useState10 } from "react";
|
|
922
798
|
import { Toaster as SonnerToaster, toast as sonnerToast } from "sonner";
|
|
923
799
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
924
800
|
var dotColorByVariant = {
|
|
@@ -1034,7 +910,7 @@ function CommandApprovalToast({
|
|
|
1034
910
|
defaultExpanded = false,
|
|
1035
911
|
className
|
|
1036
912
|
}) {
|
|
1037
|
-
const [expanded, setExpanded] =
|
|
913
|
+
const [expanded, setExpanded] = useState10(defaultExpanded);
|
|
1038
914
|
const handleApprove = () => {
|
|
1039
915
|
onApprove?.();
|
|
1040
916
|
sonnerToast.dismiss(id);
|
|
@@ -1234,15 +1110,15 @@ var useToast = () => ({
|
|
|
1234
1110
|
});
|
|
1235
1111
|
|
|
1236
1112
|
// src/hooks/use-contact-submission.ts
|
|
1237
|
-
import { useState as
|
|
1113
|
+
import { useState as useState11, useCallback as useCallback8, useEffect as useEffect11 } from "react";
|
|
1238
1114
|
function useContactSubmission(options = {}) {
|
|
1239
1115
|
const { userId, successRedirectUrl, successToastMessage, onSuccess } = options;
|
|
1240
1116
|
const { toast: toast2 } = useToast();
|
|
1241
1117
|
const router = useRouter();
|
|
1242
1118
|
const { contactUrl } = useRequiredEndpointsRuntime();
|
|
1243
|
-
const [isSubmitting, setIsSubmitting] =
|
|
1244
|
-
const [isSuccess, setIsSuccess] =
|
|
1245
|
-
const submit =
|
|
1119
|
+
const [isSubmitting, setIsSubmitting] = useState11(false);
|
|
1120
|
+
const [isSuccess, setIsSuccess] = useState11(false);
|
|
1121
|
+
const submit = useCallback8(
|
|
1246
1122
|
async (formData) => {
|
|
1247
1123
|
if (isSubmitting) return;
|
|
1248
1124
|
setIsSubmitting(true);
|
|
@@ -1280,7 +1156,7 @@ function useContactSubmission(options = {}) {
|
|
|
1280
1156
|
},
|
|
1281
1157
|
[isSubmitting, toast2, userId, successToastMessage, contactUrl]
|
|
1282
1158
|
);
|
|
1283
|
-
|
|
1159
|
+
useEffect11(() => {
|
|
1284
1160
|
if (!isSuccess || !successRedirectUrl) return void 0;
|
|
1285
1161
|
console.log("\u{1F680} Contact submission successful, redirecting to:", successRedirectUrl);
|
|
1286
1162
|
const timer = setTimeout(() => {
|
|
@@ -1293,7 +1169,7 @@ function useContactSubmission(options = {}) {
|
|
|
1293
1169
|
}, 1500);
|
|
1294
1170
|
return () => clearTimeout(timer);
|
|
1295
1171
|
}, [isSuccess, successRedirectUrl, router]);
|
|
1296
|
-
|
|
1172
|
+
useEffect11(() => {
|
|
1297
1173
|
if (isSuccess && onSuccess) {
|
|
1298
1174
|
onSuccess();
|
|
1299
1175
|
}
|
|
@@ -1302,7 +1178,7 @@ function useContactSubmission(options = {}) {
|
|
|
1302
1178
|
}
|
|
1303
1179
|
|
|
1304
1180
|
// src/hooks/use-copy-to-clipboard.ts
|
|
1305
|
-
import { useCallback as
|
|
1181
|
+
import { useCallback as useCallback9, useState as useState12 } from "react";
|
|
1306
1182
|
function useCopyToClipboard({
|
|
1307
1183
|
successTitle = "Copied",
|
|
1308
1184
|
successDescription = "Copied to clipboard",
|
|
@@ -1311,8 +1187,8 @@ function useCopyToClipboard({
|
|
|
1311
1187
|
resetDelay = 2e3
|
|
1312
1188
|
} = {}) {
|
|
1313
1189
|
const { toast: toast2 } = useToast();
|
|
1314
|
-
const [copied, setCopied] =
|
|
1315
|
-
const copy =
|
|
1190
|
+
const [copied, setCopied] = useState12(false);
|
|
1191
|
+
const copy = useCallback9(
|
|
1316
1192
|
async (text) => {
|
|
1317
1193
|
try {
|
|
1318
1194
|
await navigator.clipboard.writeText(text);
|
|
@@ -1329,7 +1205,7 @@ function useCopyToClipboard({
|
|
|
1329
1205
|
}
|
|
1330
1206
|
|
|
1331
1207
|
// src/hooks/use-batch-images.ts
|
|
1332
|
-
import { useEffect as
|
|
1208
|
+
import { useEffect as useEffect12, useMemo as useMemo3, useState as useState13, useRef as useRef6 } from "react";
|
|
1333
1209
|
var globalBatchImageConfig = {};
|
|
1334
1210
|
function configureBatchImageFetch(config) {
|
|
1335
1211
|
globalBatchImageConfig = { ...globalBatchImageConfig, ...config };
|
|
@@ -1402,17 +1278,17 @@ async function batchFetchAuthenticatedImages(imageUrls, config) {
|
|
|
1402
1278
|
return results;
|
|
1403
1279
|
}
|
|
1404
1280
|
function useBatchImages(imageUrls, config) {
|
|
1405
|
-
const [fetchedImages, setFetchedImages] =
|
|
1281
|
+
const [fetchedImages, setFetchedImages] = useState13({});
|
|
1406
1282
|
const uniqueUrls = useMemo3(
|
|
1407
1283
|
() => Array.from(new Set(imageUrls.filter((url) => Boolean(url)))),
|
|
1408
1284
|
[imageUrls]
|
|
1409
1285
|
);
|
|
1410
|
-
const requestedUrls =
|
|
1411
|
-
const fetchedImagesRef =
|
|
1412
|
-
|
|
1286
|
+
const requestedUrls = useRef6(/* @__PURE__ */ new Set());
|
|
1287
|
+
const fetchedImagesRef = useRef6(fetchedImages);
|
|
1288
|
+
useEffect12(() => {
|
|
1413
1289
|
fetchedImagesRef.current = fetchedImages;
|
|
1414
1290
|
}, [fetchedImages]);
|
|
1415
|
-
|
|
1291
|
+
useEffect12(
|
|
1416
1292
|
() => () => {
|
|
1417
1293
|
Object.values(fetchedImagesRef.current).forEach((blobUrl) => {
|
|
1418
1294
|
if (blobUrl && blobUrl.startsWith("blob:")) {
|
|
@@ -1422,7 +1298,7 @@ function useBatchImages(imageUrls, config) {
|
|
|
1422
1298
|
},
|
|
1423
1299
|
[]
|
|
1424
1300
|
);
|
|
1425
|
-
|
|
1301
|
+
useEffect12(() => {
|
|
1426
1302
|
const urlsToFetch = uniqueUrls.filter((url) => !requestedUrls.current.has(url));
|
|
1427
1303
|
if (urlsToFetch.length === 0) {
|
|
1428
1304
|
return;
|
|
@@ -1440,7 +1316,7 @@ function useBatchImages(imageUrls, config) {
|
|
|
1440
1316
|
}
|
|
1441
1317
|
|
|
1442
1318
|
// src/hooks/use-authenticated-image.ts
|
|
1443
|
-
import { useEffect as
|
|
1319
|
+
import { useEffect as useEffect13, useState as useState14, useRef as useRef7 } from "react";
|
|
1444
1320
|
var globalImageConfig = {};
|
|
1445
1321
|
var imageCache = /* @__PURE__ */ new Map();
|
|
1446
1322
|
var pendingRequests = /* @__PURE__ */ new Map();
|
|
@@ -1469,8 +1345,8 @@ function getImageConfig() {
|
|
|
1469
1345
|
};
|
|
1470
1346
|
}
|
|
1471
1347
|
function useAuthenticatedImage(imageUrl, refreshKey, config) {
|
|
1472
|
-
const [settled, setSettled] =
|
|
1473
|
-
const currentCacheKeyRef =
|
|
1348
|
+
const [settled, setSettled] = useState14(null);
|
|
1349
|
+
const currentCacheKeyRef = useRef7(null);
|
|
1474
1350
|
const { tenantHostUrl, enableDevMode, accessTokenKey } = {
|
|
1475
1351
|
...getImageConfig(),
|
|
1476
1352
|
...config
|
|
@@ -1488,7 +1364,7 @@ function useAuthenticatedImage(imageUrl, refreshKey, config) {
|
|
|
1488
1364
|
}
|
|
1489
1365
|
}
|
|
1490
1366
|
const cacheKey = fullImageUrl === null ? null : refreshKey ? `${fullImageUrl}?v=${refreshKey}` : fullImageUrl;
|
|
1491
|
-
|
|
1367
|
+
useEffect13(() => {
|
|
1492
1368
|
if (cacheKey === null) {
|
|
1493
1369
|
if (currentCacheKeyRef.current) {
|
|
1494
1370
|
const entry = imageCache.get(currentCacheKeyRef.current);
|
|
@@ -1565,7 +1441,7 @@ function useAuthenticatedImage(imageUrl, refreshKey, config) {
|
|
|
1565
1441
|
});
|
|
1566
1442
|
pendingRequests.set(cacheKey, fetchPromise2);
|
|
1567
1443
|
}, [cacheKey, fullImageUrl, refreshKey, enableDevMode, accessTokenKey]);
|
|
1568
|
-
|
|
1444
|
+
useEffect13(() => {
|
|
1569
1445
|
return () => {
|
|
1570
1446
|
if (currentCacheKeyRef.current) {
|
|
1571
1447
|
const entry = imageCache.get(currentCacheKeyRef.current);
|
|
@@ -1586,7 +1462,7 @@ function useAuthenticatedImage(imageUrl, refreshKey, config) {
|
|
|
1586
1462
|
}
|
|
1587
1463
|
|
|
1588
1464
|
// src/hooks/state/use-query-params.ts
|
|
1589
|
-
import { useEffect as
|
|
1465
|
+
import { useEffect as useEffect14, useState as useState15, useMemo as useMemo4, useCallback as useCallback10, useRef as useRef8 } from "react";
|
|
1590
1466
|
|
|
1591
1467
|
// src/hooks/state/flatten-schema.ts
|
|
1592
1468
|
function flattenQueryVariables(queryVariables, introspector2) {
|
|
@@ -2037,26 +1913,26 @@ function validateVariables(variables, schema) {
|
|
|
2037
1913
|
function useQueryParams(query, options = {}) {
|
|
2038
1914
|
const router = useRouter();
|
|
2039
1915
|
const searchParams = useSearchParams();
|
|
2040
|
-
const [isLoading, setIsLoading] =
|
|
2041
|
-
const [isReady, setIsReady] =
|
|
2042
|
-
const [error, setError] =
|
|
2043
|
-
const [schema, setSchema] =
|
|
1916
|
+
const [isLoading, setIsLoading] = useState15(true);
|
|
1917
|
+
const [isReady, setIsReady] = useState15(false);
|
|
1918
|
+
const [error, setError] = useState15(null);
|
|
1919
|
+
const [schema, setSchema] = useState15({});
|
|
2044
1920
|
const defaultValues = useMemo4(() => options.defaultValues || {}, [options.defaultValues]);
|
|
2045
1921
|
const skipIntrospection = options.skipIntrospection || false;
|
|
2046
1922
|
const debug = options.debug || false;
|
|
2047
|
-
const initSourceRef =
|
|
1923
|
+
const initSourceRef = useRef8({
|
|
2048
1924
|
introspectionHeaders: options.introspectionHeaders,
|
|
2049
1925
|
paramMapping: options.paramMapping,
|
|
2050
1926
|
defaultValues
|
|
2051
1927
|
});
|
|
2052
|
-
|
|
1928
|
+
useEffect14(() => {
|
|
2053
1929
|
initSourceRef.current = {
|
|
2054
1930
|
introspectionHeaders: options.introspectionHeaders,
|
|
2055
1931
|
paramMapping: options.paramMapping,
|
|
2056
1932
|
defaultValues
|
|
2057
1933
|
};
|
|
2058
1934
|
});
|
|
2059
|
-
|
|
1935
|
+
useEffect14(() => {
|
|
2060
1936
|
let cancelled = false;
|
|
2061
1937
|
async function initialize() {
|
|
2062
1938
|
try {
|
|
@@ -2133,7 +2009,7 @@ function useQueryParams(query, options = {}) {
|
|
|
2133
2009
|
});
|
|
2134
2010
|
return result;
|
|
2135
2011
|
}, [searchParams]);
|
|
2136
|
-
const updateUrl =
|
|
2012
|
+
const updateUrl = useCallback10(
|
|
2137
2013
|
(newParams) => {
|
|
2138
2014
|
const url = newParams.toString() ? `?${newParams.toString()}` : window.location.pathname;
|
|
2139
2015
|
if (debug) {
|
|
@@ -2143,7 +2019,7 @@ function useQueryParams(query, options = {}) {
|
|
|
2143
2019
|
},
|
|
2144
2020
|
[router, debug]
|
|
2145
2021
|
);
|
|
2146
|
-
const setParam =
|
|
2022
|
+
const setParam = useCallback10(
|
|
2147
2023
|
(key, value) => {
|
|
2148
2024
|
if (!isReady) {
|
|
2149
2025
|
console.warn("[useQueryParams] Schema not ready, cannot set param");
|
|
@@ -2159,7 +2035,7 @@ function useQueryParams(query, options = {}) {
|
|
|
2159
2035
|
},
|
|
2160
2036
|
[variables, schema, isReady, updateUrl]
|
|
2161
2037
|
);
|
|
2162
|
-
const setParams =
|
|
2038
|
+
const setParams = useCallback10(
|
|
2163
2039
|
(updates) => {
|
|
2164
2040
|
if (!isReady) {
|
|
2165
2041
|
console.warn("[useQueryParams] Schema not ready, cannot set params");
|
|
@@ -2175,7 +2051,7 @@ function useQueryParams(query, options = {}) {
|
|
|
2175
2051
|
},
|
|
2176
2052
|
[variables, schema, isReady, updateUrl]
|
|
2177
2053
|
);
|
|
2178
|
-
const clearParamsHandler =
|
|
2054
|
+
const clearParamsHandler = useCallback10(
|
|
2179
2055
|
(keys) => {
|
|
2180
2056
|
if (!isReady) {
|
|
2181
2057
|
console.warn("[useQueryParams] Schema not ready, cannot clear params");
|
|
@@ -2191,7 +2067,7 @@ function useQueryParams(query, options = {}) {
|
|
|
2191
2067
|
},
|
|
2192
2068
|
[variables, schema, isReady, updateUrl]
|
|
2193
2069
|
);
|
|
2194
|
-
const resetParams =
|
|
2070
|
+
const resetParams = useCallback10(() => {
|
|
2195
2071
|
if (debug) {
|
|
2196
2072
|
console.log("[useQueryParams] Resetting params");
|
|
2197
2073
|
}
|
|
@@ -2226,9 +2102,9 @@ function applyParamMapping(schema, mapping) {
|
|
|
2226
2102
|
}
|
|
2227
2103
|
|
|
2228
2104
|
// src/hooks/state/use-api-params.ts
|
|
2229
|
-
import { useCallback as
|
|
2105
|
+
import { useCallback as useCallback11, useEffect as useEffect15, useMemo as useMemo5, useRef as useRef9, useState as useState16 } from "react";
|
|
2230
2106
|
function useContentStable(value, key) {
|
|
2231
|
-
const [cached, setCached] =
|
|
2107
|
+
const [cached, setCached] = useState16({ value, key });
|
|
2232
2108
|
if (cached.key !== key) setCached({ value, key });
|
|
2233
2109
|
return cached.key === key ? cached.value : value;
|
|
2234
2110
|
}
|
|
@@ -2255,9 +2131,9 @@ function useApiParams(schema, options = {}) {
|
|
|
2255
2131
|
const searchParamsLive = useSearchParams();
|
|
2256
2132
|
const debug = options.debug || false;
|
|
2257
2133
|
const searchString = searchParamsLive.toString();
|
|
2258
|
-
const pendingRef =
|
|
2259
|
-
const [pendingTail, setPendingTail] =
|
|
2260
|
-
const syncPendingTail =
|
|
2134
|
+
const pendingRef = useRef9([]);
|
|
2135
|
+
const [pendingTail, setPendingTail] = useState16(void 0);
|
|
2136
|
+
const syncPendingTail = useCallback11(() => {
|
|
2261
2137
|
setPendingTail(pendingRef.current[pendingRef.current.length - 1]);
|
|
2262
2138
|
}, []);
|
|
2263
2139
|
const schemaKey = useMemo5(() => JSON.stringify(schema), [schema]);
|
|
@@ -2285,14 +2161,14 @@ function useApiParams(schema, options = {}) {
|
|
|
2285
2161
|
}
|
|
2286
2162
|
return result;
|
|
2287
2163
|
}, [searchString, debug, stableSchema, options.absent]);
|
|
2288
|
-
const [paramsCache, setParamsCache] =
|
|
2164
|
+
const [paramsCache, setParamsCache] = useState16(() => ({ src: rawParams, value: rawParams }));
|
|
2289
2165
|
let stableParams = paramsCache.value;
|
|
2290
2166
|
if (paramsCache.src !== rawParams) {
|
|
2291
2167
|
stableParams = reuseArrayRefs(paramsCache.value, rawParams);
|
|
2292
2168
|
setParamsCache({ src: rawParams, value: stableParams });
|
|
2293
2169
|
}
|
|
2294
2170
|
const params = stableParams;
|
|
2295
|
-
const addParamToSearchParams =
|
|
2171
|
+
const addParamToSearchParams = useCallback11((searchParams, key, value) => {
|
|
2296
2172
|
for (const [k, v] of createSearchParams({ [key]: value })) searchParams.append(k, v);
|
|
2297
2173
|
}, []);
|
|
2298
2174
|
const urlSearchParams = useMemo5(() => {
|
|
@@ -2307,7 +2183,7 @@ function useApiParams(schema, options = {}) {
|
|
|
2307
2183
|
}
|
|
2308
2184
|
return newParams;
|
|
2309
2185
|
}, [params, flattenedSchema, addParamToSearchParams, stableSchema]);
|
|
2310
|
-
const updateUrl =
|
|
2186
|
+
const updateUrl = useCallback11(
|
|
2311
2187
|
(newParams, keysToRemove = []) => {
|
|
2312
2188
|
const base = pendingRef.current[pendingRef.current.length - 1] ?? searchString;
|
|
2313
2189
|
const finalParams = new URLSearchParams(base);
|
|
@@ -2342,14 +2218,14 @@ function useApiParams(schema, options = {}) {
|
|
|
2342
2218
|
},
|
|
2343
2219
|
[router, debug, searchString, stableSchema, syncPendingTail]
|
|
2344
2220
|
);
|
|
2345
|
-
|
|
2221
|
+
useEffect15(() => {
|
|
2346
2222
|
const queue = pendingRef.current;
|
|
2347
2223
|
if (queue.length === 0) return;
|
|
2348
2224
|
const hit = queue.indexOf(searchString);
|
|
2349
2225
|
pendingRef.current = hit === -1 ? [] : queue.slice(hit + 1);
|
|
2350
2226
|
syncPendingTail();
|
|
2351
2227
|
}, [searchString, syncPendingTail]);
|
|
2352
|
-
const setParam =
|
|
2228
|
+
const setParam = useCallback11(
|
|
2353
2229
|
(key, value) => {
|
|
2354
2230
|
const config = stableSchema[key];
|
|
2355
2231
|
if (!config) {
|
|
@@ -2366,7 +2242,7 @@ function useApiParams(schema, options = {}) {
|
|
|
2366
2242
|
},
|
|
2367
2243
|
[updateUrl, addParamToSearchParams, stableSchema]
|
|
2368
2244
|
);
|
|
2369
|
-
const setParams =
|
|
2245
|
+
const setParams = useCallback11(
|
|
2370
2246
|
(updates) => {
|
|
2371
2247
|
const newParams = new URLSearchParams();
|
|
2372
2248
|
const keysToRemove = [];
|
|
@@ -2386,14 +2262,14 @@ function useApiParams(schema, options = {}) {
|
|
|
2386
2262
|
},
|
|
2387
2263
|
[updateUrl, addParamToSearchParams, stableSchema, flattenedSchema]
|
|
2388
2264
|
);
|
|
2389
|
-
const clearParams2 =
|
|
2265
|
+
const clearParams2 = useCallback11(
|
|
2390
2266
|
(keys) => {
|
|
2391
2267
|
const newParams = new URLSearchParams();
|
|
2392
2268
|
updateUrl(newParams, keys);
|
|
2393
2269
|
},
|
|
2394
2270
|
[updateUrl]
|
|
2395
2271
|
);
|
|
2396
|
-
const resetParams =
|
|
2272
|
+
const resetParams = useCallback11(() => {
|
|
2397
2273
|
if (debug) {
|
|
2398
2274
|
console.log("[useApiParams] Resetting params");
|
|
2399
2275
|
}
|
|
@@ -2417,7 +2293,7 @@ function useApiParams(schema, options = {}) {
|
|
|
2417
2293
|
}
|
|
2418
2294
|
|
|
2419
2295
|
// src/hooks/state/use-cursor-pagination-state.ts
|
|
2420
|
-
import { useCallback as
|
|
2296
|
+
import { useCallback as useCallback12, useEffect as useEffect16, useRef as useRef10, useState as useState17 } from "react";
|
|
2421
2297
|
var urlSchema = {
|
|
2422
2298
|
search: { type: "string", default: "" },
|
|
2423
2299
|
cursor: { type: "string", default: "" }
|
|
@@ -2425,21 +2301,21 @@ var urlSchema = {
|
|
|
2425
2301
|
function useCursorPaginationState(options) {
|
|
2426
2302
|
const { onInitialLoad, onSearchChange } = options;
|
|
2427
2303
|
const { params, setParam, setParams } = useApiParams(urlSchema);
|
|
2428
|
-
const [searchInput, setSearchInput] =
|
|
2429
|
-
const [hasLoadedBeyondFirst, setHasLoadedBeyondFirst] =
|
|
2430
|
-
const [initialLoadCount, setInitialLoadCount] =
|
|
2431
|
-
const lastSearchRef =
|
|
2432
|
-
const isSyncingFromUrl =
|
|
2433
|
-
const isInitialLoadInProgress =
|
|
2434
|
-
const searchInputRef =
|
|
2435
|
-
const onInitialLoadRef =
|
|
2436
|
-
const paramsRef =
|
|
2437
|
-
|
|
2304
|
+
const [searchInput, setSearchInput] = useState17(params.search || "");
|
|
2305
|
+
const [hasLoadedBeyondFirst, setHasLoadedBeyondFirst] = useState17(false);
|
|
2306
|
+
const [initialLoadCount, setInitialLoadCount] = useState17(0);
|
|
2307
|
+
const lastSearchRef = useRef10(null);
|
|
2308
|
+
const isSyncingFromUrl = useRef10(false);
|
|
2309
|
+
const isInitialLoadInProgress = useRef10(true);
|
|
2310
|
+
const searchInputRef = useRef10(searchInput);
|
|
2311
|
+
const onInitialLoadRef = useRef10(onInitialLoad);
|
|
2312
|
+
const paramsRef = useRef10(params);
|
|
2313
|
+
useEffect16(() => {
|
|
2438
2314
|
searchInputRef.current = searchInput;
|
|
2439
2315
|
onInitialLoadRef.current = onInitialLoad;
|
|
2440
2316
|
paramsRef.current = params;
|
|
2441
2317
|
});
|
|
2442
|
-
|
|
2318
|
+
useEffect16(() => {
|
|
2443
2319
|
if (isInitialLoadInProgress.current) return;
|
|
2444
2320
|
const urlSearch = params.search || "";
|
|
2445
2321
|
if (urlSearch !== searchInputRef.current) {
|
|
@@ -2450,7 +2326,7 @@ function useCursorPaginationState(options) {
|
|
|
2450
2326
|
}, 0);
|
|
2451
2327
|
}
|
|
2452
2328
|
}, [params.search, initialLoadCount]);
|
|
2453
|
-
|
|
2329
|
+
useEffect16(() => {
|
|
2454
2330
|
if (isInitialLoadInProgress.current) return;
|
|
2455
2331
|
if (isSyncingFromUrl.current) return;
|
|
2456
2332
|
if (searchInput !== params.search) {
|
|
@@ -2461,7 +2337,7 @@ function useCursorPaginationState(options) {
|
|
|
2461
2337
|
});
|
|
2462
2338
|
}
|
|
2463
2339
|
}, [searchInput, params.search, setParams, initialLoadCount]);
|
|
2464
|
-
|
|
2340
|
+
useEffect16(() => {
|
|
2465
2341
|
if (initialLoadCount === 0) {
|
|
2466
2342
|
const cursor = paramsRef.current.cursor || null;
|
|
2467
2343
|
const search = paramsRef.current.search || "";
|
|
@@ -2477,7 +2353,7 @@ function useCursorPaginationState(options) {
|
|
|
2477
2353
|
});
|
|
2478
2354
|
}
|
|
2479
2355
|
}, [initialLoadCount]);
|
|
2480
|
-
|
|
2356
|
+
useEffect16(() => {
|
|
2481
2357
|
if (isInitialLoadInProgress.current) return;
|
|
2482
2358
|
if (initialLoadCount === 0) return;
|
|
2483
2359
|
const currentSearch = params.search || "";
|
|
@@ -2489,7 +2365,7 @@ function useCursorPaginationState(options) {
|
|
|
2489
2365
|
});
|
|
2490
2366
|
}
|
|
2491
2367
|
}, [params.search, onSearchChange, initialLoadCount]);
|
|
2492
|
-
const handleNextPage =
|
|
2368
|
+
const handleNextPage = useCallback12(
|
|
2493
2369
|
async (endCursor, fetchFn) => {
|
|
2494
2370
|
setParam("cursor", endCursor);
|
|
2495
2371
|
await fetchFn();
|
|
@@ -2497,7 +2373,7 @@ function useCursorPaginationState(options) {
|
|
|
2497
2373
|
},
|
|
2498
2374
|
[setParam]
|
|
2499
2375
|
);
|
|
2500
|
-
const handleResetToFirstPage =
|
|
2376
|
+
const handleResetToFirstPage = useCallback12(
|
|
2501
2377
|
async (fetchFn) => {
|
|
2502
2378
|
setParam("cursor", "");
|
|
2503
2379
|
await fetchFn();
|
|
@@ -2519,22 +2395,22 @@ function useCursorPaginationState(options) {
|
|
|
2519
2395
|
}
|
|
2520
2396
|
|
|
2521
2397
|
// src/hooks/nats/use-nats-client.ts
|
|
2522
|
-
import { useEffect as
|
|
2398
|
+
import { useEffect as useEffect17, useMemo as useMemo6, useState as useState18 } from "react";
|
|
2523
2399
|
function useNatsClient(clientOptions, options = {}) {
|
|
2524
2400
|
const { autoConnect = true } = options;
|
|
2525
2401
|
const client = useMemo6(() => {
|
|
2526
2402
|
if (!clientOptions) return null;
|
|
2527
2403
|
return createNatsClient(clientOptions);
|
|
2528
2404
|
}, [clientOptions]);
|
|
2529
|
-
const [status, setStatus] =
|
|
2530
|
-
const [lastError, setLastError] =
|
|
2531
|
-
const [statusClient, setStatusClient] =
|
|
2405
|
+
const [status, setStatus] = useState18("disconnected");
|
|
2406
|
+
const [lastError, setLastError] = useState18(null);
|
|
2407
|
+
const [statusClient, setStatusClient] = useState18(client);
|
|
2532
2408
|
if (statusClient !== client) {
|
|
2533
2409
|
setStatusClient(client);
|
|
2534
2410
|
setStatus("disconnected");
|
|
2535
2411
|
setLastError(null);
|
|
2536
2412
|
}
|
|
2537
|
-
|
|
2413
|
+
useEffect17(() => {
|
|
2538
2414
|
if (!client) return void 0;
|
|
2539
2415
|
const off = client.onStatus((event) => {
|
|
2540
2416
|
setStatus(event.status);
|
|
@@ -2561,7 +2437,7 @@ function useNatsClient(clientOptions, options = {}) {
|
|
|
2561
2437
|
}
|
|
2562
2438
|
|
|
2563
2439
|
// src/hooks/use-scenario-player.ts
|
|
2564
|
-
import { useCallback as
|
|
2440
|
+
import { useCallback as useCallback13, useEffect as useEffect18, useRef as useRef11, useState as useState19 } from "react";
|
|
2565
2441
|
var START_MS = 300;
|
|
2566
2442
|
function useScenarioPlayer({
|
|
2567
2443
|
scenarioCount,
|
|
@@ -2574,14 +2450,14 @@ function useScenarioPlayer({
|
|
|
2574
2450
|
}) {
|
|
2575
2451
|
const auto = useAutoplay(enabled);
|
|
2576
2452
|
const { reducedMotion, paused, setPaused } = auto;
|
|
2577
|
-
const [scenario, setScenario] =
|
|
2578
|
-
const [rawStep, setRawStep] =
|
|
2453
|
+
const [scenario, setScenario] = useState19(initialScenario);
|
|
2454
|
+
const [rawStep, setRawStep] = useState19(startAtEnd ? Number.MAX_SAFE_INTEGER : 0);
|
|
2579
2455
|
const lastStep = typeof lastStepOption === "function" ? lastStepOption(scenario) : lastStepOption;
|
|
2580
2456
|
const step = reducedMotion ? lastStep : Math.min(rawStep, lastStep);
|
|
2581
2457
|
const playing = auto.playing && scenarioCount > 0;
|
|
2582
|
-
const starting =
|
|
2583
|
-
const wasPlaying =
|
|
2584
|
-
|
|
2458
|
+
const starting = useRef11(false);
|
|
2459
|
+
const wasPlaying = useRef11(false);
|
|
2460
|
+
useEffect18(() => {
|
|
2585
2461
|
if (playing && !wasPlaying.current) starting.current = true;
|
|
2586
2462
|
wasPlaying.current = playing;
|
|
2587
2463
|
if (!playing) return void 0;
|
|
@@ -2601,14 +2477,14 @@ function useScenarioPlayer({
|
|
|
2601
2477
|
);
|
|
2602
2478
|
return () => clearTimeout(timer);
|
|
2603
2479
|
}, [playing, rawStep, lastStep, stepMs, holdMs, scenario, scenarioCount]);
|
|
2604
|
-
const setStep =
|
|
2480
|
+
const setStep = useCallback13(
|
|
2605
2481
|
(next) => {
|
|
2606
2482
|
setRawStep(Math.max(0, Math.min(lastStep, next)));
|
|
2607
2483
|
setPaused(false);
|
|
2608
2484
|
},
|
|
2609
2485
|
[lastStep, setPaused]
|
|
2610
2486
|
);
|
|
2611
|
-
const go =
|
|
2487
|
+
const go = useCallback13(
|
|
2612
2488
|
(next) => {
|
|
2613
2489
|
setScenario(next);
|
|
2614
2490
|
setRawStep(0);
|
|
@@ -2663,7 +2539,7 @@ function useAccessCodeIntegration() {
|
|
|
2663
2539
|
}
|
|
2664
2540
|
|
|
2665
2541
|
// src/hooks/use-claude-mirror-src.ts
|
|
2666
|
-
import { useEffect as
|
|
2542
|
+
import { useEffect as useEffect19, useState as useState20 } from "react";
|
|
2667
2543
|
async function revalidateMirror(mirrorPath) {
|
|
2668
2544
|
try {
|
|
2669
2545
|
const res = await fetch(`${mirrorPath}?revalidate=1`);
|
|
@@ -2677,9 +2553,9 @@ async function revalidateMirror(mirrorPath) {
|
|
|
2677
2553
|
function useClaudeMirrorSrc(url) {
|
|
2678
2554
|
const endpoints = useEndpointsRuntime();
|
|
2679
2555
|
const mirrorPath = toClaudeMirrorPath(url, endpoints?.storageViewBaseUrl);
|
|
2680
|
-
const [resolved, setResolved] =
|
|
2556
|
+
const [resolved, setResolved] = useState20(null);
|
|
2681
2557
|
const state = resolved && resolved.key === mirrorPath ? resolved.value : { src: null, status: mirrorPath ? "probing" : "absent" };
|
|
2682
|
-
|
|
2558
|
+
useEffect19(() => {
|
|
2683
2559
|
if (!mirrorPath) return void 0;
|
|
2684
2560
|
let cancelled = false;
|
|
2685
2561
|
const settle = (value) => {
|
|
@@ -2706,9 +2582,9 @@ function useClaudeMirrorSrc(url) {
|
|
|
2706
2582
|
}
|
|
2707
2583
|
|
|
2708
2584
|
// src/hooks/use-location-hash.ts
|
|
2709
|
-
import { useSyncExternalStore
|
|
2585
|
+
import { useSyncExternalStore } from "react";
|
|
2710
2586
|
var HASH_EVENTS = ["hashchange", "popstate", LOCATION_HASH_SYNC_EVENT];
|
|
2711
|
-
function
|
|
2587
|
+
function subscribe(onChange) {
|
|
2712
2588
|
for (const event of HASH_EVENTS) window.addEventListener(event, onChange);
|
|
2713
2589
|
return () => {
|
|
2714
2590
|
for (const event of HASH_EVENTS) window.removeEventListener(event, onChange);
|
|
@@ -2723,15 +2599,15 @@ function readHash() {
|
|
|
2723
2599
|
}
|
|
2724
2600
|
}
|
|
2725
2601
|
function useLocationHash() {
|
|
2726
|
-
return
|
|
2602
|
+
return useSyncExternalStore(subscribe, readHash, () => "");
|
|
2727
2603
|
}
|
|
2728
2604
|
|
|
2729
2605
|
// src/hooks/use-scroll-to-hash.ts
|
|
2730
|
-
import { useEffect as
|
|
2606
|
+
import { useEffect as useEffect20 } from "react";
|
|
2731
2607
|
var MAX_POLL_FRAMES = 60;
|
|
2732
2608
|
function useScrollToHash(readyDep = true, options) {
|
|
2733
2609
|
const headerOffset = options?.headerOffset ?? 0;
|
|
2734
|
-
|
|
2610
|
+
useEffect20(() => {
|
|
2735
2611
|
if (typeof window === "undefined") return void 0;
|
|
2736
2612
|
if (readyDep === null || readyDep === false) return void 0;
|
|
2737
2613
|
let rafId = null;
|
|
@@ -2772,19 +2648,19 @@ function useScrollToHash(readyDep = true, options) {
|
|
|
2772
2648
|
}
|
|
2773
2649
|
|
|
2774
2650
|
// src/hooks/use-humanity-signals.ts
|
|
2775
|
-
import { useCallback as
|
|
2651
|
+
import { useCallback as useCallback14, useRef as useRef12, useState as useState21 } from "react";
|
|
2776
2652
|
function useHumanitySignals() {
|
|
2777
|
-
const ref =
|
|
2778
|
-
const [mountedAt] =
|
|
2779
|
-
const startedAtRef =
|
|
2780
|
-
const getSignals =
|
|
2653
|
+
const ref = useRef12(null);
|
|
2654
|
+
const [mountedAt] = useState21(() => typeof performance !== "undefined" ? performance.now() : 0);
|
|
2655
|
+
const startedAtRef = useRef12(mountedAt);
|
|
2656
|
+
const getSignals = useCallback14(
|
|
2781
2657
|
() => ({
|
|
2782
2658
|
[HONEYPOT_FIELD]: ref.current?.value ?? "",
|
|
2783
2659
|
[ELAPSED_MS_FIELD]: typeof performance !== "undefined" ? Math.round(performance.now() - startedAtRef.current) : 0
|
|
2784
2660
|
}),
|
|
2785
2661
|
[]
|
|
2786
2662
|
);
|
|
2787
|
-
const resetSignals =
|
|
2663
|
+
const resetSignals = useCallback14(() => {
|
|
2788
2664
|
if (ref.current) ref.current.value = "";
|
|
2789
2665
|
if (typeof performance !== "undefined") startedAtRef.current = performance.now();
|
|
2790
2666
|
}, []);
|
|
@@ -2792,7 +2668,7 @@ function useHumanitySignals() {
|
|
|
2792
2668
|
}
|
|
2793
2669
|
|
|
2794
2670
|
// src/hooks/use-form-rescue.ts
|
|
2795
|
-
import { useCallback as
|
|
2671
|
+
import { useCallback as useCallback15, useEffect as useEffect21, useMemo as useMemo7, useRef as useRef13 } from "react";
|
|
2796
2672
|
var LOCAL_DRAFT_TTL_MS = 7 * 24 * 60 * 60 * 1e3;
|
|
2797
2673
|
var STORAGE_PREFIX = "form-rescue:v1:";
|
|
2798
2674
|
var UTM_KEYS = ["source", "medium", "campaign", "content", "term"];
|
|
@@ -2854,27 +2730,27 @@ function readUtm() {
|
|
|
2854
2730
|
function useFormRescue({ form, fieldNames, onRestore, getSignals }) {
|
|
2855
2731
|
const draftsUrl = useEndpointsRuntime()?.formDraftsUrl;
|
|
2856
2732
|
const formId = form?.id ?? null;
|
|
2857
|
-
const attemptIdRef =
|
|
2858
|
-
const resumeTokenRef =
|
|
2859
|
-
const latestRef =
|
|
2860
|
-
const dirtyRef =
|
|
2861
|
-
const startedRef =
|
|
2862
|
-
const leadCapturedRef =
|
|
2863
|
-
const completedRef =
|
|
2864
|
-
const timerRef =
|
|
2865
|
-
const fieldNamesRef =
|
|
2866
|
-
const onRestoreRef =
|
|
2867
|
-
const getSignalsRef =
|
|
2868
|
-
|
|
2733
|
+
const attemptIdRef = useRef13(null);
|
|
2734
|
+
const resumeTokenRef = useRef13(null);
|
|
2735
|
+
const latestRef = useRef13(null);
|
|
2736
|
+
const dirtyRef = useRef13(false);
|
|
2737
|
+
const startedRef = useRef13(false);
|
|
2738
|
+
const leadCapturedRef = useRef13(false);
|
|
2739
|
+
const completedRef = useRef13(false);
|
|
2740
|
+
const timerRef = useRef13(null);
|
|
2741
|
+
const fieldNamesRef = useRef13(fieldNames);
|
|
2742
|
+
const onRestoreRef = useRef13(onRestore);
|
|
2743
|
+
const getSignalsRef = useRef13(getSignals);
|
|
2744
|
+
useEffect21(() => {
|
|
2869
2745
|
fieldNamesRef.current = fieldNames;
|
|
2870
2746
|
onRestoreRef.current = onRestore;
|
|
2871
2747
|
getSignalsRef.current = getSignals;
|
|
2872
2748
|
});
|
|
2873
|
-
const attemptId =
|
|
2749
|
+
const attemptId = useCallback15(() => {
|
|
2874
2750
|
if (!attemptIdRef.current) attemptIdRef.current = newAttemptId();
|
|
2875
2751
|
return attemptIdRef.current;
|
|
2876
2752
|
}, []);
|
|
2877
|
-
const send =
|
|
2753
|
+
const send = useCallback15(
|
|
2878
2754
|
(keepalive) => {
|
|
2879
2755
|
if (!formId || !draftsUrl || !dirtyRef.current || completedRef.current || !latestRef.current) return;
|
|
2880
2756
|
dirtyRef.current = false;
|
|
@@ -2905,7 +2781,7 @@ function useFormRescue({ form, fieldNames, onRestore, getSignals }) {
|
|
|
2905
2781
|
},
|
|
2906
2782
|
[attemptId, draftsUrl, formId]
|
|
2907
2783
|
);
|
|
2908
|
-
|
|
2784
|
+
useEffect21(() => {
|
|
2909
2785
|
if (!formId || typeof window === "undefined") return void 0;
|
|
2910
2786
|
let cancelled = false;
|
|
2911
2787
|
const token = new URLSearchParams(window.location.search).get(FORM_RESCUE_RESUME_PARAM);
|
|
@@ -2935,7 +2811,7 @@ function useFormRescue({ form, fieldNames, onRestore, getSignals }) {
|
|
|
2935
2811
|
cancelled = true;
|
|
2936
2812
|
};
|
|
2937
2813
|
}, [attemptId, draftsUrl, formId]);
|
|
2938
|
-
|
|
2814
|
+
useEffect21(() => {
|
|
2939
2815
|
if (!formId || typeof document === "undefined") return void 0;
|
|
2940
2816
|
const onHide = () => {
|
|
2941
2817
|
if (completedRef.current || !startedRef.current) return;
|
|
@@ -2962,7 +2838,7 @@ function useFormRescue({ form, fieldNames, onRestore, getSignals }) {
|
|
|
2962
2838
|
if (timerRef.current) clearTimeout(timerRef.current);
|
|
2963
2839
|
};
|
|
2964
2840
|
}, [attemptId, formId, send]);
|
|
2965
|
-
const track =
|
|
2841
|
+
const track = useCallback15(
|
|
2966
2842
|
(values, lastField) => {
|
|
2967
2843
|
if (!formId || completedRef.current) return;
|
|
2968
2844
|
const names = fieldNamesRef.current;
|
|
@@ -2995,14 +2871,14 @@ function useFormRescue({ form, fieldNames, onRestore, getSignals }) {
|
|
|
2995
2871
|
},
|
|
2996
2872
|
[attemptId, formId, send]
|
|
2997
2873
|
);
|
|
2998
|
-
const submitFields =
|
|
2874
|
+
const submitFields = useCallback15(() => {
|
|
2999
2875
|
if (!formId) return {};
|
|
3000
2876
|
return {
|
|
3001
2877
|
[FORM_RESCUE_ATTEMPT_FIELD]: attemptId(),
|
|
3002
2878
|
...resumeTokenRef.current ? { [FORM_RESCUE_RESUME_FIELD]: resumeTokenRef.current } : {}
|
|
3003
2879
|
};
|
|
3004
2880
|
}, [attemptId, formId]);
|
|
3005
|
-
const complete =
|
|
2881
|
+
const complete = useCallback15(() => {
|
|
3006
2882
|
if (!formId) return;
|
|
3007
2883
|
if (timerRef.current) {
|
|
3008
2884
|
clearTimeout(timerRef.current);
|
|
@@ -3020,7 +2896,7 @@ function useFormRescue({ form, fieldNames, onRestore, getSignals }) {
|
|
|
3020
2896
|
}
|
|
3021
2897
|
|
|
3022
2898
|
// src/hooks/use-rescued-form.ts
|
|
3023
|
-
import { useEffect as
|
|
2899
|
+
import { useEffect as useEffect22 } from "react";
|
|
3024
2900
|
function flattenOneLevel(values) {
|
|
3025
2901
|
const flat = {};
|
|
3026
2902
|
for (const [key, value] of Object.entries(values)) {
|
|
@@ -3044,7 +2920,7 @@ function useRescuedForm(form, { rescue, fields, getSignals, fieldPath }) {
|
|
|
3044
2920
|
}
|
|
3045
2921
|
}
|
|
3046
2922
|
});
|
|
3047
|
-
|
|
2923
|
+
useEffect22(() => {
|
|
3048
2924
|
const subscription = watch((values, { name }) => {
|
|
3049
2925
|
handle.track(flattenOneLevel(values), name ? name.split(".").pop() ?? null : null);
|
|
3050
2926
|
});
|
|
@@ -3054,8 +2930,6 @@ function useRescuedForm(form, { rescue, fields, getSignals, fieldPath }) {
|
|
|
3054
2930
|
}
|
|
3055
2931
|
|
|
3056
2932
|
export {
|
|
3057
|
-
useAutoLimitTags,
|
|
3058
|
-
useKeyboardCollisionPadding,
|
|
3059
2933
|
useDeferredError,
|
|
3060
2934
|
useFocusTrap,
|
|
3061
2935
|
useStickyToolbar,
|