Untitled
unknown
plain_text
2 years ago
2.5 kB
24
Indexable
import axios from 'axios'; // Ajout de axios
import { useCompletion } from "ai/react";
import { FormEvent, useState } from "react";
import { Companion, Message } from "@prisma/client";
import { useRouter } from "next/navigation";
import { Button } from "@/components/ui/button";
import { Trash2 } from "lucide-react";
import { ChatForm } from "@/components/chat-form";
import { ChatHeader } from "@/components/chat-header";
import { ChatMessages } from "@/components/chat-messages";
import { ChatMessageProps } from "@/components/chat-message";
interface ChatClientProps {
companion: Companion & {
messages: Message[];
_count: {
messages: number;
}
};
};
export const ChatClient = ({
companion,
}: ChatClientProps) => {
const router = useRouter();
const [messages, setMessages] = useState<ChatMessageProps[]>(companion.messages);
const {
input,
isLoading,
handleInputChange,
handleSubmit,
setInput,
} = useCompletion({
api: `/api/chat/${companion.id}`,
onFinish(_prompt, completion) {
const systemMessage: ChatMessageProps = {
role: "system",
content: completion
};
setMessages((current) => [...current, systemMessage]);
setInput("");
router.refresh();
},
});
const onSubmit = (e: FormEvent<HTMLFormElement>) => {
const userMessage: ChatMessageProps = {
role: "user",
content: input
};
setMessages((current) => [...current, userMessage]);
handleSubmit(e);
}
const resetConversation = async () => {
try {
const response = await axios.delete(`/api/chat/${companion.id}`);
if (response.status === 200) {
setMessages([]);
}
} catch (error) {
console.error("Failed to reset conversation:", error);
}
}
return (
<div className="flex flex-col h-full p-4 space-y-2">
<ChatHeader companion={companion} />
<ChatMessages
companion={companion}
isLoading={isLoading}
messages={messages}
/>
<ChatForm
isLoading={isLoading}
input={input}
handleInputChange={handleInputChange}
onSubmit={onSubmit}
/>
<Button
variant="ghost"
onClick={resetConversation}
className="mt-4"
>
<Trash2 /> Reset conversation
</Button>
</div>
);
}
Editor is loading...