diff --git a/src/contexts/ChatContext.tsx b/src/contexts/ChatContext.tsx index ce8268fc4..df2995cd3 100644 --- a/src/contexts/ChatContext.tsx +++ b/src/contexts/ChatContext.tsx @@ -4,6 +4,7 @@ import useWebSocket, { ReadyState } from 'react-use-websocket'; import { JsonValue } from 'react-use-websocket/dist/lib/types'; import { useRouter } from 'next/router'; import { getBackendWebsocketUrl } from '@/utils/backend'; +import { useSession } from 'next-auth/react'; export type Message = { messageId: string; @@ -75,10 +76,15 @@ export const ChatContextProvider = ({ children }: { children: ReactNode }) => { const [connectionStatus, setConnectionStatus] = useState(ReadyState.UNINSTANTIATED); const [lastInitSessionId, setLastInitSessionId] = useState(null); + const [lastAuthStatus, setLastAuthStatus] = useState(null); const queryClient = useQueryClient(); - const shouldConnect = true; // allow logged out to view public sessions + const { status } = useSession(); + // shouldConnect allows logged out to view public sessions, but we want to + // enforce a disconnect and reconnect when the auth status changes, so + // we use the latest cookie state + const shouldConnect = status == lastAuthStatus; const backendUrl = getBackendWebsocketUrl(); const { sendJsonMessage: wsSendMessage, @@ -104,8 +110,19 @@ export const ChatContextProvider = ({ children }: { children: ReactNode }) => { useEffect(() => { // re-initialize on change + if (status === "loading") { + return; + } + let needsReset = false; + if (status != lastAuthStatus) { + setLastAuthStatus(status); + needsReset = true; + } if (sessionId != lastInitSessionId) { - // need to clear the messages when we switch chats + setLastInitSessionId(sessionId); + needsReset = true; + } + if (needsReset) { setMessages([]); setResumeFromMessageId(null); setInsertBeforeMessageId(null); @@ -113,9 +130,8 @@ export const ChatContextProvider = ({ children }: { children: ReactNode }) => { if (sessionId) { wsSendMessage({ actor: 'system', type: 'init', payload: { sessionId } }); } - setLastInitSessionId(sessionId); } - }, [sessionId, wsSendMessage]); // note: don't add lastInitSessionId here + }, [status, sessionId, wsSendMessage]); // note: don't add lastAuthStatus, lastInitSessionId here const onOpen = () => { console.log(`Connected to backend: ${backendUrl}`); diff --git a/src/contexts/ConnectionWrapper.tsx b/src/contexts/ConnectionWrapper.tsx index 2dff2bcf0..1eda562cb 100644 --- a/src/contexts/ConnectionWrapper.tsx +++ b/src/contexts/ConnectionWrapper.tsx @@ -9,8 +9,6 @@ import { lightTheme, } from '@rainbow-me/rainbowkit'; import axios from 'axios'; -import { Session } from 'next-auth'; -import { SessionProvider } from 'next-auth/react'; import { Chain, WagmiConfig, configureChains, createClient, useEnsAvatar } from 'wagmi'; import { goerli, zkSyncTestnet } from 'wagmi/chains'; import { jsonRpcProvider } from 'wagmi/providers/jsonRpc'; @@ -20,7 +18,7 @@ import { getBackendApiUrl } from '@/utils/backend'; import { GetSiweMessageOptions, RainbowKitSiweNextAuthProvider } from '@/utils/rainbowSIWEmod'; import SettingsContext from './SettingsContext'; -const ConnectionWrapper = ({ children, pageProps, useSiwe = true }: any) => { +const ConnectionWrapper = ({ children, useSiwe = true }: any) => { /* Use a fork url cached in the browser localStorage, else use the .env value */ const [forkUrl] = useCachedState( 'forkUrl', @@ -110,7 +108,6 @@ const ConnectionWrapper = ({ children, pageProps, useSiwe = true }: any) => { return ( - {useSiwe && ( { {children} )} - ); }; diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index 7f8393115..5c6ef6946 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -8,6 +8,7 @@ import { CenterProvider } from '@center-inc/react'; import '@rainbow-me/rainbowkit/styles.css'; import { Session } from 'next-auth'; import Layout from '@/components/experimental_/layout/Layout'; +import { SessionProvider } from 'next-auth/react'; /* // disabled dynamic because this causes the query.id useEffect hook to fire twice @@ -46,15 +47,17 @@ export default function App({ theme="light" /> - - - - - - - - - + + + + + + + + + + + );