import { useState } from "react"; import { useNavigate } from "react-router-dom"; import { AppLayout } from "@/components/AppLayout"; import { useCart } from "@/contexts/CartContext"; import { useAuth } from "@/hooks/useAuth"; import { supabase } from "@/integrations/supabase/client"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from "@/components/ui/dialog"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Input } from "@/components/ui/input"; import { toast } from "@/hooks/use-toast"; import { formatIDR } from "@/lib/format"; import { Trash2, CreditCard, Loader2, QrCode } from "lucide-react"; // Edge function base URL - configurable via env with sensible default const getEdgeFunctionBaseUrl = (): string => { return import.meta.env.VITE_SUPABASE_EDGE_URL || "https://lovable.backoffice.biz.id/functions/v1"; }; const PAKASIR_CALLBACK_URL = `${getEdgeFunctionBaseUrl()}/pakasir-webhook`; type CheckoutStep = "cart" | "payment"; export default function Checkout() { const { items, removeItem, clearCart, total } = useCart(); const { user, signIn, signUp } = useAuth(); const navigate = useNavigate(); const [loading, setLoading] = useState(false); const [step, setStep] = useState("cart"); // Auth modal state const [authModalOpen, setAuthModalOpen] = useState(false); const [authLoading, setAuthLoading] = useState(false); const [authEmail, setAuthEmail] = useState(""); const [authPassword, setAuthPassword] = useState(""); const [authName, setAuthName] = useState(""); const checkPaymentStatus = async (oid: string) => { const { data: order } = await supabase.from("orders").select("payment_status").eq("id", oid).single(); if (order?.payment_status === "paid") { toast({ title: "Pembayaran berhasil!", description: "Akses produk sudah aktif" }); navigate(`/orders/${oid}`); } }; const handleCheckout = async () => { if (!user) { toast({ title: "Login diperlukan", description: "Silakan login untuk melanjutkan pembayaran" }); navigate("/auth"); return; } if (items.length === 0) { toast({ title: "Keranjang kosong", description: "Tambahkan produk ke keranjang terlebih dahulu", variant: "destructive", }); return; } setLoading(true); try { // Generate a unique order reference const orderRef = `ORD${Date.now().toString(36).toUpperCase()}${Math.random().toString(36).substring(2, 6).toUpperCase()}`; const amountInRupiah = Math.round(total); // Create order with pending payment status const { data: order, error: orderError } = await supabase .from("orders") .insert({ user_id: user.id, total_amount: amountInRupiah, status: "pending", payment_provider: "pakasir", payment_reference: orderRef, payment_status: "pending", payment_method: "qris", }) .select() .single(); if (orderError || !order) { throw new Error("Gagal membuat order"); } // Create order items const orderItems = items.map((item) => ({ order_id: order.id, product_id: item.id, unit_price: item.sale_price ?? item.price, quantity: 1, })); const { error: itemsError } = await supabase.from("order_items").insert(orderItems); if (itemsError) throw new Error("Gagal menambahkan item order"); // Build description from product titles const productTitles = items.map(item => item.title).join(", "); // Call edge function to create QRIS payment const { data: paymentData, error: paymentError } = await supabase.functions.invoke('create-payment', { body: { order_id: order.id, amount: amountInRupiah, description: productTitles, }, }); if (paymentError) { console.error('Payment creation error:', paymentError); throw new Error(paymentError.message || 'Gagal membuat pembayaran'); } // Clear cart and redirect to order detail page to show QR code clearCart(); navigate(`/orders/${order.id}`); } catch (error) { console.error("Checkout error:", error); toast({ title: "Error", description: error instanceof Error ? error.message : "Terjadi kesalahan saat checkout", variant: "destructive", }); } finally { setLoading(false); } }; const refreshPaymentStatus = async () => { // This function is now handled in OrderDetail page // Kept for backwards compatibility but no longer used toast({ title: "Info", description: "Status pembayaran diupdate otomatis" }); }; const handleLogin = async (e: React.FormEvent) => { e.preventDefault(); if (!authEmail || !authPassword) { toast({ title: "Error", description: "Email dan password wajib diisi", variant: "destructive" }); return; } setAuthLoading(true); const { error } = await signIn(authEmail, authPassword); if (error) { toast({ title: "Login gagal", description: error.message || "Email atau password salah", variant: "destructive", }); setAuthLoading(false); } else { toast({ title: "Login berhasil", description: "Silakan lanjutkan pembayaran" }); setAuthModalOpen(false); setAuthLoading(false); } }; const handleRegister = async (e: React.FormEvent) => { e.preventDefault(); if (!authEmail || !authPassword || !authName) { toast({ title: "Error", description: "Semua field wajib diisi", variant: "destructive" }); return; } if (authPassword.length < 6) { toast({ title: "Error", description: "Password minimal 6 karakter", variant: "destructive" }); return; } setAuthLoading(true); const { error, data } = await signUp(authEmail, authPassword, authName); if (error) { toast({ title: "Registrasi gagal", description: error.message || "Gagal membuat akun", variant: "destructive", }); setAuthLoading(false); } else { toast({ title: "Registrasi berhasil", description: "Silakan cek email untuk verifikasi akun Anda", }); setAuthModalOpen(false); setAuthLoading(false); } }; return (

Checkout

{items.length === 0 ? (

Keranjang belanja Anda kosong

) : (
{items.map((item) => (

{item.title}

{item.type}

{formatIDR(item.sale_price ?? item.price)}
))} Metode Pembayaran

QRIS

Scan QR dengan aplikasi e-wallet atau mobile banking

Ringkasan Order
Total {formatIDR(total)}
{user ? ( ) : ( Login atau Daftar Login Daftar
setAuthEmail(e.target.value)} required />
setAuthPassword(e.target.value)} required />
setAuthName(e.target.value)} required />
setAuthEmail(e.target.value)} required />
setAuthPassword(e.target.value)} required minLength={6} />
)}

Pembayaran aman dengan standar QRIS dari Bank Indonesia

Diproses oleh mitra pembayaran terpercaya

Didukung oleh Pakasir | QRIS terdaftar oleh Bank Indonesia

)}
); }