Una aplicación de chat inteligente desarrollada con Expo Router, que utiliza Google Vertex AI para generar respuestas y PostgreSQL como base de datos.
- Node.js (versión 18 o superior)
- npm o yarn
- Docker y Docker Compose
- Expo CLI (
npm install -g @expo/cli) - Una cuenta de Google Cloud Platform con Vertex AI habilitado
git clone <repository-url>
cd wortiAInpm installCopia el archivo de ejemplo y configura las variables necesarias:
cp .env.example .env.localEdita .env.local con tus credenciales:
# Google Vertex AI Configuration
GOOGLE_VERTEX_LOCATION='us-central1' # Tu región de Vertex AI
GOOGLE_VERTEX_PROJECT='tu-proyecto-gcp' # ID de tu proyecto en GCP
GOOGLE_APPLICATION_CREDENTIALS='./credentials.json' # Ruta a tu archivo de credenciales
# Database Configuration
DATABASE_URL='postgresql://postgres:postgres@localhost:5432/wortiai'- Ve a Google Cloud Console
- Crea un nuevo proyecto o selecciona uno existente
- Habilita la API de Vertex AI
- Crea una cuenta de servicio con permisos de Vertex AI
- Descarga el archivo JSON de credenciales
- Guárdalo como
credentials.jsonen la raíz del proyecto
Inicia PostgreSQL usando Docker Compose:
# Levantar la base de datos
docker-compose up -d
# Verificar que esté funcionando
docker-compose psConfigura las tablas de la base de datos:
# Generar migraciones (si es necesario)
npx drizzle-kit generate
# Aplicar migraciones
npx drizzle-kit migrate# Modo desarrollo
npm start
# Para dispositivos específicos
npm run ios # iOS Simulator
npm run android # Android Emulator
npm run web # Navegador web- La aplicación se abrirá en Expo Go o en tu simulador
- Verás la pantalla principal con la opción "Nuevo Chat"
- Abre el drawer lateral para ver la lista de chats
- Escribe un mensaje para comenzar a chatear con la IA
- Frontend: Expo Router + React Native
- UI: Tamagui (componentes y theming)
- Estado: TanStack Query (cache y sincronización)
- Base de Datos: PostgreSQL + Drizzle ORM
- IA: Google Vertex AI (Gemini 2.5 Flash)
- Navegación: Expo Router con Drawer Navigation
src/
├── app/ # Expo Router páginas
│ ├── api/ # API Routes
│ ├── _layout.tsx # Layout principal
│ ├── index.tsx # Página de inicio
│ └── [chatId].tsx # Página de chat específico
├── features/ # Arquitectura basada en features
│ └── chat/
│ ├── components/ # Componentes UI del chat
│ ├── hooks/ # Hooks personalizados
│ ├── queries/ # TanStack Query hooks
│ ├── mutations/ # Mutaciones de datos
│ └── types/ # Tipos TypeScript
├── contexts/ # Contextos React globales
├── db/ # Configuración de base de datos
│ ├── schema.ts # Esquema Drizzle
│ └── index.ts # Conexión DB
└── components/ # Componentes compartidos
npm start # Iniciar servidor de desarrollo
npm run ios # Abrir en iOS Simulator
npm run android # Abrir en Android Emulator
npm run web # Abrir en navegador
npm run lint # Ejecutar linter- ✅ Chat en tiempo real con IA
- ✅ Persistencia de conversaciones
- ✅ Tema claro/oscuro
- ✅ Navegación con drawer
- ✅ Lista de chats guardados
- ✅ Eliminación de chats con confirmación
- ✅ IDs únicos auto-generados
- ✅ Cache inteligente con TanStack Query
Para resetear la base de datos:
# Detener contenedores
docker-compose down
# Eliminar volúmenes (¡CUIDADO: elimina todos los datos!)
docker-compose down -v
# Volver a levantar
docker-compose up -d
# Aplicar migraciones
npx drizzle-kit migrate- chats: Almacena conversaciones con ID único, título, mensajes y timestamps
- Campos: id (varchar), userId, title, messages (json), createdAt, updatedAt
Model: Claude Code (sonnet-4)
Prompts used:
-
Theme Context
Genera un contexto de React para manejar tema claro/oscuro de la aplicación. Este contexto debe persistir el estado mediante `@react-native-async-storage/async-storage` bajo la key `@app_theme`. Debe proveer una función `toggleTheme` para alternar entre `'dark'` y `'light'`. Usar en el provider `Theme` de **Tamagui** y en el provider `ThemeProvider`. Estos providers deben envolver la aplicacion en `@app/_layout.tsx`.
-
Features based architecture
Genera una arquitectura de carpetas basada en el enfoque por features (feature-based architecture). Cada feature debe contener su propio conjunto de subcarpetas internas para mantener una estructura modular y escalable. Las subcarpetas que debe incluir cada feature son: • components/ → Componentes UI específicos de la feature • hooks/ → Hooks personalizados relacionados con la lógica de la feature • services/ → Funciones o módulos que interactúan con APIs o lógica externa • contexts/ → Contextos de React (si aplica) • assets/ → Imágenes, íconos o recursos multimedia específicos • types/ → Tipos y definiciones TypeScript relacionados Por el momento, solo necesitamos crear la estructura correspondiente a la feature chat aplicando este patrón. Muestra el resultado en formato de árbol de carpetas, siguiendo las convenciones más comunes de un proyecto React + TypeScript.
-
Haptics custom hook
Genera un custom hook de React Native llamado useHaptics que utilice la librería expo-haptics para manejar feedback háptico. El hook debe: • Tener funciones para distintos tipos de vibraciones: light, medium, heavy, success, warning, error y selection. • Usar internamente Haptics.impactAsync, Haptics.notificationAsync y Haptics.selectionAsync según el tipo. • Incluir un modo debug activado solo en __DEV__, que muestre en consola el tipo de haptic disparado junto a un emoji representativo. • Manejar errores con try/catch para evitar fallos si el dispositivo no soporta vibración. • Ser exportado como useHaptics y devolver las funciones mencionadas listas para usar en componentes. • Escribirlo en TypeScript y con buenas prácticas de código limpias y seguras.