22
33import { useCallback, useEffect, useMemo, useState } from 'react'
44import { ArrowLeft } from 'lucide-react'
5- import { Badge, Button, Tooltip } from '@/components/emcn'
5+ import { Button, Tooltip } from '@/components/emcn'
66import { redactApiKeys } from '@/lib/core/security/redaction'
77import { cn } from '@/lib/core/utils/cn'
88import { PreviewEditor } from '@/app/workspace/[workspaceId]/w/components/preview/components/preview-editor'
@@ -146,7 +146,6 @@ export function Preview({
146146 initialSelectedBlockId,
147147 autoSelectLeftmost = true,
148148}: PreviewProps) {
149- /** Initialize pinnedBlockId synchronously to ensure sidebar is present from first render */
150149 const [pinnedBlockId, setPinnedBlockId] = useState<string | null>(() => {
151150 if (initialSelectedBlockId) return initialSelectedBlockId
152151 if (autoSelectLeftmost) {
@@ -155,45 +154,38 @@ export function Preview({
155154 return null
156155 })
157156
158- /** Stack for nested workflow navigation. Empty means we're at the root level. */
159157 const [workflowStack, setWorkflowStack] = useState<WorkflowStackEntry[]>([])
160158
161- /** Block executions for the root level */
162159 const rootBlockExecutions = useMemo(() => {
163160 if (providedBlockExecutions) return providedBlockExecutions
164161 if (!rootTraceSpans || !Array.isArray(rootTraceSpans)) return {}
165162 return buildBlockExecutions(rootTraceSpans)
166163 }, [providedBlockExecutions, rootTraceSpans])
167164
168- /** Current block executions - either from stack or root */
169165 const blockExecutions = useMemo(() => {
170166 if (workflowStack.length > 0) {
171167 return workflowStack[workflowStack.length - 1].blockExecutions
172168 }
173169 return rootBlockExecutions
174170 }, [workflowStack, rootBlockExecutions])
175171
176- /** Current workflow state - either from stack or root */
177172 const workflowState = useMemo(() => {
178173 if (workflowStack.length > 0) {
179174 return workflowStack[workflowStack.length - 1].workflowState
180175 }
181176 return rootWorkflowState
182177 }, [workflowStack, rootWorkflowState])
183178
184- /** Whether we're in execution mode (have trace spans/block executions) */
185179 const isExecutionMode = useMemo(() => {
186180 return Object.keys(blockExecutions).length > 0
187181 }, [blockExecutions])
188182
189- /** Handler to drill down into a nested workflow block */
190183 const handleDrillDown = useCallback(
191184 (blockId: string, childWorkflowState: WorkflowState) => {
192185 const blockExecution = blockExecutions[blockId]
193186 const childTraceSpans = extractChildTraceSpans(blockExecution)
194187 const childBlockExecutions = buildBlockExecutions(childTraceSpans)
195188
196- /** Extract workflow name from metadata or use a fallback */
197189 const workflowName = childWorkflowState.metadata?.name || 'Nested Workflow'
198190
199191 setWorkflowStack((prev) => [
@@ -206,20 +198,17 @@ export function Preview({
206198 },
207199 ])
208200
209- /** Set pinned block synchronously to avoid double fitView from sidebar resize */
210201 const leftmostId = getLeftmostBlockId(childWorkflowState)
211202 setPinnedBlockId(leftmostId)
212203 },
213204 [blockExecutions]
214205 )
215206
216- /** Handler to go back up the stack */
217207 const handleGoBack = useCallback(() => {
218208 setWorkflowStack((prev) => prev.slice(0, -1))
219209 setPinnedBlockId(null)
220210 }, [])
221211
222- /** Handlers for node interactions - memoized to prevent unnecessary re-renders */
223212 const handleNodeClick = useCallback((blockId: string) => {
224213 setPinnedBlockId(blockId)
225214 }, [])
@@ -238,7 +227,6 @@ export function Preview({
238227
239228 const isNested = workflowStack.length > 0
240229
241- /** Current workflow name from the top of the stack */
242230 const currentWorkflowName = isNested ? workflowStack[workflowStack.length - 1].workflowName : null
243231
244232 return (
@@ -251,27 +239,26 @@ export function Preview({
251239 )}
252240 >
253241 {isNested && (
254- <div className='absolute top-[12px] left-[12px] z-20 flex items-center gap-[8px ]'>
242+ <div className='absolute top-[12px] left-[12px] z-20 flex items-center gap-[6px ]'>
255243 <Tooltip.Root>
256244 <Tooltip.Trigger asChild>
257245 <Button
258246 variant='ghost'
259247 onClick={handleGoBack}
260- className='flex h-[30px ] items-center gap-[5px] border border-[var(--border)] bg-[var(--surface-2)] px-[10px] hover:bg-[var(--surface-4)]'
248+ className='flex h-[28px ] items-center gap-[5px] rounded-[6px] border border-[var(--border)] bg-[var(--surface-2)] px-[10px] text-[var(--text-secondary)] shadow-sm hover:bg-[var(--surface-4)] hover:text-[var(--text-primary )]'
261249 >
262- <ArrowLeft className='h-[13px ] w-[13px ]' />
263- <span className='font-medium text-[13px ]'>Back</span>
250+ <ArrowLeft className='h-[12px ] w-[12px ]' />
251+ <span className='font-medium text-[12px ]'>Back</span>
264252 </Button>
265253 </Tooltip.Trigger>
266254 <Tooltip.Content side='bottom'>Go back to parent workflow</Tooltip.Content>
267255 </Tooltip.Root>
268256 {currentWorkflowName && (
269- <Badge
270- variant='default'
271- className='max-w-[200px] cursor-default truncate bg-[var(--surface-2)] text-[12px] hover:border-[var(--border)] hover:bg-[var(--surface-2)]'
272- >
273- {currentWorkflowName}
274- </Badge>
257+ <div className='flex h-[28px] max-w-[200px] items-center rounded-[6px] border border-[var(--border)] bg-[var(--surface-2)] px-[10px] shadow-sm'>
258+ <span className='truncate font-medium text-[12px] text-[var(--text-secondary)]'>
259+ {currentWorkflowName}
260+ </span>
261+ </div>
275262 )}
276263 </div>
277264 )}
0 commit comments