import { useEffect, useState } from 'react'; import { Link } from 'react-router-dom'; import { supabase } from '@/integrations/supabase/client'; import { AppLayout } from '@/components/AppLayout'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { useCart } from '@/contexts/CartContext'; import { toast } from '@/hooks/use-toast'; import { Skeleton } from '@/components/ui/skeleton'; import { formatIDR } from '@/lib/format'; import { Video, Clock, Calendar, Package, Check, Search, X } from 'lucide-react'; import { Input } from '@/components/ui/input'; interface Product { id: string; title: string; slug: string; type: string; description: string; price: number; sale_price: number | null; is_active: boolean; } interface ConsultingSettings { is_consulting_enabled: boolean; consulting_block_price: number; consulting_block_duration_minutes: number; } export default function Products() { const [products, setProducts] = useState([]); const [consultingSettings, setConsultingSettings] = useState(null); const [loading, setLoading] = useState(true); const [searchQuery, setSearchQuery] = useState(''); const [selectedType, setSelectedType] = useState('all'); const { addItem, items } = useCart(); useEffect(() => { fetchData(); }, []); const fetchData = async () => { const [productsRes, consultingRes] = await Promise.all([ supabase .from('products') .select('*') .eq('is_active', true) .order('created_at', { ascending: false }), supabase .from('consulting_settings') .select('is_consulting_enabled, consulting_block_price, consulting_block_duration_minutes') .single(), ]); if (productsRes.error) { toast({ title: 'Error', description: 'Gagal memuat produk', variant: 'destructive' }); } else { setProducts(productsRes.data || []); } if (consultingRes.data) { setConsultingSettings(consultingRes.data); } setLoading(false); }; const handleAddToCart = (product: Product) => { addItem({ id: product.id, title: product.title, price: product.price, sale_price: product.sale_price, type: product.type, }); toast({ title: 'Ditambahkan', description: `${product.title} sudah ditambahkan ke keranjang` }); }; const isInCart = (productId: string) => items.some(item => item.id === productId); const getTypeLabel = (type: string) => { switch (type) { case 'consulting': return 'Konsultasi'; case 'webinar': return 'Webinar'; case 'bootcamp': return 'Bootcamp'; default: return type; } }; // Strip HTML tags for preview, but keep first 100 chars const stripHtml = (html: string) => { const tmp = document.createElement('div'); tmp.innerHTML = html; return tmp.textContent || tmp.innerText || ''; }; // Filter products based on search and type const filteredProducts = products.filter((product) => { const matchesSearch = product.title.toLowerCase().includes(searchQuery.toLowerCase()) || stripHtml(product.description).toLowerCase().includes(searchQuery.toLowerCase()); const matchesType = selectedType === 'all' || product.type === selectedType; return matchesSearch && matchesType; }); // Get unique product types for filter const productTypes = ['all', ...Array.from(new Set(products.map(p => p.type)))]; const clearFilters = () => { setSearchQuery(''); setSelectedType('all'); }; return (

Produk

Jelajahi konsultasi, webinar, dan bootcamp kami

{/* Consulting Availability Banner */} {!loading && consultingSettings?.is_consulting_enabled && (

Konsultasi Tersedia!

Booking jadwal konsultasi 1-on-1 dengan mentor • {formatIDR(consultingSettings.consulting_block_price)} / {consultingSettings.consulting_block_duration_minutes} menit

)} {/* Search and Filter */} {!loading && products.length > 0 && (
{/* Search Bar */}
setSearchQuery(e.target.value)} className="pl-10 border-2" /> {searchQuery && ( )}
{/* Category Filter */}
Kategori: {productTypes.map((type) => ( ))} {(searchQuery || selectedType !== 'all') && ( )}
{/* Results Count */}

Menampilkan {filteredProducts.length} dari {products.length} produk

)} {loading ? (
{[...Array(6)].map((_, i) => ( ))}
) : (
{/* Consulting Card - Only show when enabled */} {consultingSettings?.is_consulting_enabled && ( {/* Decorative element */}
Konsultasi
Sesi konsultasi pribadi dengan mentor. Diskusikan masalah spesifik dan dapatkan solusi langsung.
{consultingSettings.consulting_block_duration_minutes} menit per sesi
Pilih jadwal yang tersedia
{formatIDR(consultingSettings.consulting_block_price)} / sesi
)} {/* Regular Products */} {filteredProducts.map((product) => (
{product.title} {getTypeLabel(product.type)}
{stripHtml(product.description)}
{product.sale_price ? ( <> {formatIDR(product.sale_price)} {formatIDR(product.price)} -{Math.round((1 - product.sale_price / product.price) * 100)}% ) : ( {formatIDR(product.price)} )}
))} {/* Empty State */} {filteredProducts.length === 0 && products.length > 0 && (

Tidak Ada Produk Ditemukan

Coba kata kunci atau kategori lain.

)} {products.length === 0 && !consultingSettings?.is_consulting_enabled && (

Belum Ada Produk

Kami sedang mempersiapkan produk menarik untuk Anda.

)}
)}
); }