import {useMemo, useState} from 'react'; import {ContinuousProfileHeader} from 'sentry/components/profiling/continuousProfileHeader'; import type {RequestState} from 'sentry/types/core'; import type {EventTransaction} from 'sentry/types/event'; import {useSentryEvent} from 'sentry/utils/profiling/hooks/useSentryEvent'; import {decodeScalar} from 'sentry/utils/queryString'; import {useLocation} from 'sentry/utils/useLocation'; import useOrganization from 'sentry/utils/useOrganization'; import {useParams} from 'sentry/utils/useParams'; import {ContinuousProfileProvider, ProfileTransactionContext} from './profilesProvider'; function isValidDate(date: string): boolean { return !isNaN(Date.parse(date)); } interface FlamegraphViewProps { children: React.ReactNode; } export default function ProfileAndTransactionProvider( props: FlamegraphViewProps ): React.ReactElement { const organization = useOrganization(); const params = useParams(); const location = useLocation(); const projectSlug = params.projectId!; const profileMeta = useMemo(() => { const start = decodeScalar(location.query.start); const end = decodeScalar(location.query.end); const profilerId = decodeScalar(location.query.profilerId); if (!start || !end || !profilerId) { return null; } if (!isValidDate(start) || !isValidDate(end)) { return null; } return { start, end, profiler_id: profilerId, }; }, [location.query.start, location.query.end, location.query.profilerId]); const [profile, setProfile] = useState>({ type: 'initial', }); const profileTransaction = useSentryEvent( organization.slug, projectSlug, decodeScalar(location.query.eventId) || null ); return ( {props.children} ); }