{"version":3,"file":"autocompleteController-0181b105.js","sources":["../../../../app/frontend/components/shared/controllers/autocompleteController.js"],"sourcesContent":["import { debounce } from 'lodash';\nimport { trackSegmentEvent, getContextProperties, getElementProperties } 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 }\n else if (type === \"service\") {\n href += `&query=${parameterizeQueryString_2(name)}&service_ids=${parameterizeQueryString_2(serviceIds)}`;\n }\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 }\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 }\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 if (index > -1) {\n const newSelection = suggestionsTarget.querySelector(`[data-index='${index}']`);\n newSelection.classList.add(selectedClass);\n idInputTarget.value = newSelection.dataset.id;\n autocompleteInputTarget.value = newSelection.dataset.name;\n }\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 index = parseInt(selection.dataset.index);\n setSelection(index);\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 }\n else if (suggestion.type === \"location\") {\n return `
  • \n
    \"img\"
    \n
    ${suggestion.highlight}
  • `;\n }\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 }\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 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 }\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","onResultClick","selection","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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"}