PageSourceSearch

https://incom.ai/wp-content/themes/Avada-Child-Theme/js/global-search.js?ver=1.0.0

js incom.ai collected 2026-10-05 13:28:46 UTC 12,285 bytes, 334 lines download raw bytes

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.