Skip to content

Commit b7b575c

Browse files
TheodoreSpeaksTheodore Li
andauthored
fix(ui) reduce redundant rerenders (#3593)
* Improve rerendering of resource view * Lint fix * Remove console log * Fix panel logic --------- Co-authored-by: Theodore Li <theo@sim.ai>
1 parent aad620c commit b7b575c

File tree

4 files changed

+28
-15
lines changed

4 files changed

+28
-15
lines changed

apps/sim/app/workspace/[workspaceId]/home/components/mothership-view/components/resource-content/resource-content.tsx

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use client'
22

3-
import { lazy, Suspense, useCallback, useEffect, useMemo } from 'react'
3+
import { lazy, memo, Suspense, useCallback, useEffect, useMemo } from 'react'
44
import { createLogger } from '@sim/logger'
55
import { Square } from 'lucide-react'
66
import { useRouter } from 'next/navigation'
@@ -51,7 +51,11 @@ interface ResourceContentProps {
5151
* Handles table, file, and workflow resource types with appropriate
5252
* embedded rendering for each.
5353
*/
54-
export function ResourceContent({ workspaceId, resource, previewMode }: ResourceContentProps) {
54+
export const ResourceContent = memo(function ResourceContent({
55+
workspaceId,
56+
resource,
57+
previewMode,
58+
}: ResourceContentProps) {
5559
switch (resource.type) {
5660
case 'table':
5761
return <Table key={resource.id} workspaceId={workspaceId} tableId={resource.id} embedded />
@@ -84,7 +88,7 @@ export function ResourceContent({ workspaceId, resource, previewMode }: Resource
8488
default:
8589
return null
8690
}
87-
}
91+
})
8892

8993
interface ResourceActionsProps {
9094
workspaceId: string
@@ -303,10 +307,12 @@ interface EmbeddedWorkflowProps {
303307

304308
function EmbeddedWorkflow({ workspaceId, workflowId }: EmbeddedWorkflowProps) {
305309
const workflowExists = useWorkflowRegistry((state) => Boolean(state.workflows[workflowId]))
306-
const hydrationPhase = useWorkflowRegistry((state) => state.hydration.phase)
307-
const hydrationWorkflowId = useWorkflowRegistry((state) => state.hydration.workflowId)
308-
const isMetadataLoaded = hydrationPhase !== 'idle' && hydrationPhase !== 'metadata-loading'
309-
const hasLoadError = hydrationPhase === 'error' && hydrationWorkflowId === workflowId
310+
const isMetadataLoaded = useWorkflowRegistry(
311+
(state) => state.hydration.phase !== 'idle' && state.hydration.phase !== 'metadata-loading'
312+
)
313+
const hasLoadError = useWorkflowRegistry(
314+
(state) => state.hydration.phase === 'error' && state.hydration.workflowId === workflowId
315+
)
310316

311317
if (!isMetadataLoaded) return LOADING_SKELETON
312318

apps/sim/app/workspace/[workspaceId]/home/components/mothership-view/mothership-view.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use client'
22

3-
import { useCallback, useEffect, useState } from 'react'
3+
import { memo, useCallback, useEffect, useState } from 'react'
44
import { cn } from '@/lib/core/utils/cn'
55
import { getFileExtension } from '@/lib/uploads/utils/file-utils'
66
import type { PreviewMode } from '@/app/workspace/[workspaceId]/files/components/file-viewer'
@@ -34,7 +34,7 @@ interface MothershipViewProps {
3434
className?: string
3535
}
3636

37-
export function MothershipView({
37+
export const MothershipView = memo(function MothershipView({
3838
workspaceId,
3939
chatId,
4040
resources,
@@ -99,4 +99,4 @@ export function MothershipView({
9999
</div>
100100
</div>
101101
)
102-
}
102+
})

apps/sim/app/workspace/[workspaceId]/home/home.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,6 @@ export function Home({ chatId }: HomeProps = {}) {
167167

168168
const handleResourceEvent = useCallback(() => {
169169
if (isResourceCollapsedRef.current) {
170-
/** Auto-collapse sidebar to give resource panel maximum width for immersive experience */
171170
const { isCollapsed, toggleCollapsed } = useSidebarStore.getState()
172171
if (!isCollapsed) toggleCollapsed()
173172
setIsResourceCollapsed(false)

apps/sim/app/workspace/[workspaceId]/home/hooks/use-chat.ts

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -682,8 +682,7 @@ export function useChat(
682682
readArgs?.path as string | undefined,
683683
tc.result.output
684684
)
685-
if (resource) {
686-
addResource(resource)
685+
if (resource && addResource(resource)) {
687686
onResourceEventRef.current?.()
688687
}
689688
}
@@ -694,12 +693,21 @@ export function useChat(
694693
case 'resource_added': {
695694
const resource = parsed.resource
696695
if (resource?.type && resource?.id) {
697-
addResource(resource)
696+
const wasAdded = addResource(resource)
698697
invalidateResourceQueries(queryClient, workspaceId, resource.type, resource.id)
699698

699+
if (!wasAdded && activeResourceIdRef.current !== resource.id) {
700+
setActiveResourceId(resource.id)
701+
}
700702
onResourceEventRef.current?.()
703+
701704
if (resource.type === 'workflow') {
702-
if (ensureWorkflowInRegistry(resource.id, resource.title, workspaceId)) {
705+
const wasRegistered = ensureWorkflowInRegistry(
706+
resource.id,
707+
resource.title,
708+
workspaceId
709+
)
710+
if (wasAdded && wasRegistered) {
703711
useWorkflowRegistry.getState().setActiveWorkflow(resource.id)
704712
} else {
705713
useWorkflowRegistry.getState().loadWorkflowState(resource.id)

0 commit comments

Comments
 (0)