{"version":3,"sources":["webpack:///./src/js/modules/headerSearch/components/Suggestions.js","webpack:///./src/js/modules/headerSearch/components/Panel.js","webpack:///./src/js/modules/headerSearch/index.js","webpack:///./node_modules/prop-types/index.js","webpack:///./node_modules/prop-types/factoryWithThrowingShims.js","webpack:///./node_modules/prop-types/lib/ReactPropTypesSecret.js"],"names":["Suggestions","title","suggestions","endpoint","searchQueryParam","suggestionsRef","useRef","toggle","useCallback","length","current","style","visibility","open","element","close","onComplete","stripHtml","html","tmp","document","createElement","innerHTML","textContent","innerText","useEffect","className","ref","map","suggestion","key","href","dangerouslySetInnerHTML","__html","propTypes","PropTypes","string","isRequired","array","Panel","isOpen","onClose","suggestionsEndpoint","placeholder","submitLabel","closeLabel","suggestionsTitle","panelRef","panelBoxRef","inputRef","inputId","useMemo","uuidv4","useState","keyword","setKeyword","setSuggestions","ignoreUtilFocusChanges","lastFocus","breakpoint","window","matchMedia","breakpoints","tabletLandscape","animatePanel","direction","panel","panelBox","timeline","anime","easing","begin","complete","focusFirstDescendant","click","add","targets","opacity","duration","matches","translateX","translateY","body","position","top","scrollY","scrollTo","parseInt","i","childNodes","child","attemptFocus","focusLastDescendant","isFocusable","focus","e","activeElement","listener","addListener","removeListener","handleFocus","contains","target","addEventListener","removeEventListener","fetchData","Axios","method","url","params","data","onClick","stopPropagation","action","autoComplete","htmlFor","type","name","id","value","onChange","aria-label","xlinkHref","bool","func","HeaderSearch","triggerLabel","props","setIsOpen","handleKeyboardEvents","toLowerCase","handleClickOutside","openSearch","module","exports","ReactPropTypesSecret","emptyFunction","emptyFunctionWithReset","resetWarningCache","shim","propName","componentName","location","propFullName","secret","err","Error","getShim","ReactPropTypes","number","object","symbol","any","arrayOf","elementType","instanceOf","node","objectOf","oneOf","oneOfType","shape","exact","checkPropTypes"],"mappings":"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","file":"29.13364c68639f9518cea0.js","sourcesContent":["import React, { useRef, useCallback, useEffect } from 'react';\nimport PropTypes from 'prop-types';\n\nimport { open, close } from '../../../helpers';\n\nconst Suggestions = ({ title, suggestions, endpoint, searchQueryParam }) => {\n  const suggestionsRef = useRef();\n\n  const toggle = useCallback(() => {\n    if (suggestions.length) {\n      suggestionsRef.current.style.visibility = 'visible';\n      open({ element: suggestionsRef.current });\n    } else {\n      close({\n        element: suggestionsRef.current,\n        onComplete: () => {\n          suggestionsRef.current.style.visibility = 'hidden';\n        }\n      });\n    }\n  }, [suggestions.length]);\n\n  const stripHtml = useCallback(html => {\n    const tmp = document.createElement('div');\n    tmp.innerHTML = html;\n    return tmp.textContent || tmp.innerText || '';\n  }, []);\n\n  useEffect(() => {\n    toggle();\n  }, [toggle]);\n\n  return (\n    <div className=\"header-search__suggestions\" ref={suggestionsRef}>\n      {!!suggestions.length && (\n        <div className=\"header-search__suggestions-inner\">\n          <h2 className=\"header-search__suggestions-title\">{title}</h2>\n          <ul className=\"header-search__suggestions-list\">\n            {suggestions.map(suggestion => (\n              <li key={suggestion}>\n                <a\n                  href={`${endpoint}?${searchQueryParam}=${stripHtml(\n                    suggestion\n                  )}`}\n                  dangerouslySetInnerHTML={{ __html: suggestion }}\n                />\n              </li>\n            ))}\n          </ul>\n        </div>\n      )}\n    </div>\n  );\n};\n\nSuggestions.propTypes = {\n  title: PropTypes.string.isRequired,\n  suggestions: PropTypes.array.isRequired,\n  endpoint: PropTypes.string.isRequired,\n  searchQueryParam: PropTypes.string.isRequired\n};\n\nexport default Suggestions;\n","import React, {\n  useRef,\n  useEffect,\n  useState,\n  useMemo,\n  useCallback\n} from 'react';\nimport PropTypes from 'prop-types';\nimport { v4 as uuidv4 } from 'uuid';\nimport Axios from 'axios';\nimport anime from 'animejs';\n\nimport Suggestions from './Suggestions';\n\nimport { isFocusable } from '../../../helpers';\nimport { breakpoints } from '../../../helpers/constants';\n\nconst Panel = ({\n  isOpen,\n  onClose,\n  endpoint,\n  suggestionsEndpoint,\n  searchQueryParam,\n  placeholder,\n  submitLabel,\n  closeLabel,\n  suggestionsTitle\n}) => {\n  const panelRef = useRef(null);\n  const panelBoxRef = useRef(null);\n  const inputRef = useRef(null);\n  const inputId = useMemo(() => uuidv4(), []);\n  const [keyword, setKeyword] = useState('');\n  const [suggestions, setSuggestions] = useState([]);\n\n  const ignoreUtilFocusChanges = useRef(null);\n  const lastFocus = useRef(null);\n\n  const breakpoint = useMemo(\n    () => window.matchMedia(`(min-width: ${breakpoints.tabletLandscape}px)`),\n    []\n  );\n\n  const animatePanel = useCallback(\n    ({ direction = 'normal' }) => {\n      const panel = panelRef.current;\n      const panelBox = panelBoxRef.current;\n\n      const timeline = anime.timeline({\n        easing: 'easeInOutQuad',\n        direction,\n        begin: () => {\n          if (direction === 'normal') {\n            panel.style.visibility = 'visible';\n          }\n        },\n        complete: () => {\n          if (direction === 'reverse') {\n            panel.style.visibility = 'hidden';\n            setKeyword('');\n          } else {\n            focusFirstDescendant(panelBox);\n            inputRef.current.click();\n          }\n        }\n      });\n\n      timeline.add({\n        targets: panel,\n        opacity: [0, 1],\n        duration: breakpoint.matches ? 150 : 0\n      });\n\n      if (breakpoint.matches) {\n        timeline.add({\n          targets: panelBox,\n          translateX: ['100%', '0%'],\n          duration: 400\n        });\n      } else {\n        timeline.add({\n          targets: panelBox,\n          translateY: ['100%', '0%'],\n          duration: 400\n        });\n      }\n    },\n    [breakpoint.matches]\n  );\n\n  const toggle = useCallback(() => {\n    if (isOpen) {\n      document.body.style.position = 'fixed';\n      document.body.style.top = `-${window.scrollY}px`;\n      animatePanel({});\n    } else {\n      const scrollY = document.body.style.top;\n      document.body.style.position = null;\n      document.body.style.top = null;\n      window.scrollTo(0, parseInt(scrollY || '0') * -1);\n      animatePanel({ direction: 'reverse' });\n    }\n  }, [animatePanel, isOpen]);\n\n  const focusFirstDescendant = useCallback(\n    element => {\n      for (let i = 0; i < element.childNodes.length; i++) {\n        const child = element.childNodes[i];\n        if (attemptFocus(child) || focusFirstDescendant(child)) {\n          return true;\n        }\n      }\n      return false;\n    },\n    [attemptFocus]\n  );\n\n  const focusLastDescendant = useCallback(\n    element => {\n      for (let i = element.childNodes.length - 1; i >= 0; i--) {\n        const child = element.childNodes[i];\n        if (attemptFocus(child) || focusLastDescendant(child)) {\n          return true;\n        }\n      }\n      return false;\n    },\n    [attemptFocus]\n  );\n\n  const attemptFocus = useCallback(element => {\n    if (!isFocusable(element)) {\n      return false;\n    }\n\n    ignoreUtilFocusChanges.current = true;\n    try {\n      element.focus();\n    } catch (e) {\n      return;\n    }\n    ignoreUtilFocusChanges.current = false;\n    return document.activeElement === element;\n  }, []);\n\n  useEffect(() => {\n    const listener = () => {\n      panelRef.current.style = null;\n      panelBoxRef.current.style = null;\n      toggle();\n    };\n\n    toggle();\n    breakpoint.addListener(listener);\n    return () => breakpoint.removeListener(listener);\n  }, [breakpoint, toggle]);\n\n  useEffect(() => {\n    const handleFocus = e => {\n      if (ignoreUtilFocusChanges.current) return;\n\n      if (panelBoxRef.current.contains(e.target)) {\n        lastFocus.current = e.target;\n      } else {\n        focusFirstDescendant(panelBoxRef.current);\n\n        if (lastFocus.current === document.activeElement) {\n          focusLastDescendant(panelBoxRef.current);\n        }\n        lastFocus.current = document.activeElement;\n      }\n    };\n\n    document.addEventListener('focus', handleFocus, true);\n    return () => {\n      document.removeEventListener('focus', handleFocus, true);\n    };\n  }, [focusFirstDescendant, focusLastDescendant]);\n\n  useEffect(() => {\n    const fetchData = async () => {\n      const { data } = await Axios({\n        method: 'GET',\n        url: suggestionsEndpoint,\n        params: {\n          [searchQueryParam]: keyword\n        }\n      });\n\n      setSuggestions(data);\n    };\n\n    if (keyword.length > 2) {\n      fetchData();\n    } else {\n      setSuggestions([]);\n    }\n  }, [keyword, searchQueryParam, suggestionsEndpoint]);\n\n  return (\n    <div className=\"header-search__panel\" ref={panelRef}>\n      <div\n        className=\"header-search__box\"\n        ref={panelBoxRef}\n        onClick={e => e.stopPropagation()}\n      >\n        <form\n          action={endpoint}\n          method=\"GET\"\n          className=\"header-search__form\"\n          autoComplete=\"off\"\n        >\n          <label htmlFor={inputId}>{placeholder}</label>\n          <input\n            ref={inputRef}\n            type=\"search\"\n            name={searchQueryParam}\n            id={inputId}\n            placeholder={placeholder}\n            value={keyword}\n            onChange={e => setKeyword(e.target.value)}\n          />\n          <button\n            type=\"submit\"\n            className=\"header-search__submit\"\n            aria-label={submitLabel}\n          >\n            <svg>\n              <title>search</title>\n              <use xlinkHref=\"#search\" />\n            </svg>\n          </button>\n          <button\n            type=\"button\"\n            className=\"header-search__close\"\n            aria-label={closeLabel}\n            onClick={onClose}\n          >\n            <svg>\n              <title>Close Search</title>\n              <use xlinkHref=\"#close\" />\n            </svg>\n          </button>\n        </form>\n        <Suggestions\n          title={suggestionsTitle}\n          suggestions={suggestions}\n          endpoint={endpoint}\n          searchQueryParam={searchQueryParam}\n        />\n      </div>\n    </div>\n  );\n};\n\nPanel.propTypes = {\n  isOpen: PropTypes.bool.isRequired,\n  onClose: PropTypes.func.isRequired,\n  submitLabel: PropTypes.string.isRequired,\n  closeLabel: PropTypes.string.isRequired,\n  placeholder: PropTypes.string.isRequired,\n  searchQueryParam: PropTypes.string.isRequired,\n  endpoint: PropTypes.string.isRequired,\n  suggestionsTitle: PropTypes.string.isRequired,\n  suggestionsEndpoint: PropTypes.string.isRequired\n};\n\nexport default Panel;\n","import React, { useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\n\nimport Panel from './components/Panel';\n\nconst HeaderSearch = ({ triggerLabel, ...props }) => {\n  const [isOpen, setIsOpen] = useState(false);\n\n  const handleKeyboardEvents = (e) => {\n    if (e.key && e.key.toLowerCase() === 'escape') {\n      setIsOpen(false);\n    }\n  }\n\n  const handleClickOutside = () => {\n    setIsOpen(false);\n  }\n\n  useEffect(() => {\n    const openSearch = () => setIsOpen(true);\n    document.addEventListener('openSearch', openSearch, false);\n    window.addEventListener('keydown', handleKeyboardEvents, false);\n    window.addEventListener('click', handleClickOutside, false);\n    return () => {\n      document.removeEventListener('openSearch', openSearch, false);\n    };\n  }, []);\n\n  return (\n    <>\n      <button\n        className=\"header-search__trigger\"\n        aria-label={triggerLabel}\n        onClick={(e) => {\n          e.stopPropagation();\n          setIsOpen(true);\n        }}\n      >\n        <svg>\n          <title>search trigger</title>\n          <use xlinkHref=\"#search\" />\n        </svg>\n      </button>\n      <Panel {...props} isOpen={isOpen} onClose={() => setIsOpen(false)} />\n    </>\n  );\n};\n\nHeaderSearch.propTypes = {\n  triggerLabel: PropTypes.string.isRequired\n};\n\nexport default HeaderSearch;\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n  var ReactIs = require('react-is');\n\n  // By explicitly using `prop-types` you are opting into new development behavior.\n  // http://fb.me/prop-types-in-prod\n  var throwOnDirectAccess = true;\n  module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);\n} else {\n  // By explicitly using `prop-types` you are opting into new production behavior.\n  // http://fb.me/prop-types-in-prod\n  module.exports = require('./factoryWithThrowingShims')();\n}\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nmodule.exports = function() {\n  function shim(props, propName, componentName, location, propFullName, secret) {\n    if (secret === ReactPropTypesSecret) {\n      // It is still safe when called from React.\n      return;\n    }\n    var err = new Error(\n      'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n      'Use PropTypes.checkPropTypes() to call them. ' +\n      'Read more at http://fb.me/use-check-prop-types'\n    );\n    err.name = 'Invariant Violation';\n    throw err;\n  };\n  shim.isRequired = shim;\n  function getShim() {\n    return shim;\n  };\n  // Important!\n  // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n  var ReactPropTypes = {\n    array: shim,\n    bool: shim,\n    func: shim,\n    number: shim,\n    object: shim,\n    string: shim,\n    symbol: shim,\n\n    any: shim,\n    arrayOf: getShim,\n    element: shim,\n    elementType: shim,\n    instanceOf: getShim,\n    node: shim,\n    objectOf: getShim,\n    oneOf: getShim,\n    oneOfType: getShim,\n    shape: getShim,\n    exact: getShim,\n\n    checkPropTypes: emptyFunctionWithReset,\n    resetWarningCache: emptyFunction\n  };\n\n  ReactPropTypes.PropTypes = ReactPropTypes;\n\n  return ReactPropTypes;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n"],"sourceRoot":""}