(function() { "use strict"; const STORAGE_KEY = "garagem164AdNavigation"; const STOREFRONT_STORAGE_KEY = "garagem164StorefrontNavigation"; const MAX_AGE_MS = 30 * 60 * 1000; function getAdIdFromLink(link) { try { const url = new URL(link.href, window.location.origin); const match = url.pathname.match(/^\/anuncio\/([a-zA-Z0-9]{36})$/); return match ? match[1] : ""; } catch (error) { return ""; } } function getSafeState(storageKey) { storageKey = storageKey || STORAGE_KEY; try { const state = JSON.parse(sessionStorage.getItem(storageKey) || "null"); if (!state || Date.now() - Number(state.savedAt || 0) > MAX_AGE_MS) { sessionStorage.removeItem(storageKey); return null; } const returnUrl = new URL(String(state.returnUrl || ""), window.location.origin); if (returnUrl.origin !== window.location.origin || !/^\/(anuncios(?:\/[^/?#]+)?|dashboard)$/.test(returnUrl.pathname)) { sessionStorage.removeItem(storageKey); return null; } state.returnUrl = returnUrl.pathname + returnUrl.search + returnUrl.hash; return state; } catch (error) { return null; } } function saveState(state, storageKey) { storageKey = storageKey || STORAGE_KEY; state.savedAt = Date.now(); try { sessionStorage.setItem(storageKey, JSON.stringify(state)); } catch (error) { delete state.html; try { sessionStorage.setItem(storageKey, JSON.stringify(state)); } catch (ignoredError) { // O href normal continua sendo o fallback quando o storage não está disponível. } } } function getCardPosition(card) { return card ? Math.round(card.getBoundingClientRect().top) : 0; } function capturePublicListState(link, adId) { const card = link.closest("[data-ad-public-id]"); const list = document.getElementById("ads-list"); const seller = document.getElementById("adsSellerUsername"); if (!card || !list) return false; saveState({ context: seller && seller.value ? "storefront" : "catalog", returnUrl: window.location.pathname + window.location.search + window.location.hash, adId: adId, filters: typeof window.collectAdFilters === "function" ? window.collectAdFilters() : null, html: list.innerHTML, nextOffset: Number(document.getElementById("load-more-ads")?.dataset.offset || 0), hasMore: !document.querySelector(".load-more-wrap")?.classList.contains("hidden"), cardViewportTop: getCardPosition(card), scrollY: Math.round(window.scrollY) }); return true; } function captureStorefrontOrigin(link) { if (window.location.pathname !== "/anuncios") return false; let destination; try { destination = new URL(link.href, window.location.origin); } catch (error) { return false; } if (destination.origin !== window.location.origin || !/^\/anuncios\/[a-z0-9._-]{3,40}$/.test(destination.pathname)) { return false; } const list = document.getElementById("ads-list"); if (!list) return false; const card = link.closest("[data-ad-public-id]"); saveState({ context: "catalog", returnUrl: window.location.pathname + window.location.search + window.location.hash, adId: card?.dataset.adPublicId || "", filters: typeof window.collectAdFilters === "function" ? window.collectAdFilters() : null, html: list.innerHTML, nextOffset: Number(document.getElementById("load-more-ads")?.dataset.offset || 0), hasMore: !document.querySelector(".load-more-wrap")?.classList.contains("hidden"), cardViewportTop: getCardPosition(card), scrollY: Math.round(window.scrollY) }, STOREFRONT_STORAGE_KEY); return true; } function getDashboardPage() { const label = document.querySelector(".dashboard-ads-pagination span"); const match = String(label?.textContent || "").match(/Página\s+(\d+)/i); return match ? Number(match[1]) : 1; } function captureDashboardState(link, adId) { const card = link.closest("[data-ad-public-id]"); const panel = link.closest("[data-dashboard-panel]"); if (!card || !panel || !["ads", "favorites"].includes(panel.dataset.dashboardPanel)) return false; const context = panel.dataset.dashboardPanel === "favorites" ? "dashboard-favorites" : "dashboard-ads"; saveState({ context: context, returnUrl: context === "dashboard-favorites" ? "/dashboard#favoritos" : "/dashboard#meus-anuncios", adId: adId, page: getDashboardPage(), filters: context === "dashboard-ads" ? { search: document.querySelector('[data-dashboard-ads-filter="search"]')?.value || "", status: document.querySelector('[data-dashboard-ads-filter="status"]')?.value || "all", category: document.querySelector('[data-dashboard-ads-filter="category"]')?.value || "all", order: document.querySelector('[data-dashboard-ads-filter="order"]')?.value || "newest" } : null, cardViewportTop: getCardPosition(card), scrollY: Math.round(window.scrollY) }); return true; } document.addEventListener("click", function(event) { if (event.defaultPrevented || event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return; const link = event.target.closest("a[href]"); if (!link) return; if (captureStorefrontOrigin(link)) return; const adId = getAdIdFromLink(link); if (!adId) return; capturePublicListState(link, adId) || captureDashboardState(link, adId); }, true); function matchesCurrentReturnUrl(state) { try { const expected = new URL(state.returnUrl, window.location.origin); return expected.pathname === window.location.pathname; } catch (error) { return false; } } function restorePosition(state) { const restore = function() { const adId = /^[a-zA-Z0-9]{36}$/.test(String(state.adId || "")) ? String(state.adId) : ""; const card = adId ? document.querySelector('[data-ad-public-id="' + adId + '"]') : null; if (card) { const top = window.scrollY + card.getBoundingClientRect().top - Number(state.cardViewportTop || 0); window.scrollTo(0, Math.max(0, top)); } else { window.scrollTo(0, Math.max(0, Number(state.scrollY || 0))); } }; window.requestAnimationFrame(function() { restore(); window.setTimeout(restore, 300); }); } function restorePublicList() { const state = getSafeState(); if (!state || !["catalog", "storefront"].includes(state.context) || !matchesCurrentReturnUrl(state)) return null; if (state.filters && typeof window.applyAdFiltersToControls === "function") { window.applyAdFiltersToControls(state.filters); } const list = document.getElementById("ads-list"); const loadMore = document.getElementById("load-more-ads"); const loadMoreWrap = document.querySelector(".load-more-wrap"); const hasSavedList = Boolean(list && typeof state.html === "string" && state.html); if (hasSavedList) list.innerHTML = state.html; if (loadMore) loadMore.dataset.offset = String(Math.max(0, Number(state.nextOffset || 0))); if (loadMoreWrap) loadMoreWrap.classList.toggle("hidden", !state.hasMore); state.needsReload = !hasSavedList; if (hasSavedList) { restorePosition(state); sessionStorage.removeItem(STORAGE_KEY); } return state; } function finishPublicRestore(state) { if (!state) return; restorePosition(state); try { sessionStorage.removeItem(STORAGE_KEY); } catch (error) {} } function takeDashboardState() { const state = getSafeState(); if (!state || !["dashboard-ads", "dashboard-favorites"].includes(state.context) || !matchesCurrentReturnUrl(state)) return null; return state; } function consumeDashboardState(state) { if (!state) return; restorePosition(state); try { sessionStorage.removeItem(STORAGE_KEY); } catch (error) {} } function prepareDetailBackLink() { const link = document.querySelector("[data-ad-back]"); if (!link) return; const state = getSafeState(); const currentAdId = String(link.dataset.adId || ""); if (!state || state.adId !== currentAdId) return; link.href = state.returnUrl; const label = link.querySelector("span"); if (label) { label.textContent = state.context === "storefront" ? "Voltar para a vitrine" : state.context === "dashboard-ads" ? "Voltar para Meus anúncios" : state.context === "dashboard-favorites" ? "Voltar para Favoritos" : "Voltar para os anúncios"; } } function prepareStorefrontBackLink() { const link = document.querySelector("[data-storefront-back]"); if (!link) return; const state = getSafeState(STOREFRONT_STORAGE_KEY); if (!state || state.context !== "catalog" || state.returnUrl.split(/[?#]/)[0] !== "/anuncios") return; link.href = state.returnUrl; link.addEventListener("click", function() { saveState(state, STORAGE_KEY); try { sessionStorage.removeItem(STOREFRONT_STORAGE_KEY); } catch (error) {} }); } window.G164AdNavigation = { restorePublicList: restorePublicList, finishPublicRestore: finishPublicRestore, takeDashboardState: takeDashboardState, consumeDashboardState: consumeDashboardState, prepareDetailBackLink: prepareDetailBackLink }; document.addEventListener("DOMContentLoaded", function() { prepareDetailBackLink(); prepareStorefrontBackLink(); }); })();