From fa0032d91d85959efe6f39e446a79e1d9b70f7bd Mon Sep 17 00:00:00 2001 From: Danny Avila Date: Fri, 23 Aug 2024 23:53:06 -0400 Subject: [PATCH] feat: reset artifact state on conversation change --- client/src/components/Artifacts/Artifacts.tsx | 42 +++++++++++++------ client/src/components/Chat/Presentation.tsx | 2 +- 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/client/src/components/Artifacts/Artifacts.tsx b/client/src/components/Artifacts/Artifacts.tsx index 0f67a7db33..2818bb4d72 100644 --- a/client/src/components/Artifacts/Artifacts.tsx +++ b/client/src/components/Artifacts/Artifacts.tsx @@ -1,8 +1,8 @@ import React, { useMemo, useState, useEffect, useRef } from 'react'; -import { useRecoilState } from 'recoil'; import * as Tabs from '@radix-ui/react-tabs'; import { Sandpack } from '@codesandbox/sandpack-react'; -import { removeNullishValues, Constants } from 'librechat-data-provider'; +import { removeNullishValues } from 'librechat-data-provider'; +import { useRecoilState, useRecoilValue, useResetRecoilState } from 'recoil'; import { SandpackPreview, SandpackProvider } from '@codesandbox/sandpack-react/unstyled'; import type { Artifact } from '~/common'; import { @@ -62,12 +62,13 @@ export function ArtifactPreview({ export default function Artifacts() { const { isSubmitting, latestMessage, conversation } = useChatContext(); - const conversationId = useMemo(() => conversation?.conversationId ?? '', [conversation]); const [isVisible, setIsVisible] = useState(false); const [activeTab, setActiveTab] = useState('preview'); - const [artifacts, setArtifacts] = useRecoilState(store.artifactsState); + const artifacts = useRecoilValue(store.artifactsState); const [currentArtifactId, setCurrentArtifactId] = useRecoilState(store.currentArtifactId); + const resetArtifacts = useResetRecoilState(store.artifactsState); + const resetCurrentArtifactId = useResetRecoilState(store.currentArtifactId); const orderedArtifactIds = useMemo(() => { return Object.keys(artifacts ?? {}).sort( @@ -78,18 +79,33 @@ export default function Artifacts() { const lastRunMessageIdRef = useRef(null); const lastContentRef = useRef(null); + // Use a ref to keep track of the previous conversation ID + const prevConversationIdRef = useRef(null); + + useEffect(() => { + const resetState = () => { + resetArtifacts(); + resetCurrentArtifactId(); + prevConversationIdRef.current = conversation?.conversationId ?? null; + lastRunMessageIdRef.current = null; + lastContentRef.current = null; + }; + if ( + conversation && + conversation.conversationId !== prevConversationIdRef.current && + prevConversationIdRef.current != null + ) { + resetState(); + } else if (conversation && conversation.conversationId === 'new') { + resetState(); + } + prevConversationIdRef.current = conversation?.conversationId ?? null; + }, [conversation, resetArtifacts, resetCurrentArtifactId]); + useEffect(() => { setIsVisible(true); }, []); - useEffect(() => { - if (!conversationId || conversationId === '' || conversationId === Constants.NEW_CONVO) { - setArtifacts(null); - setCurrentArtifactId(null); - return; - } - }, [conversationId, setArtifacts, setCurrentArtifactId]); - useEffect(() => { if (orderedArtifactIds.length > 0) { const latestArtifactId = orderedArtifactIds[orderedArtifactIds.length - 1]; @@ -205,7 +221,7 @@ export default function Artifacts() { }\`\`\``} /> - + {/* Footer */} diff --git a/client/src/components/Chat/Presentation.tsx b/client/src/components/Chat/Presentation.tsx index 632841d1de..c7293ff310 100644 --- a/client/src/components/Chat/Presentation.tsx +++ b/client/src/components/Chat/Presentation.tsx @@ -96,7 +96,7 @@ export default function Presentation({ defaultCollapsed={defaultCollapsed} fullPanelCollapse={fullCollapse} artifacts={ - codeArtifacts != null && Object.keys(artifacts ?? {}).length > 0 ? : null + codeArtifacts === true && Object.keys(artifacts ?? {}).length > 0 ? : null } >