(function() {
'use strict';
const API_BASE_URL = 'https://api-trueform-shop.ru/api/v1';
const REC_ID = '1726093871';
let currentCategory = null;
let currentPage = 1;
let isLoading = false;
function getCity() {
const urlParams = new URLSearchParams(window.location.search);
const citySlug = urlParams.get('city_slug');
if (citySlug) return { slug: citySlug };
const savedCity = localStorage.getItem('selectedCity');
if (savedCity) return JSON.parse(savedCity);
return null;
}
async function loadCategories() {
try {
const response = await fetch(`${API_BASE_URL}/categories/tree`);
const result = await response.json();
if (result.success && result.data) {
renderCategories(result.data);
return result.data;
}
} catch (error) {
console.error('Ошибка загрузки категорий:', error);
}
return [];
}
function renderCategories(categories) {
const sidebar = document.querySelector(`#rec${REC_ID} .js-store-parts-select-container`);
if (!sidebar) return;
const existingItems = sidebar.querySelectorAll('.t-store__parts-item[data-storepart-level="1"]');
existingItems.forEach(item => item.remove());
categories.forEach(category => {
const item = document.createElement('div');
item.className = 't-store__parts-item t-store__parts-item_level-1';
item.setAttribute('data-storepart-level', '1');
const link = document.createElement('div');
link.className = 'js-store-parts-switcher t-store__parts-switch-btn t-name t-name_xs t-menu__link-item';
link.setAttribute('data-storepart-uid', category.slug);
link.setAttribute('data-storepart-path', category.slug);
const title = document.createElement('span');
title.className = 't-store__parts-item-title';
title.textContent = category.name;
link.appendChild(title);
item.appendChild(link);
link.addEventListener('click', (e) => {
e.preventDefault();
handleCategoryClick(category.slug);
});
const wrapper = sidebar.querySelector('.t-store__parts-switch-wrapper');
if (wrapper) {
wrapper.appendChild(item);
}
});
updateCategoryTree(categories);
}
function updateCategoryTree(categories) {
const treeRoot = document.querySelector(`#rec${REC_ID} .t-store__parts-tree-root-wrapper`);
if (!treeRoot) return;
const existingNodes = treeRoot.querySelectorAll('.t-store__parts-tree-node');
existingNodes.forEach(node => node.remove());
categories.forEach(category => {
const node = document.createElement('div');
node.className = 't-store__parts-tree-node';
node.setAttribute('data-storepart-uid', category.slug);
node.setAttribute('data-storepart-path', category.slug);
const line = document.createElement('div');
line.className = 't-store__parts-tree-line';
const btn = document.createElement('div');
btn.className = 'js-store-parts-switcher t-store__parts-switch-btn t-name t-name_xs t-menu__link-item t-store__parts-tree-btn';
btn.setAttribute('data-storepart-uid', category.slug);
btn.setAttribute('data-storepart-path', category.slug);
const btnTitle = document.createElement('div');
btnTitle.className = 't-store__parts-tree-btn-title';
btnTitle.textContent = category.name;
btn.appendChild(btnTitle);
line.appendChild(btn);
node.appendChild(line);
treeRoot.appendChild(node);
btn.addEventListener('click', (e) => {
e.preventDefault();
handleCategoryClick(category.slug);
});
});
}
function handleCategoryClick(categorySlug) {
document.querySelectorAll(`#rec${REC_ID} .js-store-parts-switcher`).forEach(btn => {
btn.classList.remove('t-active');
});
const clickedBtn = document.querySelector(
`#rec${REC_ID} .js-store-parts-switcher[data-storepart-uid="${categorySlug || '533962513382'}"]`
);
if (clickedBtn) {
clickedBtn.classList.add('t-active');
}
currentCategory = categorySlug;
currentPage = 1;
loadProducts();
}
async function loadProducts() {
if (isLoading) return;
isLoading = true;
const gridContainer = document.querySelector(`#rec${REC_ID} .js-store-grid-cont`);
if (!gridContainer) {
isLoading = false;
return;
}
showPreloader();
try {
const city = getCity();
const params = new URLSearchParams({
per_page: 20,
page: currentPage
});
if (city && city.slug) {
params.append('city_slug', city.slug);
}
if (currentCategory) {
params.append('category_slug', currentCategory);
}
const response = await fetch(`${API_BASE_URL}/products?${params.toString()}`);
const result = await response.json();
if (result.success && result.data) {
if (currentPage === 1) {
clearProducts();
}
renderProducts(result.data);
if (result.pagination && result.pagination.current_page < result.pagination.last_page) {
showLoadMoreButton();
} else {
hideLoadMoreButton();
}
} else {
showEmptyState();
}
} catch (error) {
console.error('Ошибка загрузки товаров:', error);
showErrorState();
} finally {
isLoading = false;
hidePreloader();
}
}
function renderProducts(products) {
const cardList = document.querySelector(`#rec${REC_ID} .t-store__card-list`);
if (!cardList) return;
products.forEach(product => {
const card = createProductCard(product);
cardList.appendChild(card);
});
}
function createProductCard(product) {
const card = document.createElement('div');
card.className = 'js-product t-store__card t-store__stretch-col t-store__stretch-col_33 t-align_left t-item';
card.setAttribute('data-product-uid', product.id);
card.setAttribute('data-product-lid', product.id);
card.setAttribute('data-product-gen-uid', product.id);
if (product.category) {
card.setAttribute('data-product-part-uid', product.category.slug);
}
const imageUrl = product.image_url || (product.images && product.images[0]) || 'https://via.placeholder.com/360x360';
const productUrl = `/product/${product.id}`;
card.innerHTML = `
`;
return card;
}
function escapeHtml(text) {
if (!text) return '';
const div = document.createElement('div');
div.textContent = text;
return div.innerHTML;
}
function formatPrice(price) {
return Math.round(price).toLocaleString('ru-RU');
}
function clearProducts() {
const cardList = document.querySelector(`#rec${REC_ID} .t-store__card-list`);
if (cardList) {
cardList.innerHTML = '';
}
}
function showPreloader() {
const preloader = document.querySelector(`#rec${REC_ID} .js-store-grid-cont-preloader`);
if (preloader) {
preloader.style.display = 'block';
}
}
function hidePreloader() {
const preloader = document.querySelector(`#rec${REC_ID} .js-store-grid-cont-preloader`);
if (preloader) {
preloader.style.display = 'none';
}
}
function showLoadMoreButton() {
const loadMoreBtn = document.querySelector(`#rec${REC_ID} .js-store-load-more-btn`);
if (loadMoreBtn) {
loadMoreBtn.style.display = 'block';
}
}
function hideLoadMoreButton() {
const loadMoreBtn = document.querySelector(`#rec${REC_ID} .js-store-load-more-btn`);
if (loadMoreBtn) {
loadMoreBtn.style.display = 'none';
}
}
function showEmptyState() {
const gridContainer = document.querySelector(`#rec${REC_ID} .js-store-grid-cont`);
if (gridContainer) {
const cardList = gridContainer.querySelector('.t-store__card-list');
if (cardList && cardList.children.length === 0) {
cardList.innerHTML = '
Товары не найдены
';
}
}
}
function showErrorState() {
const gridContainer = document.querySelector(`#rec${REC_ID} .js-store-grid-cont`);
if (gridContainer) {
const cardList = gridContainer.querySelector('.t-store__card-list');
if (cardList && cardList.children.length === 0) {
cardList.innerHTML = '
Ошибка загрузки товаров
';
}
}
}
function initLoadMore() {
const loadMoreBtn = document.querySelector(`#rec${REC_ID} .js-store-load-more-btn`);
if (loadMoreBtn) {
loadMoreBtn.addEventListener('click', () => {
currentPage++;
loadProducts();
});
}
}
function initAllButton() {
const allBtn = document.querySelector(`#rec${REC_ID} .js-store-parts-switcher[data-storepart-uid="533962513382"]`);
if (allBtn) {
allBtn.addEventListener('click', (e) => {
e.preventDefault();
handleCategoryClick(null);
});
}
}
function init() {
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init);
return;
}
setTimeout(() => {
loadCategories().then(() => {
loadProducts();
});
initLoadMore();
initAllButton();
}, 1000);
}
init();
})();