mirror of
https://github.com/supabase/supabase.git
synced 2026-10-12 21:05:06 +03:00
* Bump the deps, refactor deprecated code.
* Migrate keepPreviousData usage.
* Migrate all uses of InfiniteQuery.
* Fix refetchInterval in queries.
* Migrate all use of isLoading to isPending in mutations.
* Fix accessing location in claim-project.
* Fix a bug in duplicate query keys.
* Migrate all queries to use isPending.
* Revert "Fix accessing location in claim-project."
This reverts commit 2a07df64b5.
* Revert the rss.xml file to master.
95 lines
3.4 KiB
TypeScript
95 lines
3.4 KiB
TypeScript
import { PostgresTrigger } from '@supabase/postgres-meta'
|
|
import { PermissionAction } from '@supabase/shared-types/out/constants'
|
|
import { parseAsBoolean, useQueryState } from 'nuqs'
|
|
import { useRef } from 'react'
|
|
import { toast } from 'sonner'
|
|
|
|
import DeleteHookModal from 'components/interfaces/Database/Hooks/DeleteHookModal'
|
|
import { EditHookPanel } from 'components/interfaces/Database/Hooks/EditHookPanel'
|
|
import { HooksList } from 'components/interfaces/Database/Hooks/HooksList/HooksList'
|
|
import NoPermission from 'components/ui/NoPermission'
|
|
import { useDatabaseHooksQuery } from 'data/database-triggers/database-triggers-query'
|
|
import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions'
|
|
import { handleErrorOnDelete, useQueryStateWithSelect } from 'hooks/misc/useQueryStateWithSelect'
|
|
import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject'
|
|
|
|
export const WebhooksListTab = () => {
|
|
const { data: project } = useSelectedProjectQuery()
|
|
|
|
// Track the ID being deleted to exclude it from error checking
|
|
const deletingHookIdRef = useRef<string | null>(null)
|
|
|
|
const [showCreateHookForm, setShowCreateHookForm] = useQueryState(
|
|
'new',
|
|
parseAsBoolean.withDefault(false).withOptions({ history: 'push', clearOnDefault: true })
|
|
)
|
|
|
|
const { can: canReadWebhooks, isSuccess: isPermissionsLoaded } = useAsyncCheckPermissions(
|
|
PermissionAction.TENANT_SQL_ADMIN_READ,
|
|
'triggers'
|
|
)
|
|
|
|
const { data: hooks, isPending: isLoadingHooks } = useDatabaseHooksQuery({
|
|
projectRef: project?.ref,
|
|
connectionString: project?.connectionString,
|
|
})
|
|
|
|
const { setValue: setSelectedHookToEdit, value: selectedHookToEdit } = useQueryStateWithSelect({
|
|
urlKey: 'edit',
|
|
select: (id: string) => (id ? hooks?.find((hook) => hook.id.toString() === id) : undefined),
|
|
enabled: !!hooks && !isLoadingHooks,
|
|
onError: () => toast.error(`Webhook not found`),
|
|
})
|
|
|
|
const { setValue: setSelectedHookToDelete, value: selectedHookToDelete } =
|
|
useQueryStateWithSelect({
|
|
urlKey: 'delete',
|
|
select: (id: string) => (id ? hooks?.find((hook) => hook.id.toString() === id) : undefined),
|
|
enabled: !!hooks && !isLoadingHooks,
|
|
onError: (_error, selectedId) =>
|
|
handleErrorOnDelete(deletingHookIdRef, selectedId, `Webhook not found`),
|
|
})
|
|
|
|
const createHook = () => {
|
|
setShowCreateHookForm(true)
|
|
}
|
|
|
|
const editHook = (hook: PostgresTrigger) => {
|
|
setSelectedHookToEdit(hook.id.toString())
|
|
}
|
|
|
|
const deleteHook = (hook: PostgresTrigger) => {
|
|
setSelectedHookToDelete(hook.id.toString())
|
|
}
|
|
|
|
if (isPermissionsLoaded && !canReadWebhooks) {
|
|
return <NoPermission isFullPage resourceText="view database webhooks" />
|
|
}
|
|
|
|
return (
|
|
<div className="p-10">
|
|
<HooksList createHook={createHook} editHook={editHook} deleteHook={deleteHook} />
|
|
<EditHookPanel
|
|
key={selectedHookToEdit?.id}
|
|
visible={showCreateHookForm || !!selectedHookToEdit}
|
|
selectedHook={selectedHookToEdit}
|
|
onClose={() => {
|
|
setShowCreateHookForm(false)
|
|
setSelectedHookToEdit(null)
|
|
}}
|
|
/>
|
|
<DeleteHookModal
|
|
visible={!!selectedHookToDelete}
|
|
selectedHook={selectedHookToDelete}
|
|
onClose={() => {
|
|
deletingHookIdRef.current = null
|
|
setSelectedHookToDelete(null)
|
|
}}
|
|
onDeleteStart={(hookId: string) => {
|
|
deletingHookIdRef.current = hookId
|
|
}}
|
|
/>
|
|
</div>
|
|
)
|
|
}
|