import {
MoreHorizontal,
FileText,
Share2,
FileJson,
FileCode
} from "lucide-react"
import { Dropdown, MenuProps, message } from "antd"
import { Message } from "@/types/message"
import { useState } from "react"
import { ShareModal } from "../Common/ShareModal"
import { useTranslation } from "react-i18next"
interface MoreOptionsProps {
messages: Message[]
historyId: string
shareModeEnabled: boolean
}
const formatAsText = (messages: Message[]) => {
return messages
.map((msg) => {
const text = `${msg.isBot ? msg.name : "You"}: ${msg.message}`
return text
})
.join("\n\n")
}
const formatAsMarkdown = (messages: Message[]) => {
return messages
.map((msg) => {
let content = `**${msg.isBot ? msg.name : "You"}**:\n${msg.message}`
if (msg.images && msg.images.length > 0) {
const imageMarkdown = msg.images
.filter((img) => img.length > 0)
.map((img) => `\n\n`)
.join("\n")
content += imageMarkdown
}
return content
})
.join("\n\n")
}
const downloadFile = (content: string, filename: string) => {
const blob = new Blob([content], { type: "text/plain;charset=utf-8" })
const url = URL.createObjectURL(blob)
const link = document.createElement("a")
link.href = url
link.download = filename
document.body.appendChild(link)
link.click()
document.body.removeChild(link)
URL.revokeObjectURL(url)
}
export const MoreOptions = ({
shareModeEnabled = false,
historyId,
messages
}: MoreOptionsProps) => {
const { t } = useTranslation("option")
const [onShareOpen, setOnShareOpen] = useState(false)
const baseItems: MenuProps["items"] = [
{
type: "group",
label: t("more.copy.group"),
children: [
{
key: "copy-text",
label: t("more.copy.asText"),
icon: ,
onClick: () => {
navigator.clipboard.writeText(formatAsText(messages))
message.success(t("more.copy.success"))
}
},
{
key: "copy-markdown",
label: t("more.copy.asMarkdown"),
icon: ,
onClick: () => {
navigator.clipboard.writeText(formatAsMarkdown(messages))
message.success(t("more.copy.success"))
}
}
]
},
{
type: "divider"
},
{
type: "group",
label: t("more.download.group"),
children: [
{
key: "download-txt",
label: t("more.download.text"),
icon: ,
onClick: () => {
downloadFile(formatAsText(messages), "chat.txt")
}
},
{
key: "download-md",
label: t("more.download.markdown"),
icon: ,
onClick: () => {
downloadFile(formatAsMarkdown(messages), "chat.md")
}
},
{
key: "download-json",
label: t("more.download.json"),
icon: ,
onClick: () => {
const jsonContent = JSON.stringify(messages, null, 2)
downloadFile(jsonContent, "chat.json")
}
}
]
}
]
const shareItem = {
type: "divider"
} as const
const shareOption = {
key: "share",
label: t("more.share"),
icon: ,
onClick: () => {
setOnShareOpen(true)
}
}
const items = shareModeEnabled
? [...baseItems, shareItem, shareOption]
: baseItems
return (
<>
>
)
}