+
);
}
diff --git a/src/components/Nav/ClearConvos.jsx b/client/src/components/Nav/ClearConvos.jsx
similarity index 56%
rename from src/components/Nav/ClearConvos.jsx
rename to client/src/components/Nav/ClearConvos.jsx
index 0247e81d12..25762aa2f2 100644
--- a/src/components/Nav/ClearConvos.jsx
+++ b/client/src/components/Nav/ClearConvos.jsx
@@ -1,27 +1,31 @@
import React from 'react';
import TrashIcon from '../svg/TrashIcon';
-import { useSWRConfig } from "swr"
+import { useSWRConfig } from 'swr';
import manualSWR from '~/utils/fetchers';
import { useDispatch } from 'react-redux';
-import { setConversation } from '~/store/convoSlice';
+import { setConversation, removeAll } from '~/store/convoSlice';
import { setMessages } from '~/store/messageSlice';
export default function ClearConvos() {
const dispatch = useDispatch();
- const { mutate } = useSWRConfig()
+ const { mutate } = useSWRConfig();
- const { trigger } = manualSWR(
- 'http://localhost:3050/convos/clear',
- 'post',
- () => {
- dispatch(setMessages([]));
- dispatch(setConversation({ error: false, title: 'New chat', conversationId: null, parentMessageId: null }));
- mutate('http://localhost:3050/convos');
- }
- );
+ const { trigger } = manualSWR(`http://localhost:3080/api/convos/clear`, 'post', () => {
+ dispatch(setMessages([]));
+ dispatch(
+ setConversation({
+ error: false,
+ title: 'New chat',
+ conversationId: null,
+ parentMessageId: null
+ })
+ );
+ mutate(`http://localhost:3080/api/convos`);
+ });
const clickHandler = () => {
console.log('Clearing conversations...');
+ dispatch(removeAll());
trigger({});
};
diff --git a/src/components/Nav/DarkMode.jsx b/client/src/components/Nav/DarkMode.jsx
similarity index 100%
rename from src/components/Nav/DarkMode.jsx
rename to client/src/components/Nav/DarkMode.jsx
diff --git a/src/components/Nav/MobileNav.jsx b/client/src/components/Nav/MobileNav.jsx
similarity index 100%
rename from src/components/Nav/MobileNav.jsx
rename to client/src/components/Nav/MobileNav.jsx
diff --git a/src/components/Nav/NavLink.jsx b/client/src/components/Nav/NavLink.jsx
similarity index 100%
rename from src/components/Nav/NavLink.jsx
rename to client/src/components/Nav/NavLink.jsx
diff --git a/src/components/Nav/NavLinks.jsx b/client/src/components/Nav/NavLinks.jsx
similarity index 100%
rename from src/components/Nav/NavLinks.jsx
rename to client/src/components/Nav/NavLinks.jsx
diff --git a/src/components/Nav/NewChat.jsx b/client/src/components/Nav/NewChat.jsx
similarity index 100%
rename from src/components/Nav/NewChat.jsx
rename to client/src/components/Nav/NewChat.jsx
diff --git a/src/components/Nav/index.jsx b/client/src/components/Nav/index.jsx
similarity index 82%
rename from src/components/Nav/index.jsx
rename to client/src/components/Nav/index.jsx
index 6316973680..2ae96d22cc 100644
--- a/src/components/Nav/index.jsx
+++ b/client/src/components/Nav/index.jsx
@@ -17,17 +17,20 @@ export default function Nav() {
};
const { data, isLoading, mutate } = swr(
- `http://localhost:3050/convos?pageNumber=${pageNumber}`
- , onSuccess);
+ `http://localhost:3080/api/convos?pageNumber=${pageNumber}`,
+ onSuccess
+ );
const containerRef = useRef(null);
const scrollPositionRef = useRef(null);
- const showMore = async () => {
- const container = containerRef.current;
- if (container) {
- scrollPositionRef.current = container.scrollTop;
+ const showMore = async (increment = true) => {
+ if (increment) {
+ const container = containerRef.current;
+ if (container) {
+ scrollPositionRef.current = container.scrollTop;
+ }
+ dispatch(incrementPage());
}
- dispatch(incrementPage());
await mutate();
};
@@ -44,9 +47,10 @@ export default function Nav() {
}
}, [data]);
- const containerClasses = isLoading && pageNumber === 1
- ? 'flex flex-col gap-2 text-gray-100 text-sm h-full justify-center items-center'
- : 'flex flex-col gap-2 text-gray-100 text-sm';
+ const containerClasses =
+ isLoading && pageNumber === 1
+ ? 'flex flex-col gap-2 text-gray-100 text-sm h-full justify-center items-center'
+ : 'flex flex-col gap-2 text-gray-100 text-sm';
return (
diff --git a/src/components/Prompts/Prompt.jsx b/client/src/components/Prompts/Prompt.jsx
similarity index 100%
rename from src/components/Prompts/Prompt.jsx
rename to client/src/components/Prompts/Prompt.jsx
diff --git a/src/components/Prompts/Templates.jsx b/client/src/components/Prompts/Templates.jsx
similarity index 100%
rename from src/components/Prompts/Templates.jsx
rename to client/src/components/Prompts/Templates.jsx
diff --git a/src/components/svg/BingChatIcon.jsx b/client/src/components/svg/BingChatIcon.jsx
similarity index 100%
rename from src/components/svg/BingChatIcon.jsx
rename to client/src/components/svg/BingChatIcon.jsx
diff --git a/src/components/svg/BingIcon.jsx b/client/src/components/svg/BingIcon.jsx
similarity index 100%
rename from src/components/svg/BingIcon.jsx
rename to client/src/components/svg/BingIcon.jsx
diff --git a/src/components/svg/CautionIcon.jsx b/client/src/components/svg/CautionIcon.jsx
similarity index 100%
rename from src/components/svg/CautionIcon.jsx
rename to client/src/components/svg/CautionIcon.jsx
diff --git a/src/components/svg/ChatIcon.jsx b/client/src/components/svg/ChatIcon.jsx
similarity index 100%
rename from src/components/svg/ChatIcon.jsx
rename to client/src/components/svg/ChatIcon.jsx
diff --git a/src/components/svg/CheckMark.jsx b/client/src/components/svg/CheckMark.jsx
similarity index 100%
rename from src/components/svg/CheckMark.jsx
rename to client/src/components/svg/CheckMark.jsx
diff --git a/src/components/svg/Clipboard.jsx b/client/src/components/svg/Clipboard.jsx
similarity index 100%
rename from src/components/svg/Clipboard.jsx
rename to client/src/components/svg/Clipboard.jsx
diff --git a/src/components/svg/ConvoIcon.jsx b/client/src/components/svg/ConvoIcon.jsx
similarity index 100%
rename from src/components/svg/ConvoIcon.jsx
rename to client/src/components/svg/ConvoIcon.jsx
diff --git a/src/components/svg/CrossIcon.jsx b/client/src/components/svg/CrossIcon.jsx
similarity index 100%
rename from src/components/svg/CrossIcon.jsx
rename to client/src/components/svg/CrossIcon.jsx
diff --git a/src/components/svg/DarkModeIcon.jsx b/client/src/components/svg/DarkModeIcon.jsx
similarity index 100%
rename from src/components/svg/DarkModeIcon.jsx
rename to client/src/components/svg/DarkModeIcon.jsx
diff --git a/src/components/svg/DislikeIcon.jsx b/client/src/components/svg/DislikeIcon.jsx
similarity index 100%
rename from src/components/svg/DislikeIcon.jsx
rename to client/src/components/svg/DislikeIcon.jsx
diff --git a/src/components/svg/EditIcon.jsx b/client/src/components/svg/EditIcon.jsx
similarity index 100%
rename from src/components/svg/EditIcon.jsx
rename to client/src/components/svg/EditIcon.jsx
diff --git a/src/components/svg/GPTIcon.jsx b/client/src/components/svg/GPTIcon.jsx
similarity index 100%
rename from src/components/svg/GPTIcon.jsx
rename to client/src/components/svg/GPTIcon.jsx
diff --git a/src/components/svg/LightModeIcon.jsx b/client/src/components/svg/LightModeIcon.jsx
similarity index 100%
rename from src/components/svg/LightModeIcon.jsx
rename to client/src/components/svg/LightModeIcon.jsx
diff --git a/src/components/svg/LightningIcon.jsx b/client/src/components/svg/LightningIcon.jsx
similarity index 100%
rename from src/components/svg/LightningIcon.jsx
rename to client/src/components/svg/LightningIcon.jsx
diff --git a/src/components/svg/LikeIcon.jsx b/client/src/components/svg/LikeIcon.jsx
similarity index 100%
rename from src/components/svg/LikeIcon.jsx
rename to client/src/components/svg/LikeIcon.jsx
diff --git a/src/components/svg/LogOutIcon.jsx b/client/src/components/svg/LogOutIcon.jsx
similarity index 100%
rename from src/components/svg/LogOutIcon.jsx
rename to client/src/components/svg/LogOutIcon.jsx
diff --git a/src/components/svg/OGBingIcon.jsx b/client/src/components/svg/OGBingIcon.jsx
similarity index 100%
rename from src/components/svg/OGBingIcon.jsx
rename to client/src/components/svg/OGBingIcon.jsx
diff --git a/src/components/svg/RegenerateIcon.jsx b/client/src/components/svg/RegenerateIcon.jsx
similarity index 100%
rename from src/components/svg/RegenerateIcon.jsx
rename to client/src/components/svg/RegenerateIcon.jsx
diff --git a/src/components/svg/RenameIcon.jsx b/client/src/components/svg/RenameIcon.jsx
similarity index 100%
rename from src/components/svg/RenameIcon.jsx
rename to client/src/components/svg/RenameIcon.jsx
diff --git a/src/components/svg/Spinner.jsx b/client/src/components/svg/Spinner.jsx
similarity index 100%
rename from src/components/svg/Spinner.jsx
rename to client/src/components/svg/Spinner.jsx
diff --git a/src/components/svg/SunIcon.jsx b/client/src/components/svg/SunIcon.jsx
similarity index 100%
rename from src/components/svg/SunIcon.jsx
rename to client/src/components/svg/SunIcon.jsx
diff --git a/src/components/svg/TrashIcon.jsx b/client/src/components/svg/TrashIcon.jsx
similarity index 100%
rename from src/components/svg/TrashIcon.jsx
rename to client/src/components/svg/TrashIcon.jsx
diff --git a/src/components/svg/UserIcon.jsx b/client/src/components/svg/UserIcon.jsx
similarity index 100%
rename from src/components/svg/UserIcon.jsx
rename to client/src/components/svg/UserIcon.jsx
diff --git a/src/components/ui/AlertDialog.tsx b/client/src/components/ui/AlertDialog.tsx
similarity index 100%
rename from src/components/ui/AlertDialog.tsx
rename to client/src/components/ui/AlertDialog.tsx
diff --git a/src/components/ui/Button.tsx b/client/src/components/ui/Button.tsx
similarity index 100%
rename from src/components/ui/Button.tsx
rename to client/src/components/ui/Button.tsx
diff --git a/src/components/ui/Dialog.tsx b/client/src/components/ui/Dialog.tsx
similarity index 100%
rename from src/components/ui/Dialog.tsx
rename to client/src/components/ui/Dialog.tsx
diff --git a/src/components/ui/DropdownMenu.tsx b/client/src/components/ui/DropdownMenu.tsx
similarity index 100%
rename from src/components/ui/DropdownMenu.tsx
rename to client/src/components/ui/DropdownMenu.tsx
diff --git a/src/components/ui/Input.tsx b/client/src/components/ui/Input.tsx
similarity index 100%
rename from src/components/ui/Input.tsx
rename to client/src/components/ui/Input.tsx
diff --git a/src/components/ui/Label.tsx b/client/src/components/ui/Label.tsx
similarity index 100%
rename from src/components/ui/Label.tsx
rename to client/src/components/ui/Label.tsx
diff --git a/src/components/ui/Tabs.tsx b/client/src/components/ui/Tabs.tsx
similarity index 100%
rename from src/components/ui/Tabs.tsx
rename to client/src/components/ui/Tabs.tsx
diff --git a/src/components/ui/Textarea.tsx b/client/src/components/ui/Textarea.tsx
similarity index 100%
rename from src/components/ui/Textarea.tsx
rename to client/src/components/ui/Textarea.tsx
diff --git a/src/hooks/ThemeContext.js b/client/src/hooks/ThemeContext.js
similarity index 100%
rename from src/hooks/ThemeContext.js
rename to client/src/hooks/ThemeContext.js
diff --git a/src/hooks/useDidMountEffect.js b/client/src/hooks/useDidMountEffect.js
similarity index 100%
rename from src/hooks/useDidMountEffect.js
rename to client/src/hooks/useDidMountEffect.js
diff --git a/src/hooks/useDocumentTitle.js b/client/src/hooks/useDocumentTitle.js
similarity index 100%
rename from src/hooks/useDocumentTitle.js
rename to client/src/hooks/useDocumentTitle.js
diff --git a/src/store/convoSlice.js b/client/src/store/convoSlice.js
similarity index 59%
rename from src/store/convoSlice.js
rename to client/src/store/convoSlice.js
index 5918dfec7b..d2294e5bba 100644
--- a/src/store/convoSlice.js
+++ b/client/src/store/convoSlice.js
@@ -12,7 +12,7 @@ const initialState = {
promptPrefix: null,
convosLoading: false,
pageNumber: 1,
- convos: [],
+ convos: []
};
const currentSlice = createSlice({
@@ -29,11 +29,23 @@ const currentSlice = createSlice({
state.pageNumber = state.pageNumber + 1;
},
setConvos: (state, action) => {
- state.convos = [...state.convos, ...action.payload];
+ const newConvos = action.payload.filter((convo) => {
+ return !state.convos.some((c) => c.conversationId === convo.conversationId);
+ });
+ state.convos = [...state.convos, ...newConvos].sort(
+ (a, b) => new Date(b.created) - new Date(a.created)
+ );
},
+ removeConvo: (state, action) => {
+ state.convos = state.convos.filter((convo) => convo.conversationId !== action.payload);
+ },
+ removeAll: (state) => {
+ state.convos = [];
+ }
}
});
-export const { setConversation, setConvos, setError, incrementPage } = currentSlice.actions;
+export const { setConversation, setConvos, setError, incrementPage, removeConvo, removeAll } =
+ currentSlice.actions;
export default currentSlice.reducer;
diff --git a/src/store/index.js b/client/src/store/index.js
similarity index 100%
rename from src/store/index.js
rename to client/src/store/index.js
diff --git a/src/store/messageSlice.js b/client/src/store/messageSlice.js
similarity index 100%
rename from src/store/messageSlice.js
rename to client/src/store/messageSlice.js
diff --git a/src/store/modelSlice.js b/client/src/store/modelSlice.js
similarity index 73%
rename from src/store/modelSlice.js
rename to client/src/store/modelSlice.js
index c13c9a899a..801f0955d8 100644
--- a/src/store/modelSlice.js
+++ b/client/src/store/modelSlice.js
@@ -16,15 +16,16 @@ const initialState = {
_id: '2',
name: 'BingAI',
value: 'bingai'
- },
- {
- _id: '3',
- name: 'ChatGPT',
- value: 'chatgptBrowser'
}
+ // {
+ // _id: '3',
+ // name: 'ChatGPT',
+ // value: 'chatgptBrowser'
+ // }
],
modelMap: {},
- initial: { chatgpt: true, chatgptCustom: true, bingai: true, chatgptBrowser: true }
+ // initial: { chatgpt: true, chatgptCustom: true, bingai: true, chatgptBrowser: true }
+ initial: { chatgpt: true, chatgptCustom: true, bingai: true, }
};
const currentSlice = createSlice({
@@ -36,7 +37,7 @@ const currentSlice = createSlice({
state.models = models;
const modelMap = {};
- models.slice(4).forEach((modelItem) => {
+ models.slice(initialState.models.length).forEach((modelItem) => {
modelMap[modelItem.value] = {
chatGptLabel: modelItem.chatGptLabel,
promptPrefix: modelItem.promptPrefix
diff --git a/src/store/submitSlice.js b/client/src/store/submitSlice.js
similarity index 100%
rename from src/store/submitSlice.js
rename to client/src/store/submitSlice.js
diff --git a/src/store/textSlice.js b/client/src/store/textSlice.js
similarity index 100%
rename from src/store/textSlice.js
rename to client/src/store/textSlice.js
diff --git a/src/style.css b/client/src/style.css
similarity index 100%
rename from src/style.css
rename to client/src/style.css
diff --git a/src/utils/fetchers.js b/client/src/utils/fetchers.js
similarity index 100%
rename from src/utils/fetchers.js
rename to client/src/utils/fetchers.js
diff --git a/src/utils/handleSubmit.js b/client/src/utils/handleSubmit.js
similarity index 94%
rename from src/utils/handleSubmit.js
rename to client/src/utils/handleSubmit.js
index 5594f0565a..a36a3bbb1c 100644
--- a/src/utils/handleSubmit.js
+++ b/client/src/utils/handleSubmit.js
@@ -1,5 +1,4 @@
-import { SSE } from '../../app/sse';
-const endpoint = 'http://localhost:3050/ask';
+import { SSE } from './sse';
// const newLineRegex = /^\n+/;
export default function handleSubmit({
@@ -12,6 +11,7 @@ export default function handleSubmit({
chatGptLabel,
promptPrefix
}) {
+ const endpoint = `http://localhost:3080/api/ask`;
let payload = { model, text, chatGptLabel, promptPrefix };
if (convo.conversationId && convo.parentMessageId) {
payload = {
diff --git a/src/utils/index.js b/client/src/utils/index.js
similarity index 100%
rename from src/utils/index.js
rename to client/src/utils/index.js
diff --git a/src/utils/regexSplit.js b/client/src/utils/regexSplit.js
similarity index 100%
rename from src/utils/regexSplit.js
rename to client/src/utils/regexSplit.js
diff --git a/app/sse.js b/client/src/utils/sse.js
similarity index 100%
rename from app/sse.js
rename to client/src/utils/sse.js
diff --git a/tailwind.config.js b/client/tailwind.config.js
similarity index 100%
rename from tailwind.config.js
rename to client/tailwind.config.js
diff --git a/tsconfig.json b/client/tsconfig.json
similarity index 100%
rename from tsconfig.json
rename to client/tsconfig.json
diff --git a/webpack.config.js b/client/webpack.config.js
similarity index 98%
rename from webpack.config.js
rename to client/webpack.config.js
index 4cbb3b8cfc..2461658544 100644
--- a/webpack.config.js
+++ b/client/webpack.config.js
@@ -1,5 +1,4 @@
const path = require('path');
-require('dotenv').config();
// const HtmlWebpackPlugin = require('html-webpack-plugin');
/*We are basically telling webpack to take index.js from entry. Then check for all file extensions in resolve.
@@ -10,7 +9,7 @@ module.exports = {
* the environment - development, production, none. tells webpack
* to use its built-in optimizations accordingly. default is production
*/
- mode: process.env.NODE_ENV,
+ mode: 'development',
/** "entry"
* the entry point
*/
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 0000000000..83fa98fd21
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,48 @@
+version: "2"
+
+services:
+ client:
+ image: react-client
+ restart: always
+ ports:
+ - "3080:80"
+ volumes:
+ - ./client:/client
+ - /client/node_modules
+ links:
+ - api
+ networks:
+ - webappnetwork
+ api:
+ image: node-api
+ restart: always
+ environment:
+ - PORT=3080
+ - MONGO_URI=mongodb://mongodb:27017/chatgpt-clone
+ - OPENAI_KEY=""
+ - CHATGPT_TOKEN=""
+ - BING_TOKEN=""
+ ports:
+ - "9000:3080"
+ volumes:
+ - ./api:/api
+ - /api/node_modules
+ depends_on:
+ - mongodb
+ networks:
+ - webappnetwork
+ mongodb:
+ image: mongo
+ restart: always
+ container_name: mongodb
+ volumes:
+ - ./data-node:/data/db
+ ports:
+ - 27020:27017
+ command: mongod --noauth
+ networks:
+ - webappnetwork
+
+networks:
+ webappnetwork:
+ driver: bridge
\ No newline at end of file
diff --git a/public/use_case.png b/images/use_case.png
similarity index 100%
rename from public/use_case.png
rename to images/use_case.png
diff --git a/public/use_case2.png b/images/use_case2.png
similarity index 100%
rename from public/use_case2.png
rename to images/use_case2.png
diff --git a/images/use_case3.png b/images/use_case3.png
new file mode 100644
index 0000000000..093c872532
Binary files /dev/null and b/images/use_case3.png differ
diff --git a/models/index.js b/models/index.js
deleted file mode 100644
index 7b77a7c79e..0000000000
--- a/models/index.js
+++ /dev/null
@@ -1,12 +0,0 @@
-const { saveMessage, deleteMessages } = require('./Message');
-const { getCustomGpts, updateCustomGpt, deleteCustomGpts } = require('./CustomGpt');
-const { saveConvo } = require('./Conversation');
-
-module.exports = {
- saveMessage,
- deleteMessages,
- saveConvo,
- getCustomGpts,
- updateCustomGpt,
- deleteCustomGpts
-};
diff --git a/nodemon.json b/nodemon.json
deleted file mode 100644
index 69b29e7181..0000000000
--- a/nodemon.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "ignore": [
- "data/"
- ]
-}
\ No newline at end of file
diff --git a/src/components/Models/ModelItem.jsx b/src/components/Models/ModelItem.jsx
deleted file mode 100644
index 4b0e1713d0..0000000000
--- a/src/components/Models/ModelItem.jsx
+++ /dev/null
@@ -1,29 +0,0 @@
-import React from 'react';
-import { DropdownMenuRadioItem } from '../ui/DropdownMenu.tsx';
-import { DialogTrigger } from '../ui/Dialog.tsx';
-
-export default function ModelItem({ modelName, value }) {
- if (value === 'chatgptCustom') {
- return (
-
-
- {modelName}
- $
-
-
- );
- }
-
- return (
-
- {modelName}
- {value === 'chatgpt' && $}
-
- );
-}