diff --git a/ventaboletos/public/images/Concierto Rock Fest.jpeg b/ventaboletos/public/images/Concierto Rock Fest.jpeg new file mode 100644 index 0000000..19cca70 Binary files /dev/null and b/ventaboletos/public/images/Concierto Rock Fest.jpeg differ diff --git a/ventaboletos/public/images/Concierto Rock Fest.jpg b/ventaboletos/public/images/Concierto Rock Fest.jpg new file mode 100644 index 0000000..d8c8cfe Binary files /dev/null and b/ventaboletos/public/images/Concierto Rock Fest.jpg differ diff --git a/ventaboletos/public/images/default.jpeg b/ventaboletos/public/images/default.jpeg new file mode 100644 index 0000000..0d76260 Binary files /dev/null and b/ventaboletos/public/images/default.jpeg differ diff --git a/ventaboletos/src/components/vistas/Informacion.jsx b/ventaboletos/src/components/vistas/Informacion.jsx index 7d6d061..627f490 100644 --- a/ventaboletos/src/components/vistas/Informacion.jsx +++ b/ventaboletos/src/components/vistas/Informacion.jsx @@ -15,6 +15,7 @@ import { } from "@/components/ui/select"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; +import { Label } from "@/components/ui/label"; // Import Label component function Informacion() { const [open, setOpen] = useState(false); @@ -26,6 +27,7 @@ function Informacion() { const [selectedCategoria, setSelectedCategoria] = useState(""); const [asientoSeleccionado, setAsientoSeleccionado] = useState(""); const [searchTerm, setSearchTerm] = useState(""); + const [precioAsiento, setPrecioAsiento] = useState(null); // Add state for seat price useEffect(() => { fetchConciertos(); @@ -52,7 +54,7 @@ function Informacion() { const fetchAsientos = async () => { let { data, error } = await supabaseClient .from("asientos") - .select("numero_asiento, categoria"); + .select("numero_asiento, categoria, precio"); // Include price in the select if (error) { console.error(error); } else { @@ -72,6 +74,15 @@ function Informacion() { const handleCategoriaChange = (categoria) => { setSelectedCategoria(categoria); setAsientoSeleccionado(""); + setPrecioAsiento(null); // Reset price when category changes + }; + + const handleAsientoChange = (asiento) => { + setAsientoSeleccionado(asiento); + const selectedAsiento = numeroAsiento.find( + (item) => item.numero_asiento === asiento + ); + setPrecioAsiento(selectedAsiento?.precio || null); // Set the price of the selected seat }; const handleAgregarAlCarrito = () => { @@ -79,13 +90,13 @@ function Informacion() { alert("Selecciona un tipo de asiento antes de continuar."); return; } - + const carritoActual = JSON.parse(localStorage.getItem("carrito")) || []; const nuevoCarrito = [ ...carritoActual, - { ...selectedConcierto, asiento: asientoSeleccionado }, + { ...selectedConcierto, asiento: asientoSeleccionado, precio: precioAsiento }, ]; - + localStorage.setItem("carrito", JSON.stringify(nuevoCarrito)); setOpen(false); }; @@ -112,8 +123,12 @@ function Informacion() { <div key={concierto.id} className="flex items-center gap-4 p-4 border rounded-lg" - > - <div className="w-16 h-16 bg-gray-300" /> + > + <img + src={`/images/${concierto.imagen || "default.jpeg"}`} + alt={concierto.nombre} + className="w-24 h-24 rounded-lg object-cover" + /> <div> <p className="text-lg font-semibold">{concierto.nombre}</p> <p className="text-sm text-gray-600">{concierto.fecha}</p> @@ -146,7 +161,7 @@ function Informacion() { </Select> </div> <div className="space-y-4"> - <Select onValueChange={setAsientoSeleccionado}> + <Select onValueChange={handleAsientoChange}> <SelectTrigger> <SelectValue placeholder="Selecciona un asiento" /> </SelectTrigger> @@ -162,6 +177,11 @@ function Informacion() { </SelectContent> </Select> </div> + <div> + <Label> + {precioAsiento !== null ? `Precio: $${precioAsiento}` : "Selecciona un asiento para ver el precio"} + </Label> + </div> <div className="flex justify-end gap-2 mt-4"> <Button variant="outline" onClick={() => setOpen(false)}> Cancelar @@ -174,4 +194,4 @@ function Informacion() { ); } -export default Informacion; +export default Informacion; \ No newline at end of file diff --git a/ventaboletos/src/pages/carrito.jsx b/ventaboletos/src/pages/carrito.jsx index 9ffd56e..a8702eb 100644 --- a/ventaboletos/src/pages/carrito.jsx +++ b/ventaboletos/src/pages/carrito.jsx @@ -3,12 +3,6 @@ import { useRouter } from "next/router"; import { Button } from "@/components/ui/button"; import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog"; -const PRECIOS_BOLETO = { - VIP: 100, - Intermedio: 75, - General: 25, -}; - export default function Carrito() { const [carrito, setCarrito] = useState([]); const [showDialog, setShowDialog] = useState(false); @@ -17,12 +11,7 @@ export default function Carrito() { useEffect(() => { const carritoGuardado = JSON.parse(localStorage.getItem("carrito")) || []; - // Asigna el precio basado en el tipo de boleto si no tiene un precio definido - const carritoConPrecios = carritoGuardado.map(item => ({ - ...item, - precio: PRECIOS_BOLETO[item.tipoBoleto] || 0, - })); - setCarrito(carritoConPrecios); + setCarrito(carritoGuardado); }, []); const eliminarConcierto = () => { @@ -38,6 +27,30 @@ export default function Carrito() { return carrito.reduce((total, item) => total + (item.precio || 0), 0); }; + const pagar = async () => { + try { + const response = await fetch("/api/comprar-boletos", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ boletos: carrito }), + }); + + if (!response.ok) { + throw new Error("Error al procesar el pago"); + } + + alert("Compra realizada con éxito"); + localStorage.removeItem("carrito"); + setCarrito([]); + router.push("/"); + } catch (error) { + console.error("Error en la compra:", error); + alert("Hubo un problema al realizar la compra"); + } + }; + return ( <div className="p-4 max-w-3xl mx-auto bg-gray-900 text-white rounded-lg shadow-lg"> <h2 className="text-2xl font-bold mb-4">Carrito de Compras</h2> @@ -73,7 +86,7 @@ export default function Carrito() { > Cancelar </Button> - <Button className="bg-green-500 hover:bg-green-600">Pagar</Button> + <Button className="bg-green-500 hover:bg-green-600" onClick={pagar}>Pagar</Button> </div> </> )} @@ -95,4 +108,4 @@ export default function Carrito() { </Dialog> </div> ); -} +} \ No newline at end of file