groupEvents.tsx 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import {useCallback} from 'react';
  2. import styled from '@emotion/styled';
  3. import * as Layout from 'sentry/components/layouts/thirds';
  4. import {space} from 'sentry/styles/space';
  5. import type {Group} from 'sentry/types/group';
  6. import type {RouteComponentProps} from 'sentry/types/legacyReactRouter';
  7. import {browserHistory} from 'sentry/utils/browserHistory';
  8. import {ISSUE_PROPERTY_FIELDS} from 'sentry/utils/fields';
  9. import normalizeUrl from 'sentry/utils/url/normalizeUrl';
  10. import useCleanQueryParamsOnRouteLeave from 'sentry/utils/useCleanQueryParamsOnRouteLeave';
  11. import useOrganization from 'sentry/utils/useOrganization';
  12. import {EventSearch} from 'sentry/views/issueDetails/streamline/eventSearch';
  13. import AllEventsTable from './allEventsTable';
  14. interface Props extends RouteComponentProps<{groupId: string}, {}> {
  15. environments: string[];
  16. group: Group;
  17. }
  18. export const ALL_EVENTS_EXCLUDED_TAGS = [
  19. 'environment',
  20. 'performance.issue_ids',
  21. 'transaction.op',
  22. 'transaction.status',
  23. ...ISSUE_PROPERTY_FIELDS,
  24. ];
  25. function GroupEvents({params, location, group, environments}: Props) {
  26. const organization = useOrganization();
  27. const {groupId} = params;
  28. useCleanQueryParamsOnRouteLeave({
  29. fieldsToClean: ['cursor', 'query'],
  30. shouldClean: newLocation => newLocation.pathname.includes(`/issues/${group.id}/`),
  31. });
  32. const handleSearch = useCallback(
  33. (query: string) =>
  34. browserHistory.push(
  35. normalizeUrl({
  36. pathname: `/organizations/${organization.slug}/issues/${groupId}/events/`,
  37. query: {...location.query, query},
  38. })
  39. ),
  40. [location, organization, groupId]
  41. );
  42. const query = location.query?.query ?? '';
  43. return (
  44. <Layout.Body>
  45. <Layout.Main fullWidth>
  46. <AllEventsFilters>
  47. <EventSearch
  48. environments={environments}
  49. group={group}
  50. handleSearch={handleSearch}
  51. query={query}
  52. />
  53. </AllEventsFilters>
  54. <AllEventsTable
  55. issueId={group.id}
  56. location={location}
  57. organization={organization}
  58. group={group}
  59. excludedTags={ALL_EVENTS_EXCLUDED_TAGS}
  60. />
  61. </Layout.Main>
  62. </Layout.Body>
  63. );
  64. }
  65. const AllEventsFilters = styled('div')`
  66. margin-bottom: ${space(2)};
  67. `;
  68. export default GroupEvents;