import {Fragment, useMemo} from 'react';
import Button from 'sentry/components/button';
import CompositeSelect from 'sentry/components/forms/compositeSelect';
import {IconSliders} from 'sentry/icons';
import {t} from 'sentry/locale';
import {CanvasPoolManager} from 'sentry/utils/profiling/canvasScheduler';
import {FlamegraphPreferences} from 'sentry/utils/profiling/flamegraph/flamegraphStateProvider/flamegraphPreferences';
import {useFlamegraphPreferences} from 'sentry/utils/profiling/flamegraph/useFlamegraphPreferences';
interface FlamegraphOptionsMenuProps {
canvasPoolManager: CanvasPoolManager;
}
function FlamegraphOptionsMenu({
canvasPoolManager,
}: FlamegraphOptionsMenuProps): React.ReactElement {
const [{colorCoding, xAxis}, dispatch] = useFlamegraphPreferences();
const options = useMemo(() => {
return [
{
label: t('X Axis'),
value: 'x axis',
defaultValue: xAxis,
options: Object.entries(X_AXIS).map(([value, label]) => ({
label,
value,
})),
onChange: value =>
dispatch({
type: 'set xAxis',
payload: value,
}),
},
{
label: t('Color Coding'),
value: 'by symbol name',
defaultValue: colorCoding,
options: Object.entries(COLOR_CODINGS).map(([value, label]) => ({
label,
value,
})),
onChange: value =>
dispatch({
type: 'set color coding',
payload: value,
}),
},
];
// If we add color and xAxis it updates the memo and the component is re-rendered (losing hovered state)
// Not ideal, but since we are only passing default value I guess we can live with it
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [dispatch]);
return (
,
size: 'xs',
}}
placement="bottom right"
sections={options}
/>
);
}
const X_AXIS: Record = {
standalone: t('Standalone'),
transaction: t('Transaction'),
};
const COLOR_CODINGS: Record = {
'by symbol name': t('By Symbol Name'),
'by library': t('By Library'),
'by system / application': t('By System / Application'),
'by recursion': t('By Recursion'),
};
export {FlamegraphOptionsMenu};