1jQuery.noConflict(); 2(function ($) { 3 $(function () { 4 jQuery(document).ready(function ($) { 5 // Assuming baseApiUrl is predefined 6 const baseApiUrl = 'https://api.incom.ai/v1'; 7 let searchTimeout; // Initialize timeout variable 8 let products = []; 9 10 function getDeposits(latitude, longitude) { 11 $.ajax({ 12 url: `${baseApiUrl}/groups/public`, 13 method: 'POST', 14 data: { 15 latitude: latitude, 16 longitude: longitude, 17 }, 18 success: function (response) { 19 jQuery('#show-groups').html(''); 20 21 if (response.status == 'success') { 22 // Assuming you have a method to set the location and shops 23 // setLocation({latitude, longitude}); // This needs to be adapted for non-React use 24 // setShops(response.data.data); // Adapt this based on how you're managing state 25 console.log('locations: ', response); 26 27 let groups = response.data; 28 groups.forEach((group) => { 29 let html = ` 30 <div class="shop"> 31 <img src='https://api.incom.ai/${group.logo.filePath}' alt="Shop Logo" 32 style='width: 100%, height: auto'/> 33 <h4>${group.name}</h4> 34 <p>Distanta: ${group.road_distance}</p> 35 </div> 36 `; 37 38 jQuery('#show-groups').css('visibility', 'visible').append(html); 39 jQuery('div#shop-map').css('display', 'block'); 40 }); 41 } 42 }, 43 error: function (error) { 44 console.log(error); 45 }, 46 }); 47 } 48 49 // Function to check and update coordinates in localStorage 50 function updateLocation(latitude, longitude) { 51 const storedLat = localStorage.getItem('latitude'); 52 const storedLong = localStorage.getItem('longitude'); 53 54 // Compare stored coordinates with current coordinates 55 if (storedLat === latitude.toString() && storedLong === longitude.toString()) { 56 console.log('Using stored coordinates:', storedLat, storedLong); 57 getDeposits(storedLat, storedLong); 58 } else { 59 console.log('Updating coordinates and fetching deposits.'); 60 localStorage.setItem('latitude', latitude); 61 localStorage.setItem('longitude', longitude); 62 getDeposits(latitude, longitude); 63 } 64 } 65 66 // Main function to handle geolocation 67 function handleGeolocation() { 68 const storedLat = localStorage.getItem('latitude'); 69 const storedLong = localStorage.getItem('longitude'); 70 getDeposits(storedLat, storedLong); 71 72 if ('geolocation' in navigator) { 73 navigator.geolocation.getCurrentPosition( 74 function (position) { 75 var latitude = position.coords.latitude; 76 var longitude = position.coords.longitude; 77 console.log('Current position:', latitude, longitude); 78 79 updateLocation(latitude, longitude); 80 }, 81 function (error) { 82 console.log(error.message); 83 }, 84 { 85 enableHighAccuracy: true, 86 timeout: 5000, 87 maximumAge: 0, 88 } 89 ); 90 } else { 91 console.log('Geolocation is not supported by this browser.'); 92 } 93 } 94 95 // Call handleGeolocation on page load or when needed 96 handleGeolocation(); 97 98 // Function to get products based on search 99 function getProductsSearched(search) { 100 jQuery('#show-results').html(''); 101 $.get(`${baseApiUrl}/products/global?page=1&limit=25&search=${search}`, function (response) { 102 // Assuming you have a method to set products in your page 103 let products = response.data.products; // Adapt based on actual response structure 104 console.log(products); 105 products.forEach((product) => { 106 let prod_image = product.remote_pictures[0]?.filePath; 107 if (product.remote_pictures.length === 0 || product.remote_pictures[0]?.filePath === '') { 108 if (product.group.logo.filePath !== undefined) { 109 prod_image = `https://api.incom.ai/${product.group.logo.filePath}`; 110 } else { 111 prod_image = 'https://api.incom.ai/media/groups/6579b7072d6e393501ab971a/logo-black.png'; 112 } 113 } 114 const companyLogo = `https://api.incom.ai/${product.group.logo.filePath}`; 115 116 let html = ` 117 <div class="product"> 118 <div class="img-representation"> 119 <img src='${prod_image}' alt="Shop Logo" style='width: 100%; height: auto'/> 120 </div> 121 <div class="img-company"> 122 <img src='${companyLogo}' alt="company Logo" style='height: 28px'/> 123 </div> 124 <p class="prod-name">${product.name}</p> 125 <p class="price">${product.price_wt} RON</p> 126 <button class="sendToProdShop fusion-button button-flat fusion-button-default-size button-custom fusion-button-default button-4 fusion-button-default-span fusion-button-default-type" data-id="${product.id}"><span class="fusion-button-text">Vezi Produs</span></button> 127 </div> 128 `; 129 jQuery('#show-results').append(html); 130 }); 131 }).fail(function (e) { 132 console.log(e); 133 }); 134 setTimeout(() => { 135 // Function to redirect to product shop 136 jQuery('.sendToProdShop').on('click', function () { 137 const prodId = jQuery(this).data('id'); 138 $.get(`${baseApiUrl}/products/${prodId}/url`, function (response) { 139 // console.log('response: ', response); 140 // window.location.href = response.data.url; // Adapt based on actual response structure 141 window.open(response.data.url, '_blank'); 142 }).fail(function (e) { 143 console.log(e); 144 }); 145 }); 146 }, 1000); 147 } 148 149 // Event handler for search input 150 $('.input-search').on('input', function () { 151 // Replace #searchInput with your actual search input's ID 152 var searchQuery = $(this).val(); 153 154 // Clear the previous timeout if it exists 155 if (searchTimeout) { 156 clearTimeout(searchTimeout); 157 } 158 159 // Set a new timeout 160 searchTimeout = setTimeout(function () { 161 getProductsSearched(searchQuery); 162 }, 1000); // 1 second delay 163 }); 164 165 // audio record search 166 // audio 167 const THINCOM_AJAX = 'https://api.incom.ai/v1/transcript'; 168 const startButton = $('.th-incom-audio-start'); 169 const stopButton = $('.th-incom-audio-end'); 170 const overlayRecord = $('.th-incom-audio-overlay'); 171 const recordingText = $('.th-incom-audio-text'); 172 const $loading = $('.lds-ripple'); 173 let mediaRecorder; 174 let recordedChunks = []; 175 176 //audio 177 $('body') 178 .on('click', '.th-incom-audio-start', function () { 179 startButton.prop('disabled', true); 180 181 recordedChunks = []; 182 navigator.mediaDevices 183 .getUserMedia({ audio: true }) 184 .then(function (stream) { 185 startButton.addClass('hidden'); 186 startButton.prop('disabled', false); 187 188 stopButton.removeClass('hidden'); 189 overlayRecord.removeClass('hidden'); 190 recordingText.removeClass('hidden'); 191 192 mediaRecorder = new MediaRecorder(stream); 193 mediaRecorder.ondataavailable = function (e) { 194 recordedChunks.push(e.data); 195 }; 196 mediaRecorder.onstop = function () { 197 let blob = new Blob(recordedChunks, { type: 'audio/mp3' }); 198 199 let formData = new FormData(); 200 formData.append('audio', blob, 'audio.mp3'); 201 formData.append('action', 'submitRecording'); 202 203 $loading.show(); 204 205 $.ajax({ 206 url: THINCOM_AJAX, 207 type: 'POST', 208 data: formData, 209 contentType: false, 210 processData: false, 211 success: function (response) { 212 console.log('response 1: ', response.data.text); 213 $loading.hide(); 214 215 console.log('response 2: ', response); 216 217 if (response.status === 'success') { 218 console.log(response); 219 $('input.input-search').val(response.data.text); 220 getProductsSearched(response.data.text); 221 } else { 222 $('input.input-search').val('Mai CautÄ'); 223 } 224 225 if (response.error) { 226 alert('Something went wrong. Try again later!'); 227 return; 228 } 229 }, 230 }); 231 }; 232 mediaRecorder.start(); 233 }) 234 .catch(function (err) { 235 alert('Error accessing microphone: ' + err); 236 }); 237 }) 238 .on('click', '.th-incom-audio-end', function () { 239 $(this).addClass('hidden'); 240 241 startButton.removeClass('hidden'); 242 overlayRecord.addClass('hidden'); 243 recordingText.addClass('hidden'); 244 245 mediaRecorder.stop(); 246 247 // Stop all tracks of the media stream and release resources 248 if (mediaRecorder && mediaRecorder.stream && mediaRecorder.stream.getTracks().length > 0) {
249 mediaRecorder.stream.getTracks().forEach(function (track) { 250 track.stop(); 251 }); 252 } 253 }) 254 .on('click', '.th-incom-audio-overlay', function () { 255 $('.th-incom-audio-end').addClass('hidden'); 256 257 startButton.removeClass('hidden'); 258 overlayRecord.addClass('hidden'); 259 recordingText.addClass('hidden'); 260 261 mediaRecorder.stop(); 262 263 // Stop all tracks of the media stream and release resources 264 if (mediaRecorder && mediaRecorder.stream && mediaRecorder.stream.getTracks().length > 0) { 265 mediaRecorder.stream.getTracks().forEach(function (track) { 266 track.stop(); 267 }); 268 } 269 }) 270 .on('click', '.th-incom-audio-try-again', function () { 271 $('.th-incom-audio-start').trigger('click'); 272 }) 273 .on('click', '.th-incom-audio-confirm', function () { 274 $loading.show(); 275 276 let products = []; 277 278 $(this) 279 .closest('.modal-content') 280 .find('.th-incom-audio-product-wrapper') 281 .each(function () { 282 products.push({ 283 id: $(this).attr('data-id'), 284 qty: $(this).attr('data-qty'), 285 }); 286 }); 287 288 $.ajax({ 289 url: THINCOM_AJAX, 290 method: 'POST', 291 dataType: 'json', 292 data: { 293 ajax: true, 294 action: 'incomAudioSubmit', 295 products, 296 }, 297 success: function (data) { 298 window.location.replace(data.url); 299 }, 300 }); 301 }) 302 .on('click', '.th-incom-change-user', function () { 303 $loading.show(); 304 305 $.ajax({ 306 url: THINCOM_AJAX, 307 method: 'POST', 308 dataType: 'json', 309 data: { 310 ajax: true, 311 action: 'changeUser', 312 }, 313 success: function (data) { 314 window.location.replace(data.redirect); 315 }, 316 }); 317 }); 318 319 // Initially apply the hidden-map class to hide the map 320 $('#shop-map iframe').addClass('hidden-map'); 321 322 $('.vezi-harta').click(function () { 323 // Toggle the hidden-map class on click 324 $('#shop-map iframe').toggleClass('hidden-map'); 325 $('#shop-map').toggleClass('open'); 326 327 $(this).toggleClass('open'); 328 329 // Optional: Toggle chevron direction 330 $(this).find('i.fa-chevron-down, i.fa-chevron-up').toggleClass('fa-chevron-down fa-chevron-up'); 331 }); 332 }); 333 }); 334})(jQuery);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.