refactor(state): clean layoutStore, add selectors, centralise STALE constants
- layoutStore: remove 4 dead field groups (pinnedPanels, selectedResultId, compareTrayVisible, notificationsOpen) — none were read outside the store - CompareTray: drop dead useLayoutStore side-effect (state was write-only) - 8 components: replace bare useStore() with explicit selectors / useShallow to prevent unnecessary re-renders on unrelated state mutations - lib/constants: add STALE_MARKET_SIGNALS + STALE_REVIEW_QUEUE (30s each) - useMarketSignals, useReviewQueue: use global constants instead of hook-local magic numbers - Add STATE_MANAGEMENT.md: decision tree + rules for RQ/Zustand/local/derived Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -3,14 +3,13 @@ import { marketIntelligenceService } from '../services/marketIntelligenceService
|
||||
import { reviewService } from '../services/reviewService'
|
||||
import type { MarketSignalFilters, SignalProcessingStatus } from '../domain/marketSignal'
|
||||
import { useToastStore } from '../stores/toastStore'
|
||||
|
||||
const STALE_SIGNALS = 30_000
|
||||
import { STALE_MARKET_SIGNALS } from '../lib/constants'
|
||||
|
||||
export function useMarketSignals(filters?: MarketSignalFilters) {
|
||||
return useQuery({
|
||||
queryKey: ['market-signals', filters ?? {}],
|
||||
queryFn: () => marketIntelligenceService.getSignals(filters),
|
||||
staleTime: STALE_SIGNALS,
|
||||
staleTime: STALE_MARKET_SIGNALS,
|
||||
select: (res) => res.data ?? [],
|
||||
})
|
||||
}
|
||||
@@ -20,7 +19,7 @@ export function useMarketSignalDetail(id: string | null) {
|
||||
queryKey: ['market-signal', id],
|
||||
queryFn: () => marketIntelligenceService.getSignalDetail(id!),
|
||||
enabled: id !== null,
|
||||
staleTime: STALE_SIGNALS,
|
||||
staleTime: STALE_MARKET_SIGNALS,
|
||||
select: (res) => res.data ?? null,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -4,15 +4,15 @@ import { useSessionStore } from '../stores/sessionStore'
|
||||
import type { ReviewFilters } from '../provider/IReviewProvider'
|
||||
import type { ReviewTaskStatus } from '../domain/review'
|
||||
import { useToastStore } from '../stores/toastStore'
|
||||
import { STALE_REVIEW_QUEUE } from '../lib/constants'
|
||||
|
||||
const STALE_REVIEW = 30_000
|
||||
const QK = 'reviewQueue'
|
||||
|
||||
export function useReviewQueue(filters?: ReviewFilters) {
|
||||
return useQuery({
|
||||
queryKey: [QK, filters ?? {}],
|
||||
queryFn: () => reviewService.getTasks(filters),
|
||||
staleTime: STALE_REVIEW,
|
||||
staleTime: STALE_REVIEW_QUEUE,
|
||||
select: (res) => res.data ?? [],
|
||||
})
|
||||
}
|
||||
@@ -21,7 +21,7 @@ export function useReviewTask(id: string | null) {
|
||||
return useQuery({
|
||||
queryKey: [QK, 'task', id],
|
||||
queryFn: () => reviewService.getTask(id!),
|
||||
staleTime: STALE_REVIEW,
|
||||
staleTime: STALE_REVIEW_QUEUE,
|
||||
enabled: !!id,
|
||||
select: (res) => res.data ?? null,
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user