useEventMarkLineSeries.tsx 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. import {useTheme} from '@emotion/react';
  2. import type {LineSeriesOption} from 'echarts';
  3. import MarkLine from 'sentry/components/charts/components/markLine';
  4. import {t} from 'sentry/locale';
  5. import type {Event} from 'sentry/types/event';
  6. import type {Group} from 'sentry/types/group';
  7. import {getFormattedDate} from 'sentry/utils/dates';
  8. import {getShortEventId} from 'sentry/utils/events';
  9. import {useNavigate} from 'sentry/utils/useNavigate';
  10. import useOrganization from 'sentry/utils/useOrganization';
  11. import {useIssueDetailsEventView} from 'sentry/views/issueDetails/streamline/hooks/useIssueDetailsDiscoverQuery';
  12. function useEventMarklineSeries({
  13. events,
  14. group,
  15. markLineProps = {},
  16. }: {
  17. events: Event[];
  18. group: Group;
  19. markLineProps?: Partial<LineSeriesOption['markLine']>;
  20. }) {
  21. const theme = useTheme();
  22. const navigate = useNavigate();
  23. const organization = useOrganization();
  24. const eventView = useIssueDetailsEventView({group});
  25. const baseEventsPath = `/organizations/${organization.slug}/issues/${group.id}/events/`;
  26. const markLine = events.length
  27. ? MarkLine({
  28. animation: false,
  29. lineStyle: {
  30. color: theme.pink200,
  31. type: 'solid',
  32. },
  33. label: {
  34. show: false,
  35. },
  36. data: events.map(event => ({
  37. xAxis: +new Date(event.dateCreated ?? event.dateReceived),
  38. name: getShortEventId(event.id),
  39. value: getShortEventId(event.id),
  40. onClick: () => {
  41. navigate({
  42. pathname: `${baseEventsPath}${event.id}/`,
  43. });
  44. },
  45. label: {
  46. formatter: () => getShortEventId(event.id),
  47. },
  48. })),
  49. tooltip: {
  50. trigger: 'item',
  51. formatter: ({data}: any) => {
  52. const time = getFormattedDate(data.value, 'MMM D, YYYY LT', {
  53. local: !eventView.utc,
  54. });
  55. return [
  56. '<div class="tooltip-series">',
  57. `<div><span class="tooltip-label"><strong>${data.name}</strong></span></div>`,
  58. '</div>',
  59. `<div class="tooltip-footer">${time}</div>`,
  60. '<div class="tooltip-arrow"></div>',
  61. ].join('');
  62. },
  63. },
  64. ...markLineProps,
  65. })
  66. : undefined;
  67. return {
  68. seriesName: t('Specific Events'),
  69. data: [],
  70. markLine,
  71. color: theme.pink200,
  72. type: 'line',
  73. };
  74. }
  75. export function useCurrentEventMarklineSeries({
  76. event,
  77. group,
  78. markLineProps = {},
  79. }: {
  80. group: Group;
  81. event?: Event;
  82. markLineProps?: Partial<LineSeriesOption['markLine']>;
  83. }) {
  84. const eventView = useIssueDetailsEventView({group});
  85. const result = useEventMarklineSeries({
  86. events: event ? [event] : [],
  87. group,
  88. markLineProps: {
  89. tooltip: {
  90. trigger: 'item',
  91. formatter: ({data}: any) => {
  92. const time = getFormattedDate(data.value, 'MMM D, YYYY LT', {
  93. local: !eventView.utc,
  94. });
  95. return [
  96. '<div class="tooltip-series">',
  97. `<div><span class="tooltip-label"><strong>${t(
  98. 'Current Event'
  99. )}</strong></span></div>`,
  100. '</div>',
  101. `<div class="tooltip-footer">${time}</div>`,
  102. '<div class="tooltip-arrow"></div>',
  103. ].join('');
  104. },
  105. },
  106. ...markLineProps,
  107. },
  108. });
  109. return {
  110. ...result,
  111. seriesName: t('Current Event'),
  112. };
  113. }