Skip to content

Commit d01b5d1

Browse files
authored
fix: pass ref explicitly using iframeProps (#33)
1 parent 0569171 commit d01b5d1

File tree

4 files changed

+18
-24
lines changed

4 files changed

+18
-24
lines changed

packages/client/src/components/HTMLResourceRenderer.tsx

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,19 @@ export type HTMLResourceRendererProps = {
77
resource: Partial<Resource>;
88
onUIAction?: (result: UIActionResult) => Promise<unknown>;
99
style?: React.CSSProperties;
10-
iframeProps?: Omit<React.HTMLAttributes<HTMLIFrameElement>, 'src' | 'srcDoc' | 'ref' | 'style'>;
10+
iframeProps?: Omit<React.HTMLAttributes<HTMLIFrameElement>, 'src' | 'srcDoc' | 'style'> & {
11+
ref?: React.RefObject<HTMLIFrameElement>;
12+
};
1113
};
1214

13-
export const HTMLResourceRenderer = React.forwardRef<
14-
HTMLIFrameElement | null,
15-
HTMLResourceRendererProps
16-
>(({ resource, onUIAction, style, iframeProps }, ref) => {
15+
export const HTMLResourceRenderer = ({
16+
resource,
17+
onUIAction,
18+
style,
19+
iframeProps,
20+
}: HTMLResourceRendererProps) => {
1721
const iframeRef = useRef<HTMLIFrameElement | null>(null);
18-
useImperativeHandle(ref, () => iframeRef.current as HTMLIFrameElement);
22+
useImperativeHandle(iframeProps?.ref, () => iframeRef.current as HTMLIFrameElement);
1923

2024
const { error, iframeSrc, iframeRenderMode, htmlString } = useMemo(
2125
() => processHTMLResource(resource),
@@ -78,6 +82,6 @@ export const HTMLResourceRenderer = React.forwardRef<
7882
}
7983

8084
return <p className="text-gray-500">Initializing HTML resource display...</p>;
81-
});
85+
};
8286

8387
HTMLResourceRenderer.displayName = 'HTMLResourceRenderer';

packages/client/src/components/UIResourceRenderer.tsx

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import React from 'react';
21
import type { Resource } from '@modelcontextprotocol/sdk/types.js';
32
import { ResourceContentType, UIActionResult } from '../types';
43
import { HTMLResourceRenderer, HTMLResourceRendererProps } from './HTMLResourceRenderer';
@@ -29,10 +28,7 @@ function getContentType(resource: Partial<Resource>): ResourceContentType | unde
2928
}
3029
}
3130

32-
export const UIResourceRenderer = React.forwardRef<
33-
HTMLIFrameElement | null,
34-
UIResourceRendererProps
35-
>((props, ref) => {
31+
export const UIResourceRenderer = (props: UIResourceRendererProps) => {
3632
const { resource, onUIAction, supportedContentTypes, htmlProps, remoteDomProps } = props;
3733
const contentType = getContentType(resource);
3834

@@ -42,15 +38,9 @@ export const UIResourceRenderer = React.forwardRef<
4238

4339
switch (contentType) {
4440
case 'rawHtml':
45-
case 'externalUrl':
46-
return (
47-
<HTMLResourceRenderer
48-
resource={resource}
49-
onUIAction={onUIAction}
50-
{...htmlProps}
51-
ref={ref}
52-
/>
53-
);
41+
case 'externalUrl': {
42+
return <HTMLResourceRenderer resource={resource} onUIAction={onUIAction} {...htmlProps} />;
43+
}
5444
case 'remoteDom':
5545
return (
5646
<RemoteDOMResourceRenderer
@@ -63,6 +53,6 @@ export const UIResourceRenderer = React.forwardRef<
6353
default:
6454
return <p className="text-red-500">Unsupported resource type.</p>;
6555
}
66-
});
56+
};
6757

6858
UIResourceRenderer.displayName = 'UIResourceRenderer';

packages/client/src/components/__tests__/HTMLResourceRenderer.test.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,7 @@ describe('HTMLResource iframe communication', () => {
291291

292292
it('should pass ref to iframe', () => {
293293
const ref = React.createRef<HTMLIFrameElement>();
294-
render(<HTMLResourceRenderer resource={mockResourceBaseForUIActionTests} ref={ref} />);
294+
render(<HTMLResourceRenderer resource={mockResourceBaseForUIActionTests} iframeProps={{ ref }} />);
295295
expect(ref.current).toBeInTheDocument();
296296
});
297297

packages/client/src/components/__tests__/UIResourceRenderer.unmocked.test.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ describe('UIResourceRenderer', () => {
1212
};
1313
it('should pass ref to HTMLResourceRenderer', () => {
1414
const ref = React.createRef<HTMLIFrameElement>();
15-
render(<UIResourceRenderer resource={testResource} ref={ref} />);
15+
render(<UIResourceRenderer resource={testResource} htmlProps={{ iframeProps: { ref } }} />);
1616
expect(ref.current).toBeInTheDocument();
1717
});
1818
});

0 commit comments

Comments
 (0)