Skip to content

Commit 1542924

Browse files
author
Theodore Li
committed
Improve rerendering of resource view
1 parent f077751 commit 1542924

File tree

4 files changed

+33
-16
lines changed

4 files changed

+33
-16
lines changed

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

Lines changed: 14 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,13 @@ 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) =>
315+
state.hydration.phase === 'error' && state.hydration.workflowId === workflowId
316+
)
310317

311318
if (!isMetadataLoaded) return LOADING_SKELETON
312319

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: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -545,6 +545,7 @@ export function useChat(
545545
break
546546
}
547547
case 'tool_result': {
548+
console.log('[tool_result] received', parsed)
548549
const id = parsed.toolCallId || getPayloadData(parsed)?.id
549550
if (!id) break
550551
const idx = toolMap.get(id)
@@ -582,8 +583,7 @@ export function useChat(
582583
readArgs?.path as string | undefined,
583584
tc.result.output
584585
)
585-
if (resource) {
586-
addResource(resource)
586+
if (resource && addResource(resource)) {
587587
onResourceEventRef.current?.()
588588
}
589589
}
@@ -594,12 +594,23 @@ export function useChat(
594594
case 'resource_added': {
595595
const resource = parsed.resource
596596
if (resource?.type && resource?.id) {
597-
addResource(resource)
597+
const wasAdded = addResource(resource)
598598
invalidateResourceQueries(queryClient, workspaceId, resource.type, resource.id)
599599

600-
onResourceEventRef.current?.()
600+
if (!wasAdded) {
601+
if (activeResourceIdRef.current !== resource.id) {
602+
setActiveResourceId(resource.id)
603+
onResourceEventRef.current?.()
604+
}
605+
} else {
606+
onResourceEventRef.current?.()
607+
}
608+
601609
if (resource.type === 'workflow') {
602-
if (ensureWorkflowInRegistry(resource.id, resource.title, workspaceId)) {
610+
if (
611+
wasAdded &&
612+
ensureWorkflowInRegistry(resource.id, resource.title, workspaceId)
613+
) {
603614
useWorkflowRegistry.getState().setActiveWorkflow(resource.id)
604615
} else {
605616
useWorkflowRegistry.getState().loadWorkflowState(resource.id)

0 commit comments

Comments
 (0)