Skip to content

feat(frontend): TanStack Query — кэш CRM-списков + мигрируем Applications#20

Merged
Br1Im merged 3 commits into
mainfrom
devin/1778715650-react-query
May 14, 2026
Merged

feat(frontend): TanStack Query — кэш CRM-списков + мигрируем Applications#20
Br1Im merged 3 commits into
mainfrom
devin/1778715650-react-query

Conversation

@devin-ai-integration

Copy link
Copy Markdown
Contributor

Summary

Поднимаем UX подгрузки CRM. До этого PR каждый компонент сам делал useEffect + useState + apiInstance.get — это значит:

  • Уход с вкладки и возврат → полный fresh-fetch и пустые таблицы во время загрузки.
  • Mutation (создание/удаление) → ручной вызов load() и второй фетч.
  • Никакого кэша между маршрутами / нет фонового обновления.

После PR:

  • На весь app вешается QueryClientProvider (TanStack Query v5).
  • staleTime: 30s — повторное открытие вкладки в течение 30 сек показывает данные мгновенно из памяти.
  • refetchOnWindowFocus: false — не дёргаем сервер при каждом возврате в окно.
  • retry: 1 — одна попытка ретрая для упавших запросов.

Что внутри

Новое

  • frontend/src/shared/api/queryHooks.ts — тонкая обёртка над TanStack:
    • useCrmList<T>(resource) нормализует ответ (массив / {data: [...]} / {items: [...]} — после пагинации в PR perf(backend): Promise.all дашборда + пагинация /api/clients и /api/cases #17 бэк возвращает разные формы) и возвращает чистый массив.
    • useCrmMutation({resource, method, url?}) после успешной мутации инвалидирует кэш [resource], UI сразу видит свежее состояние.
  • frontend/src/shared/api/queryHooks.test.tsx+5 vitest тестов (плоский массив, envelope, edge-case null, cache invalidation после POST, кастомный URL для DELETE).

Изменено

  • frontend/src/main.tsxQueryClientProvider поверх <App />.
  • frontend/src/components/Applications.tsx — мигрирован на useCrmList + useCrmMutation.

Не мигрировано (намеренно)

  • Cases.tsx, Acts.tsx, MyCases.tsx, Documents.tsx, Expenses.tsx, Materials.tsx — они грузят несколько endpoint'ов сразу, имеют сложные filter-state'ы или используют raw fetch(). Инфраструктура (QueryClientProvider + хуки) уже на месте — миграция оставшихся пойдёт отдельным PR'ом по аналогии с Applications.tsx.

Тесты

  • npm test (frontend): 25/25 PASS (20 baseline + 5 новых).
  • tsc --noEmit: чисто.
  • vite build: чисто.

Review & Testing Checklist for Human

  • Открыть /applications (как директор), уйти на «Дашборд», вернуться в течение 30 сек — таблица должна появиться мгновенно без сетевого запроса (проверить через DevTools → Network).
  • Создать заявление через +Добавить — таблица обновляется автоматически (без ручного «Обновить»).
  • Удалить заявление — строка пропадает сразу.
  • Открыть /applications спустя > 30 сек после первого открытия — должен быть фоновый refetch, на UI старые данные показываются пока новые не пришли.

Notes

@tanstack/react-query@^5.x — совместим с React 18.
staleTime: 30s — компромисс. Если данные часто меняются у других пользователей (multi-tenant CRM), можно опустить до 0 или подключить WebSocket-инвалидацию.
— Можно добавить React Query Devtools только в import.meta.env.DEV — для дебаггинга кэша. Сейчас не подключаю, чтобы не раздувать dev-бандл.

Link to Devin session: https://app.devin.ai/sessions/514f368ad0194bf18d0327e62a88aeda
Requested by: @Br1Im

@devin-ai-integration

Copy link
Copy Markdown
Contributor Author

🤖 Devin AI Engineer

I'll be helping with this pull request! Here's what you should know:

✅ I will automatically:

  • Address comments on this PR. Add '(aside)' to your comment to have me ignore it.
  • Look at CI failures and help fix them

Note: I can only respond to comments from users who have write access to this repository.

⚙️ Control Options:

  • Disable automatic comment and CI monitoring

Br1Im added 2 commits May 13, 2026 23:49
…3e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u0439 \u043f\u043e\u0434\u0433\u0440\u0443\u0437\u043a\u0435 (isPending), \u043d\u0435 \u043d\u0430 background refetch
…ptions \u0437\u0430\u0442\u0438\u0440\u0430\u043b \u0438\u043d\u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044e \u043a\u044d\u0448\u0430 \u0432 onSuccess
@Br1Im Br1Im merged commit 2685bcd into main May 14, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant