Files
Francesco Sansalvadore bd9e78b209 chore: dashboard header alignments (#42769)
Align borders to match header heights.

<img width="2904" height="1734" alt="shot_2026-02-04_at_08 42 21z_2x"
src="https://github.com/user-attachments/assets/0538f8eb-64a5-4329-94fb-3ea4feed847d"
/>
2026-02-13 11:48:12 +01:00

90 lines
3.3 KiB
TypeScript

import { useParams } from 'common'
import { useDatabasePublicationsQuery } from 'data/database-publications/database-publications-query'
import { useSendEventMutation } from 'data/telemetry/send-event-mutation'
import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization'
import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject'
import { useEffect, useState } from 'react'
import { EmptyRealtime } from './EmptyRealtime'
import { Header } from './Header'
import MessagesTable from './MessagesTable'
import { SendMessageModal } from './SendMessageModal'
import { RealtimeConfig, useRealtimeMessages } from './useRealtimeMessages'
/**
* Acts as a container component for the entire log display
*/
export const RealtimeInspector = () => {
const { ref } = useParams()
const { data: org } = useSelectedOrganizationQuery()
const { data: project } = useSelectedProjectQuery()
// Check if realtime publications are available
const { data: publications } = useDatabasePublicationsQuery({
projectRef: project?.ref,
connectionString: project?.connectionString,
})
const realtimePublication = (publications ?? []).find(
(publication) => publication.name === 'supabase_realtime'
)
const isRealtimeAvailable =
!!realtimePublication &&
((realtimePublication?.tables ?? []).length > 0 || realtimePublication?.tables === null)
const [sendMessageShown, setSendMessageShown] = useState(false)
const [realtimeConfig, setRealtimeConfig] = useState<RealtimeConfig>({
enabled: false,
projectRef: ref!,
channelName: '',
logLevel: 'info',
token: '', // will be filled out by RealtimeTokensPopover
schema: 'public',
table: '*',
isChannelPrivate: false,
filter: undefined,
bearer: null,
enablePresence: true,
enableDbChanges: isRealtimeAvailable, // Initialize based on publications availability
enableBroadcast: true,
})
const { mutate: sendEvent } = useSendEventMutation()
const { logData, sendMessage } = useRealtimeMessages(realtimeConfig, setRealtimeConfig)
// Update enableDbChanges when publications change
useEffect(() => {
setRealtimeConfig((prev) => ({ ...prev, enableDbChanges: isRealtimeAvailable }))
}, [isRealtimeAvailable])
return (
<div className="flex flex-col grow h-full">
<Header config={realtimeConfig} onChangeConfig={setRealtimeConfig} />
<div className="relative flex flex-col grow">
<div className="flex grow">
{(logData ?? []).length > 0 ? (
<MessagesTable
hasChannelSet={realtimeConfig.channelName.length > 0}
enabled={realtimeConfig.enabled}
data={logData}
showSendMessage={() => setSendMessageShown(true)}
/>
) : (
<EmptyRealtime projectRef={ref!} />
)}
</div>
</div>
<SendMessageModal
visible={sendMessageShown}
onSelectCancel={() => setSendMessageShown(false)}
onSelectConfirm={(v) => {
sendEvent({
action: 'realtime_inspector_broadcast_sent',
groups: { project: ref ?? 'Unknown', organization: org?.slug ?? 'Unknown' },
})
sendMessage(v.message, v.payload, () => setSendMessageShown(false))
}}
/>
</div>
)
}