search.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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 = 'material-symbols dropdown-item-trailing-icon'
  42. iconEl.textContent = 'open_in_new'
  43. iconEl.setAttribute('aria-hidden', 'true')
  44. iconEl.translate = false
  45. linkEl.append(iconEl)
  46. resultsEl.append(liEl)
  47. }
  48. if (nbHits > 0) {
  49. showResults()
  50. sendMB('contact-form-suggestions-shown')
  51. } else {
  52. hideResults()
  53. }
  54. } catch (e) {
  55. hideResults()
  56. }
  57. }
  58. inputEl.addEventListener('input', _.debounce(handleChange, 350))
  59. // display initial results
  60. handleChange()
  61. }