useBucketPolicyCount.ts 1.3 KB

1234567891011121314151617181920212223242526272829303132333435
  1. import { useCallback, useMemo } from 'react'
  2. import { extractBucketNameFromDefinition } from '@/components/interfaces/Storage/Storage.utils'
  3. import { useDatabasePoliciesQuery } from '@/data/database-policies/database-policies-query'
  4. import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject'
  5. export function useBucketPolicyCount() {
  6. const { data: project, isPending: isProjectPending } = useSelectedProjectQuery()
  7. const { data: policiesData = [], isPending: isPoliciesPending } = useDatabasePoliciesQuery({
  8. projectRef: project?.ref,
  9. connectionString: project?.connectionString,
  10. schema: 'storage',
  11. })
  12. const policyCountByBucket = useMemo(() => {
  13. const countMap = new Map<string, number>()
  14. for (const policy of policiesData) {
  15. if (policy.table !== 'objects') continue
  16. const bucketName =
  17. extractBucketNameFromDefinition(policy.definition) ??
  18. extractBucketNameFromDefinition(policy.check)
  19. if (bucketName) {
  20. countMap.set(bucketName, (countMap.get(bucketName) ?? 0) + 1)
  21. }
  22. }
  23. return countMap
  24. }, [policiesData])
  25. const getPolicyCount = useCallback(
  26. (bucketName: string) => policyCountByBucket.get(bucketName) ?? 0,
  27. [policyCountByBucket]
  28. )
  29. return { getPolicyCount, isLoading: isProjectPending || isPoliciesPending }
  30. }