From c1de76b66090e64d7204168106aa39aa654d2729 Mon Sep 17 00:00:00 2001 From: n4ze3m Date: Sat, 18 Jan 2025 14:42:51 +0530 Subject: [PATCH 1/5] chore: Bump version to 1.4.3 in wxt.config.ts --- wxt.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wxt.config.ts b/wxt.config.ts index 297ec16..7230b4e 100644 --- a/wxt.config.ts +++ b/wxt.config.ts @@ -51,7 +51,7 @@ export default defineConfig({ outDir: "build", manifest: { - version: "1.4.2", + version: "1.4.3", name: process.env.TARGET === "firefox" ? "Page Assist - A Web UI for Local AI Models" From aacade6c84d44bf9951fd69f3486e18528cf1849 Mon Sep 17 00:00:00 2001 From: n4ze3m Date: Sat, 18 Jan 2025 17:13:20 +0530 Subject: [PATCH 2/5] feat: Add option to download chat as an image --- src/assets/locale/en/option.json | 3 +- src/components/Layouts/MoreOptions.tsx | 181 ++++++++++++++++++++++++- 2 files changed, 177 insertions(+), 7 deletions(-) diff --git a/src/assets/locale/en/option.json b/src/assets/locale/en/option.json index debb1be..95b89a3 100644 --- a/src/assets/locale/en/option.json +++ b/src/assets/locale/en/option.json @@ -21,7 +21,8 @@ "group": "Download", "text": "Text File (.txt)", "markdown": "Markdown (.md)", - "json": "JSON File (.json)" + "json": "JSON File (.json)", + "image": "Image (.png)" }, "share": "Share" } diff --git a/src/components/Layouts/MoreOptions.tsx b/src/components/Layouts/MoreOptions.tsx index fb18df5..26fea23 100644 --- a/src/components/Layouts/MoreOptions.tsx +++ b/src/components/Layouts/MoreOptions.tsx @@ -3,7 +3,8 @@ import { FileText, Share2, FileJson, - FileCode + FileCode, + ImageIcon } from "lucide-react" import { Dropdown, MenuProps, message } from "antd" import { Message } from "@/types/message" @@ -55,6 +56,162 @@ const downloadFile = (content: string, filename: string) => { URL.revokeObjectURL(url) } +const generateChatImage = async (messages: Message[]) => { + const canvas = document.createElement("canvas") + const ctx = canvas.getContext("2d")! + + canvas.width = 1200 + const padding = 40 + let yPosition = padding + + const wrapText = (text: string, maxWidth: number) => { + const paragraphs = text.split("\n") + const lines = [] + + paragraphs.forEach((paragraph) => { + if (paragraph.length === 0) { + lines.push("") + return + } + + const words = paragraph.split(" ") + let currentLine = words[0] + + for (let i = 1; i < words.length; i++) { + const word = words[i] + const width = ctx.measureText(currentLine + " " + word).width + if (width < maxWidth) { + currentLine += " " + word + } else { + lines.push(currentLine) + currentLine = word + } + } + lines.push(currentLine) + }) + + return lines + } + + let totalHeight = padding + messages.forEach((msg) => { + totalHeight += 20 + const maxWidth = canvas.width - padding * 2 + + if (msg.message.includes("```")) { + const blocks = msg.message.split("```") + blocks.forEach((block, index) => { + if (index % 2 === 1) { + const codeLines = block.split("\n") + totalHeight += codeLines.length * 25 + 20 + } else { + const wrappedText = wrapText(block, maxWidth) + totalHeight += wrappedText.length * 25 + } + }) + } else { + const wrappedText = wrapText(msg.message, maxWidth) + totalHeight += wrappedText.length * 25 + } + + if (msg.images?.length) { + totalHeight += msg.images.length * 250 + } + + totalHeight += 30 + + }) + + canvas.height = totalHeight + console.log(totalHeight) + + ctx.fillStyle = "#ffffff" + ctx.fillRect(0, 0, canvas.width, canvas.height) + + const drawText = async () => { + for (const msg of messages) { + ctx.font = "bold 18px Inter, Arial" + ctx.fillStyle = msg.isBot ? "#1A202C" : "#1E4E8C" + ctx.fillText(`${msg.isBot ? msg.name : "You"}:`, padding, yPosition) + yPosition += 35 + + if (msg.message.includes("```")) { + const blocks = msg.message.split("```") + blocks.forEach((block, index) => { + if (index % 2 === 1) { + const codeLines = block.split("\n") + const codeHeight = codeLines.length * 25 + 20 + ctx.fillStyle = "#1a1a1a" + ctx.fillRect( + padding, + yPosition, + canvas.width - padding * 2, + codeHeight + ) + ctx.font = "15px Consolas, monospace" + ctx.fillStyle = "#e6e6e6" + codeLines.forEach((line, lineIndex) => { + ctx.fillText(line, padding + 15, yPosition + 25 + lineIndex * 25) + }) + yPosition += codeHeight + 20 + } else { + ctx.font = "16px Inter, Arial" + ctx.fillStyle = "#1A202C" + const wrappedText = wrapText(block, canvas.width - padding * 2) + wrappedText.forEach((line) => { + ctx.fillText(line, padding, yPosition) + yPosition += 30 + }) + } + }) + } else { + ctx.font = "16px Inter, Arial" + ctx.fillStyle = "#1A202C" + const wrappedText = wrapText(msg.message, canvas.width - padding * 2) + wrappedText.forEach((line) => { + ctx.fillText(line, padding, yPosition) + yPosition += 30 + }) + } + + if (msg.images?.length) { + for (const imgUrl of msg.images) { + if (imgUrl) { + try { + const img = new Image() + img.crossOrigin = "anonymous" + await new Promise((resolve, reject) => { + img.onload = resolve + img.onerror = reject + img.src = imgUrl + }) + + const maxWidth = canvas.width - padding * 2 + const maxHeight = 100 + const scale = Math.min( + maxWidth / img.width, + maxHeight / img.height, + 0.5 + ) + const drawWidth = img.width * scale + const drawHeight = img.height * scale + + ctx.drawImage(img, padding, yPosition + 10, drawWidth, drawHeight) + yPosition += drawHeight + 30 + } catch (e) { + console.warn("Failed to load image:", imgUrl) + } + } + } + } + yPosition += 30 + } + } + + await drawText() + return canvas.toDataURL("image/png") +} + export const MoreOptions = ({ shareModeEnabled = false, historyId, @@ -65,7 +222,7 @@ export const MoreOptions = ({ const baseItems: MenuProps["items"] = [ { type: "group", - label: t("more.copy.group"), + label: t("more.copy.group"), children: [ { key: "copy-text", @@ -73,12 +230,12 @@ export const MoreOptions = ({ icon: , onClick: () => { navigator.clipboard.writeText(formatAsText(messages)) - message.success(t("more.copy.success")) + message.success(t("more.copy.success")) } }, { - key: "copy-markdown", - label: t("more.copy.asMarkdown"), + key: "copy-markdown", + label: t("more.copy.asMarkdown"), icon: , onClick: () => { navigator.clipboard.writeText(formatAsMarkdown(messages)) @@ -92,7 +249,7 @@ export const MoreOptions = ({ }, { type: "group", - label: t("more.download.group"), + label: t("more.download.group"), children: [ { key: "download-txt", @@ -118,6 +275,18 @@ export const MoreOptions = ({ const jsonContent = JSON.stringify(messages, null, 2) downloadFile(jsonContent, "chat.json") } + }, + { + key: "download-image", + label: t("more.download.image"), + icon: , + onClick: async () => { + const dataUrl = await generateChatImage(messages) + const link = document.createElement("a") + link.download = "chat.png" + link.href = dataUrl + link.click() + } } ] } From 7443d0ab6b8d1ca1bfff451c0daf96d412535bb1 Mon Sep 17 00:00:00 2001 From: n4ze3m Date: Sat, 18 Jan 2025 22:04:39 +0530 Subject: [PATCH 3/5] feat: Add option to enable chat with website by default --- src/assets/locale/ar/settings.json | 3 +++ src/assets/locale/de/settings.json | 3 +++ src/assets/locale/en/settings.json | 3 +++ src/assets/locale/es/settings.json | 3 +++ src/assets/locale/fa/settings.json | 3 +++ src/assets/locale/fr/settings.json | 3 +++ src/assets/locale/it/settings.json | 3 +++ src/assets/locale/ja-JP/settings.json | 3 +++ src/assets/locale/ko/settings.json | 3 +++ src/assets/locale/ml/settings.json | 3 +++ src/assets/locale/no/settings.json | 3 +++ src/assets/locale/pt-BR/settings.json | 3 +++ src/assets/locale/ru/settings.json | 3 +++ src/assets/locale/sv/settings.json | 3 +++ src/assets/locale/uk/settings.json | 3 +++ src/assets/locale/zh/settings.json | 3 +++ .../Option/Settings/general-settings.tsx | 17 ++++++++++++++++- src/components/Sidepanel/Chat/form.tsx | 13 ++++++++++++- src/hooks/useMessage.tsx | 11 ++++++++++- 19 files changed, 86 insertions(+), 3 deletions(-) diff --git a/src/assets/locale/ar/settings.json b/src/assets/locale/ar/settings.json index ac3973a..a93eafd 100644 --- a/src/assets/locale/ar/settings.json +++ b/src/assets/locale/ar/settings.json @@ -21,6 +21,9 @@ "copilotResumeLastChat": { "label": "استئناف آخر محادثة عند فتح اللوحة الجانبية (كوبيلوت)" }, + "turnOnChatWithWebsite": { + "label": "تمكين الدردشة مع الموقع بشكل افتراضي (كوبيلوت)" + }, "webUIResumeLastChat": { "label": "استئناف آخر محادثة عند فتح واجهة المستخدم" }, diff --git a/src/assets/locale/de/settings.json b/src/assets/locale/de/settings.json index efee952..d8a106d 100644 --- a/src/assets/locale/de/settings.json +++ b/src/assets/locale/de/settings.json @@ -21,6 +21,9 @@ "copilotResumeLastChat": { "label": "Letzten Chat beim Öffnen des Seitenpanels fortsetzen (Copilot)" }, + "turnOnChatWithWebsite": { + "label": "Chat mit Website standardmäßig aktivieren (Copilot)" + }, "webUIResumeLastChat": { "label": "Letzten Chat beim Öffnen der Web-UI fortsetzen" }, diff --git a/src/assets/locale/en/settings.json b/src/assets/locale/en/settings.json index a158d05..c7c75b7 100644 --- a/src/assets/locale/en/settings.json +++ b/src/assets/locale/en/settings.json @@ -21,6 +21,9 @@ "copilotResumeLastChat": { "label": "Resume the last chat when opening the SidePanel (Copilot)" }, + "turnOnChatWithWebsite": { + "label": "Enable Chat with Website by default (Copilot)" + }, "webUIResumeLastChat": { "label": "Resume the last chat when opening the Web UI" }, diff --git a/src/assets/locale/es/settings.json b/src/assets/locale/es/settings.json index 1e474ab..4ff0ac6 100644 --- a/src/assets/locale/es/settings.json +++ b/src/assets/locale/es/settings.json @@ -21,6 +21,9 @@ "copilotResumeLastChat": { "label": "Retomar el último chat al abrir el Panel Lateral (Copilot)" }, + "turnOnChatWithWebsite": { + "label": "Habilitar Chat con Sitio Web por defecto (Copilot)" + }, "webUIResumeLastChat": { "label": "Retomar el último chat al abrir la Interfaz Web" }, diff --git a/src/assets/locale/fa/settings.json b/src/assets/locale/fa/settings.json index 8b23ebf..a66db85 100644 --- a/src/assets/locale/fa/settings.json +++ b/src/assets/locale/fa/settings.json @@ -21,6 +21,9 @@ "copilotResumeLastChat": { "label": "آخرین گفتگو را هنگام باز کردن SidePanel (Copilot) از سر بگیر" }, + "turnOnChatWithWebsite": { + "label": "فعال کردن گپ با وب سایت به صورت پیش‌فرض (کوپایلوت)" + }, "hideCurrentChatModelSettings": { "label": "مخفی کردن تنظیمات مدل گپ فعلی را" }, diff --git a/src/assets/locale/fr/settings.json b/src/assets/locale/fr/settings.json index 780ddb4..8dcfcba 100644 --- a/src/assets/locale/fr/settings.json +++ b/src/assets/locale/fr/settings.json @@ -21,6 +21,9 @@ "copilotResumeLastChat": { "label": "Reprendre la dernière conversation lors de l'ouverture du sidepanel (Copilot)" }, + "turnOnChatWithWebsite": { + "label": "Activer le chat avec le site Web par défaut (Copilot)" + }, "webUIResumeLastChat": { "label": "Reprendre la dernière conversation lors de l'ouverture de l'interface Web" }, diff --git a/src/assets/locale/it/settings.json b/src/assets/locale/it/settings.json index 4b0c900..7f1e71d 100644 --- a/src/assets/locale/it/settings.json +++ b/src/assets/locale/it/settings.json @@ -21,6 +21,9 @@ "copilotResumeLastChat": { "label": "Riprendi l'ultima chat quando apri il Pannello Laterale (Copilot)" }, + "turnOnChatWithWebsite": { + "label": "Abilita Chat con il Sito Web per impostazione predefinita (Copilot)" + }, "webUIResumeLastChat": { "label": "Riprendi l'ultima chat quando apri l'interfaccia Web" }, diff --git a/src/assets/locale/ja-JP/settings.json b/src/assets/locale/ja-JP/settings.json index 6aabff0..8c06300 100644 --- a/src/assets/locale/ja-JP/settings.json +++ b/src/assets/locale/ja-JP/settings.json @@ -24,6 +24,9 @@ "copilotResumeLastChat": { "label": "サイドパネルを開いたときに最後のチャットを再開 (Copilot)" }, + "turnOnChatWithWebsite": { + "label": "デフォルトでウェブサイトとのチャットを有効にする (Copilot)" + }, "webUIResumeLastChat": { "label": "Web UIを開いたときに最後のチャットを再開" }, diff --git a/src/assets/locale/ko/settings.json b/src/assets/locale/ko/settings.json index b652959..f7950ea 100644 --- a/src/assets/locale/ko/settings.json +++ b/src/assets/locale/ko/settings.json @@ -24,6 +24,9 @@ "copilotResumeLastChat": { "label": "사이드 패널을 열 때 마지막 채팅 재개 (Copilot)" }, + "turnOnChatWithWebsite": { + "label": "웹사이트와의 채팅 기본 활성화 (Copilot)" + }, "webUIResumeLastChat": { "label": "웹 UI를 열 때 마지막 채팅 재개" }, diff --git a/src/assets/locale/ml/settings.json b/src/assets/locale/ml/settings.json index c093da0..13700f3 100644 --- a/src/assets/locale/ml/settings.json +++ b/src/assets/locale/ml/settings.json @@ -24,6 +24,9 @@ "copilotResumeLastChat": { "label": "സൈഡ്പാനൽ തുറക്കുമ്പോൾ അവസാനത്തെ ചാറ്റ് പുനരാരംഭിക്കുക (Copilot)" }, + "turnOnChatWithWebsite": { + "label": "സ്ഥിരസ്ഥിതിയായി വെബ്സൈറ്റുമായുള്ള ചാറ്റ് പ്രവർത്തനക്ഷമമാക്കുക (കോപൈലറ്റ്)" + }, "webUIResumeLastChat": { "label": "വെബ് UI തുറക്കുമ്പോൾ അവസാനത്തെ ചാറ്റ് പുനരാരംഭിക്കുക" }, diff --git a/src/assets/locale/no/settings.json b/src/assets/locale/no/settings.json index 16f6c59..4b9c66d 100644 --- a/src/assets/locale/no/settings.json +++ b/src/assets/locale/no/settings.json @@ -21,6 +21,9 @@ "copilotResumeLastChat": { "label": "Gjenoppta siste chat ved åpning av SidePanel (copilot)" }, + "turnOnChatWithWebsite": { + "label": "Aktiver Chat med Nettsted som standard (Copilot)" + }, "webUIResumeLastChat": { "label": "Gjenoppta siste chat når Web UI åpnes" }, diff --git a/src/assets/locale/pt-BR/settings.json b/src/assets/locale/pt-BR/settings.json index 8b1423d..dc186ef 100644 --- a/src/assets/locale/pt-BR/settings.json +++ b/src/assets/locale/pt-BR/settings.json @@ -21,6 +21,9 @@ "copilotResumeLastChat": { "label": "Retomar o último chat ao abrir o Painel Lateral (Copilot)" }, + "turnOnChatWithWebsite": { + "label": "Ativar Chat com o Site por padrão (Copilot)" + }, "webUIResumeLastChat": { "label": "Retomar o último chat ao abrir a Interface Web" }, diff --git a/src/assets/locale/ru/settings.json b/src/assets/locale/ru/settings.json index 6afd82c..80592e4 100644 --- a/src/assets/locale/ru/settings.json +++ b/src/assets/locale/ru/settings.json @@ -21,6 +21,9 @@ "copilotResumeLastChat": { "label": "Возобновить последний чат при открытии боковой панели (Copilot)" }, + "turnOnChatWithWebsite": { + "label": "Включить чат с веб-сайтом по умолчанию (Copilot)" + }, "webUIResumeLastChat": { "label": "Возобновить последний чат при открытии веб-интерфейса" }, diff --git a/src/assets/locale/sv/settings.json b/src/assets/locale/sv/settings.json index bc10a22..84f38dd 100644 --- a/src/assets/locale/sv/settings.json +++ b/src/assets/locale/sv/settings.json @@ -21,6 +21,9 @@ "copilotResumeLastChat": { "label": "Återuppta den senaste chatten när du öppnar sidopanelen (Copilot)" }, + "turnOnChatWithWebsite": { + "label": "Aktivera Chatta med Webbplats som standard (Copilot)" + }, "webUIResumeLastChat": { "label": "Återuppta den senaste chatten när du öppnar webbgränssnittet" }, diff --git a/src/assets/locale/uk/settings.json b/src/assets/locale/uk/settings.json index d8c8a98..3d937a8 100644 --- a/src/assets/locale/uk/settings.json +++ b/src/assets/locale/uk/settings.json @@ -21,6 +21,9 @@ "copilotResumeLastChat": { "label": "Поновити останню розмову при відкритті бічної панелі (Copilot)" }, + "turnOnChatWithWebsite": { + "label": "Увімкнути чат з веб-сайтом за замовчуванням (Copilot)" + }, "webUIResumeLastChat": { "label": "Поновити останню розмову при відкритті веб-інтерфейсу" }, diff --git a/src/assets/locale/zh/settings.json b/src/assets/locale/zh/settings.json index e86b363..ccaf4eb 100644 --- a/src/assets/locale/zh/settings.json +++ b/src/assets/locale/zh/settings.json @@ -24,6 +24,9 @@ "copilotResumeLastChat": { "label": "打开侧边栏时恢复上次聊天(Copilot)" }, + "turnOnChatWithWebsite": { + "label": "默认启用与网站对话(Copilot)" + }, "webUIResumeLastChat": { "label": "打开Web UI时恢复上次聊天" }, diff --git a/src/components/Option/Settings/general-settings.tsx b/src/components/Option/Settings/general-settings.tsx index 45bd9c2..d000614 100644 --- a/src/components/Option/Settings/general-settings.tsx +++ b/src/components/Option/Settings/general-settings.tsx @@ -31,6 +31,10 @@ export const GeneralSettings = () => { "webUIResumeLastChat", false ) + const [defaultChatWithWebsite, setDefaultChatWithWebsite] = useStorage( + "defaultChatWithWebsite", + false + ) const [restoreLastChatModel, setRestoreLastChatModel] = useStorage( "restoreLastChatModel", @@ -118,6 +122,17 @@ export const GeneralSettings = () => { onChange={(checked) => setCopilotResumeLastChat(checked)} /> +
+
+ + {t("generalSettings.settings.turnOnChatWithWebsite.label")} + +
+ setDefaultChatWithWebsite(checked)} + /> +
@@ -220,7 +235,7 @@ export const GeneralSettings = () => {
- +
{t("generalSettings.system.export.label")} diff --git a/src/components/Sidepanel/Chat/form.tsx b/src/components/Sidepanel/Chat/form.tsx index c0bacad..7d0c376 100644 --- a/src/components/Sidepanel/Chat/form.tsx +++ b/src/components/Sidepanel/Chat/form.tsx @@ -134,7 +134,8 @@ export const SidepanelForm = ({ dropedFile }: Props) => { speechToTextLanguage, useOCR, setUseOCR, - defaultInternetSearchOn + defaultInternetSearchOn, + defaultChatWithWebsite } = useMessage() React.useEffect(() => { @@ -200,6 +201,10 @@ export const SidepanelForm = ({ dropedFile }: Props) => { setWebSearch(true) } + if (defaultChatWithWebsite) { + setChatMode("rag") + } + return () => { textareaRef.current?.removeEventListener("drop", handleDrop) textareaRef.current?.removeEventListener("dragover", handleDragOver) @@ -212,6 +217,12 @@ export const SidepanelForm = ({ dropedFile }: Props) => { } }, [defaultInternetSearchOn]) + React.useEffect(() => { + if (defaultChatWithWebsite) { + setChatMode("rag") + } + }, [defaultChatWithWebsite]) + return (
{ "defaultInternetSearchOn", false ) + + const [ + defaultChatWithWebsite, + ] = useStorage("defaultChatWithWebsite", false) + const [chatWithWebsiteEmbedding] = useStorage( "chatWithWebsiteEmbedding", true @@ -113,6 +118,9 @@ export const useMessage = () => { if(defaultInternetSearchOn) { setWebSearch(true) } + if(defaultChatWithWebsite) { + setChatMode("rag") + } } const chatWithWebsiteMode = async ( @@ -1721,6 +1729,7 @@ export const useMessage = () => { setSpeechToTextLanguage, useOCR, setUseOCR, - defaultInternetSearchOn + defaultInternetSearchOn, + defaultChatWithWebsite } } From 6be1b2b0ded4435e53985a13f011b20f91982a64 Mon Sep 17 00:00:00 2001 From: n4ze3m Date: Sun, 19 Jan 2025 12:33:26 +0530 Subject: [PATCH 4/5] feat: Add DeepSeek provider and icon to the application --- src/components/Common/ProviderIcon.tsx | 3 +++ src/components/Icons/DeepSeek.tsx | 19 +++++++++++++++++++ src/utils/oai-api-providers.ts | 5 +++++ 3 files changed, 27 insertions(+) create mode 100644 src/components/Icons/DeepSeek.tsx diff --git a/src/components/Common/ProviderIcon.tsx b/src/components/Common/ProviderIcon.tsx index adb9574..c7f6fc4 100644 --- a/src/components/Common/ProviderIcon.tsx +++ b/src/components/Common/ProviderIcon.tsx @@ -9,6 +9,7 @@ import { OpenRouterIcon } from "../Icons/OpenRouter" import { LLamaFile } from "../Icons/Llamafile" import { GeminiIcon } from "../Icons/GeminiIcon" import { MistarlIcon } from "../Icons/Mistral" +import { DeepSeekIcon } from "../Icons/DeepSeek" export const ProviderIcons = ({ provider, @@ -40,6 +41,8 @@ export const ProviderIcons = ({ return case "mistral": return + case "deepseek": + return default: return } diff --git a/src/components/Icons/DeepSeek.tsx b/src/components/Icons/DeepSeek.tsx new file mode 100644 index 0000000..a87071a --- /dev/null +++ b/src/components/Icons/DeepSeek.tsx @@ -0,0 +1,19 @@ +import React from "react" + +export const DeepSeekIcon = React.forwardRef< + SVGSVGElement, + React.SVGProps +>((props, ref) => { + return ( + + + + ) +}) diff --git a/src/utils/oai-api-providers.ts b/src/utils/oai-api-providers.ts index f0d3239..abe67f4 100644 --- a/src/utils/oai-api-providers.ts +++ b/src/utils/oai-api-providers.ts @@ -53,5 +53,10 @@ export const OAI_API_PROVIDERS = [ label: "Mistral", value: "mistral", baseUrl: "https://api.mistral.ai/v1" + }, + { + label: "DeepSeek", + value: "deepseek", + baseUrl: "https://api.deepseek.com" } ] \ No newline at end of file From b39d60fc3cbfe673d06e0a1c99b9f2fcb94cdaf4 Mon Sep 17 00:00:00 2001 From: n4ze3m Date: Sun, 19 Jan 2025 12:52:43 +0530 Subject: [PATCH 5/5] feat: Update message formatting to remove model suffix in chat display --- src/components/Layouts/MoreOptions.tsx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/components/Layouts/MoreOptions.tsx b/src/components/Layouts/MoreOptions.tsx index 26fea23..68d8f30 100644 --- a/src/components/Layouts/MoreOptions.tsx +++ b/src/components/Layouts/MoreOptions.tsx @@ -11,6 +11,7 @@ import { Message } from "@/types/message" import { useState } from "react" import { ShareModal } from "../Common/ShareModal" import { useTranslation } from "react-i18next" +import { removeModelSuffix } from "@/db/models" interface MoreOptionsProps { messages: Message[] @@ -25,11 +26,10 @@ const formatAsText = (messages: Message[]) => { }) .join("\n\n") } - const formatAsMarkdown = (messages: Message[]) => { return messages .map((msg) => { - let content = `**${msg.isBot ? msg.name : "You"}**:\n${msg.message}` + let content = `**${msg.isBot ? removeModelSuffix(msg.name?.replaceAll(/accounts\/[^\/]+\/models\//g, "")) : "You"}**:\n${msg.message}` if (msg.images && msg.images.length > 0) { const imageMarkdown = msg.images @@ -119,7 +119,6 @@ const generateChatImage = async (messages: Message[]) => { } totalHeight += 30 - }) canvas.height = totalHeight @@ -132,7 +131,7 @@ const generateChatImage = async (messages: Message[]) => { for (const msg of messages) { ctx.font = "bold 18px Inter, Arial" ctx.fillStyle = msg.isBot ? "#1A202C" : "#1E4E8C" - ctx.fillText(`${msg.isBot ? msg.name : "You"}:`, padding, yPosition) + ctx.fillText(`${msg.isBot ? removeModelSuffix(msg.name?.replaceAll(/accounts\/[^\/]+\/models\//g, "")) : "You"}:`, padding, yPosition) yPosition += 35 if (msg.message.includes("```")) {