useIndexInvalidation.ts 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import { useQueryClient } from '@tanstack/react-query'
  2. import { useRouter } from 'next/router'
  3. import { parseAsString, useQueryStates } from 'nuqs'
  4. import { useCallback } from 'react'
  5. import {
  6. QUERY_PERFORMANCE_PRESET_MAP,
  7. QUERY_PERFORMANCE_REPORT_TYPES,
  8. } from '../QueryPerformance.constants'
  9. import { type QueryPerformanceSort } from '../QueryPerformance.types'
  10. import { useQueryPerformanceQuery } from '../useQueryPerformanceQuery'
  11. import { useIndexAdvisorStatus } from './useIsIndexAdvisorStatus'
  12. import { useTableIndexAdvisor } from '@/components/grid/context/TableIndexAdvisorContext'
  13. import { databaseIndexesKeys } from '@/data/database-indexes/keys'
  14. import { databaseKeys } from '@/data/database/keys'
  15. import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject'
  16. export function useIndexInvalidation() {
  17. const router = useRouter()
  18. const queryClient = useQueryClient()
  19. const { data: project } = useSelectedProjectQuery()
  20. const { isIndexAdvisorEnabled } = useIndexAdvisorStatus()
  21. const [{ preset: urlPreset, search: searchQuery, order, sort }] = useQueryStates({
  22. sort: parseAsString,
  23. search: parseAsString.withDefault(''),
  24. order: parseAsString,
  25. preset: parseAsString.withDefault('unified'),
  26. })
  27. const { invalidate: invalidateTableIndexAdvisor } = useTableIndexAdvisor()
  28. const preset = QUERY_PERFORMANCE_PRESET_MAP[urlPreset as QUERY_PERFORMANCE_REPORT_TYPES]
  29. const orderBy = !!sort ? ({ column: sort, order } as QueryPerformanceSort) : undefined
  30. const roles = router?.query?.roles ?? []
  31. const queryPerformanceQuery = useQueryPerformanceQuery({
  32. searchQuery,
  33. orderBy,
  34. preset,
  35. roles: typeof roles === 'string' ? [roles] : roles,
  36. runIndexAdvisor: isIndexAdvisorEnabled,
  37. })
  38. return useCallback(() => {
  39. queryPerformanceQuery.runQuery()
  40. queryClient.invalidateQueries({
  41. queryKey: databaseKeys.indexAdvisorFromQuery(project?.ref, ''),
  42. })
  43. queryClient.invalidateQueries({ queryKey: databaseIndexesKeys.list(project?.ref) })
  44. invalidateTableIndexAdvisor()
  45. }, [queryPerformanceQuery, queryClient, project?.ref, invalidateTableIndexAdvisor])
  46. }