0.0.3 • Published 4 months ago

simple-iframe-resizer v0.0.3

Weekly downloads
-
License
ISC
Repository
github
Last release
4 months ago

simple-iframe-resizer

simple-iframe-resizer helps you to auto resize cross-domain iframe dimensions based on the content size

It works as react hooks, and is only compatible with React>=16.8.0

Installation

# npm
npm install simple-iframe-resizer --save
# yarn
yarn add simple-iframe-resizer
# pnpm
pnpm add simple-iframe-resizer

Basic Concepts

Two hooks are used in iframe and host respectively, useResizeChild and useResizeParent. For convenience, we treat iframe as child and host as parent.

  • useResizeChild: used within iframe context.
  • useResizeParent: used within host context that containing a iframe element

Usage

  1. Name a unique resize event name

Use it in both parent and child side. simple-iframe-resizer will use this event name to communicate between parent and child through postMessage. Make sure the event name is unique to avoid interference.

// Example event name
const RESIZE_EVENT_NAME = '__simple_iframe_resizer_demo_9f9292a4';
  1. On child side
import { useResizeChild } from 'simple-iframe-resizer';

const ChildApp = () => {
  const [domRef] = useResizeChild(RESIZE_EVENT_NAME);

  return <div ref={domRef}>Hello World</div>;
};
  1. On parent side
import { useResizeParent } from 'simple-iframe-resizer';

const ParentApp = () => {
  const iframeRef = useRef<HTMLIFrameElement>(null);
  const iframeWindowRef = useRef<Window | undefined>();

  useEffect(() => {
    iframeWindowRef.current = iframeRef.current?.contentWindow || undefined;
  }, []);

  const [rect] = useResizeParent(RESIZE_EVENT_NAME, iframeWindowRef);

  return (
    <iframe
      ref={iframeRef}
      src="https://www.example.com"
      height={rect.height || '100%'}
      width={rect.width || '100%'}
    />
  );
};

Advanced Usage

  1. Trigger onUnmount event and reset the iframe height
const [domRef, rpcClient] = useResizeChild(RESIZE_EVENT_NAME);

useEffect(() => {
  return () => rpcClient.onUnmount();
}, []);
  1. Manually get dimensions of child from parent
const [rect, childRpcClient] = useResizeParent(
  RESIZE_EVENT_NAME,
  iframeWindowRef,
);

useEffect(() => {
  childRpcClient.getSize().then((rect) => {
    console.log(rect);
  });
}, []);

Type Definition

interface ParentFunctions {
  onResize: (rect: DOMRectReadOnly) => void;
  onUnmount: () => void;
}
interface ChildFunctions {
  getSize: () => DOMRectReadOnly | undefined;
}
declare const useResizeChild: <T extends Element>(
  id: string,
) => [React.RefObject<T>, ParentRpcClient | undefined];
declare const useResizeParent: (
  id: string,
  windowRef: React.MutableRefObject<Window | undefined>,
) => [DOMRectReadOnly | undefined, ChildRpcClient | undefined];
0.0.3

4 months ago

0.0.2

4 months ago

0.0.1

4 months ago