diff --git a/server/openai.go b/server/openai.go index 522d05e6..0552fb15 100644 --- a/server/openai.go +++ b/server/openai.go @@ -46,27 +46,4 @@ func (s *Server) registerOpenAIRoutes(g *echo.Group) { return c.JSON(http.StatusOK, composeResponse(result)) }) - - g.GET("/openai/enabled", func(c echo.Context) error { - ctx := c.Request().Context() - openAIConfigSetting, err := s.Store.FindSystemSetting(ctx, &api.SystemSettingFind{ - Name: api.SystemSettingOpenAIConfigName, - }) - if err != nil && common.ErrorCode(err) != common.NotFound { - return echo.NewHTTPError(http.StatusInternalServerError, "Failed to find openai key").SetInternal(err) - } - - openAIConfig := api.OpenAIConfig{} - if openAIConfigSetting != nil { - err = json.Unmarshal([]byte(openAIConfigSetting.Value), &openAIConfig) - if err != nil { - return echo.NewHTTPError(http.StatusInternalServerError, "Failed to unmarshal openai system setting value").SetInternal(err) - } - } - if openAIConfig.Key == "" { - return echo.NewHTTPError(http.StatusBadRequest, "OpenAI API key not set") - } - - return c.JSON(http.StatusOK, composeResponse(openAIConfig.Key != "")) - }) } diff --git a/web/src/components/ArchivedMemo.tsx b/web/src/components/ArchivedMemo.tsx index 765078e5..392b48d9 100644 --- a/web/src/components/ArchivedMemo.tsx +++ b/web/src/components/ArchivedMemo.tsx @@ -53,9 +53,7 @@ const ArchivedMemo: React.FC = (props: Props) => { return (
- - {t("memo.archived-at")} {getDateTimeString(memo.updatedTs)} - + {getDateTimeString(memo.updatedTs)}
{t("common.restore")} diff --git a/web/src/components/AskAIDialog.tsx b/web/src/components/AskAIDialog.tsx deleted file mode 100644 index d0a1bfd6..00000000 --- a/web/src/components/AskAIDialog.tsx +++ /dev/null @@ -1,243 +0,0 @@ -import { Button, FormControl, Input, Modal, ModalClose, ModalDialog, Stack, Textarea, Typography } from "@mui/joy"; -import React, { useEffect, useState } from "react"; -import { toast } from "react-hot-toast"; -import { useTranslation } from "react-i18next"; -import * as api from "@/helpers/api"; -import useLoading from "@/hooks/useLoading"; -import { marked } from "@/labs/marked"; -import { useMessageStore } from "@/store/zustand/message"; -import { defaultMessageGroup, MessageGroup, useMessageGroupStore } from "@/store/zustand/message-group"; -import Icon from "./Icon"; -import { generateDialog } from "./Dialog"; -import showSettingDialog from "./SettingDialog"; -import Selector from "./kit/Selector"; - -type Props = DialogProps; - -const AskAIDialog: React.FC = (props: Props) => { - const { t } = useTranslation(); - const { destroy, hide } = props; - const fetchingState = useLoading(false); - const [messageGroup, setMessageGroup] = useState(defaultMessageGroup); - const messageStore = useMessageStore(messageGroup)(); - const [isEnabled, setIsEnabled] = useState(true); - const [isInIME, setIsInIME] = useState(false); - const [question, setQuestion] = useState(""); - const messageList = messageStore.messageList; - - useEffect(() => { - api.checkOpenAIEnabled().then(({ data }) => { - const { data: enabled } = data; - setIsEnabled(enabled); - }); - }, []); - - const handleGotoSystemSetting = () => { - showSettingDialog("system"); - destroy(); - }; - - const handleQuestionTextareaChange = async (event: React.ChangeEvent) => { - setQuestion(event.currentTarget.value); - }; - - const handleKeyDown = (event: React.KeyboardEvent) => { - if (event.key === "Enter" && !event.shiftKey && !isInIME) { - event.preventDefault(); - handleSendQuestionButtonClick().then(); - } - }; - - const handleSendQuestionButtonClick = async () => { - if (!question) { - return; - } - - fetchingState.setLoading(); - setQuestion(""); - messageStore.addMessage({ - role: "user", - content: question, - }); - try { - await fetchChatCompletion(); - } catch (error: any) { - console.error(error); - toast.error(error.response.data.error); - } - fetchingState.setFinish(); - }; - - const fetchChatCompletion = async () => { - const messageList = messageStore.getState().messageList; - const { - data: { data: answer }, - } = await api.postChatCompletion(messageList); - messageStore.addMessage({ - role: "assistant", - content: answer.replace(/^\n\n/, ""), - }); - }; - - const handleMessageGroupSelect = (value: string) => { - const messageGroup = messageGroupList.find((group) => group.messageStorageId === value); - if (messageGroup) { - setMessageGroup(messageGroup); - } - }; - - const [isAddMessageGroupDialogOpen, setIsAddMessageGroupDialogOpen] = useState(false); - const [groupName, setGroupName] = useState(""); - - const messageGroupStore = useMessageGroupStore(); - const messageGroupList = messageGroupStore.groupList; - - const handleOpenDialog = () => { - setIsAddMessageGroupDialogOpen(true); - }; - - const handleRemoveDialog = () => { - setMessageGroup(messageGroupStore.removeGroup(messageGroup)); - }; - - const handleCloseDialog = () => { - setIsAddMessageGroupDialogOpen(false); - setGroupName(""); - }; - - const handleAddMessageGroupDlgConfirm = () => { - const newMessageGroup: MessageGroup = { - name: groupName, - messageStorageId: "message-storage-" + groupName, - }; - messageGroupStore.addGroup(newMessageGroup); - setMessageGroup(newMessageGroup); - handleCloseDialog(); - }; - - const handleCancel = () => { - handleCloseDialog(); - }; - - return ( - <> -
-

- - {t("ask-ai.title")} - - ({ text: item.name, value: item.messageStorageId }))} - value={messageGroup.messageStorageId} - handleValueChanged={handleMessageGroupSelect} - /> - - - -

- - - - - - {t("ask-ai.create-message-group-title")} - - - - setGroupName(e.target.value)} - placeholder={t("ask-ai.label-message-group-name-title")} - /> - -
- - -
-
-
-
- -
-
- - {messageList.map((message, index) => ( -
- {message.role === "user" ? ( -
- - {message.content} - -
- ) : ( -
- -
-
{marked(message.content)}
-
-
- )} -
- ))} -
- {fetchingState.isLoading && ( -

- -

- )} - {!isEnabled && ( -
-

{t("ask-ai.not_enabled")}

- -
- )} -
-