From 4eeadddfe627830ed941239afd19eb141e5a1995 Mon Sep 17 00:00:00 2001 From: Danny Avila Date: Fri, 8 Aug 2025 22:44:58 -0400 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=AE=20fix:=20Artifacts=20`readOnly`=20?= =?UTF-8?q?to=20Re-render=20when=20Expected=20(#8954)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Artifacts/ArtifactCodeEditor.tsx | 26 +++++++++---------- .../src/components/Artifacts/ArtifactTabs.tsx | 6 ++--- client/src/components/Artifacts/Artifacts.tsx | 2 -- client/src/hooks/Artifacts/useArtifacts.ts | 1 - 4 files changed, 14 insertions(+), 21 deletions(-) diff --git a/client/src/components/Artifacts/ArtifactCodeEditor.tsx b/client/src/components/Artifacts/ArtifactCodeEditor.tsx index 5d163f78f7..62f2dc4e85 100644 --- a/client/src/components/Artifacts/ArtifactCodeEditor.tsx +++ b/client/src/components/Artifacts/ArtifactCodeEditor.tsx @@ -1,5 +1,5 @@ import debounce from 'lodash/debounce'; -import React, { memo, useEffect, useMemo, useCallback, useState } from 'react'; +import React, { useMemo, useState, useEffect, useCallback } from 'react'; import { useSandpack, SandpackCodeEditor, @@ -10,8 +10,8 @@ import type { SandpackBundlerFile } from '@codesandbox/sandpack-client'; import type { CodeEditorRef } from '@codesandbox/sandpack-react'; import type { ArtifactFiles, Artifact } from '~/common'; import { useEditArtifact, useGetStartupConfig } from '~/data-provider'; +import { useEditorContext, useArtifactsContext } from '~/Providers'; import { sharedFiles, sharedOptions } from '~/utils/artifacts'; -import { useEditorContext } from '~/Providers'; const createDebouncedMutation = ( callback: (params: { @@ -29,7 +29,7 @@ const CodeEditor = ({ editorRef, }: { fileKey: string; - readOnly: boolean; + readOnly?: boolean; artifact: Artifact; editorRef: React.MutableRefObject; }) => { @@ -112,33 +112,32 @@ const CodeEditor = ({ ); }; -export const ArtifactCodeEditor = memo(function ({ +export const ArtifactCodeEditor = function ({ files, fileKey, template, artifact, editorRef, sharedProps, - isSubmitting, }: { fileKey: string; artifact: Artifact; files: ArtifactFiles; - isSubmitting: boolean; template: SandpackProviderProps['template']; sharedProps: Partial; editorRef: React.MutableRefObject; }) { const { data: config } = useGetStartupConfig(); + const { isSubmitting } = useArtifactsContext(); const options: typeof sharedOptions = useMemo(() => { if (!config) { return sharedOptions; @@ -148,6 +147,10 @@ export const ArtifactCodeEditor = memo(function ({ bundlerURL: template === 'static' ? config.staticBundlerURL : config.bundlerURL, }; }, [config, template]); + const [readOnly, setReadOnly] = useState(isSubmitting ?? false); + useEffect(() => { + setReadOnly(isSubmitting ?? false); + }, [isSubmitting]); if (Object.keys(files).length === 0) { return null; @@ -164,12 +167,7 @@ export const ArtifactCodeEditor = memo(function ({ {...sharedProps} template={template} > - + ); -}); +}; diff --git a/client/src/components/Artifacts/ArtifactTabs.tsx b/client/src/components/Artifacts/ArtifactTabs.tsx index 685808873f..a8792410d0 100644 --- a/client/src/components/Artifacts/ArtifactTabs.tsx +++ b/client/src/components/Artifacts/ArtifactTabs.tsx @@ -2,12 +2,12 @@ import { useRef, useEffect } from 'react'; import * as Tabs from '@radix-ui/react-tabs'; import type { SandpackPreviewRef, CodeEditorRef } from '@codesandbox/sandpack-react'; import type { Artifact } from '~/common'; +import { useEditorContext, useArtifactsContext } from '~/Providers'; import useArtifactProps from '~/hooks/Artifacts/useArtifactProps'; import { useAutoScroll } from '~/hooks/Artifacts/useAutoScroll'; import { ArtifactCodeEditor } from './ArtifactCodeEditor'; import { useGetStartupConfig } from '~/data-provider'; import { ArtifactPreview } from './ArtifactPreview'; -import { useEditorContext } from '~/Providers'; import { cn } from '~/utils'; export default function ArtifactTabs({ @@ -15,14 +15,13 @@ export default function ArtifactTabs({ isMermaid, editorRef, previewRef, - isSubmitting, }: { artifact: Artifact; isMermaid: boolean; - isSubmitting: boolean; editorRef: React.MutableRefObject; previewRef: React.MutableRefObject; }) { + const { isSubmitting } = useArtifactsContext(); const { currentCode, setCurrentCode } = useEditorContext(); const { data: startupConfig } = useGetStartupConfig(); const lastIdRef = useRef(null); @@ -52,7 +51,6 @@ export default function ArtifactTabs({ artifact={artifact} editorRef={editorRef} sharedProps={sharedProps} - isSubmitting={isSubmitting} /> } previewRef={previewRef as React.MutableRefObject} /> diff --git a/client/src/hooks/Artifacts/useArtifacts.ts b/client/src/hooks/Artifacts/useArtifacts.ts index 402c4dffe3..55248ffa44 100644 --- a/client/src/hooks/Artifacts/useArtifacts.ts +++ b/client/src/hooks/Artifacts/useArtifacts.ts @@ -135,7 +135,6 @@ export default function useArtifacts() { isMermaid, setActiveTab, currentIndex, - isSubmitting, cycleArtifact, currentArtifact, orderedArtifactIds,