| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- // @ts-nocheck
- import { PermissionAction } from '@supabase/shared-types/out/constants'
- import { IS_PLATFORM, useParams } from 'common'
- import { PlayCircle, StopCircle } from 'lucide-react'
- import { Dispatch, SetStateAction, useCallback } from 'react'
- import { Button } from 'ui'
- import { ChooseChannelPopover } from './ChooseChannelPopover'
- import { RealtimeFilterPopover } from './RealtimeFilterPopover'
- import { RealtimeTokensPopover } from './RealtimeTokensPopover'
- import { RealtimeConfig } from './useRealtimeMessages'
- import { ButtonTooltip } from '@/components/ui/ButtonTooltip'
- import { ShortcutTooltip } from '@/components/ui/ShortcutTooltip'
- import { getTemporaryAPIKey } from '@/data/api-keys/temp-api-keys-query'
- import { useSendEventMutation } from '@/data/telemetry/send-event-mutation'
- import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions'
- import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization'
- import { SHORTCUT_IDS } from '@/state/shortcuts/registry'
- import { useShortcut } from '@/state/shortcuts/useShortcut'
- interface HeaderProps {
- config: RealtimeConfig
- onChangeConfig: Dispatch<SetStateAction<RealtimeConfig>>
- channelPopoverOpen: boolean
- onChannelPopoverChange: (open: boolean) => void
- filterPopoverOpen: boolean
- onFilterPopoverChange: (open: boolean) => void
- }
- export const Header = ({
- config,
- onChangeConfig,
- channelPopoverOpen,
- onChannelPopoverChange,
- filterPopoverOpen,
- onFilterPopoverChange,
- }: HeaderProps) => {
- const { mutate: sendEvent } = useSendEventMutation()
- const { ref } = useParams()
- const { data: org } = useSelectedOrganizationQuery()
- const { can: canReadAPIKeys } = useAsyncCheckPermissions(
- PermissionAction.READ,
- 'service_api_keys'
- )
- const canToggleListening = canReadAPIKeys && config.channelName.length > 0
- const handleToggleListening = useCallback(async () => {
- const willStartListening = !config.enabled
- // [Joshen] Refresh if starting to listen + using temp API key, since it has a low refresh rate
- if (willStartListening && (config.token.startsWith('sb_temp') || !IS_PLATFORM)) {
- const data = await getTemporaryAPIKey({ projectRef: config.projectRef, expiry: 3600 })
- const token = data.api_key
- onChangeConfig({ ...config, token, enabled: !config.enabled })
- } else {
- onChangeConfig({ ...config, enabled: !config.enabled })
- }
- if (willStartListening) {
- sendEvent({
- action: 'realtime_inspector_listen_channel_clicked',
- groups: {
- project: ref ?? 'Unknown',
- organization: org?.slug ?? 'Unknown',
- },
- })
- }
- }, [config, onChangeConfig, sendEvent, ref, org])
- useShortcut(SHORTCUT_IDS.INSPECTOR_TOGGLE_LISTENING, handleToggleListening, {
- enabled: canToggleListening,
- })
- const listeningButton = (
- <Button
- size="tiny"
- type={config.enabled ? 'warning' : 'primary'}
- className="rounded-l-none border-l-0"
- disabled={!canToggleListening}
- icon={config.enabled ? <StopCircle size="16" /> : <PlayCircle size="16" />}
- onClick={handleToggleListening}
- >
- {config.enabled ? `Stop listening` : `Start listening`}
- </Button>
- )
- return (
- <div className="flex flex-row min-h-14 md:min-h-(--header-height) gap-2.5 items-center px-4 border-b ">
- <div className="flex flex-row">
- <ChooseChannelPopover
- config={config}
- onChangeConfig={onChangeConfig}
- open={channelPopoverOpen}
- onOpenChange={onChannelPopoverChange}
- />
- <RealtimeTokensPopover config={config} onChangeConfig={onChangeConfig} />
- {canToggleListening ? (
- <ShortcutTooltip shortcutId={SHORTCUT_IDS.INSPECTOR_TOGGLE_LISTENING} side="bottom">
- {listeningButton}
- </ShortcutTooltip>
- ) : (
- <ButtonTooltip
- size="tiny"
- type={config.enabled ? 'warning' : 'primary'}
- className="rounded-l-none border-l-0"
- disabled
- icon={config.enabled ? <StopCircle size="16" /> : <PlayCircle size="16" />}
- onClick={handleToggleListening}
- tooltip={{
- content: {
- side: 'bottom',
- text: !canReadAPIKeys
- ? 'You need additional permissions to use the realtime inspector'
- : config.channelName.length === 0
- ? 'You need to join a channel first'
- : undefined,
- },
- }}
- >
- {config.enabled ? `Stop listening` : `Start listening`}
- </ButtonTooltip>
- )}
- </div>
- <RealtimeFilterPopover
- config={config}
- onChangeConfig={onChangeConfig}
- open={filterPopoverOpen}
- onOpenChange={onFilterPopoverChange}
- />
- </div>
- )
- }
|