search.js 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import _ from 'lodash'
  2. import { formatWikiHit, searchWiki } from '../algolia-search/search-wiki'
  3. import { sendMB } from '../../infrastructure/event-tracking'
  4. export function setupSearch(formEl) {
  5. const inputEl = formEl.querySelector('[name="subject"]')
  6. const resultsEl = formEl.querySelector('[data-ol-search-results]')
  7. const wrapperEl = formEl.querySelector('[data-ol-search-results-wrapper]')
  8. let lastValue = ''
  9. function hideResults() {
  10. wrapperEl.setAttribute('hidden', '')
  11. }
  12. function showResults() {
  13. wrapperEl.removeAttribute('hidden')
  14. }
  15. async function handleChange() {
  16. const value = inputEl.value
  17. if (value === lastValue) return
  18. lastValue = value
  19. if (value.length < 3) {
  20. hideResults()
  21. return
  22. }
  23. try {
  24. const { hits, nbHits } = await searchWiki(value, {
  25. hitsPerPage: 3,
  26. typoTolerance: 'strict',
  27. })
  28. resultsEl.innerText = ''
  29. for (const hit of hits) {
  30. const { url, pageName } = formatWikiHit(hit)
  31. const liEl = document.createElement('li')
  32. const linkEl = document.createElement('a')
  33. linkEl.className = 'contact-suggestion-list-item'
  34. linkEl.href = url
  35. linkEl.target = '_blank'
  36. liEl.append(linkEl)
  37. const contentEl = document.createElement('span')
  38. contentEl.innerHTML = pageName
  39. linkEl.append(contentEl)
  40. const iconEl = document.createElement('i')
  41. iconEl.className = 'fa fa-angle-right'
  42. iconEl.setAttribute('aria-hidden', 'true')
  43. linkEl.append(contentEl)
  44. resultsEl.append(liEl)
  45. }
  46. if (nbHits > 0) {
  47. showResults()
  48. sendMB('contact-form-suggestions-shown')
  49. } else {
  50. hideResults()
  51. }
  52. } catch (e) {
  53. hideResults()
  54. }
  55. }
  56. inputEl.addEventListener('input', _.debounce(handleChange, 350))
  57. // display initial results
  58. handleChange()
  59. }