From c627e5edec568f3c0ff0298199d65c7cc14c2aff Mon Sep 17 00:00:00 2001 From: Zhang Minghan Date: Mon, 29 Jan 2024 16:51:34 +0800 Subject: [PATCH] feat: support file viewer --- adapter/chatgpt/image.go | 4 +- app/src/components/FileViewer.tsx | 87 +++++++++++++++++++++++++++++ app/src/components/Markdown.tsx | 38 +++++++++---- app/src/components/plugins/file.tsx | 9 ++- app/src/resources/i18n/cn.json | 1 + app/src/resources/i18n/en.json | 3 +- app/src/resources/i18n/ja.json | 3 +- app/src/resources/i18n/ru.json | 3 +- docker-compose.yaml | 4 ++ manager/connection.go | 2 - manager/manager.go | 1 + 11 files changed, 135 insertions(+), 20 deletions(-) create mode 100644 app/src/components/FileViewer.tsx diff --git a/adapter/chatgpt/image.go b/adapter/chatgpt/image.go index 1cca870..ea4ad81 100644 --- a/adapter/chatgpt/image.go +++ b/adapter/chatgpt/image.go @@ -32,14 +32,14 @@ func (c *ChatInstance) CreateImageRequest(props ImageProps) (string, error) { N: 1, }) if err != nil || res == nil { - return "", fmt.Errorf("chatgpt error: %s", err.Error()) + return "", fmt.Errorf(err.Error()) } data := utils.MapToStruct[ImageResponse](res) if data == nil { return "", fmt.Errorf("chatgpt error: cannot parse response") } else if data.Error.Message != "" { - return "", fmt.Errorf("chatgpt error: %s", data.Error.Message) + return "", fmt.Errorf(data.Error.Message) } return data.Data[0].Url, nil diff --git a/app/src/components/FileViewer.tsx b/app/src/components/FileViewer.tsx new file mode 100644 index 0000000..c82e606 --- /dev/null +++ b/app/src/components/FileViewer.tsx @@ -0,0 +1,87 @@ +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "./ui/dialog"; +import { useTranslation } from "react-i18next"; +import React from "react"; +import { Heading2, Paperclip, Text } from "lucide-react"; +import { Textarea } from "@/components/ui/textarea.tsx"; +import { CodeMarkdown } from "@/components/Markdown.tsx"; +import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group.tsx"; + +type FileViewerProps = { + filename: string; + content: string; + children: React.ReactNode; + asChild?: boolean; +}; + +enum viewerType { + Text = "text", + Image = "image", +} + +function FileViewer({ filename, content, children, asChild }: FileViewerProps) { + const { t } = useTranslation(); + + const [renderedType, setRenderedType] = React.useState(viewerType.Text); + + return ( + + {children} + + + + + {filename ?? t("file.file")} + + +
+ + setRenderedType(viewerType.Text)} + > + + + setRenderedType(viewerType.Image)} + > + + + +
+
+ {renderedType === viewerType.Text ? ( +