From 4812dd6747a41d433862d194da2e22adde7cd45b Mon Sep 17 00:00:00 2001 From: "coderabbitai[bot]" <136622811+coderabbitai[bot]@users.noreply.github.com> Date: Sat, 9 May 2026 13:10:35 +0000 Subject: [PATCH] =?UTF-8?q?=F0=9F=93=9D=20CodeRabbit=20Chat:=20Implement?= =?UTF-8?q?=20requested=20code=20changes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/chat-messages.tsx | 1 + components/collapsible-message.tsx | 118 +++++++++++++++++------------ 2 files changed, 71 insertions(+), 48 deletions(-) diff --git a/components/chat-messages.tsx b/components/chat-messages.tsx index 6bfa3642..8eda416b 100644 --- a/components/chat-messages.tsx +++ b/components/chat-messages.tsx @@ -62,6 +62,7 @@ export function ChatMessages({ messages }: ChatMessagesProps) { isLastMessage={ groupedMessage.id === messages[messages.length - 1].id } + index={index} /> ) )} diff --git a/components/collapsible-message.tsx b/components/collapsible-message.tsx index b3349bc7..5b49f4d3 100644 --- a/components/collapsible-message.tsx +++ b/components/collapsible-message.tsx @@ -1,6 +1,6 @@ 'use client' -import React, { useEffect, useState } from 'react' +import React, { useEffect, useRef, useState } from 'react' import { Collapsible, CollapsibleTrigger, @@ -9,7 +9,7 @@ import { import { Button } from './ui/button' import { ChevronDown } from 'lucide-react' import { StreamableValue, useStreamableValue } from 'ai/rsc' -import { motion, AnimatePresence } from 'framer-motion' +import { motion, AnimatePresence, useInView } from 'framer-motion' import { cn } from '@/lib/utils' import { Separator } from './ui/separator' @@ -20,71 +20,93 @@ interface CollapsibleMessageProps { component: React.ReactNode } isLastMessage?: boolean + index?: number } export const CollapsibleMessage: React.FC = ({ message, - isLastMessage = false + isLastMessage = false, + index = 0 }) => { const [data] = useStreamableValue(message.isCollapsed) const isCollapsed = data ?? false const [open, setOpen] = useState(isLastMessage) + const ref = useRef(null) + const isInView = useInView(ref, { once: true, margin: '0px 0px -50px 0px' }) useEffect(() => { setOpen(isLastMessage) }, [isCollapsed, isLastMessage]) - // if not collapsed, return the component + const staggerDelay = index * 0.08 + + // if not collapsed, return the component with entrance animation if (!isCollapsed) { - return message.component + return ( + + {message.component} + + ) } return ( - { - setOpen(value) - }} + - -
- -
-
- - {open && ( - - - {message.component} - - - )} - - {!open && } -
+ + collapse + + + + + {open && ( + + + {message.component} + + + )} + + {!open && } + + ) }