Bienvenido al repositorio del Uber Clone. Esta aplicación es una réplica funcional de la experiencia de usuario de Uber, construida con tecnologías modernas para desarrollo móvil híbrido.
El proyecto está construido utilizando las siguientes herramientas y librerías clave:
- Framework Principal: React Native con Expo SDK 52+.
- Enrutamiento: Expo Router.
- Estilos: NativeWind (Tailwind CSS para React Native).
- Autenticación: Clerk.
- Base de Datos: PostgreSQL (hospedada en Neon).
- Gestión de Estado: Zustand.
- Mapas: React Native Maps (Google Maps API).
- Pagos: Stripe Payment Sheet.
Sigue estos pasos para configurar el entorno de desarrollo localmente.
Asegúrate de tener instalado:
- Node.js & Bun (o npm/yarn).
- Android Studio / Xcode (para simuladores).
- Cuenta en Clerk, Neon, Google Cloud Console y Stripe.
bun installCrea un archivo .env en la raíz del proyecto basado en el .env.example (si existe) o agrega tus propias keys:
EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY=pk_test_...
EXPO_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_test_...
DATABASE_URL=postgresql://...
EXPO_PUBLIC_GOOGLE_MAPS_API_KEY=AIza...Nota: Para Google Maps, asegúrate de habilitar en Google Cloud Console las APIs: Maps SDK for Android, Maps SDK for iOS y Directions API.
Para que la aplicación funcione correctamente, necesitas crear las tablas en tu base de datos Neon. Ejecuta los siguientes scripts en el SQL Editor de Neon:
Almacena la información de los conductores disponibles.
CREATE TABLE drivers (
id SERIAL PRIMARY KEY,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL,
profile_image_url TEXT,
car_image_url TEXT,
car_seats INTEGER NOT NULL CHECK (car_seats > 0),
rating DECIMAL(3, 2) CHECK (rating >= 0 AND rating <= 5)
);Sincronizada con Clerk para almacenar datos básicos del usuario.
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
clerk_id VARCHAR(50) UNIQUE NOT NULL
);Historial y registro de viajes solicitados.
CREATE TABLE rides (
ride_id SERIAL PRIMARY KEY,
origin_address VARCHAR(255) NOT NULL,
destination_address VARCHAR(255) NOT NULL,
origin_latitude DECIMAL(9, 6) NOT NULL,
origin_longitude DECIMAL(9, 6) NOT NULL,
destination_latitude DECIMAL(9, 6) NOT NULL,
destination_longitude DECIMAL(9, 6) NOT NULL,
ride_time INTEGER NOT NULL,
fare_price DECIMAL(10, 2) NOT NULL CHECK (fare_price >= 0),
payment_status VARCHAR(20) NOT NULL,
driver_id INTEGER REFERENCES drivers(id),
user_id VARCHAR(100) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);Para probar los pagos, Stripe requiere inicializarse correctamente en el cliente.
- Obtén tus llaves de API en el Dashboard de Stripe.
- Importante: La integración de pagos móviles de Stripe no funciona en Expo Go. Debes crear una "Development Build" para probarla.
Más info en la documentación oficial.
bun start:reset # Para iniciar limpiando caché (recomendado si hay cambios de nativos)
# O simplemente
bun startDado que usamos librerías con código nativo (Stripe, Maps), Expo Go no soportará todas las funciones. Genera una build de desarrollo:
Para Android:
bun run androidEsto generará el APK y lo instalará en tu emulador o dispositivo conectado.
- Sincronización de Usuarios: Asegúrate de que al registrar un usuario en Clerk, se cree el registro correspondiente en la tabla
users(generalmente manejado vía webhooks o directamente en el API route de registro). - Permisos de Ubicación: Verifica que el emulador o dispositivo tenga activados los permisos de ubicación para que los mapas funcionen.
Para poblar la base de datos con conductores de prueba e imágenes iniciales, ejecuta el siguiente script SQL en tu editor de base de datos (Neon SQL Editor o pgAdmin):
INSERT INTO drivers (id, first_name, last_name, profile_image_url, car_image_url, car_seats, rating)
VALUES
('1', 'James', 'Wilson', 'https://ucarecdn.com/dae59f69-2c1f-48c3-a883-017bcf0f9950/-/preview/1000x666/', 'https://ucarecdn.com/a2dc52b2-8bf7-4e49-9a36-3ffb5229ed02/-/preview/465x466/', 4, '4.80'),
('2', 'David', 'Brown', 'https://ucarecdn.com/6ea6d83d-ef1a-483f-9106-837a3a5b3f67/-/preview/1000x666/', 'https://ucarecdn.com/a3872f80-c094-409c-82f8-c9ff38429327/-/preview/930x932/', 5, '4.60'),
('3', 'Michael', 'Johnson', 'https://ucarecdn.com/0330d85c-232e-4c30-bd04-e5e4d0e3d688/-/preview/826x822/', 'https://ucarecdn.com/289764fb-55b6-4427-b1d1-f655987b4a14/-/preview/930x932/', 4, '4.70'),
('4', 'Robert', 'Green', 'https://ucarecdn.com/fdfc54df-9d24-40f7-b7d3-6f391561c0db/-/preview/626x417/', 'https://ucarecdn.com/b6fb3b55-7676-4ff3-8484-fb115e268d32/-/preview/930x932/', 4, '4.90');Para distribuir o probar la aplicación en dispositivos físicos sin depender del servidor de desarrollo local, utilizaremos eas build.
Nota: Este proyecto está configurado para usar el perfil
default(definido eneas.json), el cual genera distribuciones internas (APK para Android).
Asegúrate de tener instalado el CLI de EAS y haber iniciado sesión:
npm install -g eas-cli
eas loginEjecuta el comando correspondiente a la plataforma deseada:
Para Android (APK):
eas build --platform android --profile defaultPara iOS:
eas build --platform ios --profile defaultPara ambas plataformas:
eas build --platform all --profile defaultHay que deployar primero la version web para poder tener acceso a las server routes
npx expo export --platform web
eas deploy
eas deploy --prod