(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(); })();
Made on
Tilda