fix(sidebar): подключить reviews badge к real count
Бэйдж 'На ревью' в sidebar (desktop + mobile) был захардкожен в 0 — TODO comment ждал cheap /drafts/pending/count endpoint. На самом деле existing /admin/reviews/pending и /admin/schema-reviews/pending уже возвращают paged response с totalElements/total в metadata — request size=1 даёт нужный counter с минимальным payload (~1 строка + 4 metadata field'а). Новый hook useReviewsBadgeCount(): - Параллельно дёргает обе queue (record + schema) - Суммирует totalElements (record) + total (schema) - Полл каждые 60s (lighter чем 30s queue refresh — badge не critical) - Gated на auth.isAuthenticated (anonymous не должен дёргать admin endpoint'ы) Sidebar.tsx (оба варианта — desktop + mobile MobileSidebar): - reviewsCount: 0 → reviews.total
This commit is contained in:
@@ -622,6 +622,40 @@ export const reviewQueueQuery = (page = 0, size = 50) =>
|
||||
export const useReviewQueue = (page = 0, size = 50) =>
|
||||
useQuery(reviewQueueQuery(page, size))
|
||||
|
||||
/**
|
||||
* Lightweight count для sidebar badge — fetch only metadata (size=1).
|
||||
*
|
||||
* <p>Combines record-reviews + schema-reviews queues. Возвращает сумму pending
|
||||
* drafts обоих видов. Поллится каждые 30s в синк с queue queries — reviewer
|
||||
* увидит свежий counter при возврате на app даже если /reviews не открыт.
|
||||
*
|
||||
* <p>Gated на authenticated — anonymous не должен дёргать admin endpoint'ы
|
||||
* (вернут 401, шум в логах). Когда Phase 1d Keycloak roles подключатся,
|
||||
* этот gate можно сузить до approver-role (useCanReviewSchema).
|
||||
*/
|
||||
export const useReviewsBadgeCount = (enabled = true) => {
|
||||
const recordQ = useQuery({
|
||||
...reviewQueueQuery(0, 1),
|
||||
enabled,
|
||||
// Override interval: badge ОК с 60s — это не deep view, lower frequency
|
||||
// снижает background load когда tab idle.
|
||||
refetchInterval: 60_000,
|
||||
})
|
||||
const schemaQ = useQuery({
|
||||
...schemaReviewQueueQuery(0, 1),
|
||||
enabled,
|
||||
refetchInterval: 60_000,
|
||||
})
|
||||
const recordCount = recordQ.data?.totalElements ?? 0
|
||||
const schemaCount = schemaQ.data?.total ?? 0
|
||||
return {
|
||||
total: recordCount + schemaCount,
|
||||
recordCount,
|
||||
schemaCount,
|
||||
isLoading: recordQ.isLoading || schemaQ.isLoading,
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Pending drafts на конкретный dict — для бейджа "На review" в records list.
|
||||
* Лёгкий poll каждые 30s. Backend возвращает только PENDING (фильтрация в SQL).
|
||||
|
||||
Reference in New Issue
Block a user