import React, { useContext, useState } from 'react'; import { FormattedMessage, useIntl } from '@edx/frontend-platform/i18n'; import { ActionRow, Icon, IconButton, Dropdown, } from '@openedx/paragon'; import { MoreVert } from '@openedx/paragon/icons'; import { Link } from 'react-router-dom'; import { updateClipboard } from '../../generic/data/api'; import { ToastContext } from '../../generic/toast-context'; import { type ContentHit } from '../../search-manager'; import { LibraryContext } from '../common/context'; import messages from './messages'; import { STUDIO_CLIPBOARD_CHANNEL } from '../../constants'; import { getEditUrl } from './utils'; import BaseComponentCard from './BaseComponentCard'; type ComponentCardProps = { contentHit: ContentHit, blockTypeDisplayName: string, }; export const ComponentMenu = ({ usageKey }: { usageKey: string }) => { const intl = useIntl(); const editUrl = usageKey && getEditUrl(usageKey); const { showToast } = useContext(ToastContext); const [clipboardBroadcastChannel] = useState(() => new BroadcastChannel(STUDIO_CLIPBOARD_CHANNEL)); const updateClipboardClick = () => { updateClipboard(usageKey) .then((clipboardData) => { clipboardBroadcastChannel.postMessage(clipboardData); showToast(intl.formatMessage(messages.copyToClipboardSuccess)); }) .catch(() => showToast(intl.formatMessage(messages.copyToClipboardError))); }; return ( e.stopPropagation()}> ); }; const ComponentCard = ({ contentHit, blockTypeDisplayName } : ComponentCardProps) => { const { openComponentInfoSidebar, } = useContext(LibraryContext); const { blockType, formatted, tags, usageKey, } = contentHit; const description: string = (/* eslint-disable */ blockType === 'html' ? formatted?.content?.htmlContent : blockType === 'problem' ? formatted?.content?.capaContent : undefined ) ?? '';/* eslint-enable */ const displayName = formatted?.displayName ?? ''; return ( )} blockTypeDisplayName={blockTypeDisplayName} openInfoSidebar={() => openComponentInfoSidebar(usageKey)} /> ); }; export default ComponentCard;