{"version":3,"file":"global_messages.46f25f91.js","mappings":"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","sources":["webpack://fitflop-storefront/./core-app/grails-app/assets/javascripts/app/globalMessages/globalMessagesApp.js","webpack://fitflop-storefront/./core-app/grails-app/assets/javascripts/app/globalMessages/globalMessagesHooks.js","webpack://fitflop-storefront/./core-app/grails-app/assets/javascripts/app/globalMessages/globalMessagesRoot.js","webpack://fitflop-storefront/./core-app/grails-app/assets/javascripts/app/globalMessages/globalMessagesService.js","webpack://fitflop-storefront/./core-app/grails-app/assets/javascripts/app/utils/browserHelpers.js"],"sourcesContent":["import React, { useRef, useState, useEffect, useMemo } from 'react';\nimport PropTypes from 'prop-types';\nimport { FormattedMessage, useIntl } from 'react-intl';\nimport { getElementHeightNoPadding } from 'app/utils/helpers';\nimport { MAX_DISPLAY_TIME } from './globalMessagesConstants';\nimport './alerts.scss';\n\nconst GlobalMessagesApp = ({\n  autoHide,\n  customClass,\n  headerSelector,\n  sticky,\n  message,\n  messageId,\n  type,\n  onClose,\n  stickyClass,\n  values,\n  showCloseButton,\n  customColor,\n  displayTime,\n  customCloseButton,\n}) => {\n  const intl = useIntl();\n  const [isFadeOutInProcess, setIsFadeOutInProcess] = useState(false);\n  const [isSticking, setIsSticking] = useState(false);\n\n  const globalMessageDIV = useRef(null);\n\n  const isOpen = !!message || !!messageId;\n\n  const headerHeight = useMemo(() => {\n    let height = 0;\n    if (headerSelector) {\n      [...document.querySelectorAll(headerSelector)].forEach(headerElement => {\n        height += getElementHeightNoPadding(headerElement);\n      });\n    }\n    return height;\n  }, [headerSelector]);\n\n  function handleTransition() {\n    if (isFadeOutInProcess) {\n      setIsFadeOutInProcess(false);\n      onClose();\n    }\n  }\n\n  function handleScrollEvent() {\n    const shouldBeSticking = window.pageYOffset > headerHeight;\n    if (isSticking !== shouldBeSticking) {\n      setIsSticking(shouldBeSticking);\n    }\n  }\n\n  function closeAlertBox() {\n    setIsFadeOutInProcess(true);\n  }\n\n  useEffect(() => {\n    let timer = null;\n    if (autoHide) {\n      timer = window.setTimeout(closeAlertBox, displayTime * 1000);\n    }\n\n    return () => window.clearTimeout(timer);\n  }, [autoHide, displayTime]);\n\n  useEffect(() => {\n    const globalMessageDivEl = globalMessageDIV.current;\n    if (sticky && isOpen) {\n      document.addEventListener('scroll', handleScrollEvent);\n    }\n\n    globalMessageDivEl.addEventListener('transitionend', handleTransition);\n\n    handleScrollEvent();\n\n    return () => {\n      document.removeEventListener('scroll', handleScrollEvent);\n      globalMessageDivEl.removeEventListener('transitionend', handleTransition);\n    };\n  });\n\n  if (!isOpen) return <div ref={globalMessageDIV} />;\n\n  const dynamicClasses = [];\n\n  if (sticky) {\n    dynamicClasses.push('is-sticky');\n    if (isSticking) {\n      dynamicClasses.push(stickyClass);\n    }\n  }\n\n  if (isFadeOutInProcess) {\n    dynamicClasses.push('is-closing');\n  } else if (isOpen) {\n    dynamicClasses.push('is-open');\n  } else {\n    dynamicClasses.push('is-closed');\n  }\n\n  let messageElement = null;\n  if (messageId) {\n    messageElement = <FormattedMessage values={values} id={messageId} description=\"Alert by id\" />;\n  } else {\n    messageElement = <div dangerouslySetInnerHTML={{ __html: message }} />;\n  }\n\n  return (\n    <div\n      className={`alert-box ${type} ${customClass} ${dynamicClasses.join(' ')}`}\n      ref={globalMessageDIV}\n      role=\"alert\"\n      aria-atomic=\"true\"\n      style={{ backgroundColor: customColor }}\n    >\n      {messageElement}\n      {customCloseButton ||\n        (showCloseButton && (\n          <button\n            aria-label={intl.formatMessage({ id: 'header.global.message.close' })}\n            className=\"alert-box__close icon-close\"\n            type=\"button\"\n            onClick={() => setIsFadeOutInProcess(true)}\n          />\n        ))}\n    </div>\n  );\n};\n\nGlobalMessagesApp.defaultProps = {\n  autoHide: false,\n  customClass: '',\n  headerSelector: '',\n  message: '',\n  messageId: '',\n  type: '',\n  sticky: false,\n  stickyClass: 'is-sticky--fixed',\n  values: {},\n  showCloseButton: true,\n  onClose: () => true,\n  customColor: '',\n  displayTime: MAX_DISPLAY_TIME,\n  customCloseButton: null,\n};\n\nGlobalMessagesApp.propTypes = {\n  autoHide: PropTypes.bool,\n  customClass: PropTypes.string,\n  headerSelector: PropTypes.string,\n  message: PropTypes.string,\n  messageId: PropTypes.string,\n  type: PropTypes.string,\n  onClose: PropTypes.func,\n  sticky: PropTypes.bool,\n  stickyClass: PropTypes.string,\n  values: PropTypes.objectOf(PropTypes.oneOfType([PropTypes.number, PropTypes.string])),\n  showCloseButton: PropTypes.bool,\n  customColor: PropTypes.string,\n  displayTime: PropTypes.number,\n  customCloseButton: PropTypes.element,\n};\n\nexport default GlobalMessagesApp;\n","import { useEffect, useState } from 'react';\nimport { getFlashStorageRecord, getPageSpecificOptions } from './globalMessagesUtils';\n\nconst { pageType } = window.inlineGlobalConfig;\n\nexport function useServiceBootstrapper() {\n  const [messageDescriptor, setMessageDescriptor] = useState(null);\n\n  function showMessage(originalDescriptor) {\n    setMessageDescriptor(populatePresets(originalDescriptor));\n  }\n\n  function hideMessage() {\n    setMessageDescriptor(null);\n  }\n\n  function populatePresets(message) {\n    return message\n      ? {\n          ...getPageSpecificOptions(message.pageType || pageType),\n          ...message,\n          onClose: () => {\n            hideMessage();\n            if (message.onClose) {\n              message.onClose();\n            }\n          },\n        }\n      : null;\n  }\n\n  useEffect(() => {\n    const flashMessage = getFlashStorageRecord();\n    if (flashMessage) {\n      showMessage(flashMessage);\n    }\n  });\n\n  return {\n    currentMessage: messageDescriptor,\n    showMessage,\n    hideMessage,\n  };\n}\n","import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport providerHOC from 'app/utils/providerHOC/providerHOC';\nimport GlobalMessagesService from './globalMessagesService';\nimport { getGlobalMessagesRoot } from './globalMessagesUtils';\n\nconst GlobalMessagesRoot = providerHOC()(GlobalMessagesService);\n\ncreateRoot(getGlobalMessagesRoot()).render(<GlobalMessagesRoot />);\n","import React, { useCallback, useEffect, useRef } from 'react';\nimport { isIOS } from 'app/utils/browserHelpers';\nimport GlobalMessagesApp from './globalMessagesApp';\nimport { useServiceBootstrapper } from './globalMessagesHooks';\nimport { SHOW_MESSAGE_EVENT, HIDE_MESSAGE_EVENT } from './globalMessagesConstants';\nimport { getGlobalMessagesRoot, getMessagePriority, onServiceStart, onServiceStop } from './globalMessagesUtils';\n\nfunction GlobalMessagesService(props) {\n  const { currentMessage, showMessage, hideMessage } = useServiceBootstrapper(props);\n  const ref = useRef(getGlobalMessagesRoot());\n\n  // lower value means higher priority\n  const shouldReplaceCurrentMessage = useCallback(\n    newMessage => {\n      return getMessagePriority(newMessage) <= getMessagePriority(currentMessage);\n    },\n    [currentMessage]\n  );\n\n  const onShowMessage = useCallback(\n    event => {\n      const newMessage = event.detail;\n      if (!currentMessage || shouldReplaceCurrentMessage(newMessage)) {\n        showMessage(newMessage);\n      }\n    },\n    [currentMessage, shouldReplaceCurrentMessage, showMessage]\n  );\n\n  useEffect(() => {\n    const globalMessagesRoot = ref.current;\n    globalMessagesRoot?.addEventListener(SHOW_MESSAGE_EVENT, onShowMessage);\n    globalMessagesRoot?.addEventListener(HIDE_MESSAGE_EVENT, hideMessage);\n\n    onServiceStart();\n    window.addEventListener(isIOS() ? 'pagehide' : 'beforeunload', onServiceStop);\n\n    return () => {\n      globalMessagesRoot?.removeEventListener(SHOW_MESSAGE_EVENT, onShowMessage);\n      globalMessagesRoot?.removeEventListener(HIDE_MESSAGE_EVENT, hideMessage);\n      window.removeEventListener(isIOS() ? 'pagehide' : 'beforeunload', onServiceStop);\n    };\n  }, [hideMessage, onShowMessage]);\n\n  return <GlobalMessagesApp {...currentMessage} />;\n}\n\nexport default GlobalMessagesService;\n","export const isIOS = () => navigator.userAgent.match(/(iPhone|iPad)/);\n"],"names":["GlobalMessagesApp","_ref","autoHide","customClass","headerSelector","sticky","message","messageId","type","onClose","stickyClass","values","showCloseButton","customColor","displayTime","customCloseButton","intl","useIntl","_useState2","_slicedToArray","useState","isFadeOutInProcess","setIsFadeOutInProcess","_useState4","isSticking","setIsSticking","globalMessageDIV","useRef","isOpen","headerHeight","useMemo","height","document","querySelectorAll","forEach","headerElement","getElementHeightNoPadding","handleTransition","handleScrollEvent","shouldBeSticking","window","pageYOffset","closeAlertBox","useEffect","timer","setTimeout","clearTimeout","globalMessageDivEl","current","addEventListener","removeEventListener","React","ref","dynamicClasses","push","messageElement","FormattedMessage","id","description","dangerouslySetInnerHTML","__html","className","concat","join","role","style","backgroundColor","formatMessage","onClick","defaultProps","MAX_DISPLAY_TIME","propTypes","PropTypes","pageType","inlineGlobalConfig","useServiceBootstrapper","messageDescriptor","setMessageDescriptor","showMessage","originalDescriptor","_objectSpread","getPageSpecificOptions","hideMessage","flashMessage","getFlashStorageRecord","currentMessage","GlobalMessagesRoot","providerHOC","props","_useServiceBootstrapp","getGlobalMessagesRoot","shouldReplaceCurrentMessage","useCallback","newMessage","getMessagePriority","onShowMessage","event","detail","globalMessagesRoot","SHOW_MESSAGE_EVENT","HIDE_MESSAGE_EVENT","onServiceStart","isIOS","onServiceStop","createRoot","render","navigator","userAgent","match"],"sourceRoot":""}