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 (
<>
@@ -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 (
+
+ );
+};
+
+export default OrderForm;