@assistant-ui/react 0.14.20 → 0.14.22
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/context/react/utils/createContextStoreHook.d.ts.map +1 -1
- package/dist/context/react/utils/createContextStoreHook.js +3 -18
- package/dist/context/react/utils/createContextStoreHook.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.js +3 -2
- package/dist/internal.d.ts +3 -3
- package/dist/internal.js +2 -4
- package/dist/internal.js.map +1 -1
- package/dist/primitives/composer/trigger/TriggerPopover.d.ts +4 -2
- package/dist/primitives/composer/trigger/TriggerPopover.d.ts.map +1 -1
- package/dist/primitives/composer/trigger/TriggerPopover.js +125 -119
- package/dist/primitives/composer/trigger/TriggerPopover.js.map +1 -1
- package/dist/primitives/composer/trigger/TriggerPopoverResource.d.ts +3 -1
- package/dist/primitives/composer/trigger/TriggerPopoverResource.d.ts.map +1 -1
- package/dist/primitives/composer/trigger/TriggerPopoverResource.js +22 -20
- package/dist/primitives/composer/trigger/TriggerPopoverResource.js.map +1 -1
- package/dist/primitives/composer/trigger/index.d.ts +1 -0
- package/dist/unstable/useLiveCompletionAdapter.d.ts +47 -0
- package/dist/unstable/useLiveCompletionAdapter.d.ts.map +1 -0
- package/dist/unstable/useLiveCompletionAdapter.js +116 -0
- package/dist/unstable/useLiveCompletionAdapter.js.map +1 -0
- package/dist/utils/smooth/useSmooth.d.ts +8 -0
- package/dist/utils/smooth/useSmooth.d.ts.map +1 -1
- package/dist/utils/smooth/useSmooth.js +11 -2
- package/dist/utils/smooth/useSmooth.js.map +1 -1
- package/package.json +4 -4
- package/src/context/react/utils/createContextStoreHook.ts +4 -3
- package/src/index.ts +7 -0
- package/src/internal.ts +0 -2
- package/src/primitives/composer/trigger/TriggerPopover.tsx +11 -1
- package/src/primitives/composer/trigger/TriggerPopoverResource.ts +5 -0
- package/src/tests/ExternalStoreThreadRuntimeCore.test.ts +113 -0
- package/src/unstable/useLiveCompletionAdapter.test.tsx +176 -0
- package/src/unstable/useLiveCompletionAdapter.ts +145 -0
- package/src/utils/smooth/useSmooth.test.tsx +106 -2
- package/src/utils/smooth/useSmooth.ts +20 -2
|
@@ -33,6 +33,14 @@ export type SmoothOptions = {
|
|
|
33
33
|
* @default Infinity
|
|
34
34
|
*/
|
|
35
35
|
maxCharsPerFrame?: number | undefined;
|
|
36
|
+
/**
|
|
37
|
+
* Minimum time in milliseconds between committed updates. The reveal keeps
|
|
38
|
+
* advancing every frame, but the visible text (and the downstream re-render
|
|
39
|
+
* and markdown re-parse it triggers) is committed at most once per interval.
|
|
40
|
+
* The final frame always commits. `0` commits every frame.
|
|
41
|
+
* @default 0
|
|
42
|
+
*/
|
|
43
|
+
minCommitMs?: number | undefined;
|
|
36
44
|
};
|
|
37
45
|
|
|
38
46
|
const DEFAULT_DRAIN_MS = 250;
|
|
@@ -41,11 +49,13 @@ const DEFAULT_MAX_CHAR_INTERVAL_MS = 5;
|
|
|
41
49
|
class TextStreamAnimator {
|
|
42
50
|
private animationFrameId: number | null = null;
|
|
43
51
|
private lastUpdateTime: number = Date.now();
|
|
52
|
+
public lastCommitTime: number = 0;
|
|
44
53
|
|
|
45
54
|
public targetText: string = "";
|
|
46
55
|
public drainMs: number = DEFAULT_DRAIN_MS;
|
|
47
56
|
public maxCharIntervalMs: number = DEFAULT_MAX_CHAR_INTERVAL_MS;
|
|
48
57
|
public maxCharsPerFrame: number = Infinity;
|
|
58
|
+
public minCommitMs: number = 0;
|
|
49
59
|
|
|
50
60
|
constructor(
|
|
51
61
|
public currentText: string,
|
|
@@ -100,7 +110,12 @@ class TextStreamAnimator {
|
|
|
100
110
|
this.currentText.length + charsToAdd,
|
|
101
111
|
);
|
|
102
112
|
this.lastUpdateTime = currentTime - timeToConsume;
|
|
103
|
-
|
|
113
|
+
|
|
114
|
+
const isComplete = charsToAdd === remainingChars;
|
|
115
|
+
if (isComplete || currentTime - this.lastCommitTime >= this.minCommitMs) {
|
|
116
|
+
this.lastCommitTime = currentTime;
|
|
117
|
+
this.setText(this.currentText);
|
|
118
|
+
}
|
|
104
119
|
};
|
|
105
120
|
}
|
|
106
121
|
|
|
@@ -141,6 +156,7 @@ export const useSmooth = (
|
|
|
141
156
|
DEFAULT_MAX_CHAR_INTERVAL_MS,
|
|
142
157
|
);
|
|
143
158
|
const maxCharsPerFrame = positiveOr(options?.maxCharsPerFrame, Infinity);
|
|
159
|
+
const minCommitMs = positiveOr(options?.minCommitMs, 0);
|
|
144
160
|
|
|
145
161
|
const [displayedText, setDisplayedText] = useState(
|
|
146
162
|
state.status.type === "running" ? "" : text,
|
|
@@ -194,7 +210,8 @@ export const useSmooth = (
|
|
|
194
210
|
animatorRef.drainMs = drainMs;
|
|
195
211
|
animatorRef.maxCharIntervalMs = maxCharIntervalMs;
|
|
196
212
|
animatorRef.maxCharsPerFrame = maxCharsPerFrame;
|
|
197
|
-
|
|
213
|
+
animatorRef.minCommitMs = minCommitMs;
|
|
214
|
+
}, [animatorRef, drainMs, maxCharIntervalMs, maxCharsPerFrame, minCommitMs]);
|
|
198
215
|
|
|
199
216
|
const animatorPartRef = useRef(part);
|
|
200
217
|
useEffect(() => {
|
|
@@ -214,6 +231,7 @@ export const useSmooth = (
|
|
|
214
231
|
if (state.status.type === "running") {
|
|
215
232
|
animatorRef.currentText = "";
|
|
216
233
|
animatorRef.targetText = text;
|
|
234
|
+
animatorRef.lastCommitTime = 0;
|
|
217
235
|
animatorRef.start();
|
|
218
236
|
} else {
|
|
219
237
|
animatorRef.currentText = text;
|