@@ -17,7 +17,7 @@ import { Form, FormControl, FormField } from '@/components/ui/form';
1717import { InputGroup , InputGroupAddon , InputGroupButton , InputGroupInput } from '@/components/ui/input-group' ;
1818import { Popover , PopoverContent , PopoverTrigger } from '@/components/ui/popover' ;
1919import { StatusType } from '@/graphql/types' ;
20- import { useChatScroll } from '@/hooks/use-chat -scroll' ;
20+ import { useAutoScroll } from '@/hooks/use-auto -scroll' ;
2121import { Log } from '@/lib/log' ;
2222import { cn } from '@/lib/utils' ;
2323import { formatName } from '@/lib/utils/format' ;
@@ -306,8 +306,16 @@ const FlowAssistantMessages = ({ className }: FlowAssistantMessagesProps) => {
306306 const [ isSubmitting , setIsSubmitting ] = useState ( false ) ;
307307 const [ isCanceling , setIsCanceling ] = useState ( false ) ;
308308
309- const { containerRef, endRef, hasNewMessages, isScrolledToBottom, scrollToEnd } = useChatScroll (
310- logs ?? [ ] ,
309+ const selectedAssistantLogs = useMemo ( ( ) => {
310+ if ( ! logs ?. length || ! selectedAssistantId ) {
311+ return [ ] ;
312+ }
313+
314+ return logs . filter ( ( log ) => log . assistantId === selectedAssistantId ) ;
315+ } , [ logs , selectedAssistantId ] ) ;
316+
317+ const { containerRef, endRef, hasNewMessages, isScrolledToBottom, scrollToEnd } = useAutoScroll (
318+ selectedAssistantLogs ,
311319 selectedAssistantId ?? null ,
312320 ) ;
313321
@@ -380,37 +388,20 @@ const FlowAssistantMessages = ({ className }: FlowAssistantMessagesProps) => {
380388 return ! ! searchValue . trim ( ) ;
381389 } , [ searchValue ] ) ;
382390
383- // Memoize filtered logs to avoid recomputing on every render
384- // Use debouncedSearchValue for filtering to improve performance
385391 const filteredLogs = useMemo ( ( ) => {
386- if ( ! logs ) {
387- return [ ] ;
388- }
389-
390- // First filter by selected assistant
391- let assistantFilteredLogs = logs ;
392-
393- if ( selectedAssistantId ) {
394- assistantFilteredLogs = logs . filter ( ( log ) => log . assistantId === selectedAssistantId ) ;
395- } else {
396- // If no assistant is selected, show no logs
397- assistantFilteredLogs = [ ] ;
398- }
399-
400- // Then filter by search query if present
401392 const search = debouncedSearchValue . toLowerCase ( ) . trim ( ) ;
402393
403394 if ( ! search ) {
404- return assistantFilteredLogs ;
395+ return selectedAssistantLogs ;
405396 }
406397
407- return assistantFilteredLogs . filter (
398+ return selectedAssistantLogs . filter (
408399 ( log ) =>
409400 log . message . toLowerCase ( ) . includes ( search ) ||
410401 ( log . result && log . result . toLowerCase ( ) . includes ( search ) ) ||
411402 ( log . thinking && log . thinking . toLowerCase ( ) . includes ( search ) ) ,
412403 ) ;
413- } , [ logs , debouncedSearchValue , selectedAssistantId ] ) ;
404+ } , [ selectedAssistantLogs , debouncedSearchValue ] ) ;
414405
415406 // Handlers for interacting with assistant
416407 const handleAssistantDelete = ( assistantId : string ) => {
@@ -617,14 +608,18 @@ const FlowAssistantMessages = ({ className }: FlowAssistantMessagesProps) => {
617608 < div ref = { endRef } />
618609 </ div >
619610
620- { hasNewMessages && ! isScrolledToBottom && (
611+ { ! isScrolledToBottom && (
621612 < Button
622- className = "absolute right-4 bottom-4 z-10 size-9 rounded-full shadow-md hover:shadow-lg"
613+ className = "absolute right-4 bottom-4 z-10 shadow-md hover:shadow-lg"
623614 onClick = { ( ) => scrollToEnd ( ) }
624- size = "icon"
615+ size = "icon-sm "
625616 type = "button"
617+ variant = "outline"
626618 >
627619 < ChevronDown />
620+ { hasNewMessages && (
621+ < span className = "bg-primary absolute -top-1.5 -right-1.5 size-3 rounded-full" />
622+ ) }
628623 </ Button >
629624 ) }
630625 </ div >
0 commit comments