# Pendiente — web "Todos contra el fuego" (rama `meteor3-wip`) Estado a 2026-07-18. La migración **Meteor 1.6 → 3.1 + MongoDB 7** está completa y verificada (server async, React 18, web renderiza, smoke REST byte-idéntico). Lo que falta, agrupado. Ver `UPGRADE.md` para el detalle de lo ya hecho. --- ## 1. Modernización de librerías react-* antiguas (deuda de front grande) Funcionan en React 18 por compatibilidad heredada, pero ensucian la consola en desarrollo (no en producción) y **bloquean el salto a React 19**. Estado: | Lib | De → A | Estado | |---|---|---| | react-helmet | 5.2 → react-helmet-async 2 | ✅ hecho | | react-i18next + i18next | 7.4/10.5 → 14/23 | ✅ hecho | | react-bootstrap | 0.31 → 2 | ✅ hecho (CSS sigue en Bootstrap 4) | | reactstrap + 3 deps muertas | — | ✅ eliminadas (0 usos) | | react-router-dom | 4.2 → 6.30 | ✅ hecho (history 5, HOC `withRouterCompat`) | | react-leaflet + leaflet | 1.8/1.3 → 4.2/1.9 | ✅ hecho (Map→MapContainer, refs directas, useMap/useMapEvents; 4 plugins reimplementados: MapControl portal, GoogleMutantLayer, fullscreen, sleep/graphicscale vanilla; ver UPGRADE.md) | | **Bootstrap CSS/JS** | 4.1 → 5 | ⏸️ **diferida** (carrusel/navbar jQuery BS4; ver UPGRADE.md) | Lo verificado en navegador tras cada lib: `/`, `/fires`, `/fire/archive/`, `/login`, `/subscriptions` + consola. Smoke REST byte-idéntico en cada paso. Limpieza de warnings restantes YA hecha: `defaultProps` en componentes función → parámetros por defecto; `UNSAFE_componentWillReceiveProps` (FromNow, FireStats, Fires, SelectionMap) → `getDerivedStateFromProps`/`componentDidUpdate`; Reconnect (banner Blaze `meteorStatus` con `findDOMNode`) → React nativo con `useTracker(Meteor.status)`; react-share 2→5 y react-progress-bar.js → progressbar.js (ambos tiraban `findDOMNode`/`defaultProps`); y react-leaflet 1.8→4.2 (mapa central, 4 plugins reimplementados). **Tras esto la consola tiene 0 warnings de React en las rutas principales** (verificado forzando re-render en / y /fires). Único resto para React 19: el `` de Status.js (`findDOMNode`), solo en `/status` (admin). --- ## 2. Deuda funcional / de calidad de la web (independiente de prod) - **Comentarios (feature React nueva): verificación manual en staging.** El smoke no llega a la UI. Los **métodos** (insert/edit/remove/like/dislike) y el embed (`mediaAnalyzers`) ya están cubiertos por mocha (`test/server/comments.test.js`), pero quedan por probar a mano en una página de fuego: - publicar / editar / borrar un comentario (UI React) - like / dislike (toggle) - render del embed de imagen y de YouTube - email a otros comentaristas (`onCommentAdd.js`, entrega real de correo) - ✅ **`FireContainer` endurecido** (`imports/ui/pages/Fires/Fires.js`): el `findOne()` sin selector ahora se acota por el `_id` de la URL en la ruta `archive` (`new Meteor.Collection.ObjectID(id)`); en active/alert/hash cada publicación deja un único fire en minimongo, así que el read vacío es correcto. - ✅ **Suite de tests con runner (`meteortesting:mocha`).** `npm test` corre `meteor test … --driver-package meteortesting:mocha` (watch: `npm run test-watch`). Tests reescritos a `chai` + APIs async de Meteor 3 en `test/server/*.test.js` (server-only), incluyendo cobertura nueva de los métodos de comentarios. Jest y `rest.test.js` (ya cubierto por `smoke/`) eliminados. **36 passing.** Pendiente menor: portar los casos de token inválido (401/400) de `rest.test.js` al smoke. - ✅ **Rate-limit de publications** (`imports/startup/server/api.js`): reglas `type: 'subscription'` vía `rateLimitSubscriptions` — 5/1000ms en `fireFrom*` y `comments.forReference`; 10/1000ms en las subs geo (map pan/zoom). - ✅ **Google Maps con `loading=async`** (`imports/startup/client/Gkeys.js`): se envuelve `GoogleMapsLoader.createUrl` para añadir el parámetro (el paquete `google-maps` npm no expone hook). *Verificar en staging que el mapa carga y el aviso de consola desaparece.* - ✅ **`meteor-accounts-t9n` actualizado** a `^2.6.0` (es/en OK). El paquete sigue sin build gallego (`gl`), así que se mantiene el fallback gl→es documentado en `i18n.js`. Traducción gallega de la app (`gl/common.json`): 0 claves faltantes. - **Salto Bootstrap 4→5 (CSS/JS) pendiente:** react-bootstrap ya está en v2 y corre sobre el CSS Bootstrap 4 actual (`alexwine:bootstrap-4`) con un único shim `.form-label` en `forms.scss`. El salto a Bootstrap 5 npm está diferido porque el carrusel del home (`bootstrap-carousel-swipe`, jQuery/BS4) depende del JS jQuery de BS4 (`data-slide`). - ✅ **Collapse del navbar migrado a React** (`Navigation.js` + `NavItem.js`): el `data-toggle="collapse"` jQuery se sustituyó por estado React (`useState` que alterna `.show`); funciona ya sobre el CSS BS4 y no depende del JS jQuery. *Verificar en staging el menú móvil (