Files
supabase__supabase/apps/studio/components/layouts/ObservabilityLayout/ObservabilityMenu.utils.tsx
Joshen Lim db0e6b761b Joshenlim/fe 4304 bring database connections out of feature preview (#50107)
## Context

As per PR title - we're bringing Database Connections out of feature
preview and it'll live on the dashboard by default 🙂
Also deprecating the existing Ongoing queries panel which Database
Connections now supercedes.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Database Connections is now available without feature-preview
activation.
* The SQL editor’s “View running queries” option now links directly to
Database Connections.

* **Bug Fixes**
* Query cancellation and session termination now refresh database
activity data.

* **Removed**
* Removed the in-editor ongoing queries panel and its termination
controls.
* Removed the Database Connections promotional banner, preview
messaging, settings, and related telemetry.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-09-08 17:26:24 +08:00

210 lines
5.7 KiB
TypeScript

import { useFlag, useParams } from 'common'
import { useRouter } from 'next/router'
import { useMemo } from 'react'
import { useSupamonitorStatus } from '@/components/interfaces/QueryPerformance/hooks/useSupamonitorStatus'
import { useContentQuery, type Content, type ContentBase } from '@/data/content/content-query'
import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled'
import { IS_PLATFORM } from '@/lib/constants'
import { SHORTCUT_IDS, type ShortcutId } from '@/state/shortcuts/registry'
import { type Dashboards } from '@/types'
interface ObservabilityMenuItem {
name: string
key: string
url: string
shortcutId?: ShortcutId
}
export interface ObservabilityMenuSection {
title: string
key: string
items: ObservabilityMenuItem[]
}
const usePreservedQueryParams = () => {
const router = useRouter()
// Preserve date range query parameters when navigating
const preservedQueryParams = useMemo(() => {
const { its, ite, isHelper, helperText } = router.query
const params = new URLSearchParams()
if (its && typeof its === 'string') params.set('its', its)
if (ite && typeof ite === 'string') params.set('ite', ite)
if (isHelper && typeof isHelper === 'string') params.set('isHelper', isHelper)
if (helperText && typeof helperText === 'string') params.set('helperText', helperText)
const queryString = params.toString()
return queryString ? `?${queryString}` : ''
}, [router.query])
return preservedQueryParams
}
export const useGenerateObservabilityMenu = () => {
const { ref } = useParams()
const preservedQueryParams = usePreservedQueryParams()
const { isSupamonitorEnabled } = useSupamonitorStatus()
const showOverview = useFlag('observabilityOverview')
const storageSupported = useIsFeatureEnabled('project_storage:all')
const baseUrl = `/project/${ref}/observability`
const generalItems: ObservabilityMenuItem[] = [
...(showOverview
? [
{
name: 'Overview',
key: 'observability',
url: `${baseUrl}${preservedQueryParams}`,
shortcutId: SHORTCUT_IDS.NAV_OBSERVABILITY_OVERVIEW,
},
]
: []),
...(isSupamonitorEnabled
? [
{
name: 'Query Insights',
key: 'query-insights',
url: `${baseUrl}/query-insights${preservedQueryParams}`,
shortcutId: SHORTCUT_IDS.NAV_OBSERVABILITY_QUERY_PERFORMANCE,
},
]
: [
{
name: 'Query Performance',
key: 'query-performance',
url: `${baseUrl}/query-performance${preservedQueryParams}`,
shortcutId: SHORTCUT_IDS.NAV_OBSERVABILITY_QUERY_PERFORMANCE,
},
]),
...(IS_PLATFORM
? [
{
name: 'API Gateway',
key: 'api-overview',
url: `${baseUrl}/api-overview${preservedQueryParams}`,
shortcutId: SHORTCUT_IDS.NAV_OBSERVABILITY_API_GATEWAY,
},
]
: []),
{
name: 'Database Connections',
key: 'connections',
url: `${baseUrl}/connections`,
shortcutId: SHORTCUT_IDS.NAV_OBSERVABILITY_CONNECTIONS,
},
]
const productItems: ObservabilityMenuItem[] = [
{
name: 'Database',
key: 'database',
url: `${baseUrl}/database${preservedQueryParams}`,
shortcutId: SHORTCUT_IDS.NAV_OBSERVABILITY_DATABASE,
},
{
name: 'Data API',
key: 'postgrest',
url: `${baseUrl}/postgrest${preservedQueryParams}`,
shortcutId: SHORTCUT_IDS.NAV_OBSERVABILITY_DATA_API,
},
{
name: 'Auth',
key: 'auth',
url: `${baseUrl}/auth${preservedQueryParams}`,
shortcutId: SHORTCUT_IDS.NAV_OBSERVABILITY_AUTH,
},
{
name: 'Edge Functions',
key: 'edge-functions',
url: `${baseUrl}/edge-functions${preservedQueryParams}`,
shortcutId: SHORTCUT_IDS.NAV_OBSERVABILITY_FUNCTIONS,
},
...(storageSupported
? [
{
name: 'Storage',
key: 'storage',
url: `${baseUrl}/storage${preservedQueryParams}`,
shortcutId: SHORTCUT_IDS.NAV_OBSERVABILITY_STORAGE,
},
]
: []),
{
name: 'Realtime',
key: 'realtime',
url: `${baseUrl}/realtime${preservedQueryParams}`,
shortcutId: SHORTCUT_IDS.NAV_OBSERVABILITY_REALTIME,
},
]
const sections: ObservabilityMenuSection[] = [
{
title: 'GENERAL',
key: 'general-section',
items: generalItems,
},
]
if (IS_PLATFORM) {
sections.push({
title: 'PRODUCT',
key: 'product-section',
items: productItems,
})
}
return sections
}
function isReportContent(c: Content): c is ContentBase & {
type: 'report'
content: Dashboards.Content
} {
return c.type === 'report'
}
export const useGenerateCustomReportsMenu = () => {
const { ref } = useParams()
const preservedQueryParams = usePreservedQueryParams()
const { data: content, isPending: isLoading } = useContentQuery({
projectRef: ref,
type: 'report',
})
function getReportMenuItems() {
if (!content) return []
const reports = content?.content.filter(isReportContent)
const sortedReports = reports?.sort((a, b) => {
if (a.name < b.name) {
return -1
}
if (a.name > b.name) {
return 1
}
return 0
})
const reportMenuItems = sortedReports.map((r, idx) => ({
id: r.id,
name: r.name,
description: r.description || '',
key: r.id || idx + '-report',
url: `/project/${ref}/observability/${r.id}${preservedQueryParams}`,
hasDropdownActions: true,
report: r,
}))
return reportMenuItems
}
const data = getReportMenuItems()
return { data, isLoading }
}