lib/utils/iframe-resizer.ts

Summary

Maintainability
A
0 mins
Test Coverage
import every from 'lodash/every'
import { Child as PymChild } from 'pym.js'
import { injectAssets } from './assets'

// Will hold the pym instance once
var pymChild: PymChild
// URL parameters generated by Pym
const pymParams = ['initialWidth', 'childId', 'parentUrl', 'parentTitle']
// Save the initial window href value in case it changes
const initialHref = window.location.href

export default class IframeResizer {
  initializer: Promise<PymChild>

  constructor () {
    this.initializer = injectAssets('//pym.nprapps.org/pym.v1.min.js').then(() => {
      pymChild = pymChild || new window.pym.Child({ polling: 300 })
      return pymChild
    })
  }
  sendHeight (): Promise<void> {
    return this.initializer.then(pymChild => pymChild.sendHeight())
  }
  static create (): IframeResizer {
    return new IframeResizer()
  }
  static template(url: string, id: string = 'icij-' + Date.now().toString(32)): string {
    return [
      `<script type="text/javascript" src="https://pym.nprapps.org/pym.v1.min.js"></script>`,
      `<div id="${id}"></div>`,
      `<script>`,
      `const icijIframe = new pym.Parent("${id}", "${IframeResizer.deletePymParams(url)}", {})`,
      `</script>`,
    ].join('\n')
  }
  static deletePymParams(href: string = initialHref): string {
    const url = new URL(href);
    // Remove all unwanted param
    for (const param of pymParams) {
      url.searchParams.delete(param)
    }
    // Rebuild the URL
    return url.href
  }
  static isEmbedded (href: string = initialHref): boolean {
    const url = new URL(href)
    return every(pymParams, param => url.searchParams.has(param))
  }
}