HEX
Server: nginx/1.18.0
System: Linux test-ipsremont 5.4.0-214-generic #234-Ubuntu SMP Fri Mar 14 23:50:27 UTC 2025 x86_64
User: ips (1000)
PHP: 8.0.30
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: //var/www/innodrive/src/js/modules/cities-modal.js
/* eslint-disable */

import { $, splitListIntoColumns } from '@utils';
import Modal from './modal';
import axios from 'axios';

export default () => {
  const modalElement = $('#modal-city');

  if (!modalElement) { return }

  const citiesModal = document.getElementById('modal-city');
  const modalTriggers = document.querySelectorAll('.location > *');

  const spinner = $('.spinner').spinner;

  const CityModal = new Modal(modalElement, {
    trigger: modalTriggers,
    onClose: () => {
      if (citySearch) {
        citySearch.value = '';
      }
      cities.forEach((city) => {
        city.closest('li').classList.remove('hidden');
        citiesListContainer.classList.remove(Classes.NO_MATCH);
      });
    }
  });

  const Classes = {
    SHOWN: 'js-shown',
    LINK_ACTIVE: 'js-current',
    NO_MATCH: 'js-no-match'
  };

  const Selectors = {
    MODAL: '.modal__cities',
    CLOSE_BUTTON: '.modal__close',
    DISPLAY_CITY: '.js-current'
  };

  if (!citiesModal || !modalTriggers.length) { return }

  const citiesListContainer = citiesModal.querySelector(Selectors.MODAL);
  const citiesList = citiesListContainer.querySelector('ul');
  const cities = [...citiesList.querySelectorAll('li a')];
  const closeButton = citiesModal.querySelector(Selectors.CLOSE_BUTTON);
  const citySearch = document.getElementById('modal-city-input');

  const columns = Math.ceil(citiesListContainer.offsetWidth / citiesList.offsetWidth);

  splitListIntoColumns(citiesListContainer, citiesList, columns);

  let cacheHeight = citiesListContainer.offsetHeight;

  citiesListContainer.style.height = cacheHeight + 'px';

  let closeClickHandler = null;
  var current = cities.find((cities) => cities.classList.contains(Classes.LINK_ACTIVE));

  const onCityInput = (e) => {
    const value = e.currentTarget.value.toLowerCase();
    let isNoMatch = true;

    cities.forEach((city) => {
      if (!city.textContent.toLowerCase().match(new RegExp(`^${value}`))) {
        city.closest('li').classList.add('hidden');
      } else {
        city.closest('li').classList.remove('hidden');
        isNoMatch = false;
      }
    });

    if (isNoMatch) {
      citiesListContainer.classList.add(Classes.NO_MATCH);
    } else {
      citiesListContainer.classList.remove(Classes.NO_MATCH);
    }
  };

  const setUserCity = (city) => {
    if (current && current.dataset.city !== city) {
      let newCity = cities.find((cities) => cities.dataset.city == city);
      if (newCity) {
        current.classList.remove(Classes.LINK_ACTIVE);
        newCity.classList.add(Classes.LINK_ACTIVE);
        current = newCity;
      }
    }

    if (current) {
      $('.location__current  .js-current').textContent = current.textContent;
    }
    window.localStorage.setItem('city', city);

    const cityData = window.citiesData[city] ? window.citiesData[city] : window.citiesData['default'];
    $('.main-header__callback a').setAttribute('href', 'tel:' + cityData.phone);
    $('.main-header__callback a span').textContent = cityData.text;
  };

  const onCitySelect = (e) => {
    e.preventDefault();
    if (e.target.tagName && e.target.tagName.toLowerCase() === 'a') {
      setUserCity(e.target.dataset.city);
      CityModal.close();

      if (closeClickHandler) {
        closeButton.removeEventListener('click', closeClickHandler);
        closeClickHandler = null;
      }
    }
  };

  citiesListContainer.addEventListener('click', onCitySelect);
  if (citySearch) citySearch.addEventListener('input', onCityInput);

  let userCity = window.localStorage.getItem('city');
  if (userCity == null) {
    spinner.run();

    axios
      .get(
        '/wp-json/geoip/get_city', {}, {
          headers: {
            'Content-Type': 'application/x-www-form-urlencoded'
          }
        }
      )
      .then(function (res) {
        spinner.stop();

        if (res.data.status == 'ok') {
          setUserCity(res.data.city);
        }
      })
      .catch((err) => {
        spinner.stop();
      });
  } else {
    setUserCity(userCity);
  }
};