I have issue in js code that I want to add predictive text inside input field from Google's Locations API
The code is
let currentStep = 0;
function initAutocomplete() {
const input = document.getElementById("address");
const autocomplete = new google.maps.places.Autocomplete(input, {
types: ["address"],
strictBounds: true
});
autocomplete.addListener("place_changed", function() { const place = autocomplete.getPlace(); const desiredCities = ["Washington, DC"]; const desiredZipCodes = []; const desiredCounties = []; const desiredStates = ["DC"]; let isState = true; let isCity = true; let isZipCode = true; let isCounty = true; let cityName = ""; let countyName = ""; let stateName = ""; place.address_components.forEach(component => { if (component.types.includes("locality")) { cityName = component.long_name; } if (desiredZipCodes.length) { if (component.types.includes("postal_code")) { isZipCode = desiredZipCodes.includes(component.short_name); } } if (component.types.includes("administrative_area_level_2")) { countyName = component.long_name; } if (component.types.includes("administrative_area_level_1")) { stateName = component.short_name; if (desiredStates.length) { isState = desiredStates.includes(stateName); } } }); if (cityName && stateName && desiredCities.length) { const cityStateCombo = `${cityName}, ${stateName}`; isCity = desiredCities.includes(cityStateCombo); } if (countyName && stateName && desiredCounties.length) { const countyStateCombo = `${countyName}, ${stateName}`; isCounty = desiredCounties.includes(countyStateCombo); } const isDesiredLocation = isCity && isZipCode && isCounty && isState; document.getElementById("is-florida").value = isDesiredLocation ? "true" : "false"; document.getElementById("next-btn").disabled = !isDesiredLocation; if (!isDesiredLocation) { showErrorMessage("address-error", "We are not interested in this area."); } else { hideErrorMessage("address-error"); changeStep(1); }});document.getElementById('address').addEventListener('input', async function() { const query = this.value; const datalist = document.getElementById('address-suggestions'); datalist.innerHTML = ''; // Clear existing options if (query.length < 3) return; // Minimum 3 characters for suggestions try { const response = await fetch(`https://maps.googleapis.com/maps/api/place/autocomplete/json?input=${encodeURIComponent(query)}&key=YOUR_API_KEY`); const data = await response.json(); data.predictions.forEach(prediction => { const option = document.createElement('option'); option.value = prediction.description; // Use description for suggestions datalist.appendChild(option); }); } catch (error) { console.error('Error fetching suggestions:', error); }});input.addEventListener("input", function() { document.getElementById("next-btn").disabled = true; if (input.value.trim() === "") { showErrorMessage("address-error", "Address is required"); } else { hideErrorMessage("address-error"); }});
}
const totalSteps = 10; // Change this to the number of steps
function updateProgressBar() {
const progressBar = document.getElementById("progress-bar");
const progressText = document.getElementById("progress-text");
const progress = ((currentStep + 1) / totalSteps) * 100;
progressBar.style.width = Math.min(100, progress) + "%";progressText.innerText = `${Math.round(progress)}%`;
}
function showStep(step) {
const steps = document.querySelectorAll(".step");
steps.forEach((s, index) => s.classList.toggle("active", index === step));
updateProgressBar();
}
function changeStep(n) {
if (currentStep + n < 0 || currentStep + n >= totalSteps) return;
currentStep += n;showStep(currentStep);
}
function showStep(step) {
const steps = document.querySelectorAll(".step");
steps.forEach((step) => step.style.display = "none");
steps[step].style.display = "block";
document.getElementById("prev-btn").style.display = step === 0 ? "none" : "inline";document.getElementById("next-btn").style.display = step === steps.length - 1 ? "none" : "inline";document.getElementById("submit-btn").style.display = step === steps.length - 1 ? "inline" : "none";updateProgressBar();if (step === 0) { const input = document.getElementById("address"); input.value = ''; document.getElementById("is-florida").value = "false";}
}
function changeStep(n) {
const steps = document.querySelectorAll(".step");
if (n > 0 && !validateForm()) return false;
steps[currentStep].style.display = "none";currentStep += n;if (currentStep >= steps.length) { submitFormToWebhook(); return false;}showStep(currentStep);updateProgressBar();
}
function validateForm() {
const steps = document.querySelectorAll(".step");
const inputs = steps[currentStep].querySelectorAll("input, select, textarea");
let valid = true;
inputs.forEach(input => { let errorId = input.id ? `${input.id}-error` : `${input.name}-error`; const errorElement = document.getElementById(errorId); if (input.type === "radio" && !document.querySelector(`input[name="${input.name}"]:checked`)) { valid = false; if (errorElement) showErrorMessage(errorId, "This field is required."); } else if (input.type === "email") { if (!validateEmail(input.value)) { valid = false; if (errorElement) showErrorMessage(errorId, "Please enter a valid email address."); } else { if (errorElement) hideErrorMessage(errorId); } } else if (input.name === "full-name") { if (!input.value) { valid = false; if (errorElement) showErrorMessage(errorId, "Please enter your full name."); } else { if (errorElement) hideErrorMessage(errorId); } } else if (input.name === "phone-number") { if (!validatePhoneNumber(input.value)) { valid = false; if (errorElement) showErrorMessage(errorId, "Please enter a valid phone number."); } else { if (errorElement) hideErrorMessage(errorId); } } else if (input.value.trim() === "") { valid = false; if (errorElement) showErrorMessage(errorId, "This field is required."); } else { if (errorElement) hideErrorMessage(errorId); }});return valid;
}
function validateEmail(email) {
const emailPattern = /^[^\s@]+@[^\s@]+.[^\s@]+$/;
return emailPattern.test(email);
}
function validatePhoneNumber(phone) {
const usCaPhonePattern = /^(+?1\s?)?((?\d{3})?[\s.-]?)?\d{3}[\s.-]?\d{4}$/;
return usCaPhonePattern.test(phone);
}
function showErrorMessage(id, message) {
const errorDiv = document.getElementById(id);
if (errorDiv) {
errorDiv.innerText = message;
errorDiv.style.display = "block";
}
}
function hideErrorMessage(id) {
const errorDiv = document.getElementById(id);
if (errorDiv) {
errorDiv.style.display = "none";
}
}
function submitFormToWebhook() {
const form = document.getElementById("property-form");
const formData = new FormData(form);
fetch('https://services.leadconnectorhq.com/hooks/LrWypu7aGiHXi4GJFeaJ/webhook-trigger/61d241b7-94c3-4828-9838-8d7054ab7da5', { method: 'POST', body: formData}).then(response => response.json()).then(data => { console.log('Success:', data); showSuccessMessage();}).catch(error => console.error('Error:', error));
}
function showSuccessMessage() {
document.querySelector('.form-container').style.display = 'none';
const successMessageDiv = document.getElementById('success-message');
successMessageDiv.innerHTML = "
Survey submitted successfully!
";successMessageDiv.style.textAlign = 'center';
successMessageDiv.style.marginTop = '20px';
}
console.log('currentStep', currentStep);
showStep(currentStep);
initAutocomplete();
const form = document.getElementById("property-form");
form.addEventListener("submit", function(event) {
event.preventDefault();
if (validateForm()) {
submitFormToWebhook();
}
});
const propertyTypeSelect = document.getElementById("property-type");
propertyTypeSelect.addEventListener("change", function() {
if (currentStep === 1 && this.value === "mobile-home") {
showErrorMessage("property-type-error", "We are not interested in this type of home");
document.getElementById("next-btn").disabled = true;
} else {
hideErrorMessage("property-type-error");
document.getElementById("next-btn").disabled = false;
}
});
document.getElementById("phone-number").addEventListener("input", function(event) {
let input = event.target.value.replace(/\D/g, '');
if (input.length > 0) {
input = input.substring(0, 10);
}
if (input.length > 6) { input = `(${input.substring(0, 3)}) ${input.substring(3, 6)}-${input.substring(6, 10)}`;} else if (input.length > 3) { input = `(${input.substring(0, 3)}) ${input.substring(3, 6)}`;} else if (input.length > 0) { input = `(${input}`;}event.target.value = input;
});
Top comments(0)
For further actions, you may consider blocking this person and/orreporting abuse