From ef655aeab40271ef85f1c56235b9031bc7fae999 Mon Sep 17 00:00:00 2001 From: JonasBa Date: Tue, 7 Apr 2026 22:00:32 +0200 Subject: [PATCH 01/10] docs: Add FeedbackButton TopBar.Slot migration task list Tracks 33 sites where FeedbackButton needs to be wrapped in a TopBar.Slot when the page frame feature flag is active, so the top navigation bar can own button placement in that context. Co-Authored-By: Claude --- docs/feedback-button-topbar-migration.md | 509 +++++++++++++++++++++++ 1 file changed, 509 insertions(+) create mode 100644 docs/feedback-button-topbar-migration.md diff --git a/docs/feedback-button-topbar-migration.md b/docs/feedback-button-topbar-migration.md new file mode 100644 index 00000000000000..685f019838b085 --- /dev/null +++ b/docs/feedback-button-topbar-migration.md @@ -0,0 +1,509 @@ +# FeedbackButton → TopBar.Slot Migration + +## Overview + +When the page frame feature flag is active, `FeedbackButton` instances that live at the top of a +page (in `Layout.HeaderActions`, `Layout.HeaderContent`, `Layout.Header`, `SettingsPageHeader` +actions, or styled equivalents) should be rendered into the `TopBar` via a slot instead of inline. +This allows the top navigation bar to own the button's placement when the new page frame is +enabled. + +## Migration Pattern + +For each candidate site: + +1. Import `useHasPageFrameFeatureFlag` and call it in the component body. +2. Import `TopBar` from its module. +3. Wrap the existing `` in a ternary: + +```tsx +import {TopBar} from 'sentry/views/navigation/topBar'; +import {useHasPageFrameFeatureFlag} from 'sentry/views/navigation/useHasPageFrameFeatureFlag'; + +// Inside the component: +const hasPageFrameFeatureFlag = useHasPageFrameFeatureFlag(); + +// In JSX — copy all existing props, pass null as children in the slot version +// to suppress the default button label: +{hasPageFrameFeatureFlag ? ( + + {null} + +) : ( + +)} +``` + +### Rules + +- **Always preserve all existing props** (`size`, `feedbackOptions`, `aria-label`, etc.). +- **Pass `{null}` as children** inside the `TopBar.Slot` version — this prevents the default + label from rendering in the top bar context. +- **Do not change the `else` branch** — the original render must stay identical. +- **Only wrap, do not move** — leave the button in its existing location in the JSX tree; the + slot mechanism handles repositioning. + +--- + +## Task List + +### 1 — `static/app/views/alerts/list/header.tsx:82` + +Inside `Layout.HeaderActions`. + +```tsx +// Before + + +// After +{hasPageFrameFeatureFlag ? ( + {null} +) : ( + +)} +``` + +--- + +### 2 — `static/app/views/performance/transactionSummary/header.tsx:317` + +Inside `Layout.HeaderActions`. + +```tsx +// Before + +``` + +Same no-props pattern as task 1. + +--- + +### 3 — `static/app/views/insights/pages/domainViewHeader.tsx:138` + +Inside `Layout.HeaderActions`. + +```tsx +// Before + + +// After +{hasPageFrameFeatureFlag ? ( + + {null} + +) : ( + +)} +``` + +--- + +### 4 — `static/app/views/insights/uptime/views/overview.tsx:85` + +Inside `Layout.HeaderActions`. No-props pattern. + +--- + +### 5 — `static/app/views/insights/crons/views/overview.tsx:99` + +Inside `Layout.HeaderActions`. No-props pattern. + +--- + +### 6 — `static/app/views/insights/crons/components/monitorHeaderActions.tsx:87` + +Inside a `Flex` row; parent `monitorHeader.tsx` places this inside `Layout.HeaderActions`. +No-props pattern. + +--- + +### 7 — `static/app/views/explore/errors/content.tsx:48` + +Sole child of `Layout.HeaderActions`. No-props pattern. + +--- + +### 8 — `static/app/views/explore/logs/content.tsx:123` + +Inside `Layout.HeaderActions`. + +```tsx +// Before + +``` + +Preserve `feedbackOptions` in both branches. + +--- + +### 9 — `static/app/views/explore/spans/content.tsx:185` + +Inside `Layout.HeaderActions`. No-props pattern. + +--- + +### 10 — `static/app/views/explore/savedQueries/index.tsx:51` + +Inside `Layout.HeaderActions` (inside a `Grid`). No-props pattern. + +--- + +### 11 — `static/app/views/explore/multiQueryMode/index.tsx:61` + +Inside `Layout.HeaderActions` (inside a `Grid`). No-props pattern. + +--- + +### 12 — `static/app/views/explore/metrics/content.tsx:100` + +Sole child of `Layout.HeaderActions`. + +```tsx +// Before + +``` + +--- + +### 13 — `static/app/views/releases/list/index.tsx:428` + +Inside `Layout.HeaderActions`. + +```tsx +// Before + +``` + +--- + +### 14 — `static/app/views/dashboards/manage/index.tsx:648` + +Inside `Layout.HeaderActions` (inside a `Grid`). No-props pattern. + +--- + +### 15 — `static/app/views/projectDetail/projectDetail.tsx:208` + +Inside `Layout.HeaderActions` (inside a `Grid`). No-props pattern. + +--- + +### 16 — `static/app/views/issueList/issueViews/issueViewsList/issueViewsList.tsx:368` + +Inside `Layout.HeaderActions`. + +```tsx +// Before + +``` + +--- + +### 17 — `static/app/views/replays/detail/header/replayDetailsHeaderActions.tsx:26 & 38` + +Two instances inside `ButtonActionsWrapper = styled(Layout.HeaderActions)`, in separate render +branches (error state and loaded state). Both must be wrapped. + +```tsx +// Before (both instances) + +``` + +--- + +### 18 — `static/app/components/profiling/continuousProfileHeader.tsx:54` + +Inside `StyledHeaderActions = styled(Layout.HeaderActions)`. No-props pattern. + +--- + +### 19 — `static/app/components/profiling/profileHeader.tsx:92` + +Inside `StyledHeaderActions = styled(Layout.HeaderActions)`. No-props pattern. + +--- + +### 20 — `static/app/views/preprod/buildDetails/header/buildDetailsHeaderContent.tsx:178` + +Inside `Layout.HeaderActions`. + +```tsx +// Before + +``` + +Preserve all `feedbackOptions` tags. + +--- + +### 21 — `static/app/views/feedback/feedbackListPage.tsx:156` + +Inside `Layout.HeaderActions`. + +```tsx +// Before + +``` + +--- + +### 22 — `static/app/views/profiling/content.tsx:391` + +Inside `StyledHeaderContent = styled(Layout.HeaderContent)`, sibling of `Layout.Title`. +No-props pattern. + +--- + +### 23 — `static/app/views/issueDetails/streamline/header/header.tsx:150` + +Inside a custom `
` styled component, inside `Flex > Grid` at top of page. Note: this +button is nested inside an existing conditional — only the `FeedbackButton` branch changes, the +`else` branch (``) is untouched. + +```tsx +// Before +{hasFeedbackForm && feedback ? ( + +) : ( + +)} + +// After +{hasFeedbackForm && feedback ? ( + hasPageFrameFeatureFlag ? ( + + + {null} + + + ) : ( + + ) +) : ( + +)} +``` + +--- + +### 24 — `static/app/views/performance/newTraceDetails/traceHeader/index.tsx:92` + +Inside a `Grid` in a custom trace header (no `Layout.*` primitives, but at top of page). + +```tsx +// Before + +``` + +--- + +### 25 — `static/app/views/performance/newTraceDetails/traceHeader/placeholder.tsx:43` + +Same as task 24 but the skeleton/placeholder version of the trace header. + +--- + +### 26 — `static/app/views/preprod/buildComparison/header/buildCompareHeaderContent.tsx:144` + +Inside a `Flex align="center" gap="sm"` in a custom build comparison header. + +```tsx +// Before + +``` + +--- + +### 27 — `static/app/views/settings/project/preprod/index.tsx:66` + +In the `action` prop of ``, inside a `Grid`. + +```tsx +// Before + +``` + +No-props pattern. + +--- + +### 28 — `static/app/views/settings/project/tempest/index.tsx:113` + +In the `action` prop of ``, inside a `Grid`, alongside +``. + +```tsx +// Before + +``` + +No-props pattern. + +--- + +### 29 — `static/gsApp/views/seerAutomation/onboarding/onboardingSeatBased.tsx:84` + +In the `action` prop of ``. + +```tsx +// Before + +``` + +--- + +### 30 — `static/gsApp/views/amCheckout/components/checkoutSuccess.tsx:610` + +In a `Flex` alongside a `` on the checkout success page. + +```tsx +// Before + +``` + +--- + +### 31 — `static/app/views/automations/components/automationFeedbackButton.tsx:6` + +Thin wrapper component. All call sites are in header context: + +- `automations/list.tsx` → `WorkflowEngineListLayout` → `Layout.HeaderActions` +- `automations/detail.tsx` → `DetailLayout.Actions` → `Layout.HeaderActions` +- `automations/edit.tsx` → `StyledLayoutHeader = styled(Layout.Header)` +- `automations/new.tsx` → same as edit.tsx + +Migrate inside the wrapper itself to cover all call sites at once. + +```tsx +// Before +export function AutomationFeedbackButton() { + return ( + + ); +} +``` + +--- + +### 32 — `static/app/views/detectors/components/monitorFeedbackButton.tsx:6` + +Thin wrapper component used in `detectorListActions.tsx` → `WorkflowEngineListLayout` → +`Layout.HeaderActions`. Migrate inside the wrapper itself. + +```tsx +// Before +export function MonitorFeedbackButton() { + return ( + + ); +} +``` + +--- + +### 33 — `static/app/views/performance/newTraceDetails/traceSummary.tsx:90 & 164` + +Two instances: + +- **Line 90**: inside `` in the error state branch. +- **Line 164**: inside `` at the bottom of content, + conditionally rendered when `feedback` is truthy. + +Both instances: + +```tsx +// Before + +``` + +Both must be wrapped independently. From b6140f2c2efef09ccc7b0708064ab9917a99547d Mon Sep 17 00:00:00 2001 From: JonasBa Date: Tue, 7 Apr 2026 22:08:00 +0200 Subject: [PATCH 02/10] ref(nav): Wrap FeedbackButton in TopBar.Slot for page frame When the page-frame feature flag is active, FeedbackButton instances at the top of pages are rendered into the TopBar via a slot instead of inline, letting the top navigation bar own their placement. Migrates 33 sites across alerts, explore, insights, profiling, replays, releases, dashboards, issue details, trace views, preprod, settings, and automations. Co-Authored-By: Claude --- .../profiling/continuousProfileHeader.tsx | 11 ++- .../components/profiling/profileHeader.tsx | 11 ++- static/app/views/alerts/list/header.tsx | 11 ++- .../components/automationFeedbackButton.tsx | 21 +++++ static/app/views/dashboards/manage/index.tsx | 11 ++- .../components/monitorFeedbackButton.tsx | 21 +++++ static/app/views/explore/errors/content.tsx | 11 ++- static/app/views/explore/logs/content.tsx | 35 ++++++-- static/app/views/explore/metrics/content.tsx | 35 ++++++-- .../views/explore/multiQueryMode/index.tsx | 11 ++- .../app/views/explore/savedQueries/index.tsx | 11 ++- static/app/views/explore/spans/content.tsx | 11 ++- .../app/views/feedback/feedbackListPage.tsx | 41 ++++++--- .../crons/components/monitorHeaderActions.tsx | 11 ++- .../views/insights/crons/views/overview.tsx | 11 ++- .../views/insights/pages/domainViewHeader.tsx | 11 ++- .../views/insights/uptime/views/overview.tsx | 11 ++- .../issueDetails/streamline/header/header.tsx | 46 +++++++--- .../issueViewsList/issueViewsList.tsx | 41 ++++++--- .../newTraceDetails/traceHeader/index.tsx | 42 +++++++--- .../traceHeader/placeholder.tsx | 42 +++++++--- .../newTraceDetails/traceSummary.tsx | 83 ++++++++++++++----- .../performance/transactionSummary/header.tsx | 11 ++- .../header/buildCompareHeaderContent.tsx | 31 +++++-- .../header/buildDetailsHeaderContent.tsx | 31 +++++-- static/app/views/profiling/content.tsx | 11 ++- .../app/views/projectDetail/projectDetail.tsx | 11 ++- static/app/views/releases/list/index.tsx | 38 ++++++--- .../header/replayDetailsHeaderActions.tsx | 19 ++++- .../views/settings/project/preprod/index.tsx | 11 ++- .../views/settings/project/tempest/index.tsx | 11 ++- .../amCheckout/components/checkoutSuccess.tsx | 47 ++++++++--- .../onboarding/onboardingSeatBased.tsx | 38 ++++++--- 33 files changed, 640 insertions(+), 158 deletions(-) diff --git a/static/app/components/profiling/continuousProfileHeader.tsx b/static/app/components/profiling/continuousProfileHeader.tsx index 0c3efebf108d21..f675bc1a9b8b5d 100644 --- a/static/app/components/profiling/continuousProfileHeader.tsx +++ b/static/app/components/profiling/continuousProfileHeader.tsx @@ -13,6 +13,8 @@ import {trackAnalytics} from 'sentry/utils/analytics'; import {generateLinkToEventInTraceView} from 'sentry/utils/discover/urls'; import {useLocation} from 'sentry/utils/useLocation'; import {useOrganization} from 'sentry/utils/useOrganization'; +import {TopBar} from 'sentry/views/navigation/topBar'; +import {useHasPageFrameFeature} from 'sentry/views/navigation/useHasPageFrameFeature'; interface ContinuousProfileHeader { transaction: Event | null; @@ -21,6 +23,7 @@ interface ContinuousProfileHeader { export function ContinuousProfileHeader({transaction}: ContinuousProfileHeader) { const location = useLocation(); const organization = useOrganization(); + const hasPageFrameFeature = useHasPageFrameFeature(); // @TODO add breadcrumbs when other views are implemented const breadCrumbs = useMemo((): ProfilingBreadcrumbsProps['trails'] => { @@ -51,7 +54,13 @@ export function ContinuousProfileHeader({transaction}: ContinuousProfileHeader) - + {hasPageFrameFeature ? ( + + {null} + + ) : ( + + )} {transactionTarget && ( {t('Go to Trace')} diff --git a/static/app/components/profiling/profileHeader.tsx b/static/app/components/profiling/profileHeader.tsx index f2ef1609fecc13..270561785dfbf3 100644 --- a/static/app/components/profiling/profileHeader.tsx +++ b/static/app/components/profiling/profileHeader.tsx @@ -13,6 +13,8 @@ import {generateLinkToEventInTraceView} from 'sentry/utils/discover/urls'; import {isSchema, isSentrySampledProfile} from 'sentry/utils/profiling/guards/profile'; import {useLocation} from 'sentry/utils/useLocation'; import {useOrganization} from 'sentry/utils/useOrganization'; +import {TopBar} from 'sentry/views/navigation/topBar'; +import {useHasPageFrameFeature} from 'sentry/views/navigation/useHasPageFrameFeature'; import {useProfiles} from 'sentry/views/profiling/profilesProvider'; function getTransactionName(input: Profiling.ProfileInput): string { @@ -36,6 +38,7 @@ function ProfileHeader({transaction, projectId, eventId}: ProfileHeaderProps) { const location = useLocation(); const organization = useOrganization(); const profiles = useProfiles(); + const hasPageFrameFeature = useHasPageFrameFeature(); const transactionName = profiles.type === 'resolved' ? getTransactionName(profiles.data) : ''; @@ -89,7 +92,13 @@ function ProfileHeader({transaction, projectId, eventId}: ProfileHeaderProps) { - + {hasPageFrameFeature ? ( + + {null} + + ) : ( + + )} {transactionTarget && ( {t('Go to Trace')} diff --git a/static/app/views/alerts/list/header.tsx b/static/app/views/alerts/list/header.tsx index 45d9f39dbb3d1a..8575b98953b047 100644 --- a/static/app/views/alerts/list/header.tsx +++ b/static/app/views/alerts/list/header.tsx @@ -15,6 +15,8 @@ import {useLocation} from 'sentry/utils/useLocation'; import {useNavigate} from 'sentry/utils/useNavigate'; import {useOrganization} from 'sentry/utils/useOrganization'; import {makeAlertsPathname} from 'sentry/views/alerts/pathnames'; +import {TopBar} from 'sentry/views/navigation/topBar'; +import {useHasPageFrameFeature} from 'sentry/views/navigation/useHasPageFrameFeature'; type Props = { activeTab: 'stream' | 'rules'; @@ -25,6 +27,7 @@ export function AlertHeader({activeTab}: Props) { const location = useLocation(); const organization = useOrganization(); const {selection} = usePageFilters(); + const hasPageFrameFeature = useHasPageFrameFeature(); /** * Incidents list is currently at the organization level, but the link needs to * go down to a specific project scope. @@ -79,7 +82,13 @@ export function AlertHeader({activeTab}: Props) { > {t('Create Alert')} - + {hasPageFrameFeature ? ( + + {null} + + ) : ( + + )} + {null} + + ); + } + return ( (null); const hasPrebuiltDashboards = organization.features.includes( 'dashboards-prebuilt-insights-dashboards' @@ -645,7 +648,13 @@ function ManageDashboards() { )} - + {hasPageFrameFeature ? ( + + {null} + + ) : ( + + )} {({hasFeature: hasAiGenerate}) => hasAiGenerate && areAiFeaturesAllowed ? ( diff --git a/static/app/views/detectors/components/monitorFeedbackButton.tsx b/static/app/views/detectors/components/monitorFeedbackButton.tsx index 39b1aa569c2b7c..efd76cdbd09331 100644 --- a/static/app/views/detectors/components/monitorFeedbackButton.tsx +++ b/static/app/views/detectors/components/monitorFeedbackButton.tsx @@ -1,7 +1,28 @@ import {FeedbackButton} from 'sentry/components/feedbackButton/feedbackButton'; import {t} from 'sentry/locale'; +import {TopBar} from 'sentry/views/navigation/topBar'; +import {useHasPageFrameFeature} from 'sentry/views/navigation/useHasPageFrameFeature'; export function MonitorFeedbackButton() { + const hasPageFrameFeature = useHasPageFrameFeature(); + + if (hasPageFrameFeature) { + return ( + + {null} + + ); + } + return ( @@ -45,7 +48,13 @@ function ErrorsHeader() { - + {hasPageFrameFeature ? ( + + {null} + + ) : ( + + )} ); diff --git a/static/app/views/explore/logs/content.tsx b/static/app/views/explore/logs/content.tsx index 4ebebdfa5eff23..9eca8d8b0b62eb 100644 --- a/static/app/views/explore/logs/content.tsx +++ b/static/app/views/explore/logs/content.tsx @@ -32,6 +32,8 @@ import { useQueryParamsTitle, } from 'sentry/views/explore/queryParams/context'; import {TraceItemDataset} from 'sentry/views/explore/types'; +import {TopBar} from 'sentry/views/navigation/topBar'; +import {useHasPageFrameFeature} from 'sentry/views/navigation/useHasPageFrameFeature'; import {useOnboardingProject} from 'sentry/views/insights/common/queries/useOnboardingProject'; export default function LogsContent() { @@ -99,6 +101,7 @@ function LogsHeader() { const organization = useOrganization(); const {data: savedQuery} = useGetSavedQuery(pageId); const onboardingProject = useOnboardingProject({property: 'hasLogs'}); + const hasPageFrameFeature = useHasPageFrameFeature(); const hasSavedQueryTitle = defined(pageId) && defined(savedQuery) && savedQuery.name.length > 0; @@ -120,15 +123,29 @@ function LogsHeader() { - + {hasPageFrameFeature ? ( + + {null} + + ) : ( + + )} {defined(onboardingProject) && } diff --git a/static/app/views/explore/metrics/content.tsx b/static/app/views/explore/metrics/content.tsx index 723ddbba3e85d6..5a43b99ff27605 100644 --- a/static/app/views/explore/metrics/content.tsx +++ b/static/app/views/explore/metrics/content.tsx @@ -25,6 +25,8 @@ import { } from 'sentry/views/explore/queryParams/savedQuery'; import {TraceItemDataset} from 'sentry/views/explore/types'; import {useOnboardingProject} from 'sentry/views/insights/common/queries/useOnboardingProject'; +import {TopBar} from 'sentry/views/navigation/topBar'; +import {useHasPageFrameFeature} from 'sentry/views/navigation/useHasPageFrameFeature'; export default function MetricsContent() { const organization = useOrganization(); @@ -75,6 +77,7 @@ function MetricsHeader() { const title = getTitleFromLocation(location, TITLE_KEY); const organization = useOrganization(); const {data: savedQuery} = useGetSavedQuery(pageId); + const hasPageFrameFeature = useHasPageFrameFeature(); const hasSavedQueryTitle = defined(pageId) && defined(savedQuery) && savedQuery.name.length > 0; @@ -97,15 +100,29 @@ function MetricsHeader() { - + {hasPageFrameFeature ? ( + + {null} + + ) : ( + + )} ); diff --git a/static/app/views/explore/multiQueryMode/index.tsx b/static/app/views/explore/multiQueryMode/index.tsx index e429ca30a6d101..76c95f19ff1f26 100644 --- a/static/app/views/explore/multiQueryMode/index.tsx +++ b/static/app/views/explore/multiQueryMode/index.tsx @@ -17,6 +17,8 @@ import {MultiQueryModeContent} from 'sentry/views/explore/multiQueryMode/content import {SavedQueryEditMenu} from 'sentry/views/explore/savedQueryEditMenu'; import {StarSavedQueryButton} from 'sentry/views/explore/starSavedQueryButton'; import {makeTracesPathname} from 'sentry/views/traces/pathnames'; +import {TopBar} from 'sentry/views/navigation/topBar'; +import {useHasPageFrameFeature} from 'sentry/views/navigation/useHasPageFrameFeature'; export default function MultiQueryMode() { const location = useLocation(); @@ -25,6 +27,7 @@ export default function MultiQueryMode() { const id = getIdFromLocation(location); const {data: savedQuery} = useGetSavedQuery(id); + const hasPageFrameFeature = useHasPageFrameFeature(); return ( {defined(id) && savedQuery?.isPrebuilt === false && } - + {hasPageFrameFeature ? ( + + {null} + + ) : ( + + )} diff --git a/static/app/views/explore/savedQueries/index.tsx b/static/app/views/explore/savedQueries/index.tsx index 0b44748131f42d..c2ca3f70c20367 100644 --- a/static/app/views/explore/savedQueries/index.tsx +++ b/static/app/views/explore/savedQueries/index.tsx @@ -11,6 +11,8 @@ import {IconAdd} from 'sentry/icons/iconAdd'; import {t} from 'sentry/locale'; import {useOrganization} from 'sentry/utils/useOrganization'; import {isLogsEnabled} from 'sentry/views/explore/logs/isLogsEnabled'; +import {TopBar} from 'sentry/views/navigation/topBar'; +import {useHasPageFrameFeature} from 'sentry/views/navigation/useHasPageFrameFeature'; import {getLogsUrl} from 'sentry/views/explore/logs/utils'; import {SavedQueriesLandingContent} from 'sentry/views/explore/savedQueries/savedQueriesLandingContent'; import {getExploreUrl} from 'sentry/views/explore/utils'; @@ -19,6 +21,7 @@ export default function SavedQueriesView() { const organization = useOrganization(); const hasLogsFeature = isLogsEnabled(organization); const navigate = useNavigate(); + const hasPageFrameFeature = useHasPageFrameFeature(); const items = [ { @@ -48,7 +51,13 @@ export default function SavedQueriesView() { - + {hasPageFrameFeature ? ( + + {null} + + ) : ( + + )} {hasLogsFeature ? ( 0; @@ -182,7 +185,13 @@ function SpansTabHeader() { {defined(id) && savedQuery?.isPrebuilt === false && } - + {hasPageFrameFeature ? ( + + {null} + + ) : ( + + )} diff --git a/static/app/views/feedback/feedbackListPage.tsx b/static/app/views/feedback/feedbackListPage.tsx index 6660330939780b..4b581ea6ffdfa2 100644 --- a/static/app/views/feedback/feedbackListPage.tsx +++ b/static/app/views/feedback/feedbackListPage.tsx @@ -30,9 +30,12 @@ import {useLocation} from 'sentry/utils/useLocation'; import {useMedia} from 'sentry/utils/useMedia'; import {useOrganization} from 'sentry/utils/useOrganization'; import {makeAlertsPathname} from 'sentry/views/alerts/pathnames'; +import {TopBar} from 'sentry/views/navigation/topBar'; +import {useHasPageFrameFeature} from 'sentry/views/navigation/useHasPageFrameFeature'; export default function FeedbackListPage() { const organization = useOrganization(); + const hasPageFrameFeature = useHasPageFrameFeature(); const {hasSetupOneFeedback} = useHaveSelectedProjectsSetupFeedback(); const pageFilters = usePageFilters(); @@ -153,17 +156,33 @@ export default function FeedbackListPage() { - + {hasPageFrameFeature ? ( + + {null} + + ) : ( + + )} } diff --git a/static/app/views/insights/crons/components/monitorHeaderActions.tsx b/static/app/views/insights/crons/components/monitorHeaderActions.tsx index 40ed381e41d8fd..9fe38119731cd2 100644 --- a/static/app/views/insights/crons/components/monitorHeaderActions.tsx +++ b/static/app/views/insights/crons/components/monitorHeaderActions.tsx @@ -15,6 +15,8 @@ import {useNavigate} from 'sentry/utils/useNavigate'; import {useOrganization} from 'sentry/utils/useOrganization'; import {makeAlertsPathname} from 'sentry/views/alerts/pathnames'; import type {Monitor} from 'sentry/views/insights/crons/types'; +import {TopBar} from 'sentry/views/navigation/topBar'; +import {useHasPageFrameFeature} from 'sentry/views/navigation/useHasPageFrameFeature'; import {StatusToggleButton} from './statusToggleButton'; @@ -29,6 +31,7 @@ export function MonitorHeaderActions({monitor, orgSlug, onUpdate}: Props) { const navigate = useNavigate(); const organization = useOrganization(); const {selection} = usePageFilters(); + const hasPageFrameFeature = useHasPageFrameFeature(); const endpointOptions = { query: { @@ -84,7 +87,13 @@ export function MonitorHeaderActions({monitor, orgSlug, onUpdate}: Props) { return ( - + {hasPageFrameFeature ? ( + + {null} + + ) : ( + + )}