import ProductCard from '@/components/home/ProductCard'; import CartDrawer from '@/components/home/CartDrawer'; import ProductModal from '@/components/home/ProductModal'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { useCart } from '@/contexts/cart-context'; import { formatRupiah } from '@/lib/rupiah'; import type { Category, HomepageData, Paginated, Product, ProductPrice } from '@/types/homepage'; import { Head, InfiniteScroll, Link, router } from '@inertiajs/react'; import { ArrowRight, Check, ChevronRight, Info, LogIn, Mail, MapPin, Phone, Plus, Search, ShoppingBag, Star, } from 'lucide-react'; import { useCallback, useEffect, useRef, useState } from 'react'; type Props = { appName: string; aboutApp: string | null; contactEmail: string | null; contactPhone: string | null; contactAddress: string | null; instagramUrl: string | null; facebookUrl: string | null; tiktokUrl: string | null; homepage: HomepageData; categories: Category[]; products: Paginated; filters: { search: string; category: string }; seo: { title: string; description: string; image: string; url: string }; }; export default function Welcome({ appName, aboutApp, contactEmail, contactPhone, contactAddress, instagramUrl, facebookUrl, tiktokUrl, homepage, categories, products, filters, }: Props) { const [searchInput, setSearchInput] = useState(filters.search); const [selectedCategory, setSelectedCategory] = useState(filters.category); const [activeProduct, setActiveProduct] = useState(null); const [activeSection, setActiveSection] = useState('hero'); const [cartOpen, setCartOpen] = useState(false); const searchTimeoutRef = useRef>(undefined); const { totalItems } = useCart(); useEffect(() => { const sections = ['hero', 'catalog', 'gallery', 'order-guide', 'about', 'contact']; const observers: IntersectionObserver[] = []; sections.forEach((id) => { const el = document.getElementById(id); if (!el) return; const observer = new IntersectionObserver( ([entry]) => { if (entry.isIntersecting) { setActiveSection(id); } }, { rootMargin: '-40% 0px -55% 0px' }, ); observer.observe(el); observers.push(observer); }); return () => observers.forEach((o) => o.disconnect()); }, []); const FALLBACK_IMAGE = 'https://images.unsplash.com/photo-1490481651871-ab68de25d43d?w=800&auto=format&fit=crop&q=80'; const getProductImage = (product: Product): string => { for (const variant of product.product_variants) { if (variant.photo_urls && variant.photo_urls.length > 0) { return variant.photo_urls[0]; } } return FALLBACK_IMAGE; }; const getProductPriceRange = (product: Product): string => { const prices = product.product_variants.flatMap((v) => v.product_prices .filter((p: ProductPrice) => p.type === 'retail') .map((p: ProductPrice) => p.price), ); if (prices.length === 0) { const fallbackPrices = product.product_variants.flatMap((v) => v.product_prices.map((p: ProductPrice) => p.price), ); if (fallbackPrices.length === 0) return 'Rp 0'; const min = Math.min(...fallbackPrices); const max = Math.max(...fallbackPrices); return min === max ? `Rp ${formatRupiah(min)}` : `Rp ${formatRupiah(min)} - Rp ${formatRupiah(max)}`; } const min = Math.min(...prices); const max = Math.max(...prices); return min === max ? `Rp ${formatRupiah(min)}` : `Rp ${formatRupiah(min)} - Rp ${formatRupiah(max)}`; }; const fetchProducts = useCallback( (search: string, category: string) => { const params = new URLSearchParams(); if (search) params.set('search', search); if (category) params.set('category', category); const url = `/${params.toString() ? `?${params.toString()}` : ''}`; router.visit(url, { only: ['products', 'filters'], reset: ['products'], preserveState: true, preserveScroll: true, }); }, [], ); const handleSearchChange = useCallback( (value: string) => { setSearchInput(value); if (searchTimeoutRef.current) { clearTimeout(searchTimeoutRef.current); } searchTimeoutRef.current = setTimeout(() => { fetchProducts(value, selectedCategory); }, 400); }, [selectedCategory, fetchProducts], ); const handleCategoryChange = useCallback( (slug: string | null) => { const newCategory = slug ?? ''; setSelectedCategory(newCategory); fetchProducts(searchInput, newCategory); }, [searchInput, fetchProducts], ); const handleResetFilters = useCallback(() => { setSearchInput(''); setSelectedCategory(''); fetchProducts('', ''); }, [fetchProducts]); const featuredProducts = products.data.slice(0, 3); return ( <>
{/* Sticky Header */}
{appName}
{/* Hero Section */}
{/* Left Column */}
Hadir dengan Gaya Terbaru

Nyaman
dalam setiap{' '} Penampilan

Koleksi fashion wanita dengan sentuhan elegan, material berkualitas, dan kenyamanan yang dapat Anda rasakan di setiap pemakaian.

{/* Center Column: Visual */}
DST Collection
{appName}
{/* Floating Tag 1 */} {featuredProducts[0] && (
setActiveProduct(featuredProducts[0])} className="absolute top-10 left-4 md:-left-6 z-20 flex items-center space-x-3 bg-white/90 backdrop-blur-md p-3 rounded-2xl shadow-lg border border-amber-100/40 cursor-pointer transform hover:-translate-y-1 transition-all" > Preview Produk

Terpopuler

{featuredProducts[0].name}

{getProductPriceRange(featuredProducts[0])}
)} {/* Floating Tag 2 */} {featuredProducts[1] && (
setActiveProduct(featuredProducts[1])} className="absolute top-28 right-4 md:-right-6 z-20 flex items-center space-x-3 bg-white/90 backdrop-blur-md p-3 rounded-2xl shadow-lg border border-amber-100/40 cursor-pointer transform hover:-translate-y-1 transition-all" > Preview Produk
{[1, 2, 3, 4, 5].map((i) => ( ))}

{featuredProducts[1].name}

Stok Tersedia
)}
{/* Scroll Indicator */}
#DSTCollection Bahan Adem & Lembut
{/* Catalog Section */}
Katalog Eksklusif

Koleksi Busana Pilihan

Gunakan kategori dan filter di bawah untuk menyesuaikan pencarian busana idaman Anda dengan mudah.

{/* Filters */}
handleSearchChange(e.target.value)} type="text" placeholder="Cari produk..." className="w-full bg-slate-50 border-slate-200 text-xs px-4 py-3 pr-10 rounded-xl focus:border-amber-500 text-slate-700 transition-all" />
{categories.map((category) => ( ))}
{/* Product Grid with Infinite Scroll */} (
Memuat produk lainnya...
)} > {products.data.length > 0 ? (
{products.data.map((product) => ( ))}
) : (

Produk Tidak Ditemukan

Mohon maaf, kami tidak menemukan pakaian yang cocok dengan kata kunci pencarian Anda.

)}
{/* Gallery Section */} {/* Order Guide Section */}
Langkah Pemesanan

Cara Melakukan Pemesanan

Sistem pemesanan kami sangat mudah dan terhubung langsung via WhatsApp untuk pelayanan cepat dan personal.

{[ { title: 'Pilih Produk', description: 'Jelajahi pakaian favorit Anda, lalu ketuk "Lihat Detail" untuk memeriksa varian.' }, { title: 'Pilih Varian & Harga', description: 'Tentukan varian yang diinginkan dan pilih jenis harga (Eceran, Grosir, Agen, dll.).' }, { title: 'Masukkan Keranjang', description: 'Masukkan ke Keranjang Belanja untuk menampung seluruh daftar pakaian yang ingin Anda beli.' }, { title: 'Kirim ke WhatsApp', description: 'Klik tombol kirim pesanan, admin kami akan merespons rincian transfer bank dan pengiriman kurir.' }, ].map((step, index) => (
{index + 1}
{index === 0 && } {index === 1 && } {index === 2 && } {index === 3 && }
{step.title}

{step.description}

))}
{/* About Section */}
Tentang Kami
Tentang Kami

DST Collection

{aboutApp || 'Kami adalah rumah produksi busana lokal berkualitas tinggi. Berfokus pada keindahan motif, ketepatan detail jahitan, dan pemilihan kain adem yang mengedepankan aspek fungsionalitas dan estetika.'}

{['Kain Rayon Super Tebal & Menyerap Keringat', 'Motif Eksklusif & Tidak Pasaran', 'Dukungan Penuh Layanan Admin Via WhatsApp'].map((feature, index) => (
{feature}
))}
{/* Contact Section */}
Kontak Kami

Ada Pertanyaan? Hubungi Kami

Kami sangat senang mendengarkan pertanyaan Anda terkait spesifikasi produk, ketersediaan grosir, atau kemitraan. Hubungi tim admin kami melalui media di bawah.

{contactPhone && (
{contactPhone}
)} {contactEmail && (
{contactEmail}
)} {contactAddress && (
{contactAddress}
)}