Repository: supabase/supabase
File: apps/studio/components/interfaces/Auth/Policies/PoliciesDataContext.tsx (TypeScript)

Code before:

type TableKey = `${string}.${string}`

interface PoliciesDataContextValue {
  getPoliciesForTable: (schema: string, table: string) => PostgresPolicy[]
  isPoliciesLoading: boolean
  isPoliciesError: boolean
  policiesError?: ResponseError | Error
  exposedSchemas: Set<string>
}

const PoliciesDataContext = createContext<PoliciesDataContextValue | null>(null)

export const usePoliciesData = () => {
  const context = useContext(PoliciesDataContext)
  if (!context) throw new Error('usePoliciesData must be used within PoliciesDataProvider')
  return context
}

interface PoliciesDataProviderProps {
  policies: PostgresPolicy[]
  isPoliciesLoading: boolean
  isPoliciesError: boolean
  policiesError?: ResponseError | Error
  exposedSchemas: string[]
}

export const PoliciesDataProvider = ({
  children,
  policies,
  isPoliciesLoading,
  isPoliciesError,
  policiesError,
  exposedSchemas,
}: PropsWithChildren<PoliciesDataProviderProps>) => {
  const policiesByTable = useMemo(() => {
    const map = new Map<TableKey, PostgresPolicy[]>()

    for (const policy of policies) {
      const key = `${policy.schema}.${policy.table}` satisfies TableKey
      const existing = map.get(key)
      if (existing) {
        existing.push(policy)
      } else {
        map.set(key, [policy])
      }
    }

    for (const list of map.values()) {
      list.sort((a, b) => a.name.localeCompare(b.name))
    }

Review comment (suggestion):
Same as above


```suggestion
type PoliciesDataProviderProps = {
  policies: PostgresPolicy[]
  isPoliciesLoading: boolean
  isPoliciesError: boolean
  policiesError?: ResponseError | Error
  exposedSchemas: string[]
}
```

Code after:

type TableKey = `${string}.${string}`

type PoliciesDataContextValue = {
  getPoliciesForTable: (schema: string, table: string) => PostgresPolicy[]
  isPoliciesLoading: boolean
  isPoliciesError: boolean
  policiesError?: ResponseError | Error
  exposedSchemas: Set<string>
}

const PoliciesDataContext = createContext<PoliciesDataContextValue | null>(null)

export const usePoliciesData = () => {
  const context = useContext(PoliciesDataContext)
  if (!context) throw new Error('usePoliciesData must be used within PoliciesDataProvider')
  return context
}

type PoliciesDataProviderProps = {
  policies: PostgresPolicy[]
  isPoliciesLoading: boolean
  isPoliciesError: boolean
  policiesError?: ResponseError | Error
  exposedSchemas: string[]
}

export const PoliciesDataProvider = ({
  children,
  policies,
  isPoliciesLoading,
  isPoliciesError,
  policiesError,
  exposedSchemas,
}: PropsWithChildren<PoliciesDataProviderProps>) => {
  const policiesByTable = useMemo(() => {
    const map = new Map<TableKey, PostgresPolicy[]>()

    for (const policy of policies) {
      const key = `${policy.schema}.${policy.table}` satisfies TableKey
      const existing = map.get(key)
      if (existing) {
        existing.push(policy)
      } else {
        map.set(key, [policy])
      }
    }

    for (const list of map.values()) {
      list.sort((a, b) => a.name.localeCompare(b.name))
    }