"use client" import { useState, useRef, useEffect } from "react" import { Send, Loader2, Bot, User, RefreshCw, AlertCircle } from "lucide-react" interface ChatMessage { role: "user" | "assistant" content: string } export function AIChat() { const [messages, setMessages] = useState([]) const [input, setInput] = useState("") const [loading, setLoading] = useState(false) const [error, setError] = useState("") const [ollamaStatus, setOllamaStatus] = useState(null) const messagesEndRef = useRef(null) useEffect(() => { fetch("/api/ai/jobs") .then((r) => r.json()) .then((data) => { if (data.jobs?.length) { const jobNames = data.jobs.map((j: { job_title: string }) => j.job_title).join(", ") setMessages([ { role: "assistant", content: `Hi! I'm your Sales AI Assistant. I can help you with tips for targeting: ${jobNames}. What would you like to know?`, }, ]) } else { setMessages([ { role: "assistant", content: "Hi! I'm your Sales AI Assistant. Ask me anything about sales strategies and prospect targeting.", }, ]) } }) .catch(() => { setMessages([ { role: "assistant", content: "Hi! I'm your Sales AI Assistant. Ask me anything about sales strategies and prospect targeting.", }, ]) }) fetch("/api/ai/jobs") .then((r) => r.json()) .then((data) => { if (data.jobs) { const names = data.jobs.map((j: { job_title: string }) => j.job_title) setMessages([ { role: "assistant", content: `Hi! I'm your Sales AI Assistant. I can help with tips for targeting:\n\n${names.map((n: string) => `• ${n}`).join("\n")}\n\nWhat would you like to know?`, }, ]) } }) }, []) useEffect(() => { fetch("/api/ai/jobs") .then((r) => r.json()) .then((data) => { if (data.jobs?.length) { const names = data.jobs.map((j: { job_title: string }) => j.job_title) setMessages((prev) => prev.length === 1 && prev[0].role === "assistant" ? [ { role: "assistant", content: `Hi! I'm your Sales AI Assistant. I can help with tips for targeting:\n\n${names.map((n: string) => `• ${n}`).join("\n")}\n\nWhat would you like to know?`, }, ] : prev, ) } }) }, []) useEffect(() => { messagesEndRef.current?.scrollIntoView({ behavior: "smooth" }) }, [messages]) const checkOllama = async () => { try { const res = await fetch("/api/ai/chat", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ message: "__ping__" }), }) setOllamaStatus(res.status !== 503) } catch { setOllamaStatus(false) } } useEffect(() => { checkOllama() }, []) const sendMessage = async () => { const msg = input.trim() if (!msg || loading) return setInput("") setError("") setMessages((prev) => [...prev, { role: "user", content: msg }]) setLoading(true) try { const res = await fetch("/api/ai/chat", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ message: msg }), }) if (!res.ok) { const data = await res.json() throw new Error(data.error || "Failed to get response") } const data = await res.json() setMessages((prev) => [...prev, { role: "assistant", content: data.response }]) } catch (err) { const errMsg = err instanceof Error ? err.message : "AI service unavailable" setError(errMsg) setMessages((prev) => [ ...prev, { role: "assistant", content: `⚠️ Error: ${errMsg}. Make sure Ollama is running with the model loaded.` }, ]) } finally { setLoading(false) } } const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === "Enter" && !e.shiftKey) { e.preventDefault() sendMessage() } } return (
{ollamaStatus === false && (
Ollama not responding. Start it with ollama serve
)}
{messages.map((msg, i) => (
{msg.role === "assistant" && (
)}
{msg.content}
{msg.role === "user" && (
)}
))} {loading && (
)}
{error && (
{error}
)}