import Image from "next/image"; import { Toaster, toast } from "react-hot-toast"; import { useEffect, useState } from 'react'; import { remark } from 'remark'; import html from 'remark-html'; import { Compatible } from "vfile"; import '@/styles/markdown.css'; export default function Answer({ answer }: { answer: string }) { async function markdownToHtml(markdown: Compatible | undefined) { try { const result = await remark().use(html).process(markdown); return result.toString(); } catch (error) { console.error('Error converting Markdown to HTML:', error); return ''; // Handle error gracefully, return empty string or default content } } const [htmlContent, setHtmlContent] = useState(''); useEffect(() => { markdownToHtml(answer).then((html) => setHtmlContent(html)); }, [answer]); return ( <div className="container flex h-auto w-full shrink-0 gap-4 bg-gray-900 shadow-md rounded-lg border border-solid border-[#C2C2C2] p-5"> <div className="w-full"> <div className="flex items-center justify-between pb-3"> {answer && ( <div className="flex items-center gap-3"> <button onClick={() => { navigator.clipboard.writeText(answer.trim()); toast("Answer copied to clipboard", { icon: "✂️", }); }} > <Image src="/img/copy-white.svg" alt="footer" width={20} height={20} className="cursor-pointer text-white" /> </button> </div> )} </div> <div className="flex flex-wrap content-center items-center gap-[15px] pl-10 pr-10"> <div className="w-full whitespace-pre-wrap text-base font-light leading-[152.5%] text-white log-message"> {answer ? ( <div className="markdown-content" dangerouslySetInnerHTML={{ __html: htmlContent }} /> ) : ( <div className="flex w-full flex-col gap-2"> <div className="h-6 w-full animate-pulse rounded-md bg-gray-300" /> <div className="h-6 w-full animate-pulse rounded-md bg-gray-300" /> <div className="h-6 w-full animate-pulse rounded-md bg-gray-300" /> <div className="h-6 w-full animate-pulse rounded-md bg-gray-300" /> </div> )} </div> </div> </div> <Toaster position="top-center" reverseOrder={false} toastOptions={{ duration: 2000 }} /> </div> ); }