import { useParams } from 'common' import dayjs from 'dayjs' import { RefreshCw, StopCircle } from 'lucide-react' import { useEffect, useState } from 'react' import { toast } from 'sonner' import { Button, cn, Sheet, SheetContent, SheetDescription, SheetHeader, SheetSection, SheetTitle, Tooltip, TooltipContent, TooltipTrigger, } from 'ui' import { CodeBlock } from 'ui-patterns/CodeBlock' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' import AlertError from '@/components/ui/AlertError' import { useReadReplicasQuery } from '@/data/read-replicas/replicas-query' import { useQueryAbortMutation } from '@/data/sql/abort-query-mutation' import { useOngoingQueriesQuery } from '@/data/sql/ongoing-queries-query' import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' import { useUrlState } from '@/hooks/ui/useUrlState' import { IS_PLATFORM } from '@/lib/constants' import { useAppStateSnapshot } from '@/state/app-state' import { useDatabaseSelectorStateSnapshot } from '@/state/database-selector' import type { ResponseError } from '@/types' export const OngoingQueriesPanel = () => { const [_, setParams] = useUrlState({ replace: true }) const { viewOngoingQueries } = useParams() const { data: project } = useSelectedProjectQuery() const state = useDatabaseSelectorStateSnapshot() const appState = useAppStateSnapshot() const [selectedId, setSelectedId] = useState() const { data: databases } = useReadReplicasQuery({ projectRef: project?.ref }) const database = (databases ?? []).find((db) => db.identifier === state.selectedDatabaseId) const { data, error, isError, isPending: isLoadingOngoingQueries, isFetching: isFetchingOngoingQueries, refetch, } = useOngoingQueriesQuery( { projectRef: project?.ref, connectionString: database?.connectionString, }, { enabled: !IS_PLATFORM || (IS_PLATFORM && database?.connectionString !== undefined), staleTime: 5000, } ) const queries = data ?? [] useEffect(() => { if (viewOngoingQueries) { appState.setOnGoingQueriesPanelOpen(true) setParams({ viewOngoingQueries: undefined }) } }, [viewOngoingQueries]) const { mutate: abortQuery, isPending } = useQueryAbortMutation({ onSuccess: () => { toast.success(`Successfully aborted query (ID: ${selectedId})`) setSelectedId(undefined) }, }) const closePanel = () => { setParams({ viewOngoingQueries: undefined }) appState.setOnGoingQueriesPanelOpen(false) } return ( <> closePanel()}> Running queries on{' '} {database?.identifier === project?.ref ? 'primary database' : 'read replica'} )} {queries.map((query) => (
code]:m-0 [&>code>span]:flex [&>code>span]:flex-wrap' )} />

PID: {query.pid}

Started since: {dayjs(query.query_start).format('DD MMM YYYY HH:mm (ZZ)')}