import { isAllowedOrigin } from '../utils' import { MessageType } from '../types' type MessageOptions = { value?: string | number | boolean | object } export default class CommunicationHandler { send(type: MessageType, options: MessageOptions = {}) { if (!isAllowedOrigin(document.referrer)) { console.warn( 'Unable to send message. Please run your app from within Help Scout.' ) return } window.parent.postMessage( // stringify then parse to remove anything that could cause postMessage errors JSON.parse( JSON.stringify({ ...options, type, appId: window.name?.replace(/app-side-panel-|app-/, ''), iframeId: window.name, }) ), document.referrer ) } async receive(type: MessageType) { return await new Promise(resolve => { window.addEventListener('message', function onMessage(event) { if (!isAllowedOrigin(event.origin)) { // ignore messages from other origins return } try { const { data } = event const { type: receivingType, ...rest } = data if (receivingType === type) { resolve(rest) } } catch (error) { console.error('Unable to read postMessage data.') } }) }) } listen(type: MessageType, callback: (data: unknown) => void) { window.addEventListener('message', function onMessage(event) { if (!isAllowedOrigin(event.origin)) { // ignore messages from other origins return } try { const { data } = event const { type: receivingType, ...rest } = data if (receivingType === type) { callback(rest) } } catch (error) { console.error('Unable to read postMessage data.') } }) } }