Advertisement
mArtti

Untitled

Jun 17th, 2019
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.57 KB | None | 0 0
  1. (function () {
  2. // SELECTORS
  3. const searchButton = document.querySelector(".search-trigger"),
  4. closeButton = document.querySelector(".search-overlay__close"),
  5. searchOverlay = document.querySelector(".search-overlay"),
  6. searchField = document.querySelector('#search-term'),
  7. resultsDiv = document.querySelector('#search-overlay__results'),
  8. body = document.body;
  9. postsRequest = fetch(...),
  10. pagesRequest = fetch(...),
  11. results = await Promise.all([postsRequest, pagesRequest]),
  12.  
  13.  
  14. let isOverlayOpen = false,
  15. isSpinnerVisable = false,
  16. typingTimer, previousValue;
  17.  
  18. // ACTIONS
  19. const events = {
  20. keyPressDispatcher (e) {
  21. //too many future conflicts with s = search, poor design practice
  22. if (e.keyCode === 27 && isOverlayOpen) events.closeOverlay();
  23. },
  24.  
  25. openOverlay() {
  26. searchOverlay.classList.add("search-overlay--active");
  27. body.classList.add("body-no-scroll");
  28. setTimeout(() => searchField.focus(), 301);
  29. isOverlayOpen = true;
  30. },
  31.  
  32. closeOverlay() {
  33. searchOverlay.classList.remove("search-overlay--active");
  34. body.classList.remove("body-no-scroll");
  35. isOverlayOpen = false;
  36. },
  37.  
  38. typingLogic() {
  39. if(searchField.value != previousValue) {
  40. clearTimeout(typingTimer);
  41. if(searchField.value) {
  42. if(!isSpinnerVisable) {
  43. resultsDiv.innerHTML = '<div class="spinner-loader"></div>';
  44. isSpinnerVisable = true;
  45. }
  46. typingTimer = setTimeout(() => events.getResults(), 750);
  47. } else {
  48. resultsDiv.innerHTML = '';
  49. isSpinnerVisable = false;
  50. }
  51. }
  52. previousValue = searchField.value;
  53. },
  54.  
  55. getResults() {
  56. fetchURLs();
  57. async function fetchURLs() {
  58. try {
  59. let data = await Promise.all([
  60. fetch(`${universityData.root_url}/wp-json/wp/v2/posts/?search=${searchField.value}`).then((response) => response.json()),
  61. fetch(`${universityData.root_url}/wp-json/wp/v2/pages/?search=${searchField.value}`).then((response) => response.json())
  62. ]);
  63.  
  64. resultsDiv.innerHTML = `
  65. <h2 class="search-overlay__section-title">General Information</h2>
  66. <ul class="link-list min-list">
  67. ${!data[0].length && !data[1].length ? `<p>No General Information Matches That Search<p>` :
  68. `${data[0].map(arr => `<li><a href="${arr.link}">${arr.title.rendered}</a></li>`).join(''). concat(data[1].map(arr => `<li><a href="${arr.link}">${arr.title.rendered}</a></li>`).join(''))}
  69. </ul> `}
  70. `;
  71. } catch (error) {
  72. resultsDiv.innerHTML = `<p>There was a problem with the search.<p>`;
  73. }
  74. isSpinnerVisable = false;
  75. }
  76. }
  77.  
  78.  
  79. // EVENTS
  80. searchButton.addEventListener('click', events.openOverlay);
  81. closeButton.addEventListener('click', events.closeOverlay);
  82. searchField.addEventListener('keyup', events.typingLogic);
  83. document.addEventListener('keydown', events.keyPressDispatcher);
  84. })();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement