'use client'; import React, { useEffect, useRef, useState } from 'react'; import { AnimatePresence, motion } from 'motion/react'; import { useSessionContext, useSessionMessages } from '@livekit/components-react'; import type { AppConfig } from '@/app-config'; import { AgentControlBar, type AgentControlBarControls, } from '@/components/agents-ui/agent-control-bar'; import { ChatTranscript } from '@/components/app/chat-transcript'; import { GeneratedImagePanel } from '@/components/app/generated-image-panel'; import { ImageGallery } from '@/components/app/image-gallery'; import { TileLayout } from '@/components/app/tile-layout'; import { GeneratedImagesProvider } from '@/hooks/useGeneratedImages'; import { cn } from '@/lib/shadcn/utils'; import { Shimmer } from '../ai-elements/shimmer'; const MotionBottom = motion.create('div'); const MotionMessage = motion.create(Shimmer); const BOTTOM_VIEW_MOTION_PROPS = { variants: { visible: { opacity: 1, translateY: '0%', }, hidden: { opacity: 0, translateY: '100%', }, }, initial: 'hidden', animate: 'visible', exit: 'hidden', transition: { duration: 0.3, delay: 0.5, ease: 'easeOut', }, }; const SHIMMER_MOTION_PROPS = { variants: { visible: { opacity: 1, transition: { ease: 'easeIn', duration: 0.5, delay: 0.8, }, }, hidden: { opacity: 0, transition: { ease: 'easeIn', duration: 0.5, delay: 0, }, }, }, initial: 'hidden', animate: 'visible', exit: 'hidden', }; interface FadeProps { top?: boolean; bottom?: boolean; className?: string; } export function Fade({ top = false, bottom = false, className }: FadeProps) { return (
); } interface SessionViewProps { appConfig: AppConfig; } export const SessionView = ({ appConfig, ...props }: React.ComponentProps<'section'> & SessionViewProps) => { const session = useSessionContext(); const { messages } = useSessionMessages(session); const [chatOpen, setChatOpen] = useState(false); const scrollAreaRef = useRef(null); const controls: AgentControlBarControls = { leave: true, microphone: true, chat: appConfig.supportsChatInput, camera: appConfig.supportsVideoInput, screenShare: appConfig.supportsScreenShare, }; useEffect(() => { const lastMessage = messages.at(-1); const lastMessageIsLocal = lastMessage?.from?.isLocal === true; if (scrollAreaRef.current && lastMessageIsLocal) { scrollAreaRef.current.scrollTop = scrollAreaRef.current.scrollHeight; } }, [messages]); return (
{/* transcript */}
); };