bug(frontend): React error #418 hydration mismatch на /admin/scrape/cadastre #253

Closed
opened 2026-05-17 06:14:54 +00:00 by lekss361 · 2 comments
Owner

Симптом

GlitchTip FRONTEND-1 (id=13, 2 events, firstSeen 2026-05-16 20:04, lastSeen 2026-05-17 05:44). React minified error #418 = hydration mismatch — SSR rendered HTML отличается от client-side render.

Error: Minified React error #418 (Hydration mismatch)
Page: https://gendsgn.ru/admin/scrape/cadastre
Browser: Chrome 148 / Windows 10
React: 19.2.0-canary-0bdb9206-20250818

Происходит при навигации /admin/scrape/cadastre/admin/scrape/cadastre (refresh / re-mount).

Возможные причины

  1. Date/time formatting в frontend/src/app/admin/scrape/cadastre/page.tsxnew Date().toLocaleString("ru-RU") рендерит разный результат на SSR vs CSR (timezone mismatch server UTC vs browser local)
  2. localStorage admin tokenlocalStorage.getItem("admin_token") в initial useState может вернуть undefined на SSR и string на CSR
  3. Динамическое значение — например Date.now() или Math.random() в render

Воспроизведение

  1. Открыть https://gendsgn.ru/admin/scrape/cadastre
  2. Refresh (Ctrl+R)
  3. Открыть DevTools Console → "Hydration failed because the initial UI does not match what was rendered on the server"

Fix patterns

  • Вынести client-only state в useEffect:
    const [token, setToken] = useState<string>("");
    useEffect(() => setToken(localStorage.getItem("admin_token") ?? ""), []);
    
  • Для дат: suppressHydrationWarning на конкретный element + use ISO format в SSR, localized в CSR
  • Или: "use client" directive + dynamic import с ssr:false

Reference

  • frontend/src/app/admin/scrape/cadastre/page.tsx
  • Аналогичный pattern в других admin pages (geo, objective, all) — проверить нет ли там же проблемы

Acceptance

  • FRONTEND-1 не появляется на новых releases
  • DevTools Console чист на reload /admin/scrape/cadastre
  • Regression check: остальные admin pages тоже не падают на hydration

Severity

🟢 P3 — admin-only page, не visible end-users. Но React после hydration mismatch теряет state и re-renders всё с нуля — performance hit.

(GlitchTip discovery 2026-05-17)

## Симптом GlitchTip **FRONTEND-1** (id=13, 2 events, firstSeen 2026-05-16 20:04, lastSeen 2026-05-17 05:44). React minified error #418 = **hydration mismatch** — SSR rendered HTML отличается от client-side render. ``` Error: Minified React error #418 (Hydration mismatch) Page: https://gendsgn.ru/admin/scrape/cadastre Browser: Chrome 148 / Windows 10 React: 19.2.0-canary-0bdb9206-20250818 ``` Происходит при навигации `/admin/scrape/cadastre` → `/admin/scrape/cadastre` (refresh / re-mount). ## Возможные причины 1. **Date/time formatting** в `frontend/src/app/admin/scrape/cadastre/page.tsx` — `new Date().toLocaleString("ru-RU")` рендерит разный результат на SSR vs CSR (timezone mismatch server UTC vs browser local) 2. **localStorage admin token** — `localStorage.getItem("admin_token")` в initial useState может вернуть undefined на SSR и string на CSR 3. **Динамическое значение** — например `Date.now()` или `Math.random()` в render ## Воспроизведение 1. Открыть https://gendsgn.ru/admin/scrape/cadastre 2. Refresh (Ctrl+R) 3. Открыть DevTools Console → "Hydration failed because the initial UI does not match what was rendered on the server" ## Fix patterns - Вынести client-only state в `useEffect`: ```typescript const [token, setToken] = useState<string>(""); useEffect(() => setToken(localStorage.getItem("admin_token") ?? ""), []); ``` - Для дат: `suppressHydrationWarning` на конкретный element + use ISO format в SSR, localized в CSR - Или: `"use client"` directive + dynamic import с `ssr:false` ## Reference - `frontend/src/app/admin/scrape/cadastre/page.tsx` - Аналогичный pattern в других admin pages (`geo`, `objective`, `all`) — проверить нет ли там же проблемы ## Acceptance - [ ] FRONTEND-1 не появляется на новых releases - [ ] DevTools Console чист на reload /admin/scrape/cadastre - [ ] Regression check: остальные admin pages тоже не падают на hydration ## Severity 🟢 P3 — admin-only page, не visible end-users. Но React после hydration mismatch теряет state и re-renders всё с нуля — performance hit. (GlitchTip discovery 2026-05-17)
Author
Owner

Status check 2026-05-23

Issue остаётся в силе. После security pivot (PRs #437 / #442) admin frontend трогался — удалён Admin Token UI input + fix enabled: !!token (PR #442). React error #418 hydration на /admin/scrape/cadastre отдельно не проверялся, но /admin/* теперь доступен всем pilot users (вместо «Загрузка...» бесконечно).

Priority после pilot demo 28.05: medium — нужен re-test admin scrape page после PR #442.

Привязка: добавлен в umbrella epic(infra): Pilot infra status 2026-05-23 — после security pivot.

## Status check 2026-05-23 Issue остаётся в силе. После security pivot (PRs #437 / #442) admin frontend трогался — удалён Admin Token UI input + fix `enabled: !!token` (PR #442). React error #418 hydration на `/admin/scrape/cadastre` отдельно не проверялся, но `/admin/*` теперь доступен всем pilot users (вместо «Загрузка...» бесконечно). **Priority после pilot demo 28.05**: medium — нужен re-test admin scrape page после PR #442. Привязка: добавлен в umbrella `epic(infra): Pilot infra status 2026-05-23 — после security pivot`.
Collaborator

Ground-truth 2026-06-13. obsolete: первопричина (localStorage admin_token в render) удалена коммитами a2953e9+a42ca6a. GlitchTip stale (lastSeen 2026-05-17). Свежего repro нет. Закрываю; переоткрыть при свежем event.

**Ground-truth 2026-06-13.** obsolete: первопричина (localStorage admin_token в render) удалена коммитами a2953e9+a42ca6a. GlitchTip stale (lastSeen 2026-05-17). Свежего repro нет. Закрываю; переоткрыть при свежем event.
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#253
No description provided.