diff --git a/.env b/.env new file mode 100644 index 0000000..7699dc2 --- /dev/null +++ b/.env @@ -0,0 +1,6 @@ +VITE_API_KEY="AIzaSyBMt_g1TJldovTJBzSI_e5jPNfzXxo4ChI" +VITE_AUTH_DOMAIN="restaurantecarol2024.firebaseapp.com" +VITE_PROJECT_ID="restaurantecarol2024" +VITE_STORAGE_BUCKET="restaurantecarol2024.appspot.com" +VITE_MESSAGING_SENDER_ID="144840930265" +VITE_APP_ID="1:144840930265:web:d4c7fe54f38e23bda25fc8" \ No newline at end of file diff --git a/src/App.jsx b/src/App.jsx index b749a6b..19d0723 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -1,14 +1,17 @@ -import { useState } from 'react' -import viteLogo from '/vite.svg' -import './App.css' +import { useState } from 'react'; +import viteLogo from '/vite.svg'; +import './App.css'; +import React from 'react'; +import OrderForm from './orderForm'; +import OrderList from './OrderList'; // Importacion del componente function App() { - const [count, setCount] = useState(0) + const [count, setCount] = useState(0); return ( <>
- + Vite logo
@@ -24,8 +27,20 @@ function App() {

Click on the Vite and React logos to learn more

+ +
+

Bienvenido al Restaurante

+

Por favor, realiza tu pedido a continuación:

+ + {/* Componente del formulario de pedidos */} + +

Pedidos registrados:

+ {/* Componente para mostrar los pedidos */} + + +
- ) + ); } -export default App +export default App; diff --git a/src/OrderList.jsx b/src/OrderList.jsx new file mode 100644 index 0000000..cf11511 --- /dev/null +++ b/src/OrderList.jsx @@ -0,0 +1,128 @@ +import React, { useState, useEffect } from 'react'; +import { collection, getDocs, doc, deleteDoc, updateDoc } from 'firebase/firestore'; +import { db } from './firebaseConfig'; +import OrderForm from './orderForm'; // Importa el formulario existente + +const OrderList = () => { + const [orders, setOrders] = useState([]); // Lista de pedidos + const [selectedOrder, setSelectedOrder] = useState(null); // Pedido seleccionado + const [editing, setEditing] = useState(false); // Estado para saber si estamos editando + const [loading, setLoading] = useState(true); // Estado de carga + + // Función para recuperar los pedidos desde Firestore + const fetchOrders = async () => { + try { + const querySnapshot = await getDocs(collection(db, 'orders')); + const ordersData = querySnapshot.docs.map(doc => ({ + id: doc.id, + ...doc.data() + })); + setOrders(ordersData); + } catch (error) { + console.error("Error al recuperar los pedidos:", error.message); + } finally { + setLoading(false); + } + }; + + // Llama a fetchOrders al cargar el componente + useEffect(() => { + fetchOrders(); + }, []); + + // Función para manejar clic en un pedido + const handleSelectOrder = (order) => { + setSelectedOrder(order); // Establece el pedido seleccionado + }; + + // Función para eliminar un pedido + const handleDeleteOrder = async (id) => { + const confirmDelete = window.confirm('¿Estás seguro de que deseas eliminar este pedido?'); + if (confirmDelete) { + try { + await deleteDoc(doc(db, 'orders', id)); + alert('Pedido eliminado exitosamente.'); + setOrders(orders.filter(order => order.id !== id)); // Actualiza la lista localmente + setSelectedOrder(null); // Limpia el detalle si el pedido estaba seleccionado + } catch (error) { + console.error("Error al eliminar el pedido:", error.message); + } + } + }; + + // Función para manejar clic en Update + const handleUpdateOrder = () => { + setEditing(true); // Cambia al modo de edición + }; + + // Función para manejar la actualización del pedido + const handleSubmitUpdatedOrder = async (updatedOrder) => { + try { + await updateDoc(doc(db, 'orders', updatedOrder.id), updatedOrder); + alert('Pedido actualizado exitosamente.'); + setEditing(false); // Salir del modo de edición + setSelectedOrder(null); // Regresa a la lista + fetchOrders(); // Actualiza la lista + } catch (error) { + console.error("Error al actualizar el pedido:", error.message); + } + }; + + // Renderizado condicional + if (loading) { + return

Cargando pedidos...

; + } + + return ( +
+

Pedidos existentes

+ + {!selectedOrder && !editing ? ( + // Lista de pedidos + orders.length > 0 ? ( + + ) : ( +

No hay pedidos registrados.

+ ) + ) : selectedOrder && !editing ? ( + // Detalle del pedido seleccionado +
+

Detalle del Pedido

+

Nombre del cliente: {selectedOrder.customerName}

+

Artículos: {selectedOrder.items.join(', ')}

+

Total: ${selectedOrder.total}

+

Modalidad: {selectedOrder.modality}

+

Creado en: {selectedOrder.createdAt?.toDate().toLocaleString()}

+

Actualizado en: {selectedOrder.updatedAt?.toDate().toLocaleString()}

+ + {/* Botones de acción */} + + + +
+ ) : ( + // Modo de edición + { + setEditing(false); + setSelectedOrder(null); // Regresa al detalle si se cancela + }} + /> + )} +
+ ); +}; + +export default OrderList; diff --git a/src/firebaseConfig.js b/src/firebaseConfig.js new file mode 100644 index 0000000..551174b --- /dev/null +++ b/src/firebaseConfig.js @@ -0,0 +1,24 @@ +// Importación de las funciones necesarias de Firebase +import { initializeApp } from "firebase/app"; +import { getFirestore } from "firebase/firestore"; +import { getAuth } from "firebase/auth"; + +// Configuración de Firebase usando variables de entorno +const firebaseConfig = { + apiKey: import.meta.env.VITE_API_KEY, + authDomain: import.meta.env.VITE_AUTH_DOMAIN, + projectId: import.meta.env.VITE_PROJECT_ID, + storageBucket: import.meta.env.VITE_STORAGE_BUCKET, + messagingSenderId: import.meta.env.VITE_MESSAGING_SENDER_ID, + appId: import.meta.env.VITE_APP_ID, +}; + +// Inicialización de la app de Firebase +const app = initializeApp(firebaseConfig); + +// Inicialización de Firestore y Auth +export const db = getFirestore(app); +export const auth = getAuth(app); + +// Exportación de la app por si se necesita usarla en otros lugares +export default app; \ No newline at end of file diff --git a/src/orderForm.jsx b/src/orderForm.jsx new file mode 100644 index 0000000..40b1427 --- /dev/null +++ b/src/orderForm.jsx @@ -0,0 +1,163 @@ +import React, { useState, useEffect } from 'react'; +import { collection, addDoc, doc, updateDoc, serverTimestamp } from 'firebase/firestore'; +import { db } from './firebaseConfig'; + +const OrderForm = ({ initialData = null, onSubmit, onCancel }) => { + const [customerName, setCustomerName] = useState(initialData?.customerName || ''); + const [selectedItems, setSelectedItems] = useState(initialData?.items || []); + const [total, setTotal] = useState(initialData?.total || 0); + const [modality, setModality] = useState(initialData?.modality || ''); + const [loading, setLoading] = useState(false); + + const menuItems = [ + { name: 'Hamburguesa simple', price: 100 }, + { name: 'Hot dog', price: 70 }, + { name: 'Hamburguesa doble', price: 150 }, + { name: 'Papas fritas frescas', price: 80 }, + { name: 'Soda', price: 25 } + ]; + + // Calcula el total dinámicamente al cambiar los elementos seleccionados + useEffect(() => { + const totalAmount = selectedItems.reduce((sum, item) => { + const menuItem = menuItems.find(menuItem => menuItem.name === item); + return sum + (menuItem ? menuItem.price : 0); + }, 0); + setTotal(totalAmount); + }, [selectedItems]); + + // Maneja la selección de elementos del menú + const handleCheckboxChange = (itemName) => { + setSelectedItems(prevItems => + prevItems.includes(itemName) + ? prevItems.filter(item => item !== itemName) + : [...prevItems, itemName] + ); + }; + + // Maneja el envío del formulario + const handleSubmit = async (e) => { + e.preventDefault(); + + if (!customerName.trim() || selectedItems.length === 0) { + alert("Por favor, completa todos los campos obligatorios."); + return; + } + + setLoading(true); + try { + if (initialData) { + // Actualización de un pedido existente + const docRef = doc(db, 'orders', initialData.id); + await updateDoc(docRef, { + customerName, + items: selectedItems, + total, + modality, + updatedAt: serverTimestamp() + }); + alert('Pedido actualizado exitosamente.'); + } else { + // Creación de un nuevo pedido + await addDoc(collection(db, 'orders'), { + customerName, + items: selectedItems, + total, + modality, + createdAt: serverTimestamp(), + updatedAt: serverTimestamp() + }); + alert('Pedido enviado exitosamente.'); + } + + // Llama a la función de envío proporcionada + if (onSubmit) { + onSubmit({ + id: initialData?.id || null, + customerName, + items: selectedItems, + total, + modality + }); + } + + // Limpia el formulario después de enviar + setCustomerName(''); + setSelectedItems([]); + setTotal(0); + setModality(''); + } catch (error) { + console.error("Error al enviar el pedido:", error.message); + } finally { + setLoading(false); + } + }; + + return ( +
+
+ + setCustomerName(e.target.value)} + required + /> +
+ +
+ + {menuItems.map((item) => ( + + ))} +
+ +
+ +
+ +
+ + + +
+ + + {onCancel && ( + + )} +
+ ); +}; + +export default OrderForm;