From 511ac948b428ae7958897527df8780053f462b02 Mon Sep 17 00:00:00 2001 From: Daniel Avila Date: Tue, 7 Feb 2023 19:07:48 -0500 Subject: [PATCH] clear all convos in progress, async code refactored in debugging warning --- .gitignore | 1 + package-lock.json | 14 ++++----- package.json | 2 +- server/index.js | 30 +++++++++++-------- src/components/Conversations/Conversation.jsx | 11 +++---- src/components/Nav/ClearConvos.jsx | 30 +++++++++++++++++++ src/components/Nav/NavLink.jsx | 25 +++++++++------- src/components/Nav/NavLinks.jsx | 25 ++-------------- src/store/messageSlice.js | 2 +- src/utils/fetchers.js | 9 ++++-- 10 files changed, 84 insertions(+), 65 deletions(-) create mode 100644 src/components/Nav/ClearConvos.jsx diff --git a/.gitignore b/.gitignore index f9c5a49088..5b873a2608 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,7 @@ build/ dist/ public/main.js public/main.js.map +public/main.js.LICENSE.txt # Dependency directorys # Deployed apps should consider commenting these lines out: diff --git a/package-lock.json b/package-lock.json index f8041cf9da..6dace53b40 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@keyv/mongo": "^2.1.8", "@reduxjs/toolkit": "^1.9.2", - "chatgpt": "^4.1.1", + "chatgpt": "^4.2.0", "cors": "^2.8.5", "crypto-browserify": "^3.12.0", "dotenv": "^16.0.3", @@ -5233,9 +5233,9 @@ } }, "node_modules/chatgpt": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chatgpt/-/chatgpt-4.1.1.tgz", - "integrity": "sha512-2Hn9kjSSndvmLiRLYK1xHXxf436xwby3vmLBlLayxFFErQHW2+47zjGlaanhrFzb89MfWsf+1GPwl/qKklDUeA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/chatgpt/-/chatgpt-4.2.0.tgz", + "integrity": "sha512-HYQ65GCa8PGtmmUB+XSAa17/IKTy/EEj8QU9HGU8UAsGBtKZushiozC0JpNcTyG+ivpuwzdduXJyL6ELnqkY4A==", "dependencies": { "eventsource-parser": "^0.0.5", "gpt-3-encoder": "^1.1.4", @@ -16406,9 +16406,9 @@ } }, "chatgpt": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chatgpt/-/chatgpt-4.1.1.tgz", - "integrity": "sha512-2Hn9kjSSndvmLiRLYK1xHXxf436xwby3vmLBlLayxFFErQHW2+47zjGlaanhrFzb89MfWsf+1GPwl/qKklDUeA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/chatgpt/-/chatgpt-4.2.0.tgz", + "integrity": "sha512-HYQ65GCa8PGtmmUB+XSAa17/IKTy/EEj8QU9HGU8UAsGBtKZushiozC0JpNcTyG+ivpuwzdduXJyL6ELnqkY4A==", "requires": { "eventsource-parser": "^0.0.5", "gpt-3-encoder": "^1.1.4", diff --git a/package.json b/package.json index db2278b98b..3525b27baf 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "dependencies": { "@keyv/mongo": "^2.1.8", "@reduxjs/toolkit": "^1.9.2", - "chatgpt": "^4.1.1", + "chatgpt": "^4.2.0", "cors": "^2.8.5", "crypto-browserify": "^3.12.0", "dotenv": "^16.0.3", diff --git a/server/index.js b/server/index.js index 5fa4992680..c6ae9c651e 100644 --- a/server/index.js +++ b/server/index.js @@ -33,7 +33,6 @@ app.get('/messages/:conversationId', async (req, res) => { app.post('/clear_convos', async (req, res) => { let filter = {}; const { conversationId } = req.body.arg; - console.log('conversationId', conversationId); if (!!conversationId) { filter = { conversationId }; } @@ -77,19 +76,24 @@ app.post('/ask', async (req, res) => { res.write(`event: message\ndata: ${data}\n\n`); }; - let gptResponse = await ask(text, progressCallback, { parentMessageId, conversationId }); - if (!!parentMessageId) { - gptResponse = { ...gptResponse, parentMessageId }; - } else { - gptResponse.title = await titleConversation(text, gptResponse.text); + try { + let gptResponse = await ask(text, progressCallback, { parentMessageId, conversationId }); + if (!!parentMessageId) { + gptResponse = { ...gptResponse, parentMessageId }; + } else { + gptResponse.title = await titleConversation(text, gptResponse.text); + } + + gptResponse.sender = 'GPT'; + await saveMessage(gptResponse); + await saveConvo(gptResponse); + + res.write(`event: message\ndata: ${JSON.stringify(gptResponse)}\n\n`); + res.end(); + } catch (error) { + console.error(error); + res.status(500).send(error); } - - gptResponse.sender = 'GPT'; - await saveMessage(gptResponse); - await saveConvo(gptResponse); - - res.write(`event: message\ndata: ${JSON.stringify(gptResponse)}\n\n`); - res.end(); }); app.listen(port, () => { diff --git a/src/components/Conversations/Conversation.jsx b/src/components/Conversations/Conversation.jsx index 7e9acd7473..d6dab23203 100644 --- a/src/components/Conversations/Conversation.jsx +++ b/src/components/Conversations/Conversation.jsx @@ -11,17 +11,14 @@ export default function Conversation({ id, parentMessageId, title = 'New convers const conversationId = useSelector((state) => state.convo.conversationId); const { trigger, isMutating } = manualSWR( `http://localhost:3050/messages/${id}`, - 'get', - (res) => dispatch(setMessages(res)) + 'get' ); - const clickHandler = () => { - if (conversationId === id) { - return; - } + const clickHandler = async () => { dispatch(setConversation({ conversationId: id, parentMessageId })); - trigger(); + const data = await trigger(); + dispatch(setMessages(data)); }; return ( diff --git a/src/components/Nav/ClearConvos.jsx b/src/components/Nav/ClearConvos.jsx new file mode 100644 index 0000000000..ff5426e413 --- /dev/null +++ b/src/components/Nav/ClearConvos.jsx @@ -0,0 +1,30 @@ +import React from 'react'; +import NavLink from './NavLink'; +import TrashIcon from '../svg/TrashIcon'; +import manualSWR from '~/utils/fetchers'; +import { useDispatch } from 'react-redux'; +import { setConversation } from '~/store/convoSlice'; +import { setMessages } from '~/store/messageSlice'; + +export default function ClearConvos() { + const dispatch = useDispatch(); + + const { trigger, isMutating } = manualSWR( + 'http://localhost:3050/clear_convos', + 'post', + () => { + dispatch(setMessages([])); + dispatch(setConversation({ conversationId: null, parentMessageId: null })); + } + ); + + const clickHandler = () => trigger({}); + + return ( + + ); +} diff --git a/src/components/Nav/NavLink.jsx b/src/components/Nav/NavLink.jsx index 7f0875b5c2..e162423eaf 100644 --- a/src/components/Nav/NavLink.jsx +++ b/src/components/Nav/NavLink.jsx @@ -1,14 +1,19 @@ import React from 'react'; -export default function NavLink({ svg, text, clickHandler}) { - // const props - // if (clickHandler) { +export default function NavLink({ svg, text, clickHandler }) { + const props = { + className: + 'flex cursor-pointer items-center gap-3 rounded-md py-3 px-3 text-sm text-white transition-colors duration-200 hover:bg-gray-500/10' + }; - // } - // return ( - // - // {svg()} - // {text} - // - // ); + if (clickHandler) { + props.onClick = clickHandler; + } + + return ( + + {svg()} + {text} + + ); } diff --git a/src/components/Nav/NavLinks.jsx b/src/components/Nav/NavLinks.jsx index 7cfb7e15da..ef11a51259 100644 --- a/src/components/Nav/NavLinks.jsx +++ b/src/components/Nav/NavLinks.jsx @@ -1,34 +1,13 @@ import React from 'react'; +import ClearConvos from './ClearConvos'; import NavLink from './NavLink'; -import TrashIcon from '../svg/TrashIcon'; import DarkModeIcon from '../svg/DarkModeIcon'; import LogOutIcon from '../svg/LogOutIcon'; -import manualSWR from '~/utils/fetchers'; -import { useDispatch } from 'react-redux'; -import { setConversation } from '~/store/convoSlice'; -import { setMessages } from '~/store/messageSlice'; export default function NavLinks() { - const dispatch = useDispatch(); - - const { trigger, isMutating } = manualSWR( - 'http://localhost:3050/clear_convos', - 'post', - () => { - dispatch(setMessages([])); - dispatch(setConversation({ conversationId: null, parentMessageId: null })); - } - ); - - const clickHandler = () => trigger({}); - return ( <> - + { - state.messages = [...action.payload]; + state.messages = action.payload; }, } }); diff --git a/src/utils/fetchers.js b/src/utils/fetchers.js index 981cca4550..360268b34a 100644 --- a/src/utils/fetchers.js +++ b/src/utils/fetchers.js @@ -11,8 +11,11 @@ const postRequest = async (url, { arg }) => { export const swr = (path) => useSWR(path, fetcher); export default function manualSWR(path, type, successCallback) { + const options = {}; + + if (successCallback) { + options.onSuccess = successCallback; + } const fetchFunction = type === 'get' ? fetcher : postRequest; - return useSWRMutation(path, fetchFunction, { - onSuccess: successCallback - }); + return useSWRMutation(path, fetchFunction, options); };