Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
104 commits
Select commit Hold shift + click to select a range
27a1e2e
merge initial changes
hansaparicio Jan 15, 2026
f1d919d
merge initial changes
hansaparicio Jan 15, 2026
ad41f25
merge initial changes
hansaparicio Jan 15, 2026
f82f03f
merge initial changes
hansaparicio Jan 15, 2026
d74ce00
merge initial changes
hansaparicio Jan 15, 2026
d5657a7
merge initial changes
hansaparicio Jan 15, 2026
0b745c0
merge initial changes
hansaparicio Jan 15, 2026
cad6b8b
cambios en app.py para ejecutar la bd
Asiiz127 Jan 15, 2026
ea22e62
Merge pull request #1 from 4GeeksAcademy/Alex
Asiiz127 Jan 15, 2026
24693f6
docs: add env example for shared Mapbox token
fernando-delrio Jan 15, 2026
8e9af78
mapa registro
fernando-delrio Jan 15, 2026
5ded775
Merge pull request #2 from 4GeeksAcademy/feature/mapa-registro-ruta
fernando-delrio Jan 15, 2026
6799834
.
Asiiz127 Jan 15, 2026
963a8ad
añadido modal para subir tu bici
Asiiz127 Jan 15, 2026
2ef9738
Merge pull request #3 from 4GeeksAcademy/Alex
Asiiz127 Jan 15, 2026
37f96c2
button redirection to profile in home page
Asiiz127 Jan 16, 2026
e9c9d59
implementación home
kalambriento Jan 16, 2026
a06bd49
Merge branch 'main' into Raul
Asiiz127 Jan 16, 2026
39d32df
Merge pull request #4 from 4GeeksAcademy/Raul
Asiiz127 Jan 16, 2026
951f6f3
botones de inicio y logout actualizados
Asiiz127 Jan 16, 2026
7bbf594
cambios en botón de matenimiento
Asiiz127 Jan 16, 2026
8880574
Merge pull request #5 from 4GeeksAcademy/Alex
Asiiz127 Jan 16, 2026
93349d7
continuar registro ruta
fernando-delrio Jan 17, 2026
b430d2b
Merge pull request #6 from 4GeeksAcademy/continuar-registro-ruta
fernando-delrio Jan 17, 2026
f64e7be
unificación de UI y limpieza CSS duplicado
kalambriento Jan 18, 2026
0e1ae29
Merge branch 'main' into Raul
kalambriento Jan 18, 2026
554537c
Merge pull request #7 from 4GeeksAcademy/Raul
kalambriento Jan 18, 2026
cf2d5c0
correción estilos y nuevo redme para estilos
kalambriento Jan 19, 2026
b432d99
Merge pull request #8 from 4GeeksAcademy/Raul
kalambriento Jan 19, 2026
3b35c98
Explorar rutas con buscador Mapbox, planificación por puntos y guarda…
fernando-delrio Jan 20, 2026
7b937bb
Merge pull request #9 from 4GeeksAcademy/continuar-registro-ruta
fernando-delrio Jan 20, 2026
a595f45
implementación del loader
kalambriento Jan 20, 2026
9d5e6f5
Merge branch 'main' into Raul
kalambriento Jan 20, 2026
fabb817
Merge pull request #10 from 4GeeksAcademy/Raul
kalambriento Jan 20, 2026
41833ea
.
Asiiz127 Jan 20, 2026
32321a4
Merge branch 'main' of https://github.com/4GeeksAcademy/fs-pt-122_Rau…
Asiiz127 Jan 20, 2026
ffddde1
Comentarios en SavedRouteDetail.jsx routes.jsx y Cambios en el form d…
Asiiz127 Jan 20, 2026
39fa11e
feat: implementar rutas guardadas y vista de detalle
fernando-delrio Jan 20, 2026
61fcd3b
Merge pull request #11 from 4GeeksAcademy/feature/save-routes
fernando-delrio Jan 20, 2026
49087da
chore: add React performance guidelines and Copilot agent skill
fernando-delrio Jan 20, 2026
51bc841
Merge pull request #12 from 4GeeksAcademy/chore/performance-guidelines
fernando-delrio Jan 20, 2026
68463ca
copilot-instrucciones.md
fernando-delrio Jan 20, 2026
3310343
Merge pull request #13 from 4GeeksAcademy/chore/performance-guidelines
fernando-delrio Jan 20, 2026
965512f
Cloudinary upload
Asiiz127 Jan 21, 2026
1ca42cc
Actuaización del modal de bicis + implementación de pequeña bd de Bik…
Asiiz127 Jan 22, 2026
85d27e1
Merge pull request #14 from 4GeeksAcademy/Alex
Asiiz127 Jan 22, 2026
2088498
about, footer y css
kalambriento Jan 24, 2026
ff15caa
about, footer y css
kalambriento Jan 24, 2026
c14a5eb
about, fotter y css
kalambriento Jan 24, 2026
e49c8e1
Merge branch 'main' into Raul
kalambriento Jan 24, 2026
b31f4f0
Merge pull request #15 from 4GeeksAcademy/Raul
kalambriento Jan 25, 2026
c978df9
eliminado export duplicado
Asiiz127 Jan 25, 2026
939e423
Cambios en el modal para eliminar bicis y cambios en el css
Asiiz127 Jan 25, 2026
8f2ac88
Merge pull request #16 from 4GeeksAcademy/Alex
Asiiz127 Jan 25, 2026
cc34dc8
añadir boton gastacobre sin backend
fernando-delrio Jan 27, 2026
4861640
feat: añadir GASTACOBRE con catálogo de bicis y ranking por contexto
fernando-delrio Jan 27, 2026
936bc2a
Merge pull request #17 from 4GeeksAcademy/feat/gastacobre-chat
fernando-delrio Jan 27, 2026
2b9a1c6
rutas de donde hasta
fernando-delrio Jan 27, 2026
1671b97
.
Asiiz127 Jan 27, 2026
7ba8909
renderizar correctamente rutas guardadas en SavedRouteDetail
fernando-delrio Jan 27, 2026
20fd574
Merge pull request #18 from 4GeeksAcademy/feat/routes-navigator
fernando-delrio Jan 27, 2026
686beba
Implementación de garage en Home.jsx y cambios en el estilo de este
Asiiz127 Jan 27, 2026
6e04516
Merge pull request #19 from 4GeeksAcademy/Alex
Asiiz127 Jan 27, 2026
970262f
elimnación botones RRSS, unificaión login y signup y ajustes layout
kalambriento Jan 28, 2026
0de6792
Merge pull request #20 from 4GeeksAcademy/Raul2
kalambriento Jan 28, 2026
e350b69
Refactor del header en componente compartido
kalambriento Jan 29, 2026
0d282f0
Merge pull request #21 from 4GeeksAcademy/Raul2
kalambriento Jan 29, 2026
678d2f3
cambio en el script de seed_bikes_clean.py
Asiiz127 Jan 29, 2026
cbb0809
Cambios en el gastacobre
Asiiz127 Jan 30, 2026
2eb1972
correción de estilos en header
kalambriento Jan 30, 2026
1918486
Merge pull request #22 from 4GeeksAcademy/Raul2
kalambriento Jan 30, 2026
9033cec
pulido del header
kalambriento Jan 30, 2026
0fcb839
Merge pull request #23 from 4GeeksAcademy/Raul2
kalambriento Jan 30, 2026
bcdb892
Solución carga header en login
kalambriento Feb 1, 2026
9bb551f
Merge pull request #24 from 4GeeksAcademy/rutas-destacadas
kalambriento Feb 1, 2026
ac02c6b
Garage y rutas destacadas
kalambriento Feb 2, 2026
0657bad
Merge pull request #25 from 4GeeksAcademy/rutas-destacadas
kalambriento Feb 2, 2026
48f161e
comienzo readme
kalambriento Feb 2, 2026
f16539a
Merge pull request #26 from 4GeeksAcademy/rutas-destacadas
kalambriento Feb 2, 2026
f3f3e16
Mejoras UX + Flujo de creación de rutas
kalambriento Feb 3, 2026
fc9d76a
Merge pull request #27 from 4GeeksAcademy/rutas-destacadas
kalambriento Feb 3, 2026
776dc91
cambios perfil
kalambriento Feb 3, 2026
c41a7bf
Merge pull request #28 from 4GeeksAcademy/rutas-destacadas
kalambriento Feb 3, 2026
444a29e
spike
fernando-delrio Feb 3, 2026
d803e40
spike turas
fernando-delrio Feb 3, 2026
f0f53c9
Merge pull request #29 from 4GeeksAcademy/spike-rutas
fernando-delrio Feb 3, 2026
08e4264
Mejoras UI y experiencia de usuario
kalambriento Feb 3, 2026
e7a4e67
Merge pull request #30 from 4GeeksAcademy/rutas-destacadas
kalambriento Feb 3, 2026
f76e9de
readme trail
fernando-delrio Feb 4, 2026
47422b7
Merge pull request #31 from 4GeeksAcademy/docs/readme-trail
fernando-delrio Feb 4, 2026
db03679
correción nuevo usuario y logo por defecto
kalambriento Feb 4, 2026
f8d4862
correción nuevo usuario y perfil
kalambriento Feb 4, 2026
1caf9f7
Merge branch 'main' of https://github.com/4GeeksAcademy/fs-pt-122_Rau…
kalambriento Feb 4, 2026
fe4caed
Merge pull request #32 from 4GeeksAcademy/rutas-destacadas
kalambriento Feb 4, 2026
d934522
Ingreso manual de bicis
kalambriento Feb 8, 2026
3a59393
Merge pull request #33 from 4GeeksAcademy/bike-model-manual
kalambriento Feb 8, 2026
48c151c
index on refactorizar-localstorage: 3a59393 Merge pull request #33 fr…
fernando-delrio Feb 8, 2026
c1313eb
On refactorizar-localstorage: debug refactorizar-localstorage
fernando-delrio Feb 8, 2026
19d0070
refactor
fernando-delrio Feb 9, 2026
dd34d7b
fix: force python 3.10 for render compatibility
fernando-delrio Feb 9, 2026
b07ff55
fix: move runtime.txt to src so Render uses Python 3.10
fernando-delrio Feb 9, 2026
37559bf
Python 3.10
fernando-delrio Feb 9, 2026
a02f275
cambio requirements
fernando-delrio Feb 9, 2026
03abb76
refactorizar
fernando-delrio Feb 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 4 additions & 13 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,14 +1,5 @@
# This file includes global variables that will be available inside your project
# 1. In the front end code you can access this variables like this: console.log(import.meta.env.VARIABLE_NAME)
# 1. In the back end code you access the variable by importing os and then typing print(os.getenv('VARIABLE_NAME'))
# Frontend
VITE_MAPBOX_TOKEN=

# Back-End Variables
DATABASE_URL=postgres://gitpod:postgres@localhost:5432/example
FLASK_APP_KEY="any key works"
FLASK_APP=src/app.py
FLASK_DEBUG=1
DEBUG=TRUE

# Front-End Variables
VITE_BASENAME=/
#VITE_BACKEND_URL=
# Backend (if needed)
VITE_BACKEND_URL=http://127.0.0.1:3001
5 changes: 5 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
* text=auto eol=lf

*.bat text eol=crlf
*.cmd text eol=crlf
*.ps1 text eol=crlf
121 changes: 121 additions & 0 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
# Crazy Mountain Bike Social Club - AI Coding Agent Guide

## Project Overview
**Full-stack React + Flask application** for mountain bike enthusiasts to track routes, manage bikes/parts, and share activities with friends. Deployed via Render with PostgreSQL backend.

## Architecture & Critical Patterns

### Backend (Flask API)
- **Structure**: [src/api/](src/api/) with models, routes, utils, and admin setup
- **Database**: SQLAlchemy ORM with Alembic migrations (see [migrations/](migrations/))
- **Key Models** ([src/api/models.py](src/api/models.py)):
- `User`: Email/password auth with JWT tokens; `bikes` relationship (one-to-many)
- `Bike`: User-owned bicycles with `parts` relationship (one-to-many)
- `BikePart`: Components tracking wear (`km_current` vs `km_life`)
- **Authentication**: JWT tokens issued on login via `flask-jwt-extended`; `@jwt_required()` protects routes
- **Admin Panel**: Auto-generated with `flask-admin` at `/admin/` (models auto-registered in [src/api/admin.py](src/api/admin.py))

### Frontend (React + Vite)
- **Layout**: Nested routing via [src/front/routes.jsx](src/front/routes.jsx); `<Layout>` wrapper maintains Navbar/Footer across pages
- **State Management**: Context + Reducer pattern in [src/front/hooks/useGlobalReducer.jsx](src/front/hooks/useGlobalReducer.jsx) for global app state
- **Async Operations**: `useFetchWithLoader` hook in [src/front/hooks/useFetchWithLoader.js](src/front/hooks/useFetchWithLoader.js) enforces minimum 700ms loader display (UX polish)
- **Loader Provider**: [src/front/context/loaderContext.jsx](src/front/context/loaderContext.jsx) manages loading state across API calls
- **Key Pages**: Login/Signup → Home (dashboard) → Profile → Routes (detail/registration/explore/saved)

### Data Flow
1. User logs in at `/login` → JWT token stored (client-side, location TBD—verify before adding storage)
2. Protected pages call API with `Authorization: Bearer <token>` header
3. Backend validates JWT, returns user data + relationships (bikes, parts, routes)
4. Frontend renders data using global reducer for state consistency
5. Cloudinary widgets handle image/video uploads (see [src/front/components/CloudinaryUploadWidget.jsx](src/front/components/CloudinaryUploadWidget.jsx))

## Development Workflows

### Backend Setup & Commands
```bash
# Install dependencies (Python 3.13, managed via Pipenv)
pipenv install

# Database migrations (Alembic)
pipenv run migrate # Create migration from model changes
pipenv run upgrade # Apply migrations
pipenv run downgrade # Revert one migration
pipenv run reset_db # Clear & reinit (see docs/assets/reset_migrations.bash)

# Test data
pipenv run insert-test-users 5 # Add 5 test users
pipenv run insert-test-data # Run custom seed (edit src/api/commands.py)

# Run server
pipenv run start # Flask on http://localhost:3001
```

### Frontend Setup & Commands
```bash
# Node 20+ required; Vite-based
npm install
npm run dev # Dev server
npm run build # Production bundle
npm run lint # ESLint check (zero warnings enforced)
```

### Environment Variables
- **Backend**: `.env` file (copy from `.env.example`); requires `DATABASE_URL`, `JWT_SECRET_KEY`, `VITE_BACKEND_URL`
- **Frontend**: Vite reads from `.env` as `VITE_*` (e.g., `VITE_BACKEND_URL`)
- **Database**: Supports PostgreSQL (production), SQLite (local dev), MySQL

## Code Patterns & Conventions

### React Components
- **Functional components only**; no class components
- **CSS Modules or BEM naming** (see [src/front/styles/](src/front/styles/))
- **Page components** wrap in `.jsx` extension; place in [src/front/pages/](src/front/pages/) with corresponding CSS
- **Shared components** in [src/front/components/](src/front/components/) (e.g., Navbar, Footer, CloudinaryUploadWidget)
- Example structure: `Login.jsx` imports sub-components from `components/LogIn/` (LoginHeader, LoginForm, SocialLogin)

### Flask Routes
- **Blueprint-based**: All routes in [src/api/routes.py](src/api/routes.py) registered at `/api` prefix in [src/app.py](src/app.py)
- **Error handling**: Use `APIException` utility for consistent error responses
- **Email validation**: `is_valid_email()` helper in [src/api/utils.py](src/api/utils.py)
- **JWT pattern**: `@jwt_required()` decorator + `get_jwt_identity()` to extract user ID from token

### Database Models
- **Serialization**: Add `.serialize()` method to all models (returns dict for API responses)
- **Relationships**: Use `db.relationship()` with `backref` and `cascade="all, delete-orphan"` for parent-child cleanup
- **Never serialize passwords** (security baseline, enforced in User model)

### Global State (Reducer)
- **Actions**: Dispatch with `{type: 'ACTION_NAME', payload: ...}` from any component
- **Store**: Accessed via `const { store, dispatch } = useGlobalReducer()`
- **Example**: `store.todos`, `store.message` (see [src/front/store.js](src/front/store.js))

## Integration Points & Dependencies

### External Services
- **Mapbox**: Embedded maps for route visualization (see components/Map/)
- **Cloudinary**: Image/video uploads via widget (src/front/components/CloudinaryUploadWidget.jsx)
- **Render**: Deployment target (Dockerfile.render, render.yaml configured)

### Key Dependencies
**Backend**: Flask, Flask-SQLAlchemy, Flask-Migrate, Flask-JWT-Extended, Flask-Admin, Cloudinary, Gunicorn
**Frontend**: React, React Router, Vite, ESLint

## Common Pitfalls & Best Practices

1. **Migrations**: Always run `pipenv run migrate` after model changes before `pipenv run upgrade`; check generated migration files in [migrations/versions/](migrations/versions/)
2. **JWT Token Storage**: Verify secure storage (httpOnly cookie vs localStorage) before adding auth flows
3. **Loader UX**: Use `useFetchWithLoader` for API calls to enforce consistent 700ms minimum display time
4. **CORS**: Already enabled in [src/app.py](src/app.py) and route blueprints; safe for local/remote frontend
5. **Admin Access**: `/admin/` accessible locally; protect in production via environment config

## File Structure Quick Reference
- **Backend code**: `src/api/` (models, routes, utils, admin, commands)
- **Frontend code**: `src/front/` (pages, components, hooks, context, styles, utils, services)
- **Database**: `migrations/` (Alembic version control), models in `src/api/models.py`
- **Docs**: `docs/` (HELP, PERFORMANCE, CHANGE_LOG)
- **Config**: `.env`, `pycodestyle.cfg`, `eslint.config.js`, `vite.config.js`

## Deployment Notes
- **Build command**: `npm run build` + `pipenv install --deploy` for Python
- **Render setup**: See `render.yaml` and `Dockerfile.render`; auto-runs migrations via `database.sh`
- **Database initialization**: Render executes migrations on deploy; local dev requires manual `pipenv run upgrade`
Loading