diff --git a/frontend-lectures/lesson3/openriver/EXPLICACION_ES5.md b/frontend-lectures/lesson3/openriver/EXPLICACION_ES5.md new file mode 100644 index 0000000..033ae27 --- /dev/null +++ b/frontend-lectures/lesson3/openriver/EXPLICACION_ES5.md @@ -0,0 +1,731 @@ +# OpenRiver - Explicación Completa del Código en ES5 + +## Tabla de Contenidos +1. [Estructura General](#estructura-general) +2. [Configuración Principal (_app.tsx)](#configuración-principal) +3. [Configuración Web3 (wagmi.ts)](#configuración-web3) +4. [Layout (layout.tsx)](#layout) +5. [Header (Header.tsx)](#header) +6. [Componentes de Tarjetas (Card.tsx, Cards.tsx)](#componentes-tarjetas) +7. [Páginas (list, mint, dashboard, marketplace, myNFT)](#páginas) +8. [Contratos Inteligentes (contracts.ts)](#contratos) + +--- + +## Estructura General + +Este es un proyecto de **NFT Marketplace** construido con: +- **Next.js**: Framework React para aplicaciones web +- **wagmi**: Librería para interactuar con contratos de Ethereum +- **RainbowKit**: Interfaz para conectar carteras de criptomonedas +- **Tailwind CSS**: Framework para estilos + +El proyecto permite a usuarios: +✓ Conectar su cartera de criptomonedas +✓ Crear (mintear) nuevos NFTs +✓ Listar NFTs en el mercado +✓ Ver NFTs disponibles para comprar +✓ Ver su colección personal de NFTs + +--- + +## Configuración Principal (_app.tsx) + +```typescript +import '../styles/globals.css'; +import '@rainbow-me/rainbowkit/styles.css'; +``` + +**Línea por línea:** + +1. `import '../styles/globals.css'` + - Importa los estilos CSS globales que se aplican a toda la aplicación + - Estos estilos definen el look general de la aplicación + +2. `import '@rainbow-me/rainbowkit/styles.css'` + - Importa los estilos de la librería RainbowKit + - Estila el botón de conectar cartera y los modales + +```typescript +import type { AppProps } from 'next/app'; +``` + +3. `import type { AppProps }` + - Importa el tipo TypeScript que define las propiedades que recibe el componente App + - `AppProps` contiene `Component` (el componente actual) y `pageProps` (las propiedades) + +```typescript +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +``` + +4. `QueryClient` - Objeto que maneja el caché de datos +5. `QueryClientProvider` - Componente que proporciona QueryClient a toda la aplicación + +```typescript +import { WagmiProvider } from 'wagmi'; +``` + +6. `WagmiProvider` - Componente que proporciona funciones para interactuar con Ethereum a toda la aplicación + +```typescript +import { RainbowKitProvider } from '@rainbow-me/rainbowkit'; +``` + +7. `RainbowKitProvider` - Componente que proporciona la interfaz de cartera a toda la aplicación + +```typescript +import { config } from '../wagmi'; +import DashboardLayout from './layout'; +``` + +8. `config` - Configuración de wagmi (redes, proyecto ID, etc.) +9. `DashboardLayout` - Componente que proporciona el header y footer a todas las páginas + +```typescript +const client = new QueryClient(); +``` + +10. Se crea una instancia de QueryClient para manejar datos + +```typescript +function MyApp({ Component, pageProps }: AppProps) { + return ( + + + + + + + + + + ); +} +``` + +11. `MyApp` es el componente raíz que envuelve toda la aplicación + +**Estructura de Providers (como cajas anidadas):** +``` +WagmiProvider (acceso a Ethereum) + └─ QueryClientProvider (caché de datos) + └─ RainbowKitProvider (cartera) + └─ DashboardLayout (header y footer) + └─ Component (página actual) +``` + +Cada provider proporciona funcionalidades especiales a sus componentes internos. + +--- + +## Configuración Web3 (wagmi.ts) + +```typescript +import { getDefaultConfig } from '@rainbow-me/rainbowkit'; +import { sepolia } from 'wagmi/chains'; +``` + +1. `getDefaultConfig` - Función que crea una configuración lista para usar +2. `sepolia` - Red de prueba de Ethereum (usada para desarrollo, no requiere dinero real) + +```typescript +export const config = getDefaultConfig({ + appName: 'RainbowKit App', +``` + +3. `appName` - Nombre de la aplicación que aparecerá en la cartera + +```typescript + projectId: 'd69f9edb23bbe0354a3b186e1bee340c', +``` + +4. `projectId` - ID único para este proyecto en WalletConnect (servicio que conecta aplicaciones con carteras) + +```typescript + chains: [sepolia], +``` + +5. `chains` - Array de redes disponibles. Aquí solo Sepolia (red de prueba) + +```typescript + ssr: true, +``` + +6. `ssr: true` - Server-Side Rendering habilitado (renderiza en el servidor para mejor rendimiento) + +--- + +## Layout (layout.tsx) + +```typescript +import type { ReactNode } from 'react' +import Header from '../components/Header' + +type LayoutProps = { + children: ReactNode +} +``` + +1. `ReactNode` - Tipo que representa cualquier contenido React (componentes, texto, etc.) +2. `LayoutProps` - Define que este componente recibe `children` (contenido interno) + +```typescript +export default function DashboardLayout({ children }: LayoutProps) { + return ( +
+
+
{children}
+ +
+ ) +} +``` + +3. `minHeight: '100vh'` - La altura mínima es la altura total de la pantalla +4. `backgroundColor: '#f8fafc'` - Color de fondo gris claro +5. `
` - Componente de navegación +6. `{children}` - Aquí va el contenido de cada página +7. `