fix: race condition after resumable stream ends (#986)
This commit is contained in:
parent
566b01f367
commit
75af1320f4
7 changed files with 145 additions and 18 deletions
47
hooks/use-auto-resume.ts
Normal file
47
hooks/use-auto-resume.ts
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
'use client';
|
||||
|
||||
import { useEffect } from 'react';
|
||||
import type { UIMessage } from 'ai';
|
||||
import type { UseChatHelpers } from '@ai-sdk/react';
|
||||
import type { DataPart } from '@/lib/types';
|
||||
|
||||
export interface UseAutoResumeParams {
|
||||
autoResume: boolean;
|
||||
initialMessages: UIMessage[];
|
||||
experimental_resume: UseChatHelpers['experimental_resume'];
|
||||
data: UseChatHelpers['data'];
|
||||
setMessages: UseChatHelpers['setMessages'];
|
||||
}
|
||||
|
||||
export function useAutoResume({
|
||||
autoResume,
|
||||
initialMessages,
|
||||
experimental_resume,
|
||||
data,
|
||||
setMessages,
|
||||
}: UseAutoResumeParams) {
|
||||
useEffect(() => {
|
||||
if (!autoResume) return;
|
||||
|
||||
const mostRecentMessage = initialMessages.at(-1);
|
||||
|
||||
if (mostRecentMessage?.role === 'user') {
|
||||
experimental_resume();
|
||||
}
|
||||
|
||||
// we intentionally run this once
|
||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
if (!data) return;
|
||||
if (data.length === 0) return;
|
||||
|
||||
const dataPart = data[0] as DataPart;
|
||||
|
||||
if (dataPart.type === 'append-message') {
|
||||
const message = JSON.parse(dataPart.message) as UIMessage;
|
||||
setMessages([...initialMessages, message]);
|
||||
}
|
||||
}, [data, initialMessages, setMessages]);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue