@@ -34,7 +34,7 @@ function handleStopListening() {
3434
3535const Chat = ( { chatId : initialChatId } : { chatId : string } ) => {
3636 const { modelId : model , setModelId : setModel } = useModel ( ) ;
37- const [ messages , setMessages ] = useState < ChatMessage [ ] > ( [ ] ) ;
37+ const [ localMessages , setMessages ] = useState < ChatMessage [ ] > ( [ ] ) ;
3838 const [ search , setSearch ] = useState ( false ) ;
3939 const [ input , setInput ] = useState ( ( ) => {
4040 if ( typeof window === "undefined" ) return "" ;
@@ -69,24 +69,28 @@ const Chat = ({ chatId: initialChatId }: { chatId: string }) => {
6969 onScroll : scrollToBottom ,
7070 } ) ;
7171
72- const { data : chatMessages } = api . chat . getChatMessages . useQuery ( { chatId } ) ;
72+ const { data : chatMessages , isLoading : isQueryLoading } = api . chat . getChatMessages . useQuery ( { chatId } ) ;
73+
74+ // Derive display messages: prefer local state (during/after streaming),
75+ // fall back to server data so cached queries render instantly without a loader flash
76+ const messages = localMessages . length > 0
77+ ? localMessages
78+ : ( chatMessages ?. messages . map ( ( m ) => ( {
79+ id : m . id ,
80+ role : m . role === "USER" ? ( "user" as const ) : ( "assistant" as const ) ,
81+ content : m . content ,
82+ } ) ) ?? [ ] ) ;
7383
7484 useEffect ( ( ) => {
7585 setChatId ( initialChatId ) ;
86+ setMessages ( [ ] ) ;
7687 } , [ initialChatId ] ) ;
7788
7889 useEffect ( ( ) => {
79- if ( chatMessages ) {
80- setMessages (
81- chatMessages . messages . map ( ( message ) => ( {
82- id : message . id ,
83- role : message . role === "USER" ? ( "user" as const ) : ( "assistant" as const ) ,
84- content : message . content ,
85- } ) ) ,
86- ) ;
90+ if ( chatMessages && localMessages . length === 0 ) {
8791 requestAnimationFrame ( scrollToBottom ) ;
8892 }
89- } , [ chatMessages , scrollToBottom ] ) ;
93+ } , [ chatMessages , localMessages . length , scrollToBottom ] ) ;
9094
9195 const toggleWrap = useCallback ( ( ) => setIsWrapped ( ( prev ) => ! prev ) , [ ] ) ;
9296
@@ -208,7 +212,7 @@ const Chat = ({ chatId: initialChatId }: { chatId: string }) => {
208212 < div className = "relative flex h-full w-full flex-col" >
209213 < div className = "no-scrollbar flex flex-1 flex-col overflow-y-auto px-4 pb-40 md:px-4" >
210214 < div className = "mx-auto w-full max-w-4xl py-4" >
211- { messages . length === 0 ? (
215+ { messages . length === 0 && isQueryLoading ? (
212216 < div className = "text-muted-foreground flex h-[50vh] items-center justify-center" >
213217 < Loader2Icon className = "animate-spin" />
214218 </ div >
0 commit comments