481-961
salvarLocalStorage();
alert("Personalização salva!");
}
/* ============================
CONFIG. TÍTULO (senha 2020)
============================ */
function mostrarPainelTitulo(){
if(!pedirSenhaEsperada(SENHA_PERS)){
alert("Senha incorreta.");
return;
}
const main = document.getElementById('mainContent');
const t = document.getElementById('tituloHeader').textContent;
main.innerHTML = `
`;
}
function salvarTitulo(){
const v = document.getElementById('novoTitulo').value || 'Mercado Online';
document.getElementById('tituloHeader').textContent = v;
salvarLocalStorage();
alert("Título salvo!");
}
/* ============================
CONFIG. BANNER (senha 2020)
============================ */
function mostrarPainelBanner(){
if(!pedirSenhaEsperada(SENHA_PERS)){
alert("Senha incorreta.");
return;
}
document.getElementById('bannerActions').style.display='flex';
alert("Opções de banner habilitadas acima do banner.");
}
function acaoTrocarBanner(){
if(!pedirSenhaEsperada(SENHA_PERS)){
alert("Senha incorreta.");
return;
}
const url = prompt("URL da imagem:");
if(url){
bannerSrc = url;
document.getElementById('topBanner').src = url;
salvarLocalStorage();
}
}
function acaoRemoverBanner(){
if(!pedirSenhaEsperada(SENHA_PERS)){
alert("Senha incorreta.");
return;
}
bannerSrc = '';
document.getElementById('topBanner').src = '';
salvarLocalStorage();
}
/* ============================
CONFIG. PIX (senha 2020)
============================ */
function mostrarPainelPix(){
if(!pedirSenhaEsperada(SENHA_PERS)){
alert("Senha incorreta.");
return;
}
const main = document.getElementById('mainContent');
const pixLS = localStorage.getItem('chavePIX') || '';
main.innerHTML=`
`;
}
function salvarPix(){
const v = document.getElementById('pixChave').value.trim();
localStorage.setItem('chavePIX', v);
alert("Chave PIX salva!");
}
/* ============================
ADICIONAR PRODUTO (senha 2030)
============================ */
function acaoAdicionarProduto(){
if(!pedirSenhaEsperada(SENHA_ADD)){
alert("Senha incorreta.");
return;
}
mostrarFormularioAdicionar();
}
function mostrarFormularioAdicionar(){
const main = document.getElementById('mainContent');
main.innerHTML = `
`;
}
function salvarNovoProduto(){
const nome = document.getElementById('addNome').value.trim();
const preco = document.getElementById('addPreco').value.trim();
const cat = document.getElementById('addCat').value.trim();
const est = parseInt(document.getElementById('addEst').value.trim(),10);
const img = document.getElementById('addImg').value.trim();
if(!nome || !preco || !cat){
alert("Preencha nome, preço e categoria.");
return;
}
const novo = {
id: uid(),
nome,
preco: parseFloat(preco).toFixed(2),
categoria: cat,
estoque: isNaN(est)?0:est,
imagem: img || "https://via.placeholder.com/300?text=Novo+Produto"
};
produtos.push(novo);
salvarLocalStorage();
alert("Produto adicionado!");
mostrarPainelAdmin();
}
/* ============================
EDITAR PRODUTO (senha 2040)
============================ */
function editarProduto(id){
if(!pedirSenhaEsperada(SENHA_EDIT)){
alert("Senha incorreta.");
return;
}
const p = produtos.find(x=>x.id===id);
if(!p) return;
const main = document.getElementById('mainContent');
main.innerHTML = `
`;
}
function salvarEdicaoProduto(id){
const p = produtos.find(x=>x.id===id);
if(!p) return;
p.nome = document.getElementById('eNome').value.trim();
p.preco = parseFloat(document.getElementById('ePreco').value.trim()).toFixed(2);
p.categoria = document.getElementById('eCat').value.trim();
p.estoque = parseInt(document.getElementById('eEst').value.trim(),10) || 0;
p.imagem = document.getElementById('eImg').value.trim();
salvarLocalStorage();
alert("Produto atualizado!");
renderProdutos();
}
/* ============================
EXCLUIR PRODUTO (senha 2050)
============================ */
function excluirProduto(id){
if(!pedirSenhaEsperada(SENHA_DEL)){
alert("Senha incorreta.");
return;
}
if(!confirm("Tem certeza que deseja excluir?")) return;
produtos = produtos.filter(x=>x.id!==id);
salvarLocalStorage();
renderProdutos();
alert("Produto excluído!");
}
/* ============================
CARRINHO
============================ */
function adicionarAoCarrinho(id){
const p = produtos.find(x=>x.id===id);
if(!p){ alert("Produto não encontrado."); return; }
const existe = carrinho.find(x=>x.nome===p.nome);
if(existe){
existe.quantidade++;
} else {
carrinho.push({ nome:p.nome, preco:parseFloat(p.preco), quantidade:1 });
}
salvarLocalStorage();
atualizarBadgeCarrinho();
alert("Adicionado ao carrinho!");
}
function abrirCarrinho(){
const modal = document.getElementById('carrinhoModal');
const ul = document.getElementById('itensCarrinho');
const totalSpan = document.getElementById('totalCarrinho');
ul.innerHTML='';
let total=0;
carrinho.forEach((item,i)=>{
const li=document.createElement('li');
li.style.margin='6px 0';
li.textContent=`${item.nome} x${item.quantidade} - R$ ${(item.preco*item.quantidade).toFixed(2)}`;
ul.append(li);
total += item.preco*item.quantidade;
});
totalSpan.textContent=total.toFixed(2);
modal.style.display='flex';
}
function fecharCarrinho(){
document.getElementById('carrinhoModal').style.display='none';
}
function desistirCompra(){
if(confirm("Tem certeza que deseja esvaziar o carrinho?")){
carrinho=[];
salvarLocalStorage();
fecharCarrinho();
atualizarBadgeCarrinho();
}
}
/* ============================
ZOOM IMAGEM
============================ */
function abrirZoomImagem(url){
document.getElementById('imgZoomSrc').src=url;
document.getElementById('imgZoom').style.display='flex';
}
function fecharZoomImagem(){
document.getElementById('imgZoom').style.display='none';
}
/* ============================
FINALIZAR PEDIDO
============================ */
document.getElementById('btnPedido').onclick = ()=>{
if(carrinho.length===0){ alert("Carrinho vazio."); return; }
abrirModalPedido();
};
function abrirModalPedido(){
const modal=document.getElementById('modalPedido');
modal.style.display='flex';
}
function fecharModalPedido(){
const modal=document.getElementById('modalPedido');
modal.style.display='none';
}
document.getElementById('formPedido').onsubmit=function(e){
e.preventDefault();
const f = new FormData(this);
const nome = f.get('nome');
const endereco = f.get('endereco');
const tel = f.get('telefone');
const retirada = f.get('opcaoRetirada');
const pag = f.get('opcaoPagamento');
let resumo = `Cliente: ${nome}\nTelefone: ${tel}\nRetirada: ${retirada}`;
if(endereco) resumo += `\nEndereço: ${endereco}`;
resumo += `\n\nItens:\n`;
let total=0;
carrinho.forEach(i=>{
resumo += `${i.nome} x${i.quantidade} = R$ ${(i.preco*i.quantidade).toFixed(2)}\n`;
total+=i.preco*i.quantidade;
});
resumo += `\nTOTAL: R$ ${total.toFixed(2)}`;
// Mostra o resumo
const box = document.getElementById('resumoPedido');
box.style.display='block';
box.textContent=resumo;
const chave = localStorage.getItem('chavePIX') || '';
const canvas = document.getElementById('qrPIX');
const btnW = document.getElementById('btnWhatsAppPedido');
if(pag==='PIX' && chave){
canvas.style.display='block';
const qr = new QRious({
element: canvas,
value: chave,
size: 240
});
} else {
canvas.style.display='none';
}
btnW.style.display='block';
btnW.onclick=()=>{
const text = encodeURIComponent(resumo);
const wurl = `https://wa.me/?text=${text}`;
window.open(wurl,'_blank');
};
};
/* ============================
FECHAR CHECKOUT (não usado muito)
============================ */
function closeCheckout(){
document.getElementById('checkoutModal').style.display='none';
}
/* ============================
UTILITÁRIOS FINAIS E BOOT
============================ */
/* Ajusta UI relacionada ao banner/admin */
function atualizarBannerUI(){
const actions = document.getElementById('bannerActions');
if(actions) actions.style.display = modoAdmin ? 'flex' : 'none';
const bannerImg = document.getElementById('topBanner');
if(bannerImg){
bannerImg.style.cursor = modoAdmin ? 'pointer' : 'default';
bannerImg.onclick = modoAdmin ? ()=>{ if(pedirSenhaEsperada(SENHA_PERS)) acaoTrocarBanner(); else alert('Senha incorreta.'); } : null;
}
// botão modo admin
const modoBtn = document.getElementById('modoBtnFooter');
if(modoBtn) modoBtn.textContent = modoAdmin ? 'Versão Cliente' : 'Versão Administrador';
}
/* Conversor simples para garantir cores válidas */
function safeHex(h){
if(!h) return '#ffffff';
h = h.trim();
if(h[0] !== '#') h = '#'+h;
if(/^#[0-9a-fA-F]{6}$/.test(h)) return h;
if(/^#[0-9a-fA-F]{3}$/.test(h)){
return '#'+h[1]+h[1]+h[2]+h[2]+h[3]+h[3];
}
return '#ffffff';
}
/* Pequeno ajuste: garantir ids em produtos existentes */
function garantirIdsEmProdutos(){
let mudou = false;
produtos.forEach(p=>{
if(!p.id){ p.id = uid(); mudou = true; }
if(typeof p.estoque === 'undefined' || p.estoque === null) p.estoque = 0;
});
if(mudou) salvarLocalStorage();
}
/* Controle de teclas escape para fechar modais */
document.addEventListener('keydown', (e)=>{
if(e.key === 'Escape'){
fecharCarrinho();
fecharZoomImagem();
fecharModalPedido();
closeCheckout();
}
});
/* Fix: quando entra no admin via botão footer (usado em parte1) chamamos entrarModoAdmin() */
function entrarModoAdmin(){
if(modoAdmin){
modoAdmin = false;
atualizarBannerUI();
renderProdutos();
alert("Modo administrador desativado.");
return;
}
const ok = pedirSenhaEsperada(SENHA_ADMIN);
if(!ok){
alert("Senha incorreta.");
return;
}
modoAdmin = true;
atualizarBannerUI();
mostrarPainelAdmin();
alert("Modo administrador ativado!");
}
/* Pequena função para abrir checkout modal com opções (usa finalizarPedidoXXX já existentes) */
function abrirPagamento(){
if(carrinho.length === 0){ alert("Seu carrinho está vazio!"); return; }
const total = carrinho.reduce((s,i)=> s + (parseFloat(i.preco||0) * parseInt(i.quantidade||1,10)), 0).toFixed(2);
const co = document.getElementById('checkoutOptions');
co.innerHTML = `
`;
const ct = document.getElementById('checkoutTotal');
if(ct) ct.textContent = total;
const modal = document.getElementById('checkoutModal');
if(modal){ modal.style.display = 'flex'; document.body.style.overflow = 'hidden'; }
}
/* fechar checkout */
function closeCheckout(){
const modal = document.getElementById('checkoutModal');
if(modal){ modal.style.display = 'none'; document.body.style.overflow = ''; }
}
/* Ao adicionar ou remover itens, atualizamos badge */
function atualizarBadgeCarrinho(){
const btnFoot = document.getElementById('btnCarrinhoFooter');
const qtd = carrinho.reduce((s,i)=> s + (parseInt(i.quantidade||1,10) || 0), 0);
if(btnFoot) btnFoot.textContent = qtd>0 ? `Carrinho 🛒 (${qtd})` : 'Carrinho 🛒';
// também atualiza botão do pedido grande (se quiser)
const btnPedido = document.getElementById('btnPedido');
if(btnPedido) btnPedido.textContent = qtd>0 ? `🛒 Finalizar Pedido (${qtd})` : '🛒 Finalizar Pedido';
}
/* Ajuste: ao carregar, garantir que banner esteja presente */
function aplicarBannerInicial(){
const b = document.getElementById('topBanner');
if(b){
b.src = bannerSrc || 'https://via.placeholder.com/1200x300.png?text=Seu+Banner+Aqui';
}
}
/* ============================
INICIALIZAÇÃO FINAL (BOOT)
============================ */
(function boot(){
carregarLocalStorage();
garantirIdsEmProdutos();
aplicarBannerInicial();
atualizarBannerUI();
renderProdutos();
atualizarBadgeCarrinho();
// Se já houver chave PIX salva, mantemos (painel usa localStorage)
// Ativa listeners que possam não ter sido definidos anteriormente
const btnCheckout = document.getElementById('checkoutBox');
// nothing extra for now
// console log para debug
console.log('App iniciado — produtos:', produtos.length, 'carrinho:', carrinho.length);
})();
Alterar Título
Configurar chave PIX
Adicionar Produto
Nome:
Preço:
Categoria:
Estoque:
Imagem (URL):
Editar Produto
Nome:
Preço:
Categoria:
Estoque:
Imagem: