import { useCallback, useMemo, useRef, MouseEvent } from 'react'; import { LogRowContextOptions, LogRowModel } from '@grafana/data'; import { DataQuery } from '@grafana/schema'; import { Dropdown, IconButton, Menu } from '@grafana/ui'; import { t } from 'app/core/internationalization'; import { copyText, handleOpenLogsContextClick } from '../../utils'; import { LogLineStyles } from './LogLine'; import { useLogIsPinned, useLogListContext } from './LogListContext'; import { LogListModel } from './processing'; export type GetRowContextQueryFn = ( row: LogRowModel, options?: LogRowContextOptions, cacheFilters?: boolean ) => Promise; interface Props { log: LogListModel; styles: LogLineStyles; } export const LogLineMenu = ({ log, styles }: Props) => { const { getRowContextQuery, onOpenContext, onPermalinkClick, onPinLine, onUnpinLine, logSupportsContext } = useLogListContext(); const pinned = useLogIsPinned(log); const menuRef = useRef(null); const copyLogLine = useCallback(() => { copyText(log.entry, menuRef); }, [log.entry]); const copyLinkToLogLine = useCallback(() => { onPermalinkClick?.(log); }, [log, onPermalinkClick]); const shouldlogSupportsContext = useMemo( () => (logSupportsContext ? logSupportsContext(log) : false), [log, logSupportsContext] ); const showContext = useCallback( async (event: MouseEvent) => { handleOpenLogsContextClick(event, log, getRowContextQuery, (log: LogRowModel) => onOpenContext?.(log, () => {})); }, [onOpenContext, getRowContextQuery, log] ); const togglePinning = useCallback(() => { if (pinned) { onUnpinLine?.(log); } else { onPinLine?.(log); } }, [log, onPinLine, onUnpinLine, pinned]); const menu = useCallback( () => ( {onPermalinkClick && log.rowId !== undefined && log.uid && ( )} {(shouldlogSupportsContext || onPinLine || onUnpinLine) && } {shouldlogSupportsContext && ( )} {!pinned && onPinLine && ( )} {pinned && onUnpinLine && ( )} ), [ copyLinkToLogLine, copyLogLine, log.rowId, log.uid, onPermalinkClick, onPinLine, onUnpinLine, pinned, shouldlogSupportsContext, showContext, togglePinning, ] ); return ( ); };