content.tsx 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import {useMemo} from 'react';
  2. import styled from '@emotion/styled';
  3. import {Location} from 'history';
  4. import {SectionHeading} from 'sentry/components/charts/styles';
  5. import * as Layout from 'sentry/components/layouts/thirds';
  6. import Pagination from 'sentry/components/pagination';
  7. import {FunctionsTable} from 'sentry/components/profiling/functionsTable';
  8. import {ProfilesTable} from 'sentry/components/profiling/profilesTable';
  9. import {t} from 'sentry/locale';
  10. import space from 'sentry/styles/space';
  11. import {PageFilters, Project} from 'sentry/types';
  12. import {useFunctions} from 'sentry/utils/profiling/hooks/useFunctions';
  13. import {useProfiles} from 'sentry/utils/profiling/hooks/useProfiles';
  14. import {decodeScalar} from 'sentry/utils/queryString';
  15. const PROFILES_COLUMN_ORDER = [
  16. 'failed',
  17. 'id',
  18. 'timestamp',
  19. 'device_model',
  20. 'device_classification',
  21. 'trace_duration_ms',
  22. ] as const;
  23. interface ProfileSummaryContentProps {
  24. location: Location;
  25. project: Project;
  26. query: string;
  27. transaction: string;
  28. selection?: PageFilters;
  29. }
  30. function ProfileSummaryContent(props: ProfileSummaryContentProps) {
  31. const cursor = useMemo(
  32. () => decodeScalar(props.location.query.cursor),
  33. [props.location.query.cursor]
  34. );
  35. const profiles = useProfiles({
  36. cursor,
  37. limit: 5,
  38. query: props.query,
  39. selection: props.selection,
  40. });
  41. const functions = useFunctions({
  42. project: props.project,
  43. query: props.query,
  44. selection: props.selection,
  45. transaction: props.transaction,
  46. });
  47. return (
  48. <Layout.Main fullWidth>
  49. <TableHeader>
  50. <SectionHeading>{t('Recent Profiles')}</SectionHeading>
  51. <StyledPagination
  52. pageLinks={profiles.type === 'resolved' ? profiles.data.pageLinks : null}
  53. size="xsmall"
  54. />
  55. </TableHeader>
  56. <ProfilesTable
  57. error={profiles.type === 'errored' ? profiles.error : null}
  58. isLoading={profiles.type === 'initial' || profiles.type === 'loading'}
  59. traces={profiles.type === 'resolved' ? profiles.data.traces : []}
  60. columnOrder={PROFILES_COLUMN_ORDER}
  61. />
  62. <FunctionsTable
  63. error={functions.type === 'errored' ? functions.error : null}
  64. functionCalls={functions.type === 'resolved' ? functions.data : []}
  65. isLoading={functions.type === 'initial' || functions.type === 'loading'}
  66. project={props.project}
  67. />
  68. </Layout.Main>
  69. );
  70. }
  71. const TableHeader = styled('div')`
  72. display: flex;
  73. justify-content: space-between;
  74. margin-bottom: ${space(1)};
  75. `;
  76. const StyledPagination = styled(Pagination)`
  77. margin: 0 0 0 ${space(1)};
  78. `;
  79. export {ProfileSummaryContent};