import {Fragment} from 'react'; import styled from '@emotion/styled'; import ProjectAvatar from 'sentry/components/avatar/projectAvatar'; import {CopyToClipboardButton} from 'sentry/components/copyToClipboardButton'; import {DropdownMenu} from 'sentry/components/dropdownMenu'; import ErrorBoundary from 'sentry/components/errorBoundary'; import Section from 'sentry/components/feedback/feedbackItem/feedbackItemSection'; import FeedbackItemUsername from 'sentry/components/feedback/feedbackItem/feedbackItemUsername'; import FeedbackViewers from 'sentry/components/feedback/feedbackItem/feedbackViewers'; import ReplaySection from 'sentry/components/feedback/feedbackItem/replaySection'; import useDeleteFeedback from 'sentry/components/feedback/feedbackItem/useDeleteFeedback'; import ObjectInspector from 'sentry/components/objectInspector'; import PanelItem from 'sentry/components/panels/panelItem'; import {Flex} from 'sentry/components/profiling/flex'; import TextCopyInput from 'sentry/components/textCopyInput'; import {IconChevron, IconEllipsis, IconJson, IconLink} from 'sentry/icons'; import {t} from 'sentry/locale'; import {space} from 'sentry/styles/space'; import {getShortEventId} from 'sentry/utils/events'; import type {HydratedFeedbackItem} from 'sentry/utils/feedback/item/types'; import useOrganization from 'sentry/utils/useOrganization'; interface Props { feedbackItem: HydratedFeedbackItem; } export default function FeedbackItem({feedbackItem}: Props) { const organization = useOrganization(); const {onDelete} = useDeleteFeedback({feedbackItem}); return ( {feedbackItem.metadata.contact_email ? ( ) : null} {feedbackItem.project.slug} {getShortEventId(feedbackItem.feedback_id)} {}, }, { key: 'archive', label: t('Archive'), onAction: () => {}, }, ]} /> , showChevron: false, size: 'xs', }} items={[ { key: 'mark read', label: t('Mark as read'), onAction: () => {}, }, { key: 'mark unread', label: t('Mark as unread'), onAction: () => {}, }, { key: 'delete', label: t('Delete'), onAction: onDelete, }, ]} />
{feedbackItem.metadata.message}
} title={t('Url')}> {'TODO'}
{feedbackItem.replay_id ? ( ) : null} {/* */}
} title={t('Raw')}>
); } const HeaderPanelItem = styled(PanelItem)` display: grid; padding: ${space(1)} ${space(2)}; `; const OverflowPanelItem = styled(PanelItem)` overflow: scroll; flex-direction: column; flex-grow: 1; gap: ${space(3)}; `; const Blockquote = styled('blockquote')` margin: 0 ${space(4)}; position: relative; &::before { position: absolute; color: ${p => p.theme.purple300}; content: '❝'; font-size: ${space(4)}; left: -${space(4)}; top: -0.4rem; } &::after { position: absolute; border: 1px solid ${p => p.theme.purple300}; bottom: 0; content: ''; left: -${space(1)}; top: 0; } & > pre { margin: 0; background: none; font-family: inherit; font-size: ${p => p.theme.fontSizeMedium}; line-height: 1.6; padding: 0; word-break: break-word; } `;