From ae150b440bdf0466d854a5ba536a94c30dccd55e Mon Sep 17 00:00:00 2001 From: Adithya Krishna Date: Fri, 27 Mar 2026 17:54:04 +0530 Subject: [PATCH 1/2] chore: fix rerenders on files --- .../components/file-viewer/file-viewer.tsx | 24 +- .../components/file-viewer/preview-panel.tsx | 21 +- .../files-list-context-menu.tsx | 5 +- .../workspace/[workspaceId]/files/files.tsx | 529 +++++++++++------- 4 files changed, 367 insertions(+), 212 deletions(-) diff --git a/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/file-viewer.tsx b/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/file-viewer.tsx index 5075ee61ba..10be5a8770 100644 --- a/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/file-viewer.tsx +++ b/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/file-viewer.tsx @@ -1,6 +1,6 @@ 'use client' -import { useCallback, useEffect, useRef, useState } from 'react' +import { memo, useCallback, useEffect, useRef, useState } from 'react' import { createLogger } from '@sim/logger' import { Skeleton } from '@/components/emcn' import { cn } from '@/lib/core/utils/cn' @@ -183,6 +183,8 @@ function TextEditor({ } = useWorkspaceFileContent(workspaceId, file.id, file.key, file.type === 'text/x-pptxgenjs') const updateContent = useUpdateWorkspaceFileContent() + const updateContentRef = useRef(updateContent) + updateContentRef.current = updateContent const [content, setContent] = useState('') const [savedContent, setSavedContent] = useState('') @@ -230,14 +232,14 @@ function TextEditor({ const currentContent = contentRef.current if (currentContent === savedContentRef.current) return - await updateContent.mutateAsync({ + await updateContentRef.current.mutateAsync({ workspaceId, fileId: file.id, content: currentContent, }) setSavedContent(currentContent) savedContentRef.current = currentContent - }, [workspaceId, file.id, updateContent]) + }, [workspaceId, file.id]) const { saveStatus, saveImmediately, isDirty } = useAutosave({ content, @@ -402,7 +404,7 @@ function TextEditor({ ) } -function IframePreview({ file }: { file: WorkspaceFileRecord }) { +const IframePreview = memo(function IframePreview({ file }: { file: WorkspaceFileRecord }) { const serveUrl = `/api/files/serve/${encodeURIComponent(file.key)}?context=workspace` return ( @@ -417,9 +419,9 @@ function IframePreview({ file }: { file: WorkspaceFileRecord }) { /> ) -} +}) -function ImagePreview({ file }: { file: WorkspaceFileRecord }) { +const ImagePreview = memo(function ImagePreview({ file }: { file: WorkspaceFileRecord }) { const serveUrl = `/api/files/serve/${encodeURIComponent(file.key)}?context=workspace` return ( @@ -432,7 +434,7 @@ function ImagePreview({ file }: { file: WorkspaceFileRecord }) { /> ) -} +}) const pptxSlideCache = new Map() @@ -701,7 +703,11 @@ function PptxPreview({ ) } -function UnsupportedPreview({ file }: { file: WorkspaceFileRecord }) { +const UnsupportedPreview = memo(function UnsupportedPreview({ + file, +}: { + file: WorkspaceFileRecord +}) { const ext = getFileExtension(file.name) return ( @@ -714,4 +720,4 @@ function UnsupportedPreview({ file }: { file: WorkspaceFileRecord }) {

) -} +}) diff --git a/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/preview-panel.tsx b/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/preview-panel.tsx index 692cb510ac..b3c9666d76 100644 --- a/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/preview-panel.tsx +++ b/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/preview-panel.tsx @@ -42,7 +42,12 @@ interface PreviewPanelProps { isStreaming?: boolean } -export function PreviewPanel({ content, mimeType, filename, isStreaming }: PreviewPanelProps) { +export const PreviewPanel = memo(function PreviewPanel({ + content, + mimeType, + filename, + isStreaming, +}: PreviewPanelProps) { const previewType = resolvePreviewType(mimeType, filename) if (previewType === 'markdown') @@ -52,7 +57,7 @@ export function PreviewPanel({ content, mimeType, filename, isStreaming }: Previ if (previewType === 'svg') return return null -} +}) const REMARK_PLUGINS = [remarkGfm, remarkBreaks] @@ -197,7 +202,7 @@ const MarkdownPreview = memo(function MarkdownPreview({ ) }) -function HtmlPreview({ content }: { content: string }) { +const HtmlPreview = memo(function HtmlPreview({ content }: { content: string }) { return (