import {useState} from 'react'; import styled from '@emotion/styled'; import {Panel, PanelBody} from 'sentry/components/panels'; import {IconArrow, IconGlobe, IconGraph, IconMenu, IconNumber} from 'sentry/icons'; import {IconGraphArea} from 'sentry/icons/iconGraphArea'; import {IconGraphBar} from 'sentry/icons/iconGraphBar'; import space from 'sentry/styles/space'; import {DisplayType} from '../types'; import {WidgetTemplate} from './data'; type Props = { selectedWidgets: WidgetTemplate[]; setErrored: (errored: boolean) => void; setSelectedWidgets: (widgets: WidgetTemplate[]) => void; widget: WidgetTemplate; ['data-test-id']?: string; }; export function getWidgetIcon(displayType: DisplayType) { switch (displayType) { case DisplayType.TABLE: return IconMenu; case DisplayType.WORLD_MAP: return IconGlobe; case DisplayType.BIG_NUMBER: return IconNumber; case DisplayType.BAR: return IconGraphBar; case DisplayType.TOP_N: return IconArrow; case DisplayType.AREA: return IconGraphArea; case DisplayType.LINE: default: return IconGraph; } } function WidgetLibraryCard({ selectedWidgets, widget, setSelectedWidgets, ['data-test-id']: dataTestId, }: Props) { const [selected, setSelected] = useState(selectedWidgets.includes(widget)); const Icon = getWidgetIcon(widget.displayType); return ( { if (selected) { const updatedWidgets = selectedWidgets.filter( selectedWidget => widget !== selectedWidget ); setSelectedWidgets(updatedWidgets); } else { const updatedWidgets = selectedWidgets.slice().concat(widget); setSelectedWidgets(updatedWidgets); } setSelected(!selected); }} > {widget.title} {widget.description} ); } const Title = styled('div')` padding-left: ${space(1)}; font-size: 16px; line-height: 140%; color: ${p => p.theme.gray500}; `; const TitleContainer = styled('div')` padding: ${space(1.5)} ${space(2)}; padding-bottom: ${space(0.5)}; display: flex; align-items: center; `; const Description = styled('div')` padding: 0 ${space(1)} ${space(1.5)} 36px; font-size: 14px; line-height: 21px; color: ${p => p.theme.gray300}; `; type PanelProps = { selected?: boolean; }; const StyledPanel = styled(Panel)` border: ${p => p.selected ? `2px solid ${p.theme.active}` : `1px solid ${p.theme.border}`}; margin: ${p => (p.selected ? '-1px' : 0)}; box-sizing: border-box; box-shadow: 0px 2px 1px rgba(0, 0, 0, 0.08); cursor: pointer; `; export default WidgetLibraryCard;