"use-client"; import React, { useEffect, useRef, useState } from "react"; import { TranscriptItem } from "@/app/components/Realtime/types"; import Image from "next/image"; import { useTranscript } from "@/app/components/Realtime/contexts/TranscriptContext"; import { getPersonalityImageSrc } from "@/lib/utils"; import { ArrowRight } from "lucide-react"; import { dbInsertTranscriptItem } from "@/db/conversations"; import { SupabaseClient } from "@supabase/supabase-js"; import { EmojiComponent } from "../../Playground/EmojiImage"; export interface TranscriptProps { userText: string; setUserText: (val: string) => void; onSendMessage: () => void; canSend: boolean; personality: IPersonality; userId: string; isDoctor: boolean; supabase: SupabaseClient; } function Transcript({ userText, setUserText, onSendMessage, canSend, personality, userId, isDoctor, supabase, }: TranscriptProps) { const { transcriptItems, toggleTranscriptItemExpand } = useTranscript(); const transcriptRef = useRef(null); const [prevLogs, setPrevLogs] = useState([]); const [justCopied, setJustCopied] = useState(false); const inputRef = useRef(null); function scrollToBottom() { if (transcriptRef.current) { transcriptRef.current.scrollTop = transcriptRef.current.scrollHeight; } } useEffect(() => { const hasNewMessage = transcriptItems.length > prevLogs.length; const hasUpdatedMessage = transcriptItems.some((newItem, index) => { const oldItem = prevLogs[index]; return ( oldItem && (newItem.title !== oldItem.title || newItem.data !== oldItem.data) ); }); if (hasNewMessage || hasUpdatedMessage) { scrollToBottom(); // if (hasNewMessage && transcriptItems.length > 0) { // const newestMessage = transcriptItems[transcriptItems.length - 1]; // // Do something with the newest message // console.log("New message received:", newestMessage); // if (newestMessage.status === "DONE" && newestMessage.type === "MESSAGE") { // dbInsertTranscriptItem(supabase, newestMessage, userId, personality.key, isDoctor); // } // } // If a message was updated, find which one(s) if (hasUpdatedMessage) { transcriptItems.forEach((newItem, index) => { const oldItem = prevLogs[index]; if (oldItem && (newItem.title !== oldItem.title || newItem.data !== oldItem.data)) { console.log("Message updated:", newItem); if (newItem.type === "MESSAGE" && newItem.role === "user") { dbInsertTranscriptItem(supabase, newItem, userId, personality.key, isDoctor); } } }); } } setPrevLogs(transcriptItems); }, [transcriptItems]); // Autofocus on text box input on load useEffect(() => { if (canSend && inputRef.current) { inputRef.current.focus(); } }, [canSend]); return (
{/* Fixed Personality header */}
{personality.key && ( personality.creator_id === null ? ( {personality.title} ) : (
) )}

{personality.title}

{personality.subtitle}

{/* */}
{/* Transcript */}
{transcriptItems.map((item) => { const { itemId, type, role, data, expanded, timestamp, title = "", isHidden } = item; if (isHidden) { return null; } if (type === "MESSAGE") { const isUser = role === "user"; const containerClasses = `flex ${isUser ? "justify-end" : "justify-start"} mb-2`; const bubbleClasses = `max-w-[80%] p-3 rounded-xl ${ isUser ? "bg-blue-400 text-white" : "bg-yellow-100 text-gray-800" } border-2 ${isUser ? "border-blue-500" : "border-yellow-200"} shadow-sm`; const isBracketedMessage = title.startsWith("[") && title.endsWith("]"); const messageStyle = isBracketedMessage ? "italic text-gray-400 text-md" : "text-md font-medium"; const displayTitle = isBracketedMessage ? title.slice(1, -1) : title; return (
{displayTitle}
{timestamp}
); } })}
{/*
setUserText(e.target.value)} onKeyDown={(e) => { if (e.key === "Enter" && canSend) { onSendMessage(); } }} className="flex-1 px-4 py-2 rounded-full border border-gray-300 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent" placeholder="Type a message..." />
*/}
); } export default Transcript;