| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- import { useMemo, useState } from 'react'
- import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader'
- import { Policies } from '@/components/interfaces/Auth/Policies/Policies'
- import { PoliciesDataProvider } from '@/components/interfaces/Auth/Policies/PoliciesDataContext'
- import { PolicyEditorPanel } from '@/components/interfaces/Auth/Policies/PolicyEditorPanel'
- import type { Policy } from '@/components/interfaces/Auth/Policies/PolicyTableRow/PolicyTableRow.utils'
- import AlertError from '@/components/ui/AlertError'
- import { useDatabasePoliciesQuery } from '@/data/database-policies/database-policies-query'
- import { useTablesQuery } from '@/data/tables/tables-query'
- import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject'
- export const RealtimePolicies = () => {
- const { data: project } = useSelectedProjectQuery()
- const [showPolicyEditor, setShowPolicyEditor] = useState(false)
- const [selectedPolicyToEdit, setSelectedPolicyToEdit] = useState<Policy>()
- const {
- data: tables,
- isPending: isLoading,
- isSuccess,
- isError,
- error,
- } = useTablesQuery({
- projectRef: project?.ref,
- connectionString: project?.connectionString,
- schema: 'realtime',
- })
- const filteredTables = useMemo(
- () => (tables ?? []).filter((table) => table.name === 'messages'),
- [tables]
- )
- const visibleTableIds = useMemo(
- () => new Set(filteredTables.map((table) => table.id)),
- [filteredTables]
- )
- const {
- data: policies,
- isPending: isLoadingPolicies,
- isError: isPoliciesError,
- error: policiesError,
- } = useDatabasePoliciesQuery({
- projectRef: project?.ref,
- connectionString: project?.connectionString,
- })
- // realtime is never in PostgREST's db_schema — skip the config query to avoid a false warning
- const exposedSchemas = useMemo(() => ['realtime'], [])
- return (
- <>
- {isLoading && <GenericSkeletonLoader />}
- {isError && <AlertError error={error} subject="Failed to retrieve tables" />}
- {isSuccess && (
- <PoliciesDataProvider
- policies={policies ?? []}
- isPoliciesLoading={isLoadingPolicies}
- isPoliciesError={isPoliciesError}
- policiesError={policiesError ?? undefined}
- exposedSchemas={exposedSchemas}
- >
- <Policies
- schema="realtime"
- tables={filteredTables}
- hasTables
- isLocked={false}
- visibleTableIds={visibleTableIds}
- onSelectCreatePolicy={(_tableName) => {
- setSelectedPolicyToEdit(undefined)
- setShowPolicyEditor(true)
- }}
- onSelectEditPolicy={(policy) => {
- setSelectedPolicyToEdit(policy)
- setShowPolicyEditor(true)
- }}
- />
- </PoliciesDataProvider>
- )}
- <PolicyEditorPanel
- visible={showPolicyEditor}
- searchString="messages"
- schema="realtime"
- selectedPolicy={selectedPolicyToEdit}
- onSelectCancel={() => setShowPolicyEditor(false)}
- authContext="realtime"
- />
- </>
- )
- }
|