eventDetails.tsx 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. import {createContext, useContext, useRef, useState} from 'react';
  2. import styled from '@emotion/styled';
  3. import {CommitRow} from 'sentry/components/commitRow';
  4. import {SuspectCommits} from 'sentry/components/events/suspectCommits';
  5. import {DatePageFilter} from 'sentry/components/organizations/datePageFilter';
  6. import {EnvironmentPageFilter} from 'sentry/components/organizations/environmentPageFilter';
  7. import {space} from 'sentry/styles/space';
  8. import usePageFilters from 'sentry/utils/usePageFilters';
  9. import {
  10. EventDetailsContent,
  11. type EventDetailsContentProps,
  12. } from 'sentry/views/issueDetails/groupEventDetails/groupEventDetailsContent';
  13. import {EventNavigation} from 'sentry/views/issueDetails/streamline/eventNavigation';
  14. import {EventSearch} from 'sentry/views/issueDetails/streamline/eventSearch';
  15. import {Section} from 'sentry/views/issueDetails/streamline/foldSection';
  16. export interface EventDetailsContextType {
  17. searchQuery: string;
  18. }
  19. const EventDetailsContext = createContext<EventDetailsContextType>({
  20. searchQuery: '',
  21. });
  22. export function useEventDetailsContext() {
  23. return useContext(EventDetailsContext);
  24. }
  25. export function EventDetails({
  26. group,
  27. event,
  28. project,
  29. }: Required<EventDetailsContentProps>) {
  30. const navRef = useRef<HTMLDivElement>(null);
  31. const {selection} = usePageFilters();
  32. const {environments} = selection;
  33. const [eventDetails, setEventDetails] = useState<EventDetailsContextType>({
  34. searchQuery: '',
  35. });
  36. return (
  37. <EventDetailsContext.Provider value={eventDetails}>
  38. <SuspectCommits
  39. project={project}
  40. eventId={event.id}
  41. group={group}
  42. commitRow={CommitRow}
  43. />
  44. <FilterContainer>
  45. <EnvironmentPageFilter />
  46. <SearchFilter
  47. group={group}
  48. handleSearch={searchQuery => {
  49. setEventDetails(details => ({...details, searchQuery}));
  50. }}
  51. environments={environments}
  52. query={eventDetails.searchQuery}
  53. />
  54. <DatePageFilter />
  55. </FilterContainer>
  56. <GroupContent navHeight={navRef?.current?.offsetHeight}>
  57. <FloatingEventNavigation event={event} group={group} ref={navRef} />
  58. <GroupContentPadding>
  59. <EventDetailsContent group={group} event={event} project={project} />
  60. </GroupContentPadding>
  61. </GroupContent>
  62. </EventDetailsContext.Provider>
  63. );
  64. }
  65. const FloatingEventNavigation = styled(EventNavigation)`
  66. position: sticky;
  67. top: 0;
  68. @media (max-width: ${p => p.theme.breakpoints.medium}) {
  69. top: ${p => p.theme.sidebar.mobileHeight};
  70. }
  71. background: ${p => p.theme.background};
  72. z-index: 100;
  73. border-radius: 6px 6px 0 0;
  74. `;
  75. const SearchFilter = styled(EventSearch)`
  76. border-radius: ${p => p.theme.borderRadius};
  77. `;
  78. const GroupContent = styled('div')<{navHeight?: number}>`
  79. border: 1px solid ${p => p.theme.translucentBorder};
  80. background: ${p => p.theme.background};
  81. border-radius: ${p => p.theme.borderRadius};
  82. position: relative;
  83. & ${Section} {
  84. scroll-margin-top: ${p => p.navHeight ?? 0}px;
  85. }
  86. `;
  87. const GroupContentPadding = styled('div')`
  88. padding: ${space(1)} ${space(1.5)};
  89. `;
  90. const FilterContainer = styled('div')`
  91. display: grid;
  92. grid-template-columns: auto 1fr auto;
  93. gap: ${space(1)};
  94. `;