mirror of
https://github.com/supabase/supabase.git
synced 2026-10-12 12:55:06 +03:00
* Add shimmering-loader CSS to ui-patterns. * Import the shimmering-loader classes from the ui-patterns component. * Remove ShimmeringLoader from studio. * Migrate studio to use ui-patterns/ShimmeringLoader. * Migrate away from using default import for ShimmeringLoader. * Fix the css imports in docs and studio.
103 lines
3.3 KiB
TypeScript
103 lines
3.3 KiB
TypeScript
import { PostgresPolicy } from '@supabase/postgres-meta'
|
|
import { useMemo, useState } from 'react'
|
|
|
|
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 AlertError from 'components/ui/AlertError'
|
|
import { useProjectPostgrestConfigQuery } from 'data/config/project-postgrest-config-query'
|
|
import { useDatabasePoliciesQuery } from 'data/database-policies/database-policies-query'
|
|
import { useTablesQuery } from 'data/tables/tables-query'
|
|
import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject'
|
|
import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader'
|
|
|
|
export const RealtimePolicies = () => {
|
|
const { data: project } = useSelectedProjectQuery()
|
|
const { data: postgrestConfig } = useProjectPostgrestConfigQuery({ projectRef: project?.ref })
|
|
|
|
const [showPolicyEditor, setShowPolicyEditor] = useState(false)
|
|
const [selectedPolicyToEdit, setSelectedPolicyToEdit] = useState<PostgresPolicy>()
|
|
|
|
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,
|
|
})
|
|
const exposedSchemas = useMemo(() => {
|
|
const dbSchema = postgrestConfig?.db_schema
|
|
if (!dbSchema) return []
|
|
|
|
return dbSchema
|
|
.split(',')
|
|
.map((schema) => schema.trim())
|
|
.filter((schema) => schema.length > 0)
|
|
}, [postgrestConfig?.db_schema])
|
|
|
|
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"
|
|
/>
|
|
</>
|
|
)
|
|
}
|