@@ -19,15 +19,13 @@ import {
19
19
TooltipProvider ,
20
20
TooltipTrigger ,
21
21
} from "components/Tooltip/Tooltip" ;
22
- import { useProxy } from "contexts/ProxyContext" ;
23
22
import {
24
23
ArrowLeftIcon ,
25
24
ChevronDownIcon ,
26
25
LayoutGridIcon ,
27
26
RotateCcwIcon ,
28
27
} from "lucide-react" ;
29
28
import { AppStatusIcon } from "modules/apps/AppStatusIcon" ;
30
- import { getAppHref } from "modules/apps/apps" ;
31
29
import { useAppLink } from "modules/apps/useAppLink" ;
32
30
import { AI_PROMPT_PARAMETER_NAME , type Task } from "modules/tasks/tasks" ;
33
31
import { WorkspaceAppStatus } from "modules/workspaces/WorkspaceAppStatus/WorkspaceAppStatus" ;
@@ -312,17 +310,6 @@ const TaskApps: FC<TaskAppsProps> = ({ task }) => {
312
310
throw new Error ( `Agent for app ${ activeAppId } not found in task workspace` ) ;
313
311
}
314
312
315
- const { proxy } = useProxy ( ) ;
316
- const [ iframeSrc , setIframeSrc ] = useState ( ( ) => {
317
- const src = getAppHref ( activeApp , {
318
- agent,
319
- workspace : task . workspace ,
320
- path : proxy . preferredPathAppURL ,
321
- host : proxy . preferredWildcardHostname ,
322
- } ) ;
323
- return src ;
324
- } ) ;
325
-
326
313
const embeddedApps = apps . filter ( ( app ) => ! app . external ) ;
327
314
const externalApps = apps . filter ( ( app ) => app . external ) ;
328
315
@@ -344,7 +331,6 @@ const TaskApps: FC<TaskAppsProps> = ({ task }) => {
344
331
345
332
e . preventDefault ( ) ;
346
333
setActiveAppId ( app . id ) ;
347
- setIframeSrc ( e . currentTarget . href ) ;
348
334
} }
349
335
/>
350
336
) ) }
@@ -387,11 +373,16 @@ const TaskApps: FC<TaskAppsProps> = ({ task }) => {
387
373
</ div >
388
374
389
375
< div className = "flex-1" >
390
- < iframe
391
- title = { activeApp . display_name ?? activeApp . slug }
392
- className = "w-full h-full border-0"
393
- src = { iframeSrc }
394
- />
376
+ { embeddedApps . map ( ( app ) => {
377
+ return (
378
+ < TaskAppIFrame
379
+ key = { app . id }
380
+ active = { activeAppId === app . id }
381
+ app = { app }
382
+ task = { task }
383
+ />
384
+ ) ;
385
+ } ) }
395
386
</ div >
396
387
</ main >
397
388
) ;
@@ -443,6 +434,37 @@ const TaskAppButton: FC<TaskAppButtonProps> = ({
443
434
) ;
444
435
} ;
445
436
437
+ type TaskAppIFrameProps = {
438
+ task : Task ;
439
+ app : WorkspaceApp ;
440
+ active : boolean ;
441
+ } ;
442
+
443
+ const TaskAppIFrame : FC < TaskAppIFrameProps > = ( { task, app, active } ) => {
444
+ const agent = task . workspace . latest_build . resources
445
+ . flatMap ( ( r ) => r . agents )
446
+ . filter ( ( a ) => ! ! a )
447
+ . find ( ( a ) => a . apps . some ( ( a ) => a . id === app . id ) ) ;
448
+
449
+ if ( ! agent ) {
450
+ throw new Error ( `Agent for app ${ app . id } not found in task workspace` ) ;
451
+ }
452
+
453
+ const link = useAppLink ( app , {
454
+ agent,
455
+ workspace : task . workspace ,
456
+ } ) ;
457
+
458
+ return (
459
+ < iframe
460
+ src = { link . href }
461
+ title = { link . label }
462
+ loading = "eager"
463
+ className = { cn ( [ active ? "block" : "hidden" , "w-full h-full border-0" ] ) }
464
+ />
465
+ ) ;
466
+ } ;
467
+
446
468
export const data = {
447
469
fetchTask : async ( workspaceOwnerUsername : string , workspaceName : string ) => {
448
470
const workspace = await API . getWorkspaceByOwnerAndName (
0 commit comments