import { useEffect, useRef, useState } from "react"; import { Send, X, Briefcase, UserCheck } from "lucide-react"; import { Streamdown } from "streamdown"; import { Store } from "@tanstack/store"; import { useResumeChat } from "#/lib/resume-ai-hook"; import type { ResumeChatMessages } from "#/lib/resume-ai-hook"; function Messages({ messages }: { messages: ResumeChatMessages }) { const messagesContainerRef = useRef(null); useEffect(() => { if (messagesContainerRef.current) { messagesContainerRef.current.scrollTop = messagesContainerRef.current.scrollHeight; } }, [messages]); if (!messages.length) { return (

Welcome, Recruiter!

Ask about skills, experience, or qualifications...

); } return (
{messages.map(({ id, role, parts }) => (
{parts.map((part, index) => { if (part.type === "text" && part.content) { return (
{role === "assistant" ? (
) : (
You
)}
{part.content}
); } return null; })}
))}
); } // Export store for header control export const showResumeAssistant = new Store(false); export default function ResumeAssistant() { const [isOpen, setIsOpen] = useState(false); const { messages, sendMessage, isLoading } = useResumeChat(); const [input, setInput] = useState(""); // Sync with store for header control useEffect(() => { return showResumeAssistant.subscribe(() => { setIsOpen(showResumeAssistant.state); }); }, []); const handleToggle = () => { const newState = !isOpen; setIsOpen(newState); showResumeAssistant.setState(() => newState); }; const handleSend = () => { if (input.trim()) { sendMessage(input); setInput(""); } }; if (!isOpen) return null; return (
{/* Decorative top gradient */}
{/* Header */}

Resume Assistant

Candidate Evaluation AI

{/* Messages */} {/* Loading indicator */} {isLoading && (
Analyzing experience...
)} {/* Input */}
{ e.preventDefault(); handleSend(); }} >