import {useCallback, useMemo, useState} from 'react'; import {browserHistory} from 'react-router'; import styled from '@emotion/styled'; import {Location} from 'history'; import CompactSelect from 'sentry/components/compactSelect'; import * as Layout from 'sentry/components/layouts/thirds'; import Pagination from 'sentry/components/pagination'; import {FunctionsTable} from 'sentry/components/profiling/functionsTable'; import {ProfileEventsTable} from 'sentry/components/profiling/profileEventsTable'; import {t} from 'sentry/locale'; import space from 'sentry/styles/space'; import {PageFilters, Project} from 'sentry/types'; import {useFunctions} from 'sentry/utils/profiling/hooks/useFunctions'; import { formatSort, useProfileEvents, } from 'sentry/utils/profiling/hooks/useProfileEvents'; import {decodeScalar} from 'sentry/utils/queryString'; const FUNCTIONS_CURSOR_NAME = 'functionsCursor'; interface ProfileSummaryContentProps { location: Location; project: Project; query: string; selection: PageFilters; transaction: string; } function ProfileSummaryContent(props: ProfileSummaryContentProps) { const profilesCursor = useMemo( () => decodeScalar(props.location.query.cursor), [props.location.query.cursor] ); const functionsCursor = useMemo( () => decodeScalar(props.location.query.functionsCursor), [props.location.query.functionsCursor] ); const functionsSort = useMemo( () => decodeScalar(props.location.query.functionsSort, '-p99'), [props.location.query.functionsSort] ); const sort = formatSort(decodeScalar(props.location.query.sort), FIELDS, { key: 'timestamp', order: 'desc', }); const profiles = useProfileEvents({ cursor: profilesCursor, fields: FIELDS, query: props.query, sort, limit: 5, referrer: 'api.profiling.profile-summary-table', }); const [functionType, setFunctionType] = useState<'application' | 'system' | 'all'>( 'application' ); const functions = useFunctions({ cursor: functionsCursor, project: props.project, query: '', // TODO: This doesnt support the same filters selection: props.selection, transaction: props.transaction, sort: functionsSort, functionType, }); const handleFunctionsCursor = useCallback((cursor, pathname, query) => { browserHistory.push({ pathname, query: {...query, [FUNCTIONS_CURSOR_NAME]: cursor}, }); }, []); const handleFilterChange = useCallback( value => { browserHistory.push({ ...props.location, query: {...props.location.query, sort: value}, }); }, [props.location] ); return ( handleFilterChange(opt.value)} /> setFunctionType(value)} /> ); } const FIELDS = [ 'id', 'timestamp', 'release', 'device.model', 'device.classification', 'profile.duration', ] as const; const FILTER_OPTIONS = [ { label: t('Recent Profiles'), value: '-timestamp', }, { label: t('Slowest Profiles'), value: '-profile.duration', }, { label: t('Fastest Profiles'), value: 'profile.duration', }, ]; type FieldType = typeof FIELDS[number]; const TableHeader = styled('div')` display: flex; justify-content: space-between; margin-bottom: ${space(1)}; `; const StyledPagination = styled(Pagination)` margin: 0 0 0 ${space(1)}; `; export {ProfileSummaryContent};