@assistant-ui/react 0.15.31 → 0.15.32
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/_virtual/_rolldown/runtime.js +1 -2
- package/dist/adapters/OpenAIRealtimeVoiceAdapter.js +1 -2
- package/dist/assistant-transport.js +1 -2
- package/dist/cloud-renderer/CloudRendererHost.js +1 -2
- package/dist/context/ReadonlyStore.js +1 -2
- package/dist/context/providers/MessageProvider.js +1 -2
- package/dist/context/providers/ThreadViewportProvider.js +1 -2
- package/dist/context/react/ThreadViewportContext.js +1 -2
- package/dist/context/react/utils/createContextHook.js +1 -2
- package/dist/context/react/utils/createContextStoreHook.js +1 -2
- package/dist/context/stores/ThreadViewport.js +1 -2
- package/dist/devtools/DevToolsHooks.js +1 -2
- package/dist/hooks/useMessageQuote.js +1 -2
- package/dist/hooks/useMessageTiming.js +1 -2
- package/dist/hooks/useToolCallElapsed.js +1 -2
- package/dist/internal.js +1 -2
- package/dist/legacy-runtime/AssistantRuntimeProvider.js +1 -2
- package/dist/mcp-apps/McpAppRenderer.d.ts.map +1 -1
- package/dist/mcp-apps/McpAppRenderer.js +3 -3
- package/dist/mcp-apps/McpAppRenderer.js.map +1 -1
- package/dist/mcp-apps/McpAppsRemoteHost.js +1 -2
- package/dist/mcp-apps/app-frame.js +1 -2
- package/dist/mcp-apps/bridge.js +1 -2
- package/dist/mcp-apps/csp.js +1 -2
- package/dist/mcp-apps/types.js +1 -2
- package/dist/mcp-apps/utils.js +1 -2
- package/dist/model-context/frame/useAssistantFrameHost.js +1 -2
- package/dist/model-context/makeAssistantVisible.js +1 -2
- package/dist/primitives/actionBar/ActionBarCopy.js +1 -2
- package/dist/primitives/actionBar/ActionBarEdit.js +1 -2
- package/dist/primitives/actionBar/ActionBarExportMarkdown.js +1 -2
- package/dist/primitives/actionBar/ActionBarFeedbackNegative.js +1 -2
- package/dist/primitives/actionBar/ActionBarFeedbackPositive.js +1 -2
- package/dist/primitives/actionBar/ActionBarInteractionContext.js +1 -2
- package/dist/primitives/actionBar/ActionBarReload.js +1 -2
- package/dist/primitives/actionBar/ActionBarRoot.js +1 -2
- package/dist/primitives/actionBar/ActionBarSpeak.js +1 -2
- package/dist/primitives/actionBar/ActionBarStopSpeaking.js +1 -2
- package/dist/primitives/actionBar/useActionBarFloatStatus.js +1 -2
- package/dist/primitives/actionBar.js +1 -2
- package/dist/primitives/actionBarMore/ActionBarMoreContent.js +1 -2
- package/dist/primitives/actionBarMore/ActionBarMoreItem.js +1 -2
- package/dist/primitives/actionBarMore/ActionBarMoreRoot.js +1 -2
- package/dist/primitives/actionBarMore/ActionBarMoreSeparator.js +1 -2
- package/dist/primitives/actionBarMore/ActionBarMoreTrigger.js +1 -2
- package/dist/primitives/actionBarMore/scope.js +1 -2
- package/dist/primitives/actionBarMore.js +1 -2
- package/dist/primitives/assistantModal/AssistantModalAnchor.js +1 -2
- package/dist/primitives/assistantModal/AssistantModalContent.js +1 -2
- package/dist/primitives/assistantModal/AssistantModalRoot.js +1 -2
- package/dist/primitives/assistantModal/AssistantModalTrigger.js +1 -2
- package/dist/primitives/assistantModal/popoverRenderPrimitives.js +1 -2
- package/dist/primitives/assistantModal/scope.js +1 -2
- package/dist/primitives/assistantModal.js +1 -2
- package/dist/primitives/attachment/AttachmentName.js +1 -2
- package/dist/primitives/attachment/AttachmentRemove.js +1 -2
- package/dist/primitives/attachment/AttachmentRoot.js +1 -2
- package/dist/primitives/attachment/AttachmentThumb.js +1 -2
- package/dist/primitives/attachment.js +1 -2
- package/dist/primitives/branchPicker/BranchPickerCount.js +1 -2
- package/dist/primitives/branchPicker/BranchPickerNext.js +1 -2
- package/dist/primitives/branchPicker/BranchPickerNumber.js +1 -2
- package/dist/primitives/branchPicker/BranchPickerPrevious.js +1 -2
- package/dist/primitives/branchPicker/BranchPickerRoot.js +1 -2
- package/dist/primitives/branchPicker.js +1 -2
- package/dist/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.d.ts +5 -4
- package/dist/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.d.ts.map +1 -1
- package/dist/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.js +57 -20
- package/dist/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.js.map +1 -1
- package/dist/primitives/chainOfThought/ChainOfThoughtRoot.js +1 -2
- package/dist/primitives/chainOfThought.js +1 -2
- package/dist/primitives/composer/ComposerAddAttachment.js +1 -2
- package/dist/primitives/composer/ComposerAttachmentDropzone.js +1 -2
- package/dist/primitives/composer/ComposerCancel.js +1 -2
- package/dist/primitives/composer/ComposerCompactContext.js +1 -2
- package/dist/primitives/composer/ComposerDictate.js +1 -2
- package/dist/primitives/composer/ComposerDictationTranscript.js +1 -2
- package/dist/primitives/composer/ComposerInput.js +1 -2
- package/dist/primitives/composer/ComposerInputPluginContext.js +1 -2
- package/dist/primitives/composer/ComposerQuote.js +1 -2
- package/dist/primitives/composer/ComposerResume.js +1 -2
- package/dist/primitives/composer/ComposerRoot.js +1 -2
- package/dist/primitives/composer/ComposerSend.js +1 -2
- package/dist/primitives/composer/ComposerStopDictation.js +1 -2
- package/dist/primitives/composer/composerInputSelector.js +1 -2
- package/dist/primitives/composer/trigger/TriggerPopover.js +1 -2
- package/dist/primitives/composer/trigger/TriggerPopoverAction.js +1 -2
- package/dist/primitives/composer/trigger/TriggerPopoverBack.js +1 -2
- package/dist/primitives/composer/trigger/TriggerPopoverCategories.js +1 -2
- package/dist/primitives/composer/trigger/TriggerPopoverDirective.js +1 -2
- package/dist/primitives/composer/trigger/TriggerPopoverItems.js +1 -2
- package/dist/primitives/composer/trigger/TriggerPopoverResource.js +1 -2
- package/dist/primitives/composer/trigger/TriggerPopoverRootContext.js +1 -2
- package/dist/primitives/composer/trigger/detectTrigger.js +1 -2
- package/dist/primitives/composer/trigger/index.js +1 -2
- package/dist/primitives/composer/trigger/matchesTriggerItemQuery.js +1 -2
- package/dist/primitives/composer/trigger/triggerDetectionResource.js +1 -2
- package/dist/primitives/composer/trigger/triggerKeyboardResource.js +1 -2
- package/dist/primitives/composer/trigger/triggerNavigationResource.js +1 -2
- package/dist/primitives/composer/trigger/triggerSelectionResource.js +1 -2
- package/dist/primitives/composer/useComposerCancelWithFocus.js +1 -2
- package/dist/primitives/composer/useComposerInputState.js +1 -2
- package/dist/primitives/composer.js +1 -2
- package/dist/primitives/dropdownMenuRenderPrimitives.js +1 -2
- package/dist/primitives/error/ErrorMessage.js +1 -2
- package/dist/primitives/error/ErrorRoot.js +1 -2
- package/dist/primitives/error.js +1 -2
- package/dist/primitives/message/MessageError.js +1 -2
- package/dist/primitives/message/MessageIf.js +1 -2
- package/dist/primitives/message/MessageParts.js +1 -2
- package/dist/primitives/message/MessagePartsGrouped.js +1 -2
- package/dist/primitives/message/MessageRoot.js +1 -2
- package/dist/primitives/message.js +1 -2
- package/dist/primitives/messagePart/MessagePartImage.js +1 -2
- package/dist/primitives/messagePart/MessagePartText.js +1 -2
- package/dist/primitives/messagePart/useMessagePartData.js +1 -2
- package/dist/primitives/messagePart/useMessagePartFile.js +1 -2
- package/dist/primitives/messagePart/useMessagePartImage.js +1 -2
- package/dist/primitives/messagePart/useMessagePartReasoning.js +1 -2
- package/dist/primitives/messagePart/useMessagePartSource.js +1 -2
- package/dist/primitives/messagePart/useMessagePartText.js +1 -2
- package/dist/primitives/messagePart.js +1 -2
- package/dist/primitives/queueItem/QueueItemRemove.js +1 -2
- package/dist/primitives/queueItem/QueueItemSteer.js +1 -2
- package/dist/primitives/queueItem/QueueItemText.js +1 -2
- package/dist/primitives/queueItem.js +1 -2
- package/dist/primitives/reasoning/useScrollLock.d.ts.map +1 -1
- package/dist/primitives/reasoning/useScrollLock.js +41 -25
- package/dist/primitives/reasoning/useScrollLock.js.map +1 -1
- package/dist/primitives/selectionToolbar/SelectionToolbarQuote.js +1 -2
- package/dist/primitives/selectionToolbar/SelectionToolbarRoot.js +1 -2
- package/dist/primitives/selectionToolbar.js +1 -2
- package/dist/primitives/suggestion/SuggestionDescription.js +1 -2
- package/dist/primitives/suggestion/SuggestionTitle.js +1 -2
- package/dist/primitives/suggestion/SuggestionTrigger.js +1 -2
- package/dist/primitives/suggestion.js +1 -2
- package/dist/primitives/thread/ThreadEmpty.js +1 -2
- package/dist/primitives/thread/ThreadIf.js +1 -2
- package/dist/primitives/thread/ThreadLoadEarlier.js +1 -2
- package/dist/primitives/thread/ThreadRoot.js +1 -2
- package/dist/primitives/thread/ThreadRootElementContext.js +1 -2
- package/dist/primitives/thread/ThreadScrollToBottom.js +1 -2
- package/dist/primitives/thread/ThreadSuggestion.js +1 -2
- package/dist/primitives/thread/ThreadViewport.js +1 -2
- package/dist/primitives/thread/ThreadViewportFooter.js +1 -2
- package/dist/primitives/thread/topAnchor/computeTopAnchorSlack.js +1 -2
- package/dist/primitives/thread/topAnchor/createReserveObservers.js +1 -2
- package/dist/primitives/thread/topAnchor/mountTopAnchorReserve.js +1 -2
- package/dist/primitives/thread/topAnchor/topAnchorTurn.js +1 -2
- package/dist/primitives/thread/topAnchor/topAnchorUtils.js +1 -2
- package/dist/primitives/thread/topAnchor/useTopAnchorReserve.js +1 -2
- package/dist/primitives/thread/useThreadViewportAutoScroll.js +1 -2
- package/dist/primitives/thread.js +1 -2
- package/dist/primitives/threadList/ThreadListLoadMore.js +1 -2
- package/dist/primitives/threadList/ThreadListNew.js +1 -2
- package/dist/primitives/threadList/ThreadListRoot.js +1 -2
- package/dist/primitives/threadList.js +1 -2
- package/dist/primitives/threadListFocusGroup.js +1 -2
- package/dist/primitives/threadListItem/ThreadListItemArchive.js +1 -2
- package/dist/primitives/threadListItem/ThreadListItemDelete.js +1 -2
- package/dist/primitives/threadListItem/ThreadListItemRoot.d.ts.map +1 -1
- package/dist/primitives/threadListItem/ThreadListItemRoot.js +2 -3
- package/dist/primitives/threadListItem/ThreadListItemRoot.js.map +1 -1
- package/dist/primitives/threadListItem/ThreadListItemTrigger.js +1 -2
- package/dist/primitives/threadListItem/ThreadListItemUnarchive.js +1 -2
- package/dist/primitives/threadListItem.js +1 -2
- package/dist/primitives/threadListItemMore/ThreadListItemMoreContent.js +1 -2
- package/dist/primitives/threadListItemMore/ThreadListItemMoreItem.js +1 -2
- package/dist/primitives/threadListItemMore/ThreadListItemMoreRoot.js +1 -2
- package/dist/primitives/threadListItemMore/ThreadListItemMoreSeparator.js +1 -2
- package/dist/primitives/threadListItemMore/ThreadListItemMoreTrigger.js +1 -2
- package/dist/primitives/threadListItemMore/scope.js +1 -2
- package/dist/primitives/threadListItemMore.js +1 -2
- package/dist/sandbox-host/SandboxHost.js +1 -2
- package/dist/unstable/useComposerInput.js +1 -2
- package/dist/unstable/useComposerInputHistory.js +1 -2
- package/dist/unstable/useLiveCompletionAdapter.js +1 -2
- package/dist/unstable/useMentionAdapter.js +1 -2
- package/dist/unstable/useMessageStallDetection.js +1 -2
- package/dist/unstable/useModelContextSnapshot.js +1 -2
- package/dist/unstable/useSlashCommandAdapter.js +1 -2
- package/dist/unstable/webmcp/WebMcpRegistrationResource.js +1 -2
- package/dist/unstable/webmcp/convertTools.js +1 -2
- package/dist/unstable/webmcp/useWebMcpProvider.js +1 -2
- package/dist/unstable/webmcp/webmcp-host.js +1 -2
- package/dist/utils/Primitive.js +1 -2
- package/dist/utils/createActionButton.js +1 -2
- package/dist/utils/getSelectionMessageId.js +1 -2
- package/dist/utils/hooks/useManagedRef.js +1 -2
- package/dist/utils/hooks/useMediaQuery.js +1 -2
- package/dist/utils/hooks/useOnScrollToBottom.js +1 -2
- package/dist/utils/hooks/useSizeHandle.js +1 -2
- package/dist/utils/isCompositionKey.js +1 -2
- package/dist/utils/smooth/SmoothContext.js +1 -2
- package/dist/utils/smooth/useSmooth.d.ts.map +1 -1
- package/dist/utils/smooth/useSmooth.js +11 -4
- package/dist/utils/smooth/useSmooth.js.map +1 -1
- package/dist/utils/useIsomorphicLayoutEffect.js +0 -1
- package/package.json +6 -6
- package/src/mcp-apps/McpAppRenderer.composer.test.tsx +111 -0
- package/src/mcp-apps/McpAppRenderer.test.tsx +24 -23
- package/src/mcp-apps/McpAppRenderer.tsx +9 -1
- package/src/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.test.tsx +91 -0
- package/src/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.tsx +54 -0
- package/src/primitives/reasoning/useScrollLock.test.tsx +71 -2
- package/src/primitives/reasoning/useScrollLock.ts +78 -51
- package/src/primitives/threadListItem/ThreadListItemRoot.tsx +4 -1
- package/src/primitives/threadListItem/ThreadListKeyboardNav.test.tsx +25 -0
- package/src/utils/smooth/useSmooth.test.tsx +113 -4
- package/src/utils/smooth/useSmooth.ts +16 -2
- package/src/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.ts +0 -49
|
@@ -112,6 +112,31 @@ describe("thread list keyboard navigation", () => {
|
|
|
112
112
|
expect(document.activeElement).toBe(first);
|
|
113
113
|
});
|
|
114
114
|
|
|
115
|
+
it("skips disabled triggers in both directions without wrapping", () => {
|
|
116
|
+
const { container } = render(
|
|
117
|
+
<ThreadListPrimitiveRoot>
|
|
118
|
+
{[0, 1, 2].map((i) => (
|
|
119
|
+
<ThreadListItemPrimitiveRoot key={i}>
|
|
120
|
+
<ThreadListItemPrimitiveTrigger disabled={i === 1}>
|
|
121
|
+
item {i}
|
|
122
|
+
</ThreadListItemPrimitiveTrigger>
|
|
123
|
+
</ThreadListItemPrimitiveRoot>
|
|
124
|
+
))}
|
|
125
|
+
</ThreadListPrimitiveRoot>,
|
|
126
|
+
);
|
|
127
|
+
const [first, , third] = triggers(container);
|
|
128
|
+
|
|
129
|
+
first!.focus();
|
|
130
|
+
expect(fireEvent.keyDown(first!, { key: "ArrowDown" })).toBe(false);
|
|
131
|
+
expect(document.activeElement).toBe(third);
|
|
132
|
+
expect(fireEvent.keyDown(third!, { key: "ArrowDown" })).toBe(true);
|
|
133
|
+
expect(document.activeElement).toBe(third);
|
|
134
|
+
expect(fireEvent.keyDown(third!, { key: "ArrowUp" })).toBe(false);
|
|
135
|
+
expect(document.activeElement).toBe(first);
|
|
136
|
+
expect(fireEvent.keyDown(first!, { key: "ArrowUp" })).toBe(true);
|
|
137
|
+
expect(document.activeElement).toBe(first);
|
|
138
|
+
});
|
|
139
|
+
|
|
115
140
|
it("moves between an item and its More button with right/left arrows", () => {
|
|
116
141
|
const { trigger, more } = renderItem();
|
|
117
142
|
|
|
@@ -8,12 +8,14 @@ import type {
|
|
|
8
8
|
TextMessagePart,
|
|
9
9
|
} from "@assistant-ui/core";
|
|
10
10
|
|
|
11
|
-
const
|
|
12
|
-
vi.mock("@assistant-ui/store", () => ({
|
|
13
|
-
|
|
11
|
+
const aui = vi.hoisted(() => ({ part: {} }));
|
|
12
|
+
vi.mock("@assistant-ui/store", async (importOriginal) => ({
|
|
13
|
+
...(await importOriginal<typeof import("@assistant-ui/store")>()),
|
|
14
|
+
useAui: () => aui,
|
|
14
15
|
useAuiState: (selector: () => unknown) => selector(),
|
|
15
16
|
}));
|
|
16
|
-
vi.mock("./SmoothContext", () => ({
|
|
17
|
+
vi.mock("./SmoothContext", async (importOriginal) => ({
|
|
18
|
+
...(await importOriginal<typeof import("./SmoothContext")>()),
|
|
17
19
|
useSmoothStatusStore: () => null,
|
|
18
20
|
}));
|
|
19
21
|
|
|
@@ -163,6 +165,113 @@ describe("useSmooth", () => {
|
|
|
163
165
|
expect(result.current.status.type).toBe("running");
|
|
164
166
|
});
|
|
165
167
|
|
|
168
|
+
it("keeps completed text visible when smoothing is enabled", () => {
|
|
169
|
+
vi.spyOn(performance, "now").mockReturnValue(1000);
|
|
170
|
+
vi.spyOn(globalThis, "requestAnimationFrame").mockReturnValue(1);
|
|
171
|
+
vi.spyOn(globalThis, "cancelAnimationFrame").mockImplementation(() => {});
|
|
172
|
+
const { result, rerender } = renderHook(
|
|
173
|
+
({ state, smooth }) => useSmooth(state, smooth),
|
|
174
|
+
{ initialProps: { state: textState("Hello"), smooth: false } },
|
|
175
|
+
);
|
|
176
|
+
rerender({ state: runningState("Hello world"), smooth: false });
|
|
177
|
+
rerender({ state: textState("Hello world"), smooth: false });
|
|
178
|
+
expect(result.current.text).toBe("Hello world");
|
|
179
|
+
|
|
180
|
+
rerender({ state: textState("Hello world"), smooth: true });
|
|
181
|
+
expect(result.current.text).toBe("Hello world");
|
|
182
|
+
expect(result.current.status.type).toBe("complete");
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
it("starts a new part from its own cursor when enabling smoothing in the same update", () => {
|
|
186
|
+
let now = 1000;
|
|
187
|
+
let queued: FrameRequestCallback | undefined;
|
|
188
|
+
vi.spyOn(performance, "now").mockImplementation(() => now);
|
|
189
|
+
vi.spyOn(globalThis, "requestAnimationFrame").mockImplementation((cb) => {
|
|
190
|
+
queued = cb;
|
|
191
|
+
return 1;
|
|
192
|
+
});
|
|
193
|
+
vi.spyOn(globalThis, "cancelAnimationFrame").mockImplementation(() => {
|
|
194
|
+
queued = undefined;
|
|
195
|
+
});
|
|
196
|
+
const { result, rerender } = renderHook(
|
|
197
|
+
({ state, smooth }) => useSmooth(state, smooth),
|
|
198
|
+
{
|
|
199
|
+
initialProps: {
|
|
200
|
+
state: runningState("Hello"),
|
|
201
|
+
smooth: false as boolean | SmoothOptions,
|
|
202
|
+
},
|
|
203
|
+
},
|
|
204
|
+
);
|
|
205
|
+
expect(result.current.text).toBe("Hello");
|
|
206
|
+
|
|
207
|
+
aui.part = {};
|
|
208
|
+
rerender({
|
|
209
|
+
state: runningState("Hello world"),
|
|
210
|
+
smooth: { maxCharsPerFrame: 1 },
|
|
211
|
+
});
|
|
212
|
+
expect(result.current.text).toBe("");
|
|
213
|
+
act(() => {
|
|
214
|
+
now += 16;
|
|
215
|
+
const callback = queued;
|
|
216
|
+
queued = undefined;
|
|
217
|
+
callback?.(now);
|
|
218
|
+
});
|
|
219
|
+
expect(result.current.text).toBe("H");
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
it.each([false, true])(
|
|
223
|
+
"animates only new text after reduced motion is disabled, with a part switch: %s",
|
|
224
|
+
(switchPart) => {
|
|
225
|
+
let now = 1000;
|
|
226
|
+
let queued: FrameRequestCallback | undefined;
|
|
227
|
+
vi.spyOn(performance, "now").mockImplementation(() => now);
|
|
228
|
+
vi.spyOn(globalThis, "requestAnimationFrame").mockImplementation((cb) => {
|
|
229
|
+
queued = cb;
|
|
230
|
+
return 1;
|
|
231
|
+
});
|
|
232
|
+
vi.spyOn(globalThis, "cancelAnimationFrame").mockImplementation(() => {
|
|
233
|
+
queued = undefined;
|
|
234
|
+
});
|
|
235
|
+
const listeners = new Set<() => void>();
|
|
236
|
+
const media = {
|
|
237
|
+
matches: true,
|
|
238
|
+
addEventListener: (_event: string, listener: () => void) =>
|
|
239
|
+
listeners.add(listener),
|
|
240
|
+
removeEventListener: (_event: string, listener: () => void) =>
|
|
241
|
+
listeners.delete(listener),
|
|
242
|
+
};
|
|
243
|
+
Object.defineProperty(window, "matchMedia", {
|
|
244
|
+
configurable: true,
|
|
245
|
+
value: () => media,
|
|
246
|
+
});
|
|
247
|
+
const { result, rerender } = renderHook(
|
|
248
|
+
(state) => useSmooth(state, { maxCharsPerFrame: 1 }),
|
|
249
|
+
{ initialProps: runningState("Hello") },
|
|
250
|
+
);
|
|
251
|
+
if (switchPart) aui.part = {};
|
|
252
|
+
rerender(runningState("Hello world"));
|
|
253
|
+
expect(result.current.text).toBe("Hello world");
|
|
254
|
+
|
|
255
|
+
act(() => {
|
|
256
|
+
media.matches = false;
|
|
257
|
+
for (const listener of listeners) listener();
|
|
258
|
+
});
|
|
259
|
+
expect(result.current.text).toBe("Hello world");
|
|
260
|
+
|
|
261
|
+
rerender(runningState("Hello world!"));
|
|
262
|
+
expect(result.current.text).toBe("Hello world");
|
|
263
|
+
act(() => {
|
|
264
|
+
now += 16;
|
|
265
|
+
const callback = queued;
|
|
266
|
+
queued = undefined;
|
|
267
|
+
callback?.(now);
|
|
268
|
+
});
|
|
269
|
+
expect(result.current.text).toBe("Hello world!");
|
|
270
|
+
rerender(textState("Hello world!"));
|
|
271
|
+
expect(result.current.status.type).toBe("complete");
|
|
272
|
+
},
|
|
273
|
+
);
|
|
274
|
+
|
|
166
275
|
it.each([
|
|
167
276
|
{ name: "negative drain time", options: { drainMs: -1 } },
|
|
168
277
|
{ name: "NaN character interval", options: { maxCharIntervalMs: NaN } },
|
|
@@ -217,6 +217,17 @@ export const useSmooth = (
|
|
|
217
217
|
const [animatorRef] = useState(
|
|
218
218
|
() => new TextStreamAnimator(displayedText, setText),
|
|
219
219
|
);
|
|
220
|
+
const [prevEnabled, setPrevEnabled] = useState(enabled);
|
|
221
|
+
if (enabled !== prevEnabled) {
|
|
222
|
+
setPrevEnabled(enabled);
|
|
223
|
+
if (
|
|
224
|
+
enabled &&
|
|
225
|
+
part === prevPart &&
|
|
226
|
+
text.startsWith(animatorRef.currentText)
|
|
227
|
+
) {
|
|
228
|
+
setDisplayedText(animatorRef.currentText);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
220
231
|
|
|
221
232
|
useEffect(() => {
|
|
222
233
|
animatorRef.drainMs = drainMs;
|
|
@@ -227,13 +238,16 @@ export const useSmooth = (
|
|
|
227
238
|
|
|
228
239
|
const animatorPartRef = useRef(part);
|
|
229
240
|
useEffect(() => {
|
|
241
|
+
const partChanged = animatorPartRef.current !== part;
|
|
242
|
+
animatorPartRef.current = part;
|
|
230
243
|
if (!enabled) {
|
|
231
244
|
animatorRef.stop();
|
|
245
|
+
animatorRef.currentText = text;
|
|
246
|
+
animatorRef.targetText = text;
|
|
247
|
+
animatorRef.lastCommitTime = -Infinity;
|
|
232
248
|
return;
|
|
233
249
|
}
|
|
234
250
|
|
|
235
|
-
const partChanged = animatorPartRef.current !== part;
|
|
236
|
-
animatorPartRef.current = part;
|
|
237
251
|
// A new part whose text shares a prefix with the previous target would
|
|
238
252
|
// keep the stale cursor and flicker without this reset.
|
|
239
253
|
if (partChanged || !text.startsWith(animatorRef.targetText)) {
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
type ActionButtonElement,
|
|
5
|
-
type ActionButtonProps,
|
|
6
|
-
createActionButton,
|
|
7
|
-
} from "../../utils/createActionButton";
|
|
8
|
-
import { useCallback } from "react";
|
|
9
|
-
import { useAuiState, useAui } from "@assistant-ui/store";
|
|
10
|
-
|
|
11
|
-
const useChainOfThoughtAccordionTrigger = () => {
|
|
12
|
-
const aui = useAui();
|
|
13
|
-
const collapsed = useAuiState((s) => s.chainOfThought.collapsed);
|
|
14
|
-
|
|
15
|
-
const callback = useCallback(() => {
|
|
16
|
-
aui.chainOfThought.setCollapsed(!collapsed);
|
|
17
|
-
}, [aui, collapsed]);
|
|
18
|
-
|
|
19
|
-
return callback;
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
export namespace ChainOfThoughtPrimitiveAccordionTrigger {
|
|
23
|
-
export type Element = ActionButtonElement;
|
|
24
|
-
/**
|
|
25
|
-
* Props for the ChainOfThoughtPrimitive.AccordionTrigger component.
|
|
26
|
-
* Inherits all button element props and action button functionality.
|
|
27
|
-
*/
|
|
28
|
-
export type Props = ActionButtonProps<
|
|
29
|
-
typeof useChainOfThoughtAccordionTrigger
|
|
30
|
-
>;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* A button component that toggles the collapsed state of the chain of thought accordion.
|
|
35
|
-
*
|
|
36
|
-
* This component automatically handles the toggle functionality, expanding or collapsing
|
|
37
|
-
* the chain of thought parts when clicked.
|
|
38
|
-
*
|
|
39
|
-
* @example
|
|
40
|
-
* ```tsx
|
|
41
|
-
* <ChainOfThoughtPrimitive.AccordionTrigger>
|
|
42
|
-
* Toggle Reasoning
|
|
43
|
-
* </ChainOfThoughtPrimitive.AccordionTrigger>
|
|
44
|
-
* ```
|
|
45
|
-
*/
|
|
46
|
-
export const ChainOfThoughtPrimitiveAccordionTrigger = createActionButton(
|
|
47
|
-
"ChainOfThoughtPrimitive.AccordionTrigger",
|
|
48
|
-
useChainOfThoughtAccordionTrigger,
|
|
49
|
-
);
|