// app.jsx — YetiShopping main App const { useState, useEffect, useRef } = React; // ───────────────────────────────────────────────────────────────────────────── // Histórico de busca (localStorage) function useSearchHistory() { const [history, setHistory] = useState(() => { try { return JSON.parse(localStorage.getItem("yeti_hist") || "[]"); } catch { return []; } }); function add(term) { setHistory(prev => { const updated = [term, ...prev.filter(h => h !== term)].slice(0, 6); localStorage.setItem("yeti_hist", JSON.stringify(updated)); return updated; }); } function remove(term) { setHistory(prev => { const updated = prev.filter(h => h !== term); localStorage.setItem("yeti_hist", JSON.stringify(updated)); return updated; }); } return { history, add, remove }; } // ───────────────────────────────────────────────────────────────────────────── // Hook: busca AliExpress — skeleton enquanto carrega, produtos reais depois function useSearch(keyword, size = 12, sort = "") { const [products, setProducts] = useState(makeSkeleton(size)); const [loading, setLoading] = useState(true); useEffect(() => { if (!keyword) { setLoading(false); return; } let cancelled = false; setLoading(true); setProducts(makeSkeleton(size)); YetiAPI.search(keyword, { size, sort }).then(list => { if (!cancelled) { setProducts(list); setLoading(false); } }); return () => { cancelled = true; }; }, [keyword, sort]); return { products, loading }; } // ───────────────────────────────────────────────────────────────────────────── // Header — design original YetiShopping function Header({ onLogo, onSearch, query, setQuery }) { return (
setQuery(e.target.value)} onKeyDown={e => e.key === "Enter" && onSearch?.()} placeholder="Buscar produto... ex: iPhone, tênis, fone..." style={{ width: "100%", border: "1.5px solid #E8E1CC", background: "white", borderRadius: 999, padding: "9px 120px 9px 36px", fontSize: 13.5, fontFamily: "inherit", color: "#0E2A47", outline: "none", }} onFocus={e => e.target.style.borderColor="#0E2A47"} onBlur={e => e.target.style.borderColor="#E8E1CC"} />
); } // ───────────────────────────────────────────────────────────────────────────── // Hero — compacto e limpo function Hero({ onSearch, query, setQuery, onGarimpo }) { const { history, remove } = useSearchHistory(); return (
⚡ MELHORES PREÇOS DA ALIEXPRESS EM TEMPO REAL

Compre quando o preço estiver de boas. 🤙

Busque qualquer produto e compare os menores preços da AliExpress agora

setQuery(e.target.value)} onKeyDown={e => e.key === "Enter" && onSearch?.()} placeholder="ex: iPhone, tênis Nike, smartwatch..." style={{ width: "100%", border: "2px solid rgba(255,255,255,.2)", background: "rgba(255,255,255,.1)", borderRadius: 14, padding: "15px 140px 15px 20px", fontSize: 15, fontFamily: "inherit", color: "white", outline: "none", }} />
{["Smartphone", "Fone Bluetooth", "Smartwatch", "Notebook", "Câmera"].map(t => ( ))}
{history.length > 0 && (
RECENTES: {history.map(h => ( { setQuery(h); onSearch?.(); }}>{h} remove(h)}>× ))}
)}
); } // 2 carrosséis na home — mais vendidos e melhores ofertas function HomeCarousels({ onProduct }) { const C1 = { keyword: "best selling electronics phone laptop", label: "🔥 Mais Vendidos Agora", sub: "Os produtos mais comprados da AliExpress" }; const C2 = { keyword: "hot deals discount sale gadgets", label: "💰 Melhores Ofertas", sub: "Maiores descontos do dia" }; return (
{[C1, C2].map((c, ci) => ( ))}
); } function CarrosselSimples({ config, onProduct, style }) { const scrollRef = useRef(null); const [products, setProducts] = useState(makeSkeleton(7)); const [loading, setLoading] = useState(true); useEffect(() => { let cancelled = false; YetiAPI.search(config.keyword, { size: 7 }).then(list => { if (!cancelled) { setProducts(list.length > 0 ? list.slice(0, 7) : makeSkeleton(7)); setLoading(false); } }); return () => { cancelled = true; }; }, [config.keyword]); // Auto-scroll useEffect(() => { const el = scrollRef.current; if (!el) return; const timer = setInterval(() => { if (!scrollRef.current) return; const e2 = scrollRef.current; const max = e2.scrollWidth - e2.clientWidth; if (max <= 0) return; e2.scrollLeft >= max - 10 ? e2.scrollTo({ left: 0, behavior: "smooth" }) : e2.scrollTo({ left: e2.scrollLeft + 220, behavior: "smooth" }); }, 3000); return () => clearInterval(timer); }, [products.length]); const scroll = dir => { if (scrollRef.current) scrollRef.current.scrollLeft += dir * 220; }; return (

{config.label}

{config.sub}

{products.slice(0, 7).map(p => (
))}
); } function StatsStrip() { return null; } // Navegação de categorias (estilo Shein) + botão Garimpo function CategoryNav({ onSearch, setQuery, onGarimpo }) { return ( ); } // ───────────────────────────────────────────────────────────────────────────── // ProductCarousel — carrossel horizontal de produtos de UMA categoria function ProductCarousel({ storeConfig, onProduct }) { const scrollRef = useRef(null); const kw = storeConfig.keyword || storeConfig.name; const [shown, setShown] = useState(makeSkeleton(8)); const [loading, setLoading] = useState(true); useEffect(() => { let cancelled = false; setLoading(true); setShown(makeSkeleton(8)); YetiAPI.search(kw, { size: 10 }).then(list => { if (!cancelled) { setShown(list); setLoading(false); } }); return () => { cancelled = true; }; }, [storeConfig.key]); // Auto-scroll contínuo — usa shown.length para não resetar a cada render useEffect(() => { const el = scrollRef.current; if (!el) return; const STEP = 212; const timer = setInterval(() => { if (!scrollRef.current) return; const el2 = scrollRef.current; const max = el2.scrollWidth - el2.clientWidth; if (max <= 0) return; if (el2.scrollLeft >= max - 10) { el2.scrollTo({ left: 0, behavior: "smooth" }); } else { el2.scrollTo({ left: el2.scrollLeft + STEP, behavior: "smooth" }); } }, 3000); return () => clearInterval(timer); }, [shown.length]); const scroll = (dir) => { if (scrollRef.current) scrollRef.current.scrollLeft += dir * 280; }; return (
{/* Header da loja */}
{storeConfig.emoji} {storeConfig.name} {storeConfig.isAffiliate && ( AFILIADO )}
{shown.length > 0 && ( {shown.length} produtos encontrados )}
{/* Cards horizontais */}
{shown.length === 0 ? ( /* Fallback: botão para ir à loja */ {storeConfig.emoji} Ver todos os produtos
em {storeConfig.name} →
) : ( shown.slice(0, 10).map(p => (
)) )} {/* Botão "ver mais" no final */} {shown.length >= 3 && ( {storeConfig.emoji} Ver mais em
{storeConfig.name} →
)}
); } // ───────────────────────────────────────────────────────────────────────────── // StoreCarouselsSection — todos os carrosséis numa seção function StoreCarouselsSection({ onProduct }) { const stores = YetiAPI.CAROUSEL_STORES; return (

Explorar por categoria

{stores.map(store => ( ))}
); } // ───────────────────────────────────────────────────────────────────────────── // TopDropsSection — maiores descontos gerais function TopDropsSection({ onProduct }) { const { products } = useSearch("best deals electronics", 12); const sorted = [...products].sort((a, b) => { const da = a.base > 0 ? (1 - a.current / a.base) : 0; const db = b.base > 0 ? (1 - b.current / b.base) : 0; return db - da; }); return (

🔥 Mais vendidos hoje

{sorted.slice(0, 4).map(p => )}
); } // ───────────────────────────────────────────────────────────────────────────── // CategoriesRow function CategoriesRow({ onPick }) { return (
Explore

Categorias mais buscadas

{CATEGORIES.map(c => ( ))}
); } // ───────────────────────────────────────────────────────────────────────────── // TrendingSection — últimas semanas function TrendingSection({ onProduct }) { const { products } = useSearch("popular gadgets", 8); return (

⭐ Mais buscados esta semana

{products.slice(0, 8).map(p => )}
); } // ───────────────────────────────────────────────────────────────────────────── // ⛏️ Garimpo Modal function GarimpoModal({ isOpen, onClose, onGarimpo }) { const [term, setTerm] = useState(""); const sugestoes = ["iPhone", "Nike", "Fone Bluetooth", "Tênis", "Relógio", "Câmera", "Notebook", "Joias"]; if (!isOpen) return null; function executar() { if (!term.trim()) return; onGarimpo(term.trim()); onClose(); setTerm(""); } return (
e.target === e.currentTarget && onClose()} style={{ position: "fixed", inset: 0, background: "rgba(0,0,0,0.65)", zIndex: 500, display: "flex", alignItems: "center", justifyContent: "center", padding: 20, }}>

⛏️ Garimpo

Encontra os preços mais baratos na AliExpress

💡 O Garimpo busca na AliExpress e ordena pelo menor preço — perfeito para encontrar as melhores promoções!

setTerm(e.target.value)} onKeyDown={e => e.key === "Enter" && executar()} placeholder="Ex: iPhone, Nike Air Max, Fone Bluetooth..." style={{ flex: 1, border: "2px solid #e2e8f0", borderRadius: 12, padding: "14px 16px", fontSize: 15, outline: "none", fontFamily: "inherit" }} />
Tente: {sugestoes.map(s => ( setTerm(s)} style={{ background: "#f1f5f9", border: "1px solid #e2e8f0", borderRadius: 999, padding: "4px 12px", fontSize: 12, fontWeight: 600, cursor: "pointer", color: "#374151", }}>{s} ))}
); } // ───────────────────────────────────────────────────────────────────────────── // Trust Bar (estilo YetiFinds) function TrustBar() { return (
{[["✓", "#FF6600", "Qualidade Verificada"], ["👁", "#FF6600", "Transparência"], ["🔒", "#FF6600", "Proteção de Dados"], ["⚡", "#FF6600", "Preços em Tempo Real"]].map(([icon, color, text], i) => (
{icon} {text}
))}
); } // ───────────────────────────────────────────────────────────────────────────── // SearchResultsSection — com sort, histórico e load more function SearchResultsSection({ query, onProduct, onBack }) { const [sort, setSort] = useState(""); const [allProducts, setAllProducts] = useState([]); const [loading, setLoading] = useState(true); const [offset, setOffset] = useState(0); const [hasMore, setHasMore] = useState(true); const [loadingMore, setLoadingMore] = useState(false); // Busca inicial useEffect(() => { if (!query) return; setLoading(true); setAllProducts([]); setOffset(0); setHasMore(true); YetiAPI.search(query, { size: 24, offset: 0, sort }).then(list => { setAllProducts(list); setHasMore(list.length >= 20); setLoading(false); }); }, [query, sort]); function loadMore() { const newOffset = offset + 24; setOffset(newOffset); setLoadingMore(true); YetiAPI.search(query, { size: 24, offset: newOffset, sort }).then(list => { setAllProducts(prev => [...prev, ...list]); setHasMore(list.length >= 20); setLoadingMore(false); }); } return (
{/* Header da busca */}
Resultados para "{query}"
{!loading && {allProducts.length} produtos} {/* Sort filter */}
{/* Grid de produtos */} {loading ? (

Buscando na AliExpress...

) : (
{allProducts.map(p => )}
)} {/* Load More */} {!loading && hasMore && (
)}
); } // ───────────────────────────────────────────────────────────────────────────── // HowItWorks function HowItWorks() { return (
Como funciona

Três passos, e o Yeti faz
a parte chata por você.

{[ { n:"01", icon:"🔎", title:"Cola o link ou busca", desc:"Cole o link da Amazon, Mercado Livre ou qualquer loja — ou busque pelo nome do produto." }, { n:"02", icon:"🔔", title:"Define o preço-alvo", desc:"Diz pro Yeti o preço que vale a pena. Ele fica de olho 24/7 sem você precisar fazer nada." }, { n:"03", icon:"🤙", title:"Compra na boa", desc:"Quando o preço cair, te avisamos por email ou push. Aí é só correr pro abraço." }, ].map((s, i) => (
{s.icon}
PASSO {s.n}

{s.title}

{s.desc}

))}
); } // ───────────────────────────────────────────────────────────────────────────── // Footer function Footer({ onNav }) { const nav = (page) => (e) => { e.preventDefault(); onNav?.(page); window.scrollTo({ top: 0, behavior: "instant" }); }; return ( ); } // ───────────────────────────────────────────────────────────────────────────── // Página estática reutilizável function StaticPage({ title, subtitle, onBack, children }) { return (
{subtitle}

{title}

{children}
); } // ───────────────────────────────────────────────────────────────────────────── // Política de Privacidade function PrivacyPage({ onBack }) { const H = ({ children }) =>

{children}

; const P = ({ children }) =>

{children}

; return (

Última atualização: maio de 2026.

O YetiShopping ("nós", "nosso") respeita sua privacidade. Esta política descreve como coletamos, usamos e protegemos suas informações ao visitar yetishopping.com.br.

1. Informações que coletamos

Não coletamos dados pessoais diretamente. Podemos coletar dados anônimos de navegação (páginas visitadas, tempo de sessão) por meio de ferramentas de análise de terceiros, como o Google Analytics.

2. Cookies e publicidade

Utilizamos o Google AdSense para exibir anúncios. O Google pode usar cookies para exibir anúncios com base em visitas anteriores ao nosso site e a outros sites. Você pode desativar o uso de cookies para publicidade personalizada em Configurações de Anúncios do Google.

Terceiros fornecedores, incluindo o Google, usam cookies para exibir anúncios com base nas visitas anteriores do usuário ao nosso site ou a outros sites. O uso de cookies de publicidade pelo Google permite que ele e seus parceiros exibam anúncios aos usuários com base nas visitas a este e a outros sites.

3. Links para lojas parceiras

O YetiShopping exibe produtos de diversas lojas (Amazon, Mercado Livre, Magalu, Kabum, entre outras). Ao clicar em um produto, você será redirecionado para a loja parceira. Não somos responsáveis pelas práticas de privacidade dessas lojas.

Alguns links podem conter identificadores de afiliados. Isso significa que podemos receber uma comissão caso você efetue uma compra, sem custo adicional para você.

4. Como usamos suas informações

Os dados de navegação anônimos são usados exclusivamente para melhorar a experiência do site, entender quais categorias são mais acessadas e otimizar o conteúdo exibido.

5. Seus direitos (LGPD)

De acordo com a Lei Geral de Proteção de Dados (LGPD — Lei nº 13.709/2018), você tem o direito de acessar, corrigir ou solicitar a exclusão de seus dados pessoais. Para exercer esses direitos, entre em contato conosco pelo e-mail abaixo.

6. Segurança

Utilizamos HTTPS em todo o site para garantir que sua navegação seja segura.

7. Contato

Dúvidas sobre esta política? Fale conosco: contato@yetishopping.com.br

); } // ───────────────────────────────────────────────────────────────────────────── // Termos de Uso function TermsPage({ onBack }) { const H = ({ children }) =>

{children}

; const P = ({ children }) =>

{children}

; return (

Última atualização: maio de 2026.

Ao acessar o YetiShopping, você concorda com os seguintes termos.

1. Sobre o serviço

O YetiShopping é um comparador de preços brasileiro que reúne informações de produtos de diversas lojas para ajudar consumidores a encontrar o melhor momento para comprar. Não vendemos produtos diretamente.

2. Precisão dos preços

Os preços exibidos têm caráter informativo. Os valores podem variar a qualquer momento. Sempre confirme o preço final diretamente na loja antes de efetuar a compra.

3. Links de afiliados

Alguns links levam a lojas parceiras e podem conter identificadores de afiliados. Ao comprar por esses links, o YetiShopping pode receber uma comissão sem qualquer custo adicional para você.

4. Propriedade intelectual

Todo o conteúdo do site (textos, logotipo, design) é de propriedade do YetiShopping. É proibida a reprodução sem autorização prévia.

5. Limitação de responsabilidade

O YetiShopping não se responsabiliza por decisões de compra tomadas com base nas informações do site, nem por problemas ocorridos em transações realizadas nas lojas parceiras.

6. Contato

contato@yetishopping.com.br

); } // ───────────────────────────────────────────────────────────────────────────── // Sobre nós function AboutPage({ onBack }) { const H = ({ children }) =>

{children}

; const P = ({ children }) =>

{children}

; return (

O YetiShopping nasceu de uma ideia simples: por que pagar mais caro se o preço de ontem era menor?

Somos um comparador de preços brasileiro focado em transparência. Reunimos produtos de lojas como Amazon, Mercado Livre, Magalu, Kabum, Casas Bahia e Shopee em um único lugar — para que você saiba exatamente se aquele "desconto" é real ou não.

Nossa missão

Ajudar brasileiros a comprar com inteligência. Mostramos o histórico de preços de cada produto para que você saiba se é o momento certo de comprar — ou se vale esperar uma promoção de verdade.

Como funciona

Monitoramos os preços de milhares de produtos nas principais lojas brasileiras. Ao acessar um produto, você vê o preço atual, o histórico dos últimos meses e uma análise do Yeti dizendo se é boa hora para comprar.

Transparência

Alguns links neste site são links de afiliados — isso significa que podemos receber uma comissão quando você compra por eles, sem nenhum custo extra para você. Essa é uma das formas de manter o serviço gratuito para todos.

Nunca colocamos o interesse comercial acima da informação correta. Se o preço não está bom, a gente fala.

Contato

Quer falar com a gente? Envie um e-mail para contato@yetishopping.com.br

); } // ───────────────────────────────────────────────────────────────────────────── // Como Funciona (página) function HowItWorksPage({ onBack }) { return (

Entenda como usamos o histórico de preços para te ajudar a comprar no momento certo.

{[ { n: "01", icon: "🔎", title: "Busque o produto", desc: "Digite o nome do produto na barra de busca. Encontramos nas principais lojas brasileiras: Amazon, Mercado Livre, Magalu, Kabum, Casas Bahia e muito mais." }, { n: "02", icon: "📊", title: "Veja o histórico de preços", desc: "Exibimos um gráfico com a evolução do preço nos últimos 180 dias. Isso mostra se o preço atual é realmente uma boa oferta ou se já esteve mais barato." }, { n: "03", icon: "🧊", title: "O Yeti analisa para você", desc: "O Yeti compara o preço atual com o menor preço histórico e emite um veredito: COMPRA agora ou Vale esperar. Simples assim." }, { n: "04", icon: "🔔", title: "Crie um alerta de preço", desc: "Defina o preço que vale a pena e o Yeti te avisa quando o produto atingir esse valor. Você não precisa ficar verificando o preço todo dia." }, { n: "05", icon: "🛒", title: "Compre na loja de sua escolha", desc: "Quando o preço estiver bom, clique no botão e vá direto para a loja. Você compra diretamente no site da loja, com toda a segurança e garantia deles." }, ].map((s, i) => (
{s.icon}
PASSO {s.n}

{s.title}

{s.desc}

))}
); } // Exports Object.assign(window, { Header, Hero, CategoryNav, StatsStrip, TopDropsSection, CategoriesRow, TrendingSection, SearchResultsSection, StoreCarouselsSection, HomeCarousels, CarrosselSimples, HowItWorks, Footer, GarimpoModal, TrustBar, PrivacyPage, TermsPage, AboutPage, HowItWorksPage, StaticPage, useSearchHistory });