{"version":3,"file":"autocompleteController-9557dacb.js","sources":["../../../../app/frontend/components/shared/controllers/autocompleteController.js"],"sourcesContent":["import {debounce} from 'lodash';\nimport {\n trackSegmentEvent,\n getContextProperties,\n getElementProperties\n} from '~/components/shared/tracking/segmentAnalytics';\n\n// these need to be outside the controllerElement loop scope in order to keep track of data selected from the inputs\nconst submitBtns = document.querySelectorAll('[data-target=\"submit-btn\"]');\nlet apiSelection = null;\nlet locationSelection = null;\nconst directoryInput = document.querySelector('[data-search-input=\"directory\"]');\nconst locationInput = document.querySelector('[data-search-input=\"city\"]');\n\nconst defaultSuggestions = [\n {\n \"type\": \"keyword\",\n \"name\": \"Urgent Care\",\n \"id\": \"kwidx_provider_type_uc\",\n },\n {\n \"type\": \"service\",\n \"name\": \"Rapid COVID test\",\n \"id\": \"Olq1m9,Ord20g_rapid_covid_test_urgent_care\",\n },\n {\n \"type\": \"service\",\n \"name\": \"COVID test\",\n \"id\": \"9nvZo9,Olq1m9,Ord20g,p3MME9,pPooAg,pvN7yp_covid_test_urgent_care\",\n },\n {\n \"type\": \"service\",\n \"name\": \"Flu Shot\",\n \"id\": \"n9wG9K_flu_shot_urgent_care\",\n },\n {\n \"type\": \"symptom\",\n \"name\": \"Fever\",\n \"id\": \"urgent_care_Fever_Fever\",\n },\n {\n \"type\": \"symptom\",\n \"name\": \"Urinary tract infection\",\n \"id\": \"urgent_care_Uti_Urinary_tract_infection\",\n },\n {\n \"type\": \"symptom\",\n \"name\": \"Flu, cold, or cough\",\n \"id\": \"\",\n },\n {\n \"type\": \"symptom\",\n \"name\": \"Ear ache\",\n \"id\": \"\",\n },\n {\n \"type\": \"symptom\",\n \"name\": \"Rash\",\n \"id\": \"urgent_care_Rash_Rash\",\n },\n {\n \"type\": \"symptom\",\n \"name\": \"Sore throat\",\n \"id\": \"urgent_care_Sore_throat_Sore_throat\",\n },\n];\n\n// data tracking for autocomplete\nsubmitBtns.forEach(btn => {\n btn.addEventListener('click', (e) => {\n trackSegmentEvent('Directory Search CTA Clicked', {\n ...getContextProperties(),\n ...getElementProperties(btn),\n action: 'clicked',\n });\n });\n});\nif (directoryInput) {\n directoryInput.addEventListener('click', (e) => {\n trackSegmentEvent('Directory Search Selector Clicked', {\n ...getContextProperties(),\n action: 'clicked',\n });\n });\n}\nif (locationInput) {\n locationInput.addEventListener('click', (e) => {\n trackSegmentEvent('Directory Search Location Clicked', {\n ...getContextProperties(),\n action: 'clicked',\n });\n });\n}\n\ndocument.querySelectorAll('[data-controller=\"autocomplete\"]')\n .forEach(controllerElement => {\n const idInputTarget = controllerElement.querySelector('[data-autocomplete-target=\"id-input\"]');\n const suggestionsTarget = controllerElement.querySelector('[data-autocomplete-target=\"suggestions\"]');\n const autocompleteInputTarget = controllerElement.querySelector('[data-autocomplete-target=\"autocomplete-input\"]');\n const searchPathValue = controllerElement.dataset.autocompleteSearchPathValue;\n const queryKeyValue = controllerElement.dataset.autocompleteQueryKeyValue;\n const selectedClass = 'results__item--selected';\n let results = [];\n\n // change this to an env variable\n const baseUrl = \"https://solvhealth.com/r/search\";\n let type = \"\";\n let name = \"\";\n let serviceIds = \"\";\n let location = \"\";\n let lat = \"\";\n let lng = \"\";\n let state = \"\";\n\n const buildQueryString = (query) => `${searchPathValue}?${queryKeyValue}=${query}`;\n\n const parameterizeQueryString_1 = (string) => {\n let temp = string;\n return temp.replace(/\\s+/g, '-').toLowerCase();\n }\n\n const parameterizeQueryString_2 = (string) => {\n let temp = string;\n return encodeURIComponent(temp).replace('%20', '+');\n }\n\n const setSearchButtonHref = (href) => {\n // submitBtn.setAttribute('href', href);\n submitBtns.forEach(btn => btn.setAttribute('href', href));\n }\n\n const buildSRPUrl = () => {\n\n if (apiSelection !== null) {\n type = apiSelection.dataset.type;\n name = apiSelection.dataset.name;\n serviceIds = apiSelection.dataset.id;\n }\n\n if (locationSelection !== null) {\n location = locationSelection.dataset.name;\n lat = locationSelection.dataset.coordLat;\n lng = locationSelection.dataset.coordLong;\n state = locationSelection.dataset.state;\n }\n\n //begin building the url\n let href = `${baseUrl}?patient=adult`;\n\n if (type === \"symptom\") {\n href += `&query=${parameterizeQueryString_2(name)}`;\n } else if (type === \"service\") {\n href += `&query=${parameterizeQueryString_2(name)}&service_ids=${parameterizeQueryString_2(serviceIds)}`;\n } else if (type === \"location\") { // the type called location is different from the city selected from the second input\n state = apiSelection.dataset.state;\n href = `https://www.solvhealth.com/${parameterizeQueryString_1(name)}-${state}-${serviceIds}`;\n window.location = href; // redirect to the location page upon selection\n } else {\n if (apiSelection !== null)\n href += `&query=${parameterizeQueryString_2(name)}`;\n else if (directoryInput.value !== \"\") {\n href += `&query=${parameterizeQueryString_2(directoryInput.value)}`;\n } else\n href += `&query=Urgent+Care`;\n }\n\n // add the rest of the parameters\n href += `&time=asap&modality=any`;\n\n if (location !== \"\")\n href += `&location=${parameterizeQueryString_2(location)}&lat=${lat}&lng=${lng}`;\n else\n href += `&location=&lat=&lng=`; // when the user is redirected, the solv app will automatically use the user's location in the browser, so we can leave these blank\n\n if (state !== \"\")\n href += `&state=${state}`;\n\n setSearchButtonHref(href);\n }\n\n // in case the user types in but does not select anything from the menu\n if (directoryInput) {\n directoryInput.addEventListener('input', (e) => {\n buildSRPUrl();\n });\n }\n const closeSuggestionsPanel = () => {\n suggestionsTarget.parentElement.classList.add('autocomplete__results--hidden');\n }\n\n const onClickOutside = (e) => {\n e.stopPropagation();\n const isOutside = !controllerElement.contains(e.target) && e.target !== controllerElement;\n if (isOutside) {\n closeSuggestionsPanel();\n document.removeEventListener('click', onClickOutside)\n }\n }\n\n const getSelectedResult = () => {\n if (results.length === 0) {\n return null;\n }\n return suggestionsTarget.querySelector(`.${selectedClass}`);\n }\n\n const setSelection = (index) => {\n getSelectedResult()?.classList.remove(selectedClass);\n const newSelection = suggestionsTarget.querySelector(`[data-index='${index}']`);\n if (index > -1) {\n newSelection.classList.add(selectedClass);\n idInputTarget.value = newSelection.dataset.id;\n autocompleteInputTarget.value = newSelection.dataset.name;\n }\n }\n\n const reloadMentalHealthPage = (selection) => {\n console.log(selection)\n const currentHref = window.location.href;\n const newQueryParam = {city_id: selection.dataset.id};\n const newUrl = new URL(currentHref);\n newUrl.searchParams.set('city', selection.dataset.name);\n window.location.href = newUrl;\n }\n\n const onResultClick = (e) => {\n let selection = e.target;\n // there are divs and img inside the results, so we need to check if the user clicked on those instead of the li\n if (e.target.tagName === 'DIV' || e.target.tagName === 'IMG')\n selection = e.target.parentElement;\n\n const isMentalHealth = controllerElement.dataset.autocompleteMentalHealthListings == \"true\";\n\n if (isMentalHealth) {\n reloadMentalHealthPage(selection)\n return\n } else {\n const index = parseInt(selection.dataset.index);\n setSelection(index);\n }\n\n\n // we need to set the global variables in order to use them in the buildSRPUrl function for building the url\n if (selection.dataset.location)\n locationSelection = selection;\n else\n apiSelection = selection;\n\n if (directoryInput) {\n buildSRPUrl();\n }\n\n closeSuggestionsPanel();\n }\n\n const openSuggestionsPanel = () => {\n suggestionsTarget.parentElement.classList.remove('autocomplete__results--hidden');\n document.addEventListener('click', onClickOutside)\n }\n\n const addHandlersToSuggestions = () => {\n suggestionsTarget.querySelectorAll('.results__item')\n .forEach(el => {\n el.addEventListener('click', onResultClick)\n el.addEventListener('keyup', e => {\n if (e.key === 'Enter' || e.key === 'Return') {\n onResultClick(e);\n }\n })\n });\n }\n\n const buildAPISuggestionHTML = (suggestion, index) => {\n if (suggestion.name === \"Urgent Care\") {\n return `
  • ${suggestion.highlight}
  • `;\n } else if (suggestion.type === \"location\") {\n return `
  • \n
    \"img\"
    \n
    ${suggestion.highlight}
  • `;\n } else {\n return `
  • ${suggestion.highlight}
  • `;\n }\n }\n\n const buildLocationSuggestionHTML = (suggestion, index) =>\n `
  • ${suggestion.name_with_state}
  • `;\n\n const buildDefaultSuggestionHTML = (suggestion, index) => {\n if (suggestion.name === \"Urgent Care\") {\n return `
  • \"img\"
    ${suggestion.name}
  • `;\n } else {\n return `
  • ${suggestion.name}
  • `;\n }\n }\n\n const showDirectoryPromptPanel = () => {\n const html = defaultSuggestions.map((s, index) => buildDefaultSuggestionHTML(s, index)).join('');\n suggestionsTarget.innerHTML = html;\n addHandlersToSuggestions();\n openSuggestionsPanel();\n }\n\n const showLocationPromptPanel = () => {\n const html = `
  • Search Location...
  • `;\n suggestionsTarget.innerHTML = html;\n openSuggestionsPanel();\n }\n\n const keyHandler = (e) => {\n\n const isMentalHealth = controllerElement.dataset.autocompleteMentalHealthListings == \"true\";\n\n if (isMentalHealth) {\n return\n }\n\n if (results.length === 0) {\n return\n }\n const currentSelection = getSelectedResult();\n let currentIndex = -1;\n if (currentSelection) {\n currentIndex = parseInt(currentSelection.dataset.index);\n }\n switch (e.key) {\n case 'ArrowDown':\n if (currentIndex < results.length - 1) {\n currentIndex++;\n setSelection(currentIndex);\n }\n break;\n case 'ArrowUp':\n if (currentIndex > -1) {\n currentIndex--;\n setSelection(currentIndex);\n }\n break;\n case 'Enter':\n case 'Return':\n closeSuggestionsPanel();\n }\n }\n\n const search = async (e) => {\n const query = e.target.value;\n if (query.length === 0) {\n if (e.target.dataset.searchInput === \"directory\")\n showDirectoryPromptPanel();\n else\n showLocationPromptPanel();\n return\n }\n\n results = [];\n closeSuggestionsPanel();\n const url = buildQueryString(query);\n\n const resp = await fetch(url, {\n method: \"GET\"\n });\n\n const data = await resp.json();\n results = data.results;\n\n const searchImpressionTrackingData = data.search_tracking_data;\n\n if (searchImpressionTrackingData) {\n const impressionTrackingApiResponse = await fetch(\"https://d1t8xc2i03znwz.cloudfront.net/api/v1/track/search-intent/send\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(searchImpressionTrackingData),\n });\n }\n\n let html;\n\n if (results.length > 0) {\n // this checks whether the results come from the API or the location database, since they both return an array of objects, we can check with hasOwnProperty\n // if the results come from the API, they will have a 'type' property\n if (results[0].hasOwnProperty('type')) {\n results = results.slice(0, 7);\n html = results.map((s, index) => buildAPISuggestionHTML(s, index)).join('');\n suggestionsTarget.innerHTML = html;\n addHandlersToSuggestions();\n } else {\n html = results.map((s, index) => buildLocationSuggestionHTML(s, index)).join('');\n suggestionsTarget.innerHTML = html;\n addHandlersToSuggestions();\n }\n } else {\n html = `
  • No Results Found
  • `;\n suggestionsTarget.innerHTML = html;\n }\n openSuggestionsPanel();\n };\n\n const actions = {\n search: debounce(search, 300),\n };\n\n controllerElement.querySelectorAll(\"[data-action]\").forEach(el => {\n const actionName = el.dataset.action.split('#')[1];\n el.addEventListener('input', actions[actionName]);\n el.addEventListener('click', actions['search']);\n\n // TODO: when refactoring this can be specified in the DOM\n el.addEventListener('keyup', keyHandler);\n })\n\n controllerElement.addEventListener('keyup', e => {\n if (e.key === 'Escape') {\n closeSuggestionsPanel();\n }\n });\n\n })\n"],"names":["submitBtns","apiSelection","locationSelection","directoryInput","locationInput","defaultSuggestions","btn","e","trackSegmentEvent","getContextProperties","getElementProperties","controllerElement","idInputTarget","suggestionsTarget","autocompleteInputTarget","searchPathValue","queryKeyValue","selectedClass","results","baseUrl","type","name","serviceIds","location","lat","lng","state","buildQueryString","query","parameterizeQueryString_1","string","parameterizeQueryString_2","setSearchButtonHref","href","buildSRPUrl","closeSuggestionsPanel","onClickOutside","getSelectedResult","setSelection","index","_a","newSelection","reloadMentalHealthPage","selection","currentHref","newUrl","onResultClick","openSuggestionsPanel","addHandlersToSuggestions","el","buildAPISuggestionHTML","suggestion","buildLocationSuggestionHTML","buildDefaultSuggestionHTML","showDirectoryPromptPanel","html","s","showLocationPromptPanel","keyHandler","currentSelection","currentIndex","search","url","data","searchImpressionTrackingData","actions","debounce","actionName"],"mappings":"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"}