From af3d74b104daf4cf33f0842dfa881a1fa4b38feb Mon Sep 17 00:00:00 2001 From: Wentao Lyu <35-wentao.lyu@users.noreply.git.stereye.tech> Date: Tue, 28 Mar 2023 20:36:21 +0800 Subject: [PATCH] refactor: nav and search. feat: use recoil to replace redux feat: use react-native THIS IS NOT FINISHED. DONT USE THIS --- client/index.js | 14 +- client/package.json | 2 + client/src/App.jsx | 75 +++-- .../components/Conversations/Conversation.jsx | 206 +++++++----- .../components/Conversations/DeleteButton.jsx | 29 +- client/src/components/Conversations/Pages.jsx | 4 +- client/src/components/Conversations/index.jsx | 23 +- .../src/components/MessageHandler/index.jsx | 305 ++++++++++++++++++ client/src/components/Nav/ClearConvos.jsx | 33 +- client/src/components/Nav/Logout.jsx | 12 +- client/src/components/Nav/MobileNav.jsx | 30 +- client/src/components/Nav/NavLinks.jsx | 12 +- client/src/components/Nav/NewChat.jsx | 20 +- client/src/components/Nav/SearchBar.jsx | 33 +- client/src/components/Nav/index.jsx | 161 +++++---- client/src/routes/Chat.jsx | 67 ++++ client/src/routes/Root.jsx | 29 ++ client/src/store/conversation.js | 106 ++++++ client/src/store/conversations.js | 27 ++ client/src/store/index.js | 35 +- client/src/store/models.js | 80 +++++ client/src/store/search.js | 25 ++ client/src/store/submission.js | 37 +++ client/src/store/user.js | 17 + client/src/{store => store2}/convoSlice.js | 0 client/src/store2/index.js | 22 ++ client/src/{store => store2}/messageSlice.js | 0 client/src/{store => store2}/modelSlice.js | 0 client/src/{store => store2}/searchSlice.js | 0 client/src/{store => store2}/submitSlice.js | 0 client/src/{store => store2}/textSlice.js | 0 client/src/{store => store2}/userReducer.js | 0 client/src/utils/handleSubmit.js | 211 +++++------- 33 files changed, 1142 insertions(+), 473 deletions(-) create mode 100644 client/src/components/MessageHandler/index.jsx create mode 100644 client/src/routes/Chat.jsx create mode 100644 client/src/routes/Root.jsx create mode 100644 client/src/store/conversation.js create mode 100644 client/src/store/conversations.js create mode 100644 client/src/store/models.js create mode 100644 client/src/store/search.js create mode 100644 client/src/store/submission.js create mode 100644 client/src/store/user.js rename client/src/{store => store2}/convoSlice.js (100%) create mode 100644 client/src/store2/index.js rename client/src/{store => store2}/messageSlice.js (100%) rename client/src/{store => store2}/modelSlice.js (100%) rename client/src/{store => store2}/searchSlice.js (100%) rename client/src/{store => store2}/submitSlice.js (100%) rename client/src/{store => store2}/textSlice.js (100%) rename client/src/{store => store2}/userReducer.js (100%) 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 : (