import { IS_PLATFORM, useFlag, useParams } from 'common' import { MoreHorizontal, TrashIcon } from 'lucide-react' import { cloneElement, useState } from 'react' import { toast } from 'sonner' import { Button, Card, cn, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from 'ui' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' import { LOG_DRAIN_TYPES, LogDrainType } from './LogDrains.constants' import { LogDrainsCard } from './LogDrainsCard' import { LogDrainsEmpty } from './LogDrainsEmpty' import { VoteLink } from './VoteLink' import AlertError from '@/components/ui/AlertError' import { useDeleteLogDrainMutation } from '@/data/log-drains/delete-log-drain-mutation' import { LogDrainData, useLogDrainsQuery } from '@/data/log-drains/log-drains-query' import { useCheckEntitlements } from '@/hooks/misc/useCheckEntitlements' import { useTrack } from '@/lib/telemetry/track' export function LogDrains({ onNewDrainClick, onUpdateDrainClick: _onUpdateDrainClick, }: { onNewDrainClick: (src: LogDrainType) => void onUpdateDrainClick: (drain: LogDrainData) => void }) { const { hasAccess: hasAccessToLogDrains, isLoading: isLoadingEntitlement } = useCheckEntitlements('log_drains') const track = useTrack() const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false) const [selectedLogDrain, setSelectedLogDrain] = useState(null) const { ref } = useParams() const { data: logDrains, isPending: isLoading, error, isError, } = useLogDrainsQuery( { ref }, { enabled: hasAccessToLogDrains, } ) const sentryEnabled = useFlag('SentryLogDrain') const s3Enabled = useFlag('S3logdrain') const axiomEnabled = useFlag('axiomLogDrain') const otlpEnabled = useFlag('otlpLogDrain') const last9Enabled = useFlag('Last9LogDrain') const syslogEnabled = useFlag('syslogLogDrain') const hasLogDrains = !!logDrains?.length const { mutate: deleteLogDrain } = useDeleteLogDrainMutation({ onSuccess: () => { setIsDeleteModalOpen(false) setSelectedLogDrain(null) }, onError: () => { setIsDeleteModalOpen(false) setSelectedLogDrain(null) toast.error('Failed to delete log drain') }, }) if (isLoading || isLoadingEntitlement) { return (
) } if (!isLoadingEntitlement && !hasAccessToLogDrains) { return } if (isError) { return } if (!isLoading && !hasLogDrains) { return ( <>
{LOG_DRAIN_TYPES.filter((t) => { if (t.value === 'sentry') return sentryEnabled if (t.value === 's3') return s3Enabled if (t.value === 'axiom') return axiomEnabled if (t.value === 'otlp') return otlpEnabled if (t.value === 'last9') return last9Enabled if (t.value === 'syslog') return syslogEnabled return true }).map((src) => ( { onNewDrainClick(src.value) }} /> ))}
) } return ( <> Name Description Destination
Actions
{logDrains ?.slice() .sort((a, b) => b.id - a.id) .map((drain) => ( {drain.name} {drain.description || '-'}
{LOG_DRAIN_TYPES.find((t) => t.value === drain.type)?.icon && ( {cloneElement(LOG_DRAIN_TYPES.find((t) => t.value === drain.type)!.icon, { height: 16, width: 16, })} )} {LOG_DRAIN_TYPES.find((t) => t.value === drain.type)?.name ?? drain.type}
) }