```javascript= document.onreadystatechange = function() { if (document.readyState === 'ready' || document.readyState === 'complete') { window.Foxy = new Foxy(); window.Foxy.go(); } }; window.isiOS = () => { return [ 'iPad Simulator', 'iPhone Simulator', 'iPod Simulator', 'iPad', 'iPhone', 'iPod' ].includes(navigator.platform) // iPad on iOS 13 detection || (navigator.userAgent.includes("Mac") && "ontouchend" in document) }; window.isFacebookBrowser = () => { let ua = navigator.userAgent || navigator.vendor || window.opera; return (ua.indexOf("FBAN") > -1) || (ua.indexOf("FBAV") > -1) || (ua.indexOf("INSTAGRAM") > -1); }; class Foxy { constructor() { this.params = new URLSearchParams(window.location.search); this.css = { fab: { backgroundColor: '#ffffff;border: solid 1px rgba(151, 151, 151, 0.28);', backgroundImage: 'linear-gradient(to right, #ff585d, #ff4b84)', boxShadow: '0 1px 4px 0 rgba(0, 0, 0, 0.24);' }, }; this.formStep = 1; this.selectedStoreId = 0; // determine hosts let foxy_live_host; let api_host; let urls = { production: { foxy_live_host: 'https://live.foxy.in', api_host: 'https://live.foxy.in', }, local: { foxy_live_host: 'http://localhost:3000', api_host: 'http://localhost:3000', }, liveDev1: { foxy_live_host: 'https://live.live-dev-1.foxy.in', api_host: 'https://live.live-dev-1.foxy.in', } }; if (window.environment === 'liveDev1') { // enable cross domain post messages document.domain = 'live-dev-1.foxy.in'; } else if (window.environment === 'production') { try { document.domain = 'foxy.in' } catch { } } this.foxy_live_host = urls[window.environment].foxy_live_host; this.api_host = urls[window.environment].api_host; this.brand_id = window.brand_id; // determine if this is a testing environment this.test = this.params.get('test'); this.defaultFirebaseParams = { brand_id: this.brand_id, utm_source: this.params.get('utm_source'), utm_medium: this.params.get('utm_medium'), utm_campaign: this.params.get('utm_campaign'), invite_id: this.params.get('invite_id'), stream_session_id: localStorage.getItem('stream_session_id'), one_on_one_session_id: localStorage.getItem('stream_session_id'), screen_name: 'fab-plugin', is_guest_flow: false }; } go() { // things to do before jq this.loadScripts(); this.setUpFirebase(); } checkBrowserCompatbility() { let supported = Twilio.Video.isSupported; if (window.isiOS()) { supported = false; } return supported; } setUpFormEvents() { let that = this; that.jq(document).on('focusin focusout keypress', 'input', function (e) { let target = that.jq(e.target); that.logEvent(`input_${e.type}`, {...that.defaultFirebaseParams, ...{ name: target.attr('name'), id: target.attr('id') }}) }) } onJqLoaded() { this.appendFAB(); this.setUpFormEvents(); // lead page stuff if (window.leadPage) { let toggle = window.Foxy.toggleFab(); if (toggle && !window.Foxy.selectedStoreId) { window.Foxy.getLocation(); } } } loadScripts() { let that = this; // // load jquery // window.onload = function() { let script; // load jquery if (window.jQuery) { let jqVersion = $().jquery; if (parseInt(jqVersion.split('.')[0]) < 3) { // jquery version is too low; load it. // set the first version to no conflict let $ = $.noConflict(true); // load the new version script = document.createElement('script'); script.onload = function() { window.jq = $.noConflict(true); that.jq = window.jq; that.onJqLoaded(); }; script.src = 'https://code.jquery.com/jquery-3.5.1.min.js'; document.head.appendChild(script); } else { that.jq = $; that.onJqLoaded(); } } else { script = document.createElement('script'); script.onload = function() { window.jq = $.noConflict(true); that.jq = window.jq; that.onJqLoaded(); }; script.src = 'https://code.jquery.com/jquery-3.5.1.min.js'; document.head.appendChild(script); } }; } appendFAB() { let that = this; // this.jq('body').append(this.jq(this.FABTemplate()).html()); // find and save elements this.fab = this.jq('body').find('#foxy-fab'); this.form = this.jq('body').find('#foxy-fab-form'); this.formClose = this.jq('body').find('#foxy-fab-form-close'); this.searchInput = this.jq('body').find('#foxy-fab-search'); this.searchLabel = this.jq('body').find('#dev-search-label'); this.searchResult = this.jq('body').find('#dev-search-result'); this.searchResultContainer = this.jq('body').find('#dev-search-results'); this.searchResultTitle = this.jq('body').find('#dev-search-results-title'); this.formFields = this.jq('body').find('#dev-form-fields'); this.submitForm1 = this.jq('body').find('#dev-submit-form'); this.nameInput = this.jq('body').find('#dev-name'); this.emailInput = this.jq('body').find('#dev-email'); this.mobileInput = this.jq('body').find('#dev-mobile'); this.otpInput = this.jq('body').find('#dev-otp'); this.changeStoreButton = this.jq('body').find('#dev-store-change'); this.locationInput = this.jq('body').find('#dev-lat-long'); this.ipInput = this.jq('body').find('#dev-ip'); this.otpLoader = this.jq('body').find('#dev-otp-loader'); this.resendButton = this.jq('#resend-otp'); this.timer = this.jq('#timer'); this.resendWhatsapp = this.jq('#resend-via-whatsapp'); this.whatsappIcon = this.jq('.whatsapp-icon'); this.whatsappDisabledIcon = this.jq('.whatsapp-disabled-icon'); this.resendWhatsappText = this.jq('.resend-via-whatsapp-text'); this.changeNumberText = this.jq('#dev-otp-number'); this.geoLocateButton = this.jq('#dev-geo-locate'); this.geoLocatingShimmer = this.jq('#dev-geolocating-shimmer'); this.geoLocationInput = this.jq('#dev-geolocation-input'); this.detectPrompt = this.jq('#dev-detect-prompt'); this.noArtists = this.jq('#dev-no-artists'); this.introText = this.jq('#dev-intro-text'); this.fab.removeClass('hidden'); this.fab.fadeIn('slow'); // pre fill values if present let saved_name = localStorage.getItem('foxy_name'); let saved_phone = localStorage.getItem('foxy_phone_number'); let saved_email = localStorage.getItem('foxy_email'); if (saved_name) { this.nameInput.val(saved_name); } if (saved_phone) { this.mobileInput.val(saved_phone); } if (saved_email) { this.emailInput.val(saved_email); } // set event listeners for the button this.fab.on('click', function() { let toggle = that.toggleFab(); // if (localStorage.getItem('selected-store')) { // that.selectStore(parseInt(localStorage.getItem('selected-store'))) // } else { // if (!that.selectedStoreId) { // that.getLocation(); // } // } if (toggle && !that.selectedStoreId) { that.getLocation(); } }); // check if fab has to be opened automatically if (that.params.get('auto-open') === 'true'){ that.fab.trigger('click'); } this.formClose.on('click', function() { that.toggleFab(); }); // set event listeners for change store button this.changeStoreButton.on('click', function() { that.changeStore(); }); // set event listeners for form 1 submission this.submitForm1.on('click', function() { let params = that.params; if (that.formStep === 1) { // validate form let valid = !that.validateForm1(); if (valid) { that.submitForm1.text('Submitting...'); // check if at least one artist is available that.ensureAtleastOneArtist() .then(() => { // if phone number was previously verified, go ahead and directly start call let savedToken = localStorage.getItem('foxy_token'); let saved_phone = localStorage.getItem('foxy_phone_number'); let saved_name = localStorage.getItem('foxy_name'); if ( savedToken && saved_phone === that.mobileInput.val() && saved_name === that.nameInput.val() ) { that.logEvent('verification_skip', that.defaultFirebaseParams); that.logEvent('call_redirect', that.defaultFirebaseParams); window.top.location.href = `${ that.foxy_live_host }/foxy-live/call?auth_token=${savedToken}&coords=${that.locationInput.val()}&store=${ that.selectedStoreId }&test=${that.test ? '1' : ''}&brand=${that.brand_id}&environment=${window.environment}&utm_source=${params.get('utm_source')}&utm_campaign=${params.get('utm_campaign')}&utm_medium=${params.get('utm_medium')}&invite_id=${params.get('invite_id')}&referrer=${localStorage.getItem('referrer')}`; return; } that.jq.ajax({ url: `${that.api_host}/api/v1/users/send_otp`, method: 'POST', data: { user: { phone_number: `${that.mobileInput.val()}`, country_code: '91', }, profile: { name: that.nameInput.val(), email: that.emailInput.val() }, via: 'sms', }, success: function() { that.submitForm1.text('Continue'); that.goToOTPVerification(); that.formStep = 2; localStorage.setItem('foxy_name', that.nameInput.val()); localStorage.setItem('foxy_phone_number', that.mobileInput.val()); localStorage.setItem('foxy_email', that.emailInput.val()); localStorage.removeItem('foxy_token'); that.otpInput.parent().removeClass('hidden'); that.otpInput.show(); that.otpLoader.hide(); that.changeNumberText.text(that.mobileInput.val()); that.logEvent('otp_send', that.defaultFirebaseParams); }, error: function(error) { that.submitForm1.text('Continue'); console.error(error); alert('An error occurred. Please contact customer support.'); that.logEvent('otp_sending_failure', that.defaultFirebaseParams); }, }); }); } // verify OTP } else if (that.formStep === 2) { that.submitForm1.text('Verifying...'); that.jq.ajax({ url: `${that.api_host}/api/v1/users/verify_otp`, method: 'POST', data: { user: { phone_number: `${that.mobileInput.val()}`, country_code: '91', otp: that.getOTP(), }, profile: { name: that.nameInput.val(), }, }, success: function(response) { that.submitForm1.text('Continue'); let token = response.user.token; localStorage.setItem('foxy_token', token); that.logEvent('otp_verification_success', that.defaultFirebaseParams); that.logEvent('call_redirect', that.defaultFirebaseParams); window.top.location.href = `${ that.foxy_live_host }/foxy-live/call?auth_token=${token}&coords=${that.locationInput.val()}&store=${ that.selectedStoreId }&test=${that.test ? '1' : ''}&brand=${that.brand_id}&environment=${window.environment}&utm_source=${params.get('utm_source')}&utm_campaign=${params.get('utm_campaign')}&utm_medium=${params.get('utm_medium')}&invite_id=${params.get('invite_id')}&referrer=${localStorage.getItem('referrer')}`; }, error: function(error) { that.submitForm1.text('Continue'); that.otpInput.addClass('error'); that.otpInput.data('error-message', 'OTP is incorrect'); that.showErrors(); that.logEvent('otp_wrong', that.defaultFirebaseParams); }, }); } }); this.resendButton.on('click', function() { that.resendOtp('sms'); }); this.resendWhatsapp.on('click', function() { if (that.jq(this).hasClass('disabled')) { return; } that.resendOtp('whatsapp'); }); this.geoLocateButton.on('click', function() { that.detectPrompt.hide(); that.getLocation(); that.logEvent('geolocation_request', that.defaultFirebaseParams); }); } toggleFab() { let that = this; // check browser compat let isSupported = that.checkBrowserCompatbility(); if (!isSupported) { that.jq('#dev-unsupported-browser').removeClass('hidden'); if (window.isiOS()) { that.jq('#dev-unsupported-text').text('Please open this link with Google Chrome on Android, macOS or Windows.'); } else { that.jq('#dev-unsupported-text').text('Please open this link with Google Chrome to start the video call'); } that.fab.hide(); that.form.hide(); that.jq('body').css('overflow', 'hidden'); window.parent.postMessage({ event: 'toggleFAB', is_open: this.fab.hasClass('active') }, '*'); if (window.isFacebookBrowser() && !window.isiOS()){ that.jq('.facebook-prompt').removeClass('hidden'); } else { that.jq('#dev-copy-text-section').removeClass('hidden'); } that.jq('#dev-copy-link').val(window.top.location.href); that.jq('#dev-copy').on('click', function () { let copyText = document.getElementById("dev-copy-link"); copyText.select(); copyText.setSelectionRange(0, 99999); /*For mobile devices*/ document.execCommand("copy"); that.jq('#dev-link-copied').removeClass('invisible'); window.setTimeout(() => { that.jq('#dev-link-copied').addClass('invisible'); }, 3000) }); window.fyrebase.logEvent('browser_unsupported', { user_agent: navigator.userAgent, ...that.defaultFirebaseParams }); return false; } else { that.form.show(); } // tell the parent we're toggling FAB if (!window.leadPage) { window.parent.postMessage({ event: 'toggleFAB', is_open: this.fab.hasClass('active') }, '*'); // remove the hidden class this.form.removeClass('hidden'); if (this.fab.hasClass('active')) { this.fab.show(); this.form.hide(); this.fab.removeClass('active'); // tell firebase we closed fab this.logEvent('plugin_close', that.defaultFirebaseParams); } else { this.fab.hide(); this.form.show(); this.form.css('display', 'flex'); this.fab.addClass('active'); this.logEvent('plugin_open', that.defaultFirebaseParams); } that.nameInput.focus(); } // enable google map search that.initGoogleSearchBox(); return true; } initGoogleSearchBox() { let that = this; window.autoComplete = new google.maps.places.SearchBox(document.getElementById('foxy-fab-search'), { // todo: componentRestrictions are not supported by searchBoxes // need to add lat long bounds instead componentRestrictions: { country: 'IN' } }); google.maps.event.addListener(window.autoComplete, 'places_changed', function() { const place = window.autoComplete.getPlaces()[0]; that.locationInput.val(`${place.geometry.location.lat()}x${place.geometry.location.lng()}`); if (!that.selectedStoreId) { that.search('', 'google'); } }) } search(q = '', initiator) { let that = this; if (initiator !== 'auto') { that.formFields.addClass('hidden').hide(); } let coords; let ip; if (initiator === 'google' || initiator === 'auto') { coords = that.locationInput.val(); ip = that.ipInput.val(); } else { coords = undefined; ip = undefined; } this.jq.ajax({ url: `${that.api_host}/api/v1/beauty_stores/search/`, method: 'GET', data: { q: q, coords: coords, brand_id: that.brand_id, ip: ip, }, success: function(results) { that.logEvent('store_search_success', that.defaultFirebaseParams); // remove all results that.searchResultContainer.empty(); // hide the prompt that.detectPrompt.hide(); // save the search results that.storeSearchResults = results; // add search results to UI if (!initiator || initiator === 'google') { that.jq.each(results.objects.slice(0, 4), function(_index, item) { let template = that.searchResult; let templateHTML = template.html(); templateHTML = templateHTML.replace(/{{name}}/g, item.name); templateHTML = templateHTML.replace(/{{address}}/g, item.address); templateHTML = templateHTML.replace(/{{store-id}}/g, item.id); that.searchResultContainer.append(templateHTML); that.jq('.dev-rendered-search-result').on('click', function() { that.selectStore(that.jq(this).data('store-id')); }); }); } else { that.geoLocationInput.show(); that.geoLocatingShimmer.hide(); let selectedStore = results.objects[0]; if (selectedStore) { that.selectStore(selectedStore.id); } } }, error: function(results) { that.logEvent('store_search_failure', that.defaultFirebaseParams); }, complete: function() { that.logEvent('store_search_initiate', that.defaultFirebaseParams); } }); } selectStore(storeId) { let that = this; // hide detect prompt text this.detectPrompt.hide(); // show form fields again this.formFields.removeClass('hidden').show(); this.jq.each(this.formFields.find('.foxy-input').not('#dev-otp'), function (_index, item) { that.jq(item).parent().show(); }); // remove all results this.searchResultContainer.empty(); // hide the search field this.searchInput.hide(); this.searchLabel.hide(); // hide search results this.searchResultContainer.hide(); this.searchResultTitle.hide(); // show intro text // this.introText.show(); // find the selected store let store = this.jq.grep(this.storeSearchResults.objects, function(item) { return item.id === storeId; })[0]; // show the selected store let selectedStoreEl = this.jq('#dev-selected-store'); selectedStoreEl.removeClass('hidden'); selectedStoreEl.show(); selectedStoreEl.find('.text').text(`Connecting you to: ${store.name} - ${store.area_name}`); this.selectedStoreId = store.id; localStorage.setItem('selected-store', store.id); that.logEvent('store_select', that.defaultFirebaseParams); } changeStore() { let that = this; // remove saved store this.selectedStoreId = null; // show form fields again this.formFields.hide(); // this.formFields.removeClass('hidden').show(); this.jq.each(this.jq('.foxy-input').not('#foxy-fab-search'), function(_index, item) { that.jq(item).parent().hide(); }); this.jq('#foxy-fab-search').parent().show(); // show detect prompt this.detectPrompt.show(); this.detectPrompt.css('display', 'flex'); // remove all results this.searchResultContainer.empty(); // show the search field this.searchInput.show(); this.searchLabel.show(); // hide intro text // this.introText.hide(); // show search results // hide search results this.searchResultContainer.show(); this.searchResultTitle.show(); // remove the selected store let selectedStoreEl = this.jq('#dev-selected-store'); selectedStoreEl.find('.text').text(''); selectedStoreEl.addClass('hidden'); selectedStoreEl.hide(); // empty the search input this.searchInput.val(''); // hide the OTP input if it was visible this.otpInput.parent().addClass('hidden'); this.otpInput.hide(); // set form state to 1 this.formStep = 1; // get closest stores that.search('', 'google'); this.logEvent('store_change', this.defaultFirebaseParams); } validateForm1() { let that = this; let hasErrors = false; // check store validity if (!this.selectedStoreId) { that.searchInput.addClass('error'); hasErrors = true; that.searchInput.data('error-message', 'This field is required'); that.logEvent('store_input_error', this.defaultFirebaseParams); } // check name validity // todo: this is not dry if (!this.nameInput.val() || !this.nameInput.val().replace(/\s/g, '').length) { that.nameInput.addClass('error'); hasErrors = true; that.nameInput.data('error-message', 'This field is required'); that.logEvent('name_input_error', this.defaultFirebaseParams); } else { // remove error classes and messages that.nameInput.removeClass('error'); } // check email validity if (this.emailInput.val()) { let mailformat = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/; if (!this.emailInput.val().match(mailformat)) { that.emailInput.addClass('error'); hasErrors = true; that.emailInput.data('error-message', 'Please enter a valid email'); that.logEvent('email_input_error', this.defaultFirebaseParams); } else { that.emailInput.removeClass('error'); } } // check phone validity if (!this.mobileInput.val()) { that.mobileInput.addClass('error'); that.mobileInput.data('error-message', 'This field is required'); hasErrors = true; that.logEvent('phone_number_input_error', this.defaultFirebaseParams); } else if (that.mobileInput.val().length !== 10) { that.mobileInput.addClass('error'); that.mobileInput.data( 'error-message', 'Please enter a Indian 10 digit mobile number.', ); hasErrors = true; } else if ( !/^[+-]?\d+(\.\d+)?([eE][+-]?\d+)?$/.test(that.mobileInput.val()) ) { that.mobileInput.addClass('error'); that.mobileInput.data('error-message', 'Please only enter digits.'); hasErrors = true; } else if ( that.jq.inArray(that.mobileInput.val().slice(0, 1), [ '0', '1', '2', '3', '4', '5', ]) > -1 && that.jq.inArray(that.mobileInput.val().slice(0, 6), [ '369900' ]) < 0 ) { that.mobileInput.addClass('error'); that.mobileInput.data( 'error-message', 'Phone number should start with 6,7,8,9.', ); hasErrors = true; that.logEvent('phone_number_input_error', this.defaultFirebaseParams); } else { // remove error classes and messages that.mobileInput.removeClass('error'); } that.jq.each(that.jq('body').find('.foxy-input'), function(_index, item) { let label = that.jq(item).siblings('.label'); label.removeClass('error'); }); that.showErrors(); return hasErrors; } showErrors() { let that = this; // add error class to correct labels that.jq.each(that.jq('body').find('.error'), function(_index, item) { let label = that.jq(item).siblings('.label'); label.addClass('error'); }); // add error text that.jq.each(that.jq('body').find('.foxy-input'), function(_index, item) { let errorText = that.jq(item).siblings('.error-text'); errorText.text(that.jq(item).data('error-message')); }); } goToOTPVerification() { let that = this; that.logEvent('screen_view', {...that.defaultFirebaseParams, ...{ screen: 'otp_verification' }}); this.jq.each(this.jq('.foxy-input').not('#dev-otp'), function(_index, item) { that.jq(item).parent().hide(); }); this.jq('#dev-otp').show(); this.jq('#dev-otp').parent().show(); that.otpLoader.parent().removeClass('hidden'); that.otpLoader.removeClass('hidden').show(); that.otpInput.hide(); that.startOTPTimer(); // set OTP validation this.jq.each(this.otpInput.find('input'), function(_index, item) { that.jq(item).on('keyup', function(e) { that.logEvent('otp_input_keypress', that.defaultFirebaseParams); // if backspace is pressed, clear input if (e.keyCode === 8) { that.jq(item).val(); // and go to prev input if (!that.jq(item).hasClass('1')) { let prevInput = that.jq(item).prev(); prevInput.focus(); } } // enter a maximum of 1 digit if (that.jq(item).val().length > 1) { that.jq(item).val(that.jq(item).val().substr(-1)); } // if the length is 1, proceed to next box if (that.jq(item).val().length === 1) { if (!that.jq(item).hasClass('4')) { let nextInput = that.jq(item).next(); nextInput.focus(); } } // if all inputs have been filled, submit form if (that.jq(item).hasClass('4')) { let values = that.jq.map(that.otpInput.find('input'), function( item, ) { if (that.jq(item).val()) { return that.jq(item).val(); } }); if (values.length === 4) { // trigger form submit if 4 digits are present that.submitForm1.click(); that.logEvent('otp_submit', that.defaultFirebaseParams); } } }); }); that.jq('body').on('click', '#dev-number-change', function() { that.logEvent('phone_number_change', that.defaultFirebaseParams); // show form fields again that.formFields.removeClass('hidden').show(); that.jq.each(that.jq('.foxy-input').not('#dev-otp'), function(_index, item) { that.jq(item).parent().show(); }); // hide the OTP input that.otpInput.parent().hide(); // set form state to 1 that.formStep = 1; }); } getOTP() { let that = this; let otp = ''; this.jq.each(this.otpInput.find('input'), function(_index, item) { otp += that.jq(item).val(); }); return otp; } getLocation() { let that = this; if (!navigator.geolocation) { alert( 'Your browser does not support geo location. Foxy Live will not work as expected.', ); that.logEvent('geolocation_error', that.defaultFirebaseParams); } else { that.geoLocationInput.hide(); that.geoLocatingShimmer.show(); that.logEvent('permission_trigger', {...that.defaultFirebaseParams, ...{ permission_name: 'geolocation', screen_name: 'plugin' }}); navigator.geolocation.getCurrentPosition( function(location) { that.logEvent('permission_allow', { ...that.defaultFirebaseParams, ...{ permission_name: 'geolocation', screen_name: 'plugin' } }); const lat = location.coords.latitude; const long = location.coords.longitude; that.jq('body').find('#dev-lat-long').val(`${lat}x${long}`); // find closest store // show searching shimmer that.search('', 'auto'); }, function() { that.logEvent('permission_deny', { ...that.defaultFirebaseParams, ...{ permission_name: 'geolocation', screen_name: 'plugin' } }); // if location was rejected, use IP address as fallback that.logEvent('ip_address_fetch', that.defaultFirebaseParams); that.jq.getJSON('https://api.foxy.in/api/v1/my_ip', function( data, ) { that.jq('body').find('#dev-ip').val(`${data.ip}`); that.search('', 'auto'); }); }, ); } } hideOTPTimer() { let that = this; that.logEvent('otp_timer_hide', that.defaultFirebaseParams); this.timer.addClass('hidden'); this.resendButton.removeClass('hidden'); this.whatsappIcon.removeClass('hidden'); this.whatsappDisabledIcon.addClass('hidden'); this.resendWhatsappText[0].style.color = '#009688'; this.resendWhatsapp.removeClass('disabled'); } showOTPTimer() { let that = this; that.logEvent('otp_timer_show', that.defaultFirebaseParams); this.timer.removeClass('hidden'); this.resendButton.addClass('hidden'); this.whatsappIcon.addClass('hidden'); this.whatsappDisabledIcon.removeClass('hidden'); this.resendWhatsappText[0].style.color = '#979BAA'; this.resendWhatsapp.addClass('disabled'); } getTime(sec) { sec = sec - 1; return (sec < 10 ? '0' : '') + sec; } startOTPTimer() { let that = this; let seconds = 16; let timer = this.jq('#timer'); this.showOTPTimer(); let timerId = setTimeout(function otpTimer() { timer.text(`00:${that.getTime(seconds)}`); seconds = seconds - 1; timerId = setTimeout(otpTimer, 1000); if (seconds === 0) { that.hideOTPTimer(); clearTimeout(timerId); } }, 1000); } resendOtp(via) { let that = this; that.logEvent('otp_rerequest', {...that.defaultFirebaseParams, ...{ medium: via }}); that.jq.ajax({ url: `${that.api_host}/api/v1/users/send_otp`, method: 'POST', data: { user: { phone_number: `${that.mobileInput.val()}`, country_code: '91', }, profile: { name: that.nameInput.val(), }, via: via, }, success: function() { that.startOTPTimer(); }, error: function(error) { that.continueButton.text('Continue'); console.error(error); alert('An error occurred. Please contact customer support.'); that.logEvent('otp_sending_failure', that.defaultFirebaseParams); }, }); } setUpFirebase() { let that = this; // get settings fetch(`${that.api_host}/api/v1/one_on_one_sessions/settings`, { method: 'GET', headers: { 'x-auth-token': localStorage.getItem('auth_token') } }) .then((response) => response.json()) .then((response) => { let firebase_settings = response.firebase_events; that.firebase = firebase.initializeApp(firebase_settings); that.firebase_analytics = that.firebase.analytics(); localStorage.setItem('places_api_key', response.places_api_key) that.logEvent('firebase_init_success', that.defaultFirebaseParams); }) .catch((error) => { console.error(error); }) } ensureAtleastOneArtist() { let that = this; return new Promise((resolve, reject) => { fetch(`/api/v1/one_on_one_sessions/available_artists/?store_id=${that.selectedStoreId}`, { method: 'GET' }) .then((response) => response.json()) .then((response) => { if (response.available_artists < 1) { let selectedStoreEl = this.jq('#dev-selected-store'); that.formFields.hide(); that.noArtists.show(); that.submitForm1.hide(); selectedStoreEl.hide(); } resolve(this); }) .catch((error) => { console.error(error); // let the user go ahead even if this call fails resolve(this); }) }); } logEvent(eventName, eventParams) { if (this.firebase_analytics) { this.firebase_analytics.logEvent(eventName, eventParams); } else { console.error('Skipping event, firebase not available.') } } } ```