[CL-REACT-DOCTOR-REBAL] refactor(AiRebalancingModal): чистим 11 react-doctor warnings + smoke-test #111

Merged
andrei merged 1 commit from feature/claude-ai-rebal-warnings-cleanup into master 2026-05-21 12:54:49 +00:00
Owner

Что сделано

  • Tailwind 4 size-shorthand на 10 иконках: h-X w-Xsize-X (loading spinner, alert icons, trend icon, clock, alerts) — rule design-no-redundant-size-axes ×10
  • Стабильный composite key для trade rows: ${propertyName}-${action} вместо array index (rule no-array-index-as-key)
  • Intl.NumberFormat обёрнут в useMemo с зависимостью от i18n.language — конструируется один раз на locale (rule js-hoist-intl partial)
  • EUR_FORMAT_OPTIONS вынесен на module scope (frozen const)
  • void generate() в useEffect для async pattern (rule async-defer-await partial)
  • Новый smoke test app/src/components/ai/__tests__/AiRebalancingModal.test.tsx (7 кейсов): loading state, plan render, composite key, confirm flow, disabled 403, cancel, не render при isOpen=false

Зачем

Phase 2 react-doctor hygiene #2 после Lightbox PR #104. Из 20 warnings на app/src/components/ai/AiRebalancingModal.tsx закрываем 11. GitNexus impact: LOW risk, 0 upstream callers — pure internal refactor.

До После
20 warnings 9 warnings
0 errors 0 errors
0 tests 7/7 PASS

План тестирования

  • cd app && npx tsc --noEmit — clean
  • cd app && npx eslint src/components/ai/AiRebalancingModal.tsx --max-warnings 0 — clean
  • cd app && npx vitest run src/components/ai/__tests__/AiRebalancingModal.test.tsx7/7 PASS
  • cd app && npm run test:i18n-usage — Missing: 0
  • cd app && npx react-doctor . --offline --lint -y --json → AiRebalancingModal 20 → 9 warnings, app errors=0
  • CI: 8 jobs Forgejo + React Doctor self-scan должны быть green

Где могу ошибаться

  • 9 warnings остались как state-architecture work, отдельный PR:
    • rerender-state-only-in-handlers (setState вне handlers — useReducer paradigm shift)
    • no-cascading-set-state (chain setState в generate() — useReducer dispatch)
    • prefer-useReducer (7 useState → 1 useReducer)
    • no-effect-event-handler (handler внутри useEffect)
    • async-defer-await (await перед early-return — нужен рестракт)
    • js-hoist-intl (useMemo всё ещё детектится rule'ом — возможно требуется module-level singleton, но не подходит для многоязычного контекста)
  • Composite key ${propertyName}-${action} имеет collision risk если 2 трейда с одинаковыми property+action — маловероятно (action='BUY' константа)
  • Worktree husky pre-push не запустился (свежий pnpm install не активирует hook) — рассчитываю на server-side CI
  • await generate() теперь discarded через void — ошибки swallowed, но try/catch внутри generate уже обрабатывает их
## Что сделано - Tailwind 4 size-shorthand на 10 иконках: `h-X w-X` → `size-X` (loading spinner, alert icons, trend icon, clock, alerts) — rule `design-no-redundant-size-axes` ×10 - Стабильный composite key для trade rows: `${propertyName}-${action}` вместо array index (rule `no-array-index-as-key`) - `Intl.NumberFormat` обёрнут в `useMemo` с зависимостью от `i18n.language` — конструируется один раз на locale (rule `js-hoist-intl` partial) - `EUR_FORMAT_OPTIONS` вынесен на module scope (frozen const) - `void generate()` в useEffect для async pattern (rule `async-defer-await` partial) - Новый smoke test `app/src/components/ai/__tests__/AiRebalancingModal.test.tsx` (7 кейсов): loading state, plan render, composite key, confirm flow, disabled 403, cancel, не render при isOpen=false ## Зачем Phase 2 react-doctor hygiene #2 после Lightbox PR #104. Из 20 warnings на `app/src/components/ai/AiRebalancingModal.tsx` закрываем 11. GitNexus impact: **LOW** risk, 0 upstream callers — pure internal refactor. | До | После | |---|---| | 20 warnings | 9 warnings | | 0 errors | 0 errors | | 0 tests | 7/7 PASS | ## План тестирования - `cd app && npx tsc --noEmit` — clean - `cd app && npx eslint src/components/ai/AiRebalancingModal.tsx --max-warnings 0` — clean - `cd app && npx vitest run src/components/ai/__tests__/AiRebalancingModal.test.tsx` — **7/7 PASS** - `cd app && npm run test:i18n-usage` — Missing: 0 - `cd app && npx react-doctor . --offline --lint -y --json` → AiRebalancingModal 20 → 9 warnings, app errors=0 - CI: 8 jobs Forgejo + React Doctor self-scan должны быть green ## Где могу ошибаться - 9 warnings остались как state-architecture work, отдельный PR: - 3× `rerender-state-only-in-handlers` (setState вне handlers — useReducer paradigm shift) - 2× `no-cascading-set-state` (chain setState в generate() — useReducer dispatch) - 1× `prefer-useReducer` (7 useState → 1 useReducer) - 1× `no-effect-event-handler` (handler внутри useEffect) - 1× `async-defer-await` (await перед early-return — нужен рестракт) - 1× `js-hoist-intl` (useMemo всё ещё детектится rule'ом — возможно требуется module-level singleton, но не подходит для многоязычного контекста) - Composite key `${propertyName}-${action}` имеет collision risk если 2 трейда с одинаковыми property+action — маловероятно (action='BUY' константа) - Worktree husky pre-push не запустился (свежий pnpm install не активирует hook) — рассчитываю на server-side CI - `await generate()` теперь discarded через `void` — ошибки swallowed, но try/catch внутри generate уже обрабатывает их
[CL-REACT-DOCTOR-REBAL] refactor(AiRebalancingModal): чистим 11 react-doctor warnings + smoke-test
Some checks failed
CI / Prisma Migrate Gate (pull_request) Has been cancelled
React Doctor / React Doctor / App (pull_request) Has been cancelled
CI / API (pull_request) Has been cancelled
CI / App (pull_request) Has been cancelled
CI / Python SDK (pull_request) Has been cancelled
CI / Contracts (pull_request) Has been cancelled
CI / Telegram Mini App (pull_request) Has been cancelled
CI / Secrets Scan (pull_request) Has been cancelled
8536e1dda4
## Что сделано
- Tailwind 4 size-shorthand на 10 иконках: `h-X w-X` → `size-X` (loading spinner, alert icons, trend icon, clock, alerts) — rule `design-no-redundant-size-axes` ×10
- Стабильный composite key для trade rows: `${propertyName}-${action}` вместо array index (rule `no-array-index-as-key`)
- `Intl.NumberFormat` обёрнут в `useMemo` с зависимостью от `i18n.language` — конструируется один раз на locale (rule `js-hoist-intl` partial fix)
- `EUR_FORMAT_OPTIONS` вынесен на module scope (frozen const)
- `void generate()` в useEffect для async pattern (rule `async-defer-await` partial fix)
- Новый smoke test `app/src/components/ai/__tests__/AiRebalancingModal.test.tsx` (7 кейсов): loading state, plan render, composite key, confirm flow, disabled 403, cancel, не render при isOpen=false

## Зачем
Phase 2 react-doctor hygiene #2 после Lightbox PR #104. Из 20 warnings на `app/src/components/ai/AiRebalancingModal.tsx` закрываем 11. GitNexus impact: **LOW** risk, 0 upstream callers — pure internal refactor.

| До | После |
|---|---|
| 20 warnings | 9 warnings |
| 0 errors | 0 errors |
| 0 tests | 7/7 PASS |

## План тестирования
- `cd app && npx tsc --noEmit` — clean
- `cd app && npx eslint src/components/ai/AiRebalancingModal.tsx --max-warnings 0` — clean
- `cd app && npx vitest run src/components/ai/__tests__/AiRebalancingModal.test.tsx` — **7/7 PASS**
- `cd app && npm run test:i18n-usage` — Missing: 0 (никаких новых i18n ключей — все существующие)
- `cd app && npx react-doctor . --offline --lint -y --json` → AiRebalancingModal 20 → 9 warnings, app errors=0

## Где могу ошибаться
- 9 warnings остались как state-architecture work, отдельный PR:
  - 3× `rerender-state-only-in-handlers` (setState вне handlers — useReducer paradigm shift)
  - 2× `no-cascading-set-state` (chain setState в generate() — useReducer dispatch)
  - 1× `prefer-useReducer` (related — 7 useState → 1 useReducer)
  - 1× `no-effect-event-handler` (handler внутри useEffect)
  - 1× `async-defer-await` (await перед early-return pattern — нужен рестракт)
  - 1× `js-hoist-intl` (useMemo всё ещё детектится rule'ом — возможно требуется module-level singleton, но не подходит для многоязычного контекста)
- Composite key `${propertyName}-${action}` имеет collision risk если два трейда с одинаковыми property+action — маловероятно (action='BUY' константа в trade)
- Worktree husky pre-push не запустился (свежий pnpm install не активирует hook) — рассчитываю на server-side CI
- `await generate()` теперь discarded через `void` — ошибки swallowed, но try/catch внутри generate уже обрабатывает их
andrei merged commit aa39b222d8 into master 2026-05-21 12:54:49 +00:00
andrei deleted branch feature/claude-ai-rebal-warnings-cleanup 2026-05-21 12:54:49 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
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
europa-tech-srl/europatech!111
No description provided.