diff --git a/client/index.js b/client/index.js index 6e1b2c1620..f4cf5cb234 100644 --- a/client/index.js +++ b/client/index.js @@ -1,19 +1,21 @@ import React from 'react'; import { createRoot } from 'react-dom/client'; -import { Provider } from 'react-redux'; -import { store } from './src/store'; +// import { Provider } from 'react-redux'; +// import { store } from './src/store'; +import { RecoilRoot } from 'recoil'; + import { ThemeProvider } from './src/hooks/ThemeContext'; import App from './src/App'; import './src/style.css'; -import './src/mobile.css' +import './src/mobile.css'; const container = document.getElementById('root'); const root = createRoot(container); root.render( - + - -); \ No newline at end of file + +); diff --git a/client/package.json b/client/package.json index 1357b72066..6bd5b4fdd6 100644 --- a/client/package.json +++ b/client/package.json @@ -36,9 +36,11 @@ "react-lazy-load": "^4.0.1", "react-markdown": "^8.0.5", "react-redux": "^8.0.5", + "react-router-dom": "^6.9.0", "react-string-replace": "^1.1.0", "react-textarea-autosize": "^8.4.0", "react-transition-group": "^4.4.5", + "recoil": "^0.7.7", "rehype-highlight": "^6.0.0", "rehype-katex": "^6.0.2", "rehype-raw": "^6.1.1", diff --git a/client/src/App.jsx b/client/src/App.jsx index 6ee3be2a6b..07b8df49b8 100644 --- a/client/src/App.jsx +++ b/client/src/App.jsx @@ -1,53 +1,52 @@ import React, { useEffect, useState } from 'react'; -import Messages from './components/Messages'; -import Landing from './components/Main/Landing'; -import TextChat from './components/Main/TextChat'; -import Nav from './components/Nav'; -import MobileNav from './components/Nav/MobileNav'; -import useDocumentTitle from '~/hooks/useDocumentTitle'; -import { useSelector, useDispatch } from 'react-redux'; +import { createBrowserRouter, RouterProvider, Navigate } from 'react-router-dom'; +import Root from './routes/Root'; +// import Chat from './routes/Chat'; +import store from './store'; import userAuth from './utils/userAuth'; -import { setUser } from './store/userReducer'; -import { setSearchState } from './store/searchSlice'; +import { useRecoilState, useSetRecoilState } from 'recoil'; + import axios from 'axios'; -const App = () => { - const dispatch = useDispatch(); +const router = createBrowserRouter([ + { + path: '/', + element: , + children: [ + { + index: true, + element: ( + + ) + }, + { + path: 'chat/:conversationId', + element: null // + } + ] + } +]); - const { messages, messageTree } = useSelector((state) => state.messages); - const { user } = useSelector((state) => state.user); - const { title } = useSelector((state) => state.convo); - const [navVisible, setNavVisible] = useState(false); - useDocumentTitle(title); +const App = () => { + const [user, setUser] = useRecoilState(store.user); + const setIsSearchEnabled = useSetRecoilState(store.isSearchEnabled); useEffect(() => { - axios.get('/api/search/enable').then((res) => { console.log(res.data); dispatch(setSearchState(res.data))}); + axios.get('/api/search/enable').then(res => { + setIsSearchEnabled(res.data); + }); userAuth() - .then((user) => dispatch(setUser(user))) - .catch((err) => console.log(err)); + .then(user => setUser(user)) + .catch(err => console.log(err)); }, []); if (user) return ( -
-
- {conversationId === id ? ( + {currentConversation?.conversationId === conversationId ? (
{ - dispatch(setMessages([])); - dispatch(removeConvo(conversationId)); - dispatch(setNewConvo()); - dispatch(setSubmission({})); - retainView(); - } - ); + const currentConversation = useRecoilValue(store.conversation) || {}; + const { newConversation } = store.useConversation(); + const { refreshConversations } = store.useConversations(); + const { trigger } = manualSWR(`/api/convos/clear`, 'post', () => { + if (currentConversation?.conversationId == conversationId) newConversation(); + refreshConversations(); + retainView(); + }); const clickHandler = () => trigger({ conversationId }); const handler = renaming ? cancelHandler : clickHandler; @@ -29,7 +24,7 @@ export default function DeleteButton({ conversationId, renaming, cancelHandler, className="p-1 hover:text-white" onClick={handler} > - { renaming ? : } + {renaming ? : } ); } diff --git a/client/src/components/Conversations/Pages.jsx b/client/src/components/Conversations/Pages.jsx index 1001ee8362..91b93388b4 100644 --- a/client/src/components/Conversations/Pages.jsx +++ b/client/src/components/Conversations/Pages.jsx @@ -1,12 +1,12 @@ import React from 'react'; export default function Pages({ pageNumber, pages, nextPage, previousPage }) { - const clickHandler = (func) => async (e) => { + const clickHandler = func => async e => { e.preventDefault(); await func(); }; - return ( + return pageNumber == 1 && pages == 1 ? null : (