<script>
import { onMount, onDestroy, tick } from 'svelte';

export let component;

let frame;
let doc;
let content;

$: mountComponent(doc, component);
$: updateProps($$props);

function mountComponent(doc) {
  if (content) content.$destroy();
  if (doc && component) {
    const { component, ...props } = $$props;
    content = new component({ target: doc.body, props });
  }
}

function updateProps(props) {
  if (content) {
    const { component, ...rest } = props;
    content.$set(rest);
  }
}

function loadHandler() {
  doc = frame.contentDocument;
  // import styles
  Array.from(document.querySelectorAll('style, link[rel="stylesheet"]'))
    .forEach(node => doc.head.appendChild(node.cloneNode(true)));
}

onMount(async () => {
  await tick();
  if (frame.contentDocument.readyState === 'complete' && frame.contentDocument.defaultView) {
    loadHandler();
  } else {
    frame.addEventListener('load', loadHandler);
  }
});

onDestroy(() => {
  if (frame) frame.removeEventListener('load', loadHandler);
  if (content) content.$destroy();
});
</script>

<iframe bind:this={frame} title="frame"></iframe>

<style>
iframe {
  border: none;
  width: 100%;
  height: 100%;
}
</style>