{"version":3,"sources":["../../src/widget/init.ts"],"sourcesContent":["import {safeReplyToEvent} from '../utils/events'\nimport {logger} from '../utils/logging'\n\nimport {\n  getHiddenAt,\n  guardedHide,\n  guardedToggle,\n  setHiddenAt,\n} from './hiddenAtSynchronization'\nimport type {\n  GetParentWindowDimensionsResponse,\n  HideWidgetMessage,\n  ToggleWidgetMessage,\n  SetDeviceTypeWidgetMessage,\n  GetWidgetVisibilityStatus,\n  ShowWidget,\n} from './managementMethods'\nimport {isNufiWidgetManagementMessage} from './managementMethods'\nimport {DEFAULT_DEVICE, getResponsiveUIHandlers} from './responsiveUIHandlers'\nimport {extendQueryString} from './utils'\n\nconst NUFI_WIDGET_ID = 'nufi-widget'\nconst NUFI_WIDGET_QUERY_SELECTOR = `iframe#${NUFI_WIDGET_ID}`\n\nexport const CORE_SDK_NOT_INITIALIZED = '\"initNufiDappSdk\" was not called'\n\nconst HIDDEN_WIDGET_SIZE = '1px'\nconst DESKTOP_IFRAME_BOTTOM_POSITION = '10px'\n\nexport type IFrameOptions = {\n  zIndex?: number\n  responsive?: boolean\n  colorMode?: 'dark' | 'light'\n}\n\nconst createIframe = (url: string, options?: IFrameOptions) => {\n  logger.debug('\"createIframe\"', {url, options})\n\n  const iframe = document.createElement('iframe')\n\n  iframe.id = NUFI_WIDGET_ID\n  iframe.src = url\n  iframe.style.width = HIDDEN_WIDGET_SIZE\n  iframe.style.height = HIDDEN_WIDGET_SIZE\n  iframe.style.position = 'fixed'\n  iframe.style.bottom = DESKTOP_IFRAME_BOTTOM_POSITION\n  iframe.style.zIndex = `${options?.zIndex ?? 0}`\n  iframe.style.colorScheme = 'none'\n\n  // Without this property there is white border around the iframe\n  // eslint-disable-next-line\n  // @ts-ignore\n  iframe.frameBorder = 0\n\n  document.body.appendChild(iframe)\n\n  return iframe\n}\n\n// Note that due to browser restrictions we can not simply lookup this property.\n// Note that change to another origin will not be allowed by the browser.\n// Note that we only allow `/widget` pathname to be loaded inside iframe.\n// Note that we are storing `ConnectorPlatform` in query string in order to\n// have an option of tracking usage in the future.\nlet previousIframeUrl: string | null = null\n\nexport let widgetManagementReadyPromise: Promise<void> | null = null\nlet resolveWidgetManagementReadyPromise: (() => void) | null = null\n\nconst setNewWidgetManagementReadyPromise = () => {\n  widgetManagementReadyPromise = new Promise((resolve) => {\n    resolveWidgetManagementReadyPromise = resolve\n  })\n}\n\nsetNewWidgetManagementReadyPromise()\n\nconst getOrCreateIframe = (url: string, iframeOptions?: IFrameOptions) => {\n  const existingIframe = document.querySelector(\n    NUFI_WIDGET_QUERY_SELECTOR,\n  ) as HTMLIFrameElement | null\n\n  let iframeDidRefresh = false\n\n  if (existingIframe && url !== previousIframeUrl) {\n    // This results in Widget refresh.\n    existingIframe.src = url\n    iframeDidRefresh = true\n  }\n\n  previousIframeUrl = url\n\n  const result = existingIframe\n    ? {iframe: existingIframe, isNewIframeCreated: false, iframeDidRefresh}\n    : {\n        iframe: createIframe(url, iframeOptions),\n        isNewIframeCreated: true,\n        iframeDidRefresh: true,\n      }\n\n  if (result.iframeDidRefresh) {\n    setHiddenAt(null)\n    setNewWidgetManagementReadyPromise()\n  }\n  return result\n}\n\nconst width = {\n  desktop: {\n    closed: '200px',\n    opened: '400px',\n    hidden: HIDDEN_WIDGET_SIZE,\n  },\n  mobile: {\n    closed: '200px',\n    opened: '100vw',\n    hidden: HIDDEN_WIDGET_SIZE,\n  },\n}\n\nconst height = {\n  desktop: {\n    closed: '80px',\n    opened: '700px',\n    hidden: HIDDEN_WIDGET_SIZE,\n  },\n  mobile: {\n    closed: '80px',\n    opened: '100dvh',\n    hidden: HIDDEN_WIDGET_SIZE,\n  },\n}\n\nconst position = {\n  desktop: {\n    bottom: DESKTOP_IFRAME_BOTTOM_POSITION,\n  },\n  mobile: {\n    bottom: '0px',\n  },\n}\n\nlet colorMode: Exclude<IFrameOptions['colorMode'], undefined> = 'dark'\n\nexport function ensureWidgetEmbeddedInIframe(\n  params:\n    | {\n        type: 'prefetch'\n        baseUrl: string\n        iframeOptions?: IFrameOptions\n      }\n    | {\n        type: 'updateQueryString'\n        query: `?${string}`\n      },\n) {\n  if (params.type === 'prefetch' && params.iframeOptions?.colorMode) {\n    // store the preferred color mode from iframeOptions so it can be passed as query string\n    colorMode = params.iframeOptions.colorMode\n  }\n\n  const url = (() => {\n    if (previousIframeUrl == null) {\n      if (params.type === 'prefetch') {\n        return params.baseUrl\n      }\n      throw new Error(CORE_SDK_NOT_INITIALIZED)\n    } else {\n      if (params.type === 'prefetch') {\n        // Avoid using the prefetch url once set to full url as this would reset the search string.\n        // This can happen if dapp prefetches the iframe after already being initialized\n        // with target search string.\n        return previousIframeUrl\n      }\n      const _url = new URL(previousIframeUrl)\n      const queryString = extendQueryString(params.query, {colorMode})\n      return `${_url.origin}${_url.pathname}?${queryString}`\n    }\n  })()\n\n  const iframeOptions = (() => {\n    if (params.type === 'prefetch') {\n      return params.iframeOptions\n    }\n    return undefined\n  })()\n\n  const {iframe, isNewIframeCreated, iframeDidRefresh} = getOrCreateIframe(\n    url,\n    iframeOptions,\n  )\n  // Get a reference to the iframe's window.\n  // eslint-disable-next-line\n  const iframeWindow = iframe.contentWindow!\n\n  const responsiveUIHandlers = iframeOptions?.responsive\n    ? getResponsiveUIHandlers()\n    : undefined\n\n  const sendPortPostMessage = (message: unknown, transfer: Transferable[]) => {\n    iframeWindow.postMessage(message, new URL(url).origin, transfer)\n  }\n\n  const sendSimplePostMessage = (message: unknown) => {\n    iframeWindow.postMessage(message, new URL(url).origin)\n  }\n\n  const resizeIframe = (type: 'opened' | 'closed' | 'hidden') => {\n    logger.debug('\"resizeIframe\"', type)\n\n    const device = responsiveUIHandlers?.getDeviceType() || DEFAULT_DEVICE\n\n    responsiveUIHandlers?.toggleBodyOverflow({\n      hidden: device === 'mobile' && type === 'opened',\n    })\n\n    iframe.style.width = width[device][type]\n    iframe.style.height = height[device][type]\n    iframe.style.bottom = position[device].bottom\n  }\n\n  const showWidget: ShowWidget = (type) => {\n    const priorityTimestamp = new Date().toISOString()\n    logger.debug('showWidget', type, priorityTimestamp)\n    setHiddenAt(null)\n\n    if (type === 'closed') {\n      const message: ToggleWidgetMessage = {\n        appId: 'nufi',\n        method: 'closeWidget',\n        priorityTimestamp,\n      }\n      sendSimplePostMessage(message)\n      // Note that this is dirty workaround that we need, as we currently\n      // do not have mechanism to detect that message was processed.\n      setTimeout(() => {\n        guardedToggle(() => resizeIframe('closed'), priorityTimestamp)\n      }, 200)\n    } else {\n      const message: ToggleWidgetMessage = {\n        appId: 'nufi',\n        method: 'openWidget',\n        priorityTimestamp,\n      }\n      guardedToggle(() => resizeIframe('opened'), priorityTimestamp) // first expand iframe to avoid scroll bar\n      sendSimplePostMessage(message)\n    }\n  }\n\n  const hideWidget = () => {\n    const priorityTimestamp = new Date().toISOString()\n    logger.debug('\"hideWidget\"', priorityTimestamp)\n    setHiddenAt(priorityTimestamp)\n\n    const message: HideWidgetMessage = {\n      appId: 'nufi',\n      method: 'hideWidget',\n      priorityTimestamp,\n    }\n    sendSimplePostMessage(message)\n\n    // Note that this is dirty workaround that we need, as we currently\n    // do not have mechanism for waiting on `sendHideWidgetMessage`\n    // to be processed.\n    setTimeout(() => {\n      if (getHiddenAt() != null) {\n        resizeIframe('hidden')\n      }\n    }, 200)\n  }\n\n  const sendDeviceTypeMessage = (\n    device: SetDeviceTypeWidgetMessage['device'],\n  ) => {\n    const message: SetDeviceTypeWidgetMessage = {\n      appId: 'nufi',\n      method: 'setDeviceType',\n      device,\n      priorityTimestamp: new Date().toISOString(),\n    }\n\n    sendSimplePostMessage(message)\n  }\n\n  if (isNewIframeCreated) {\n    window.addEventListener('message', (_e) => {\n      if (!isNufiWidgetManagementMessage(_e)) return\n      logger.debug('\"registerNufiWidgetManagementListener\"', {\n        method: _e.data.method,\n        data: _e.data,\n        currentHiddenAt: getHiddenAt(),\n      })\n      switch (_e.data.method) {\n        case 'hideWidget': {\n          guardedHide(hideWidget, _e.data.priorityTimestamp)\n          break\n        }\n        case 'closeWidget': {\n          guardedToggle(() => resizeIframe('closed'), _e.data.priorityTimestamp)\n          break\n        }\n        case 'openWidget': {\n          guardedToggle(() => resizeIframe('opened'), _e.data.priorityTimestamp)\n          break\n        }\n        case 'refreshPage': {\n          location.reload()\n          break\n        }\n        case 'getParentWindowDimensionsRequest': {\n          const iframe = document.querySelector(\n            NUFI_WIDGET_QUERY_SELECTOR,\n          ) as HTMLIFrameElement | null\n          if (!iframe) {\n            return\n          }\n          const iframeRect = iframe.getBoundingClientRect()\n\n          const response: GetParentWindowDimensionsResponse = {\n            appId: 'nufi',\n            method: 'getParentWindowDimensionsResponse',\n            dimensions: {\n              width: window.innerWidth,\n              height: window.innerHeight,\n              top: window.screenTop,\n              left: window.screenLeft,\n            },\n            iframeRect: {\n              top: iframeRect.top,\n              right: iframeRect.right,\n              bottom: iframeRect.bottom,\n              left: iframeRect.left,\n              width: iframeRect.width,\n              height: iframeRect.height,\n              x: iframeRect.x,\n              y: iframeRect.y,\n            },\n          }\n          safeReplyToEvent(_e, response)\n          break\n        }\n        case 'widgetReady': {\n          resolveWidgetManagementReadyPromise?.()\n          sendDeviceTypeMessage(\n            responsiveUIHandlers?.getDeviceType() || DEFAULT_DEVICE,\n          )\n          break\n        }\n        default: {\n          return\n        }\n      }\n    })\n\n    // listen on breakpoint changes when resizing window\n    responsiveUIHandlers?.addDeviceChangeListener((device) => {\n      sendDeviceTypeMessage(device)\n    })\n  }\n\n  const getWidgetVisibilityStatus: GetWidgetVisibilityStatus = () => {\n    logger.debug('\"getWidgetVisibilityStatus\"', iframe.style.width)\n    if (iframe.style.width === HIDDEN_WIDGET_SIZE) {\n      logger.debug('\"getWidgetVisibilityStatus\"', 'hidden')\n      return 'hidden'\n    }\n    const device = responsiveUIHandlers?.getDeviceType() || DEFAULT_DEVICE\n    if (iframe.style.width === width[device].opened) {\n      logger.debug('\"getWidgetVisibilityStatus\"', 'opened')\n      return 'open'\n    }\n    logger.debug('\"getWidgetVisibilityStatus\"', 'closed')\n    return 'closed'\n  }\n\n  return {\n    iframeDidRefresh,\n    sendPortPostMessage,\n    sendSimplePostMessage,\n    showWidget,\n    hideWidget,\n    getWidgetVisibilityStatus,\n  }\n}\n\nexport type EnsureWidgetEmbeddedInIframe = typeof ensureWidgetEmbeddedInIframe\n"],"mappings":"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","names":["iframe"]}