import type {ComponentProps, ReactNode} from 'react';
import {useState} from 'react';
import styled from '@emotion/styled';
import {LinkButton} from 'sentry/components/button';
import EmptyStateWarning from 'sentry/components/emptyStateWarning';
import Placeholder from 'sentry/components/placeholder';
import {Flex} from 'sentry/components/profiling/flex';
import QuestionTooltip from 'sentry/components/questionTooltip';
import Accordion from 'sentry/components/replays/accordion';
import TextOverflow from 'sentry/components/textOverflow';
import {IconCursorArrow, IconSearch} from 'sentry/icons';
import {t, tct} from 'sentry/locale';
import {space} from 'sentry/styles/space';
import useDeadRageSelectors from 'sentry/utils/replays/hooks/useDeadRageSelectors';
import type {ColorOrAlias} from 'sentry/utils/theme';
import {useLocation} from 'sentry/utils/useLocation';
import useOrganization from 'sentry/utils/useOrganization';
import {normalizeUrl} from 'sentry/utils/withDomainRequired';
import {
ContentContainer,
HeaderContainer,
HeaderTitleLegend,
Subtitle,
WidgetContainer,
} from 'sentry/views/profiling/landing/styles';
import ExampleReplaysList from 'sentry/views/replays/deadRageClick/exampleReplaysList';
import {
ProjectInfo,
SelectorLink,
transformSelectorQuery,
} from 'sentry/views/replays/deadRageClick/selectorTable';
function DeadRageSelectorCards() {
return (
{t('Most Dead Clicks')}
{t('Suggested replays to watch')}
}
deadOrRage="dead"
/>
{t('Most Rage Clicks')}
{t('Suggested replays to watch')}
}
deadOrRage="rage"
/>
);
}
function AccordionWidget({
clickType,
deadOrRage,
header,
}: {
clickType: 'count_dead_clicks' | 'count_rage_clicks';
deadOrRage: 'dead' | 'rage';
header: ReactNode;
}) {
const [selectedListIndex, setSelectListIndex] = useState(-1);
const {isLoading, isError, data} = useDeadRageSelectors({
per_page: 3,
sort: `-${clickType}`,
cursor: undefined,
prefix: 'selector_',
isWidgetData: true,
});
const location = useLocation();
const filteredData = data.filter(d => (d[clickType] ?? 0) > 0);
const clickColor = deadOrRage === 'dead' ? 'yellow300' : 'red300';
return (
{header}
{isLoading ? (
) : isError || (!isLoading && filteredData.length === 0) ? (
{t('No results found')}
{tct(
'There were no [type] clicks within this timeframe. Expand your timeframe, or increase your replay sample rate to see more data.',
{type: deadOrRage}
)}
) : (
{
const selectorQuery = `${deadOrRage}.selector:"${transformSelectorQuery(
d.dom_element.fullSelector
)}"`;
return {
header: (
),
content: (
),
};
})}
/>
)}
);
}
function AccordionItemHeader({
count,
clickColor,
selector,
selectorQuery,
id,
}: {
clickColor: ColorOrAlias;
count: number;
id: number;
selector: string;
selectorQuery: string;
}) {
const clickCount = (
{count}
);
return (
{clickCount}
);
}
function SearchButton({
label,
sort,
path,
...props
}: {
label: ReactNode;
path: string;
sort: string;
} & Omit, 'size' | 'to'>) {
const location = useLocation();
const organization = useOrganization();
return (
{label}
);
}
const SplitCardContainer = styled('div')`
display: grid;
grid-template-columns: 1fr 1fr;
grid-template-rows: max-content;
grid-auto-flow: column;
gap: 0 ${space(2)};
align-items: stretch;
`;
const ClickCount = styled(TextOverflow)`
color: ${p => p.theme.gray400};
display: grid;
grid-template-columns: auto auto;
gap: ${space(0.75)};
align-items: center;
`;
const StyledHeaderContainer = styled(HeaderContainer)`
grid-auto-flow: row;
align-items: center;
grid-template-rows: auto;
grid-template-columns: 30px auto;
`;
const LeftAlignedContentContainer = styled(ContentContainer)`
justify-content: flex-start;
`;
const CenteredContentContainer = styled(ContentContainer)`
justify-content: center;
`;
const StyledButton = styled(LinkButton)`
width: 100%;
border-radius: ${p => p.theme.borderRadiusBottom};
padding: ${space(3)};
border-bottom: none;
border-left: none;
border-right: none;
font-size: ${p => p.theme.fontSizeMedium};
background-color: transparent;
`;
const StyledAccordionHeader = styled('div')`
display: grid;
grid-template-columns: 1fr max-content;
flex: 1;
`;
const TitleTooltipContainer = styled('div')`
display: flex;
gap: ${space(1)};
align-items: center;
`;
const StyledWidgetHeader = styled(HeaderTitleLegend)`
display: grid;
justify-content: space-between;
align-items: center;
`;
const StyledWidgetContainer = styled(WidgetContainer)`
margin-bottom: 0;
padding-top: ${space(1.5)};
`;
export const RightAlignedCell = styled('div')`
text-align: right;
display: flex;
align-items: center;
justify-content: center;
gap: ${space(1)};
padding-left: ${space(1)};
`;
const EmptySubtitle = styled('div')`
font-size: ${p => p.theme.fontSizeMedium};
line-height: 1.6em;
padding-left: ${space(1)};
padding-right: ${space(1)};
`;
const LoadingContainer = styled(ContentContainer)`
gap: ${space(0.25)};
padding: ${space(1)} ${space(0.5)} 3px ${space(0.5)};
`;
const StyledPlaceholder = styled(Placeholder)`
height: 34px;
`;
const EmptyHeader = styled(Flex)`
justify-content: center;
align-items: center;
gap: ${space(1.5)};
color: ${p => p.theme.gray300};
`;
export default DeadRageSelectorCards;