import React, { useState, useMemo } from 'react';
// --- MOCK DATA ---
const MOCK_PRODUCTS = [
{ id: 1, name: 'Pompa Air Shimizu PS-135 E', price: 550000, category: 'Pompa', type: 'product', rating: 4.8, sold: 124, image: 'pompa', desc: 'Pompa air sumur dangkal otomatis dengan daya hisap maksimal 9 meter. Cocok untuk kebutuhan rumah tangga.' },
{ id: 2, name: 'Kaporit Kolam Renang TCCA 90% (1kg)', price: 45000, category: 'Obat Kolam', type: 'product', rating: 4.9, sold: 300, image: 'kaporit', desc: 'Kaporit granular berkualitas tinggi untuk menjaga kejernihan air kolam renang dari lumut dan bakteri.' },
{ id: 3, name: 'Jasa Kuras & Pembersihan Kolam', price: 350000, category: 'Jasa', type: 'service', rating: 5.0, sold: 45, image: 'jasa', desc: 'Layanan pembersihan kolam renang profesional area Jawa Tengah. Termasuk sikat kerak, vakum dasar, dan pengecekan filter.' },
{ id: 4, name: 'Filter Tabung Sand Filter 16 Inch', price: 2100000, category: 'Pompa', type: 'product', rating: 4.7, sold: 12, image: 'filter', desc: 'Sand filter untuk kolam renang kapasitas sedang. Tahan tekanan tinggi dan anti karat.' },
{ id: 5, name: 'PAC (Poly Aluminium Chloride) 1kg', price: 25000, category: 'Obat Kolam', type: 'product', rating: 4.6, sold: 150, image: 'pac', desc: 'Penjernih air kolam renang yang ampuh mengikat kotoran agar mengendap ke dasar kolam.' },
{ id: 6, name: 'Jasa Service Pompa Air', price: 150000, category: 'Jasa', type: 'service', rating: 4.8, sold: 88, image: 'service', desc: 'Perbaikan pompa air mati total, suara bising, atau daya hisap lemah. Bergaransi 1 minggu.' },
];
// --- ICONS (Inline SVGs) ---
const Icons = {
Search: () => ,
Cart: () => ,
User: () => ,
Star: () => ,
Location: () => ,
Store: () => ,
WhatsApp: () =>
};
// --- HELPER COMPONENT: IMAGE PLACEHOLDER ---
const ProductImage = ({ type, className }) => {
const bgColor = type === 'pompa' || type === 'filter' ? 'bg-blue-100' : type === 'kaporit' || type === 'pac' ? 'bg-cyan-100' : 'bg-sky-100';
const textColor = type === 'pompa' || type === 'filter' ? 'text-blue-500' : type === 'kaporit' || type === 'pac' ? 'text-cyan-500' : 'text-sky-500';
return (
{type}
);
};
// --- MAIN APP COMPONENT ---
export default function App() {
const [currentView, setCurrentView] = useState('home'); // home, catalog, detail, cart, user, admin
const [selectedProduct, setSelectedProduct] = useState(null);
const [cart, setCart] = useState([]);
const [searchQuery, setSearchQuery] = useState('');
// Formatter Rupiah
const formatRp = (number) => {
return new Intl.NumberFormat('id-ID', { style: 'currency', currency: 'IDR', minimumFractionDigits: 0 }).format(number);
};
const navigateTo = (view, product = null) => {
setCurrentView(view);
if (product) setSelectedProduct(product);
window.scrollTo(0, 0);
};
const addToCart = (product, qty = 1) => {
setCart(prev => {
const existing = prev.find(item => item.id === product.id);
if (existing) {
return prev.map(item => item.id === product.id ? { ...item, qty: item.qty + qty } : item);
}
return [...prev, { ...product, qty }];
});
alert(`${product.name} ditambahkan ke keranjang!`);
};
// --- SUB-COMPONENTS (VIEWS) ---
const Navbar = () => (
{/* Logo */}
navigateTo('home')}>
Jateng Pool Store
{/* Search Bar */}
{/* Navigation & Icons */}
);
const Footer = () => (
);
const HomeView = () => (
{/* Hero Banner */}
Solusi Air & Kolam Renang Terbaik di Jawa Tengah
Beli pompa air, perlengkapan kolam, atau pesan jasa kuras langsung melalui WhatsApp. Mudah, Cepat & Terpercaya.
{/* Decorative elements */}
{/* Grid Kategori */}
Kategori Pilihan
{[
{ name: 'Pompa Air', icon: '๐ง', color: 'bg-blue-100 text-blue-600' },
{ name: 'Obat Kolam', icon: '๐งช', color: 'bg-cyan-100 text-cyan-600' },
{ name: 'Jasa Kuras', icon: '๐งน', color: 'bg-sky-100 text-sky-600' },
{ name: 'Filter', icon: '๐ข๏ธ', color: 'bg-gray-100 text-gray-600' },
{ name: 'Aksesoris', icon: '๐', color: 'bg-indigo-100 text-indigo-600' },
{ name: 'Semua', icon: 'โก๏ธ', color: 'bg-blue-100 text-blue-600' },
].map(cat => (
navigateTo('catalog')} className="flex flex-col items-center justify-center p-4 bg-white rounded-xl shadow-sm border border-gray-100 cursor-pointer hover:shadow-md transition">
{cat.icon}
{cat.name}
))}
{/* Terlaris */}
Produk & Jasa Terlaris
{MOCK_PRODUCTS.slice(0, 4).map(product => (
navigateTo('detail', product)}>
{product.type === 'service' && (
JASA
)}
{product.name}
{formatRp(product.price)}
{product.rating}
Terjual {product.sold}
))}
);
const CatalogView = () => {
const [filterCategory, setFilterCategory] = useState('Semua');
const [sortBy, setSortBy] = useState('Terbaru');
const filteredProducts = MOCK_PRODUCTS.filter(p => {
if (filterCategory !== 'Semua' && p.category !== filterCategory) return false;
if (searchQuery && !p.name.toLowerCase().includes(searchQuery.toLowerCase())) return false;
return true;
}).sort((a, b) => {
if (sortBy === 'Termurah') return a.price - b.price;
if (sortBy === 'Termahal') return b.price - a.price;
return b.id - a.id; // Default Terbaru
});
return (
{/* Sidebar Filter */}
{/* Main Grid */}
{searchQuery ? `Hasil Pencarian: "${searchQuery}"` : 'Katalog Produk & Jasa'}
{filteredProducts.length === 0 ? (
Barang atau jasa tidak ditemukan.
) : (
<>
{filteredProducts.map(product => (
navigateTo('detail', product)}>
{product.type === 'service' && (
JASA
)}
{product.category}
{product.name}
{formatRp(product.price)}
{product.rating}
{product.sold} Terjual
))}
{/* Pagination (Mock) */}
>
)}
);
};
const ProductDetailView = () => {
if (!selectedProduct) return null;
const isService = selectedProduct.type === 'service';
return (
navigateTo('home')}>Beranda
/
navigateTo('catalog')}>Katalog
/
{selectedProduct.name}
{/* Gallery */}
{/* Details */}
{selectedProduct.name}
Terjual {selectedProduct.sold}
{selectedProduct.rating}
{formatRp(selectedProduct.price)}
Deskripsi {isService ? 'Layanan' : 'Produk'}:
{selectedProduct.desc}
{/* Action Box */}
Atur Pesanan
{isService ? (
) : (
)}
Subtotal
{formatRp(selectedProduct.price)}
);
};
const CartCheckoutView = () => {
const [custName, setCustName] = useState('');
const [custPhone, setCustPhone] = useState('');
const [custAddress, setCustAddress] = useState('');
const subtotal = cart.reduce((sum, item) => sum + (item.price * item.qty), 0);
const hasService = cart.some(item => item.type === 'service');
const shippingCost = hasService ? 0 : (subtotal > 0 ? 25000 : 0); // Flat ongkir atau gratis jika jasa
const handleWhatsAppCheckout = () => {
if (cart.length === 0) return alert("Keranjang kosong!");
if (!custName || !custPhone || !custAddress) return alert("Mohon lengkapi data pengiriman Anda.");
const waNumber = "6281234567890"; // Nomor WA Toko (Ganti sesuai kebutuhan)
let message = `Halo *Jateng Pool Store*, saya ingin memesan:\n\n`;
cart.forEach((item, idx) => {
message += `${idx + 1}. ${item.name} (${item.qty}x) - ${formatRp(item.price * item.qty)}\n`;
});
message += `\n*Total Belanja (belum termasuk ongkir jika ada): ${formatRp(subtotal)}*\n\n`;
message += `*Data Pengiriman:*\n`;
message += `Nama: ${custName}\n`;
message += `No. HP/WA: ${custPhone}\n`;
message += `Alamat Lengkap: ${custAddress}\n\n`;
message += `Mohon konfirmasi total tagihan akhir dan metode pembayarannya. Terima kasih.`;
const waUrl = `https://wa.me/${waNumber}?text=${encodeURIComponent(message)}`;
window.open(waUrl, '_blank');
setCart([]); // Clear cart after redirect
navigateTo('home');
};
return (
Keranjang Belanja
{/* Cart Items & Address */}
{/* Items List */}
Daftar Item
{cart.length === 0 ? (
Keranjang Anda masih kosong. Ayo belanja!
) : (
cart.map((item, idx) => (
{item.name}
{formatRp(item.price)}
))
)}
{/* Address Form */}
{cart.length > 0 && (
Lokasi Pengiriman / Pengerjaan Jasa
)}
{/* Summary Box */}
Ringkasan Belanja
Total Harga ({cart.length} barang)
{formatRp(subtotal)}
Estimasi Ongkir
{shippingCost === 0 ? 'Gratis' : formatRp(shippingCost)}
Total Estimasi
{formatRp(subtotal + shippingCost)}
Pesanan Anda akan dikirimkan ke WhatsApp admin kami untuk konfirmasi ketersediaan stok dan total tagihan akhir.
);
};
const UserDashboardView = () => (
{/* Profile Sidebar */}
B
Bapak Budi
budi@email.com
Member Silver
- Pesanan Saya
- Daftar Keinginan
- Alamat Saya
- Pengaturan Akun
{/* Order History */}
Riwayat Pesanan
{/* Status Tabs */}
{/* Order Cards Mockup */}
{/* Ongoing Order */}
Diproses
12 Jun 2026
TRX-123456
Jateng Pool Store
Jasa Kuras & Pembersihan Kolam
1 x Rp 350.000
Jadwal: 15 Jun 2026
Total Belanja
Rp 350.000
{/* Completed Order */}
Selesai
01 Mei 2026
TRX-987654
Kaporit Kolam Renang TCCA 90% (1kg)
2 x Rp 45.000
Total Belanja
Rp 115.000
);
const AdminDashboardView = () => {
const [adminTab, setAdminTab] = useState('dashboard'); // dashboard, catalog, crm, promo
return (
Pusat Komando Admin
Kelola operasional Jateng Pool Store
{/* Admin Sidebar */}
{[
{ id: 'dashboard', name: 'Dashboard' },
{ id: 'catalog', name: 'Manajemen Katalog' },
{ id: 'crm', name: 'Pelanggan (CRM)' },
{ id: 'promo', name: 'Promosi & Diskon' }
].map(tab => (
- setAdminTab(tab.id)}
className={`px-4 py-3 border-b cursor-pointer font-medium ${adminTab === tab.id ? 'bg-blue-50 text-blue-600 border-l-4 border-l-blue-600' : 'text-gray-600 hover:bg-gray-50'}`}
>
{tab.name}
))}
{/* Admin Content Area */}
{adminTab === 'dashboard' && (
{/* Stats Cards */}
Total Penjualan Hari Ini
Rp 1.250.000
Pesanan Baru (WA)
4 pesanan
Jadwal Jasa Mendatang
2 layanan
{/* Kanban Board Mockup */}
Status Transaksi Berjalan
{/* Column 1 */}
Pesanan Masuk 2
INV/2026/06/14
Pompa Shimizu (1x)
{/* Column 2 */}
Sedang Diproses 1
JASA/2026/06/15
Kuras Kolam (Bpk. Budi)
{/* Column 3 */}
Selesai Hari Ini 0
Belum ada pesanan selesai
)}
{adminTab === 'catalog' && (
Daftar Produk & Jasa
| ID |
Nama Item |
Kategori |
Harga |
Aksi |
{MOCK_PRODUCTS.map(product => (
| #{product.id} |
{product.name} |
{product.category}
|
{formatRp(product.price)} |
|
))}
)}
{adminTab === 'crm' && (
๐ฅ
Manajemen Pelanggan
Tabel database pengguna, tiering loyalty, dan tombol Export CSV akan dirender di sini.
)}
{adminTab === 'promo' && (
๐๏ธ
Manajemen Voucher
Pembuatan kode kupon promo dan pelacakan klaim akan dikelola di panel ini.
)}
);
};
// --- RENDER ROUTER ---
return (
{currentView === 'home' && }
{currentView === 'catalog' && }
{currentView === 'detail' && }
{currentView === 'cart' && }
{currentView === 'user' && }
{currentView === 'admin' && }
{currentView !== 'admin' &&
}
);
}