Uh oh!
There was an error while loading. Please reload this page.
fix(hackathons): línea de tiempo calculada desde la fecha actual - #76
Conversation
El marcador de "hoy" salía de `closedCount / n`, que en agosto cae justo
en el límite JUL/AGO — se veía parado en julio. Y los meses vacíos se
insertaban a mano buscando el nodo "JUL" en la lista.
Ahora el riel es un calendario derivado de las fechas: un slot por mes
entre el primer y el último hackatón, y la posición de hoy se interpola
sobre ese eje, así que arranca sobre el punto del mes en curso y avanza
hacia el siguiente a medida que pasa el mes. Solo se mueve hacia adelante;
antes, al cerrar un hackatón, el marcador saltaba para atrás al punto
medio entre dos nodos. El rango del encabezado ("Marzo → Octubre 2026")
también sale de los datos.
Los meses sin hackatón dejan de ser tarjetas: siguen como nodos del riel
(sacarlos comprimiría el hueco y volvería a descolocar el marcador), pero
el carrusel solo tiene hackatones, así que las flechas, el teclado y el
swipe saltan derecho al siguiente en vez de caer en "Sin hackatón
programado". Como la posición en el riel ya no coincide con la del
carrusel, la selección se resuelve por id.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>The latest updates on your projects. Learn more about Vercel for GitHub.
|
Warning Review limit reached
Next review available in:52 minutes You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. 📝 WalkthroughWalkthroughThe hackathon timeline now generates calendar-based rail months, keeps empty months as rail-only placeholders, and separates carousel navigation from rail positions. The page also displays a computed date range. ChangesHackathon timeline
Estimated code review effort: 3 (Moderate) | ~25 minutes Sequence Diagram(s)sequenceDiagram
participant Page
participant buildTimeline
participant HackathonTimeline
participant RailButton
participant StageCard
Page->>buildTimeline: Build calendar rail and rangeLabel
buildTimeline-->>Page: Return hackathons and placeholders
Page->>HackathonTimeline: Provide timeline nodes
HackathonTimeline->>RailButton: Render calendar rail
RailButton->>HackathonTimeline: Select mapped hackathon index
HackathonTimeline->>StageCard: Render active hackathon
Possibly related PRs
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@app/hackathons/page.tsx`:
- Around line 233-235: Update the firstMonth and lastMonth bounds in the
hackathon rail construction to derive the minimum and maximum key values across
all hackathonSlots, rather than relying on the first and last array elements.
Preserve todayMonth as the fallback for an empty slot list so the loop always
covers configured months regardless of ordering.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: 8a48428d-5515-4d92-8e54-4f24df58bd4c
📒 Files selected for processing (2)
app/hackathons/HackathonTimeline.tsxapp/hackathons/page.tsx
Uh oh!
There was an error while loading. Please reload this page.
`ordered` ordena por primera fecha, así que un hackatón anunciado antes de tener fechas (clave de orden "") queda primero, pero su posición en el riel sale del mes declarado en el JSON. Leer los extremos del array invertía los límites, el loop no emitía ningún nodo y `rangeLabel` desreferenciaba `items[0]` sobre un array vacío — justo el caso que el comentario del fallback dice soportar. Ahora los límites salen del mínimo y el máximo de las claves. Con `hackathonSlots` vacío el fallback a `todayMonth` sigue emitiendo un slot, así que `items` nunca queda vacío. Reportado por CodeRabbit en #76. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Uh oh!
There was an error while loading. Please reload this page.
El marcador de "hoy" en
/hackathonsse veía parado en julio estando en agosto, y los meses vacíos del riel estaban hardcodeados.El bug
todayPctsalía declosedCount / n. Con 5 hackatones cerrados sobre 8 nodos eso da 62.5%, que es exactamente el punto medio entre el nodo JUL (56.25%) y el AGO (68.75%) — visualmente, pegado a julio. El número no depende de la fecha en absoluto: solo cambia cuando un hackatón cierra, así que el marcador se queda clavado ahí todo agosto y todo septiembre.Efecto lateral del mismo cálculo: mientras un hackatón está en curso el marcador sí avanza hacia el nodo siguiente, y al cerrarse salta para atrás al punto medio. Era no monótono.
Y los slots vacíos se insertaban buscando el nodo de julio por su etiqueta:
Qué cambió
El riel es un calendario derivado de las fechas. Un slot por mes entre el primer y el último hackatón; los meses que nadie programó se rellenan solos. Agregar un hackatón en noviembre extiende el riel sin tocar este código.
La posición de hoy se interpola sobre ese eje.
railIndex= índice fraccionario del mes actual + la fracción del mes transcurrida; el+ 0.5lo recentra sobre los puntos, que viven en el centro de cada slice1/n. Hoy arranca sobre el punto de su propio mes y viaja hacia el siguiente a medida que pasa el mes, así que siempre se lee como "estamos en <mes>" y solo avanza. Al 4 de agosto: ~70%, apenas pasado el nodo AGO.El día se saca del mismo
toISOString().slice(0, 10)contra el que comparahackathonStatus(), así el marcador y los puntos de estado no pueden discrepar sobre qué día es. Los meses se parsean del string ISO y no connew Date(iso), que lee UTC medianoche y se corre al mes anterior al oeste de Greenwich.El encabezado "Marzo → Octubre 2026" ahora sale de los mismos datos.
Meses vacíos: nodos sí, tarjetas no
Segundo pedido: las tarjetas "Sin hackatón programado" molestaban y las flechas obligaban a pasar por dos de ellas para ir de AI AGENTS a LABITCONF.
Los meses vacíos siguen en el riel — sacarlos comprimiría el hueco JUL→OCT y volvería a descolocar el marcador — pero salen del carrusel:
El índice de estado pasa a ser sobre
slides. Como la posición en el riel ya no coincide con la del carrusel, la selección se resuelve por id (slideIndexById) en vez de por índice — sin eso el anillo activo se corría dos nodos a partir de agosto. Los nodos AGO/SEP ya eran<div>no interactivos, así que no cambian. Quedaron muertas y se borraron las ramasif (h.placeholder)deStageCardyPeekCard.initialIndexse calcula sobre la lista filtrada. Antes elegía el primer itemupcomingdeitems, que hoy era el placeholder de agosto: por eso la página abría en una tarjeta vacía.Verificado en el navegador
El árbol de accesibilidad lista solo 6 botones de nodo,
"Sin hackatón programado"ya no aparece en el DOM y el pip amarillo queda sobre AGO con el fill llegando hasta ahí. Sin errores de consola;tsc --noEmitypnpm buildlimpios.Para el reviewer
placeholderMonth()deriva sustatusdel calendario aunque hoy nadie lo lea (el riel renderiza placeholders sin status). Es deliberado: fijarlo en"upcoming"dejaba una trampa para un lector futuro, porque un mes hueco ya pasado seguiría diciendo "upcoming" — que es justo el bug que teníainitialIndex.hackathons.jsonhoy, pero el riel lo parte en dos slices yrailIndexlos recorre a lo largo del mes en vez de romperse.nowsigue leyéndose dentro de"use cache". El perfilnostranidado (revalidate 300) se propaga a la página, así que el marcador queda como mucho ~5 min viejo — irrelevante en una escala mensual.🤖 Generated with Claude Code
Summary by CodeRabbit