diff --git a/static/app/components/events/autofix/autofixFeedback.tsx b/static/app/components/events/autofix/autofixFeedback.tsx index b05c02e15ab06f..2dfa52ddce4c01 100644 --- a/static/app/components/events/autofix/autofixFeedback.tsx +++ b/static/app/components/events/autofix/autofixFeedback.tsx @@ -1,35 +1,18 @@ -import {useRef} from 'react'; - -import {Button} from 'sentry/components/core/button'; +import FeedbackButton from 'sentry/components/feedbackButton/feedbackButton'; import {t} from 'sentry/locale'; -import {useFeedbackForm} from 'sentry/utils/useFeedbackForm'; - -function AutofixFeedback() { - const buttonRef = useRef(null); - const openForm = useFeedbackForm(); - - if (!openForm) { - return null; - } +export default function AutofixFeedback() { return ( - + feedbackOptions={{ + formTitle: t('Give feedback to the devs'), + messagePlaceholder: t('How can we make Seer better for you?'), + tags: { + ['feedback.source']: 'issue_details_ai_autofix', + ['feedback.owner']: 'ml-ai', + }, + }} + /> ); } - -export default AutofixFeedback; diff --git a/static/app/components/events/featureFlags/eventFeatureFlagSection.tsx b/static/app/components/events/featureFlags/eventFeatureFlagSection.tsx index bce4239d2ba4b0..0a89c4e7e89189 100644 --- a/static/app/components/events/featureFlags/eventFeatureFlagSection.tsx +++ b/static/app/components/events/featureFlags/eventFeatureFlagSection.tsx @@ -22,19 +22,19 @@ import { sortedFlags, } from 'sentry/components/events/featureFlags/utils'; import {useOrganizationFlagLog} from 'sentry/components/featureFlags/hooks/useOrganizationFlagLog'; +import FeedbackButton from 'sentry/components/feedbackButton/feedbackButton'; import useDrawer from 'sentry/components/globalDrawer'; import {useGroupSuspectFlagScores} from 'sentry/components/issues/suspect/useGroupSuspectFlagScores'; import useLegacyEventSuspectFlags from 'sentry/components/issues/suspect/useLegacyEventSuspectFlags'; import useSuspectFlagScoreThreshold from 'sentry/components/issues/suspect/useSuspectFlagScoreThreshold'; import {KeyValueData} from 'sentry/components/keyValueData'; -import {IconMegaphone, IconSearch} from 'sentry/icons'; +import {IconSearch} from 'sentry/icons'; import {t, tn} from 'sentry/locale'; import type {Event, FeatureFlag} from 'sentry/types/event'; import {IssueCategory, type Group} from 'sentry/types/group'; import type {Project} from 'sentry/types/project'; import {trackAnalytics} from 'sentry/utils/analytics'; import {MutableSearch} from 'sentry/utils/tokenizeSearch'; -import {useFeedbackForm} from 'sentry/utils/useFeedbackForm'; import {useLocation} from 'sentry/utils/useLocation'; import useMedia from 'sentry/utils/useMedia'; import useOrganization from 'sentry/utils/useOrganization'; @@ -63,26 +63,19 @@ function BaseEventFeatureFlagList({event, group, project}: EventFeatureFlagSecti const theme = useTheme(); const isXsScreen = useMedia(`(max-width: ${theme.breakpoints.xs})`); - const openForm = useFeedbackForm(); - const feedbackButton = - openForm && !isXsScreen ? ( - - ) : null; + const feedbackButton = isXsScreen ? null : ( + + ); // If we're showing the suspect section at all const enableSuspectFlags = organization.features.includes('feature-flag-suspect-flags'); diff --git a/static/app/components/feedback/summaryCategories/feedbackSummaryCategories.tsx b/static/app/components/feedback/summaryCategories/feedbackSummaryCategories.tsx index 5cd5c5806c2a5d..4b44a5d617a5ca 100644 --- a/static/app/components/feedback/summaryCategories/feedbackSummaryCategories.tsx +++ b/static/app/components/feedback/summaryCategories/feedbackSummaryCategories.tsx @@ -1,23 +1,20 @@ import styled from '@emotion/styled'; import {AiPrivacyTooltip} from 'sentry/components/aiPrivacyTooltip'; -import {Button} from 'sentry/components/core/button'; import {Disclosure} from 'sentry/components/core/disclosure'; import {Flex} from 'sentry/components/core/layout'; import {useOrganizationSeerSetup} from 'sentry/components/events/autofix/useOrganizationSeerSetup'; import FeedbackCategories from 'sentry/components/feedback/summaryCategories/feedbackCategories'; import FeedbackSummary from 'sentry/components/feedback/summaryCategories/feedbackSummary'; +import FeedbackButton from 'sentry/components/feedbackButton/feedbackButton'; import {IconThumb} from 'sentry/icons'; import {t} from 'sentry/locale'; -import {useFeedbackForm} from 'sentry/utils/useFeedbackForm'; import useOrganization from 'sentry/utils/useOrganization'; import {useSyncedLocalStorageState} from 'sentry/utils/useSyncedLocalStorageState'; export default function FeedbackSummaryCategories() { const organization = useOrganization(); - const openForm = useFeedbackForm(); - const {areAiFeaturesAllowed} = useOrganizationSeerSetup(); const [isExpanded, setIsExpanded] = useSyncedLocalStorageState( @@ -35,27 +32,27 @@ export default function FeedbackSummaryCategories() { } const feedbackButton = ({type}: {type: 'positive' | 'negative'}) => { - return openForm ? ( - ); } diff --git a/static/app/components/searchQueryBuilder/tokens/filterKeyListBox/index.tsx b/static/app/components/searchQueryBuilder/tokens/filterKeyListBox/index.tsx index d60dec5e25e578..0a41ebd9b2f3be 100644 --- a/static/app/components/searchQueryBuilder/tokens/filterKeyListBox/index.tsx +++ b/static/app/components/searchQueryBuilder/tokens/filterKeyListBox/index.tsx @@ -14,6 +14,7 @@ import type { SelectOptionOrSectionWithKey, } from 'sentry/components/core/compactSelect/types'; import InteractionStateLayer from 'sentry/components/core/interactionStateLayer'; +import FeedbackButton from 'sentry/components/feedbackButton/feedbackButton'; import {Overlay} from 'sentry/components/overlay'; import {AskSeer} from 'sentry/components/searchQueryBuilder/askSeer/askSeer'; import {ASK_SEER_CONSENT_ITEM_KEY} from 'sentry/components/searchQueryBuilder/askSeer/askSeerConsentOption'; @@ -29,9 +30,7 @@ import { } from 'sentry/components/searchQueryBuilder/tokens/filterKeyListBox/utils'; import type {Token, TokenResult} from 'sentry/components/searchSyntax/parser'; import {getKeyLabel, getKeyName} from 'sentry/components/searchSyntax/utils'; -import {IconMegaphone} from 'sentry/icons'; import {t} from 'sentry/locale'; -import {useFeedbackForm} from 'sentry/utils/useFeedbackForm'; import usePrevious from 'sentry/utils/usePrevious'; interface FilterKeyListBoxProps extends CustomComboboxMenuProps { @@ -80,30 +79,20 @@ function ListBoxSectionButton({ function FeedbackFooter() { const {searchSource} = useSearchQueryBuilder(); - const openForm = useFeedbackForm(); - - if (!openForm) { - return null; - } return ( - + feedbackOptions={{ + messagePlaceholder: t('How can we make search better for you?'), + tags: { + search_source: searchSource, + ['feedback.source']: 'search_query_builder', + ['feedback.owner']: 'issues', + }, + }} + /> ); } diff --git a/static/app/views/alerts/rules/metric/details/sidebar.tsx b/static/app/views/alerts/rules/metric/details/sidebar.tsx index 290342ad3660b6..2e8e69569caabd 100644 --- a/static/app/views/alerts/rules/metric/details/sidebar.tsx +++ b/static/app/views/alerts/rules/metric/details/sidebar.tsx @@ -6,19 +6,18 @@ import {OnDemandWarningIcon} from 'sentry/components/alerts/onDemandMetricAlert' import {SectionHeading} from 'sentry/components/charts/styles'; import {ActorAvatar} from 'sentry/components/core/avatar/actorAvatar'; import {AlertBadge} from 'sentry/components/core/badge/alertBadge'; -import {Button} from 'sentry/components/core/button'; import {DateTime} from 'sentry/components/dateTime'; import Duration from 'sentry/components/duration'; +import FeedbackButton from 'sentry/components/feedbackButton/feedbackButton'; import {KeyValueTable, KeyValueTableRow} from 'sentry/components/keyValueTable'; import TimeSince from 'sentry/components/timeSince'; -import {IconDiamond, IconMegaphone} from 'sentry/icons'; +import {IconDiamond} from 'sentry/icons'; import {t, tct} from 'sentry/locale'; import {space} from 'sentry/styles/space'; import type {Actor} from 'sentry/types/core'; import {getSearchFilters, isOnDemandSearchKey} from 'sentry/utils/onDemandMetrics/index'; import {capitalize} from 'sentry/utils/string/capitalize'; import {isChonkTheme} from 'sentry/utils/theme/withChonk'; -import {useFeedbackForm} from 'sentry/utils/useFeedbackForm'; import useOrganization from 'sentry/utils/useOrganization'; import {COMPARISON_DELTA_OPTIONS} from 'sentry/views/alerts/rules/metric/constants'; import type {Action, MetricRule} from 'sentry/views/alerts/rules/metric/types'; @@ -168,28 +167,22 @@ export function MetricDetailsSidebar({ const ownerId = rule.owner?.split(':')[1]; const teamActor = ownerId && {type: 'team' as Actor['type'], id: ownerId, name: ''}; - const openForm = useFeedbackForm(); - - const feedbackButton = openForm ? ( - - ) : null; + /> + ); return ( diff --git a/static/app/views/alerts/rules/metric/triggers/dynamicAlertsFeedbackButton.tsx b/static/app/views/alerts/rules/metric/triggers/dynamicAlertsFeedbackButton.tsx index 8ff88e713eeeb8..f2040253c457a6 100644 --- a/static/app/views/alerts/rules/metric/triggers/dynamicAlertsFeedbackButton.tsx +++ b/static/app/views/alerts/rules/metric/triggers/dynamicAlertsFeedbackButton.tsx @@ -1,37 +1,31 @@ import styled from '@emotion/styled'; -import {Button} from 'sentry/components/core/button'; -import {IconMegaphone} from 'sentry/icons'; +import FeedbackButton from 'sentry/components/feedbackButton/feedbackButton'; +import {useFeedbackSDKIntegration} from 'sentry/components/feedbackButton/useFeedbackSDKIntegration'; import {t} from 'sentry/locale'; -import {useFeedbackForm} from 'sentry/utils/useFeedbackForm'; export default function DynamicAlertsFeedbackButton() { - const openForm = useFeedbackForm(); + const {feedback} = useFeedbackSDKIntegration(); - if (!openForm) { + if (!feedback) { return null; } return ( - + /> ); } diff --git a/static/app/views/automations/components/automationFeedbackButton.tsx b/static/app/views/automations/components/automationFeedbackButton.tsx index 1344eb490811f8..4105aa4cb75a0c 100644 --- a/static/app/views/automations/components/automationFeedbackButton.tsx +++ b/static/app/views/automations/components/automationFeedbackButton.tsx @@ -1,30 +1,19 @@ -import {Button} from 'sentry/components/core/button'; -import {IconMegaphone} from 'sentry/icons'; +import FeedbackButton from 'sentry/components/feedbackButton/feedbackButton'; import {t} from 'sentry/locale'; -import {useFeedbackForm} from 'sentry/utils/useFeedbackForm'; export function AutomationFeedbackButton() { - const openForm = useFeedbackForm(); - - if (!openForm) { - return null; - } - return ( - + {t('Feedback')} + ); } diff --git a/static/app/views/detectors/components/monitorFeedbackButton.tsx b/static/app/views/detectors/components/monitorFeedbackButton.tsx index 7cbe08de92733e..2072366727a53e 100644 --- a/static/app/views/detectors/components/monitorFeedbackButton.tsx +++ b/static/app/views/detectors/components/monitorFeedbackButton.tsx @@ -1,30 +1,19 @@ -import {Button} from 'sentry/components/core/button'; -import {IconMegaphone} from 'sentry/icons'; +import FeedbackButton from 'sentry/components/feedbackButton/feedbackButton'; import {t} from 'sentry/locale'; -import {useFeedbackForm} from 'sentry/utils/useFeedbackForm'; export function MonitorFeedbackButton() { - const openForm = useFeedbackForm(); - - if (!openForm) { - return null; - } - return ( - + {t('Feedback')} + ); } diff --git a/static/app/views/explore/logs/content.tsx b/static/app/views/explore/logs/content.tsx index 1b452b70e0c044..01f540c93e2fee 100644 --- a/static/app/views/explore/logs/content.tsx +++ b/static/app/views/explore/logs/content.tsx @@ -1,19 +1,18 @@ -import {Button} from 'sentry/components/core/button'; import {ButtonBar} from 'sentry/components/core/button/buttonBar'; import {LinkButton} from 'sentry/components/core/button/linkButton'; +import FeedbackButton from 'sentry/components/feedbackButton/feedbackButton'; import * as Layout from 'sentry/components/layouts/thirds'; import PageFiltersContainer from 'sentry/components/organizations/pageFilters/container'; import SentryDocumentTitle from 'sentry/components/sentryDocumentTitle'; import {withoutLoggingSupport} from 'sentry/data/platformCategories'; import {platforms} from 'sentry/data/platforms'; -import {IconMegaphone, IconOpen} from 'sentry/icons'; +import {IconOpen} from 'sentry/icons'; import {t} from 'sentry/locale'; import {DataCategory} from 'sentry/types/core'; import {defined} from 'sentry/utils'; import {trackAnalytics} from 'sentry/utils/analytics'; import {LogsAnalyticsPageSource} from 'sentry/utils/analytics/logsAnalyticsEvent'; import {useDatePageFilterProps} from 'sentry/utils/useDatePageFilterProps'; -import {useFeedbackForm} from 'sentry/utils/useFeedbackForm'; import {useMaxPickableDays} from 'sentry/utils/useMaxPickableDays'; import useOrganization from 'sentry/utils/useOrganization'; import usePageFilters from 'sentry/utils/usePageFilters'; @@ -32,32 +31,6 @@ import { import {TraceItemDataset} from 'sentry/views/explore/types'; import {useOnboardingProject} from 'sentry/views/insights/common/queries/useOnboardingProject'; -function FeedbackButton() { - const openForm = useFeedbackForm(); - - if (!openForm) { - return null; - } - return ( - - ); -} - export default function LogsContent() { const organization = useOrganization(); const maxPickableDays = useMaxPickableDays({ @@ -137,7 +110,16 @@ function LogsHeader() { - + diff --git a/static/app/views/explore/metrics/content.tsx b/static/app/views/explore/metrics/content.tsx index 011f3ed451858b..96a2177bb79ad8 100644 --- a/static/app/views/explore/metrics/content.tsx +++ b/static/app/views/explore/metrics/content.tsx @@ -1,15 +1,12 @@ import {FeatureBadge} from 'sentry/components/core/badge/featureBadge'; -import {Button} from 'sentry/components/core/button'; -import {ButtonBar} from 'sentry/components/core/button/buttonBar'; +import FeedbackButton from 'sentry/components/feedbackButton/feedbackButton'; import * as Layout from 'sentry/components/layouts/thirds'; import PageFiltersContainer from 'sentry/components/organizations/pageFilters/container'; import SentryDocumentTitle from 'sentry/components/sentryDocumentTitle'; -import {IconMegaphone} from 'sentry/icons'; import {t} from 'sentry/locale'; import {DataCategory} from 'sentry/types/core'; import {defined} from 'sentry/utils'; import {useDatePageFilterProps} from 'sentry/utils/useDatePageFilterProps'; -import {useFeedbackForm} from 'sentry/utils/useFeedbackForm'; import {useLocation} from 'sentry/utils/useLocation'; import {useMaxPickableDays} from 'sentry/utils/useMaxPickableDays'; import useOrganization from 'sentry/utils/useOrganization'; @@ -26,32 +23,6 @@ import { import {TraceItemDataset} from 'sentry/views/explore/types'; import {useOnboardingProject} from 'sentry/views/insights/common/queries/useOnboardingProject'; -function FeedbackButton() { - const openForm = useFeedbackForm(); - - if (!openForm) { - return null; - } - return ( - - ); -} - export default function MetricsContent() { const organization = useOrganization(); const onboardingProject = useOnboardingProject({property: 'hasTraceMetrics'}); @@ -122,9 +93,16 @@ function MetricsHeader() { - - - + ); diff --git a/static/app/views/feedback/feedbackListPage.tsx b/static/app/views/feedback/feedbackListPage.tsx index ca949ace732070..269e60cc721da1 100644 --- a/static/app/views/feedback/feedbackListPage.tsx +++ b/static/app/views/feedback/feedbackListPage.tsx @@ -16,15 +16,14 @@ import useCurrentFeedbackId from 'sentry/components/feedback/useCurrentFeedbackI import useHaveSelectedProjectsSetupFeedback from 'sentry/components/feedback/useFeedbackOnboarding'; import {FeedbackQueryKeys} from 'sentry/components/feedback/useFeedbackQueryKeys'; import useRedirectToFeedbackFromEvent from 'sentry/components/feedback/useRedirectToFeedbackFromEvent'; +import FeedbackButton from 'sentry/components/feedbackButton/feedbackButton'; import FullViewport from 'sentry/components/layouts/fullViewport'; import * as Layout from 'sentry/components/layouts/thirds'; import PageFiltersContainer from 'sentry/components/organizations/pageFilters/container'; import {PageHeadingQuestionTooltip} from 'sentry/components/pageHeadingQuestionTooltip'; import SentryDocumentTitle from 'sentry/components/sentryDocumentTitle'; -import {IconMegaphone} from 'sentry/icons'; import {t} from 'sentry/locale'; import {space} from 'sentry/styles/space'; -import {useFeedbackForm} from 'sentry/utils/useFeedbackForm'; import {useLocation} from 'sentry/utils/useLocation'; import useMedia from 'sentry/utils/useMedia'; import useOrganization from 'sentry/utils/useOrganization'; @@ -47,7 +46,6 @@ export default function FeedbackListPage() { const isMediumOrSmaller = useMedia(`(max-width: ${theme.breakpoints.md})`); const [showItemPreview, setShowItemPreview] = useState(false); const [selectedItemIndex, setSelectedItemIndex] = useState(null); - const openFeedbackForm = useFeedbackForm(); // show feedback item preview when feedback is selected on med screens and smaller useEffect(() => { @@ -150,24 +148,17 @@ export default function FeedbackListPage() { - {openFeedbackForm ? ( - - ) : null} + diff --git a/static/app/views/issueDetails/streamline/header/header.tsx b/static/app/views/issueDetails/streamline/header/header.tsx index 75c60ae8a8c09a..25c0e6b6041f33 100644 --- a/static/app/views/issueDetails/streamline/header/header.tsx +++ b/static/app/views/issueDetails/streamline/header/header.tsx @@ -4,7 +4,6 @@ import Color from 'color'; import {Breadcrumbs} from 'sentry/components/breadcrumbs'; import {Tag} from 'sentry/components/core/badge/tag'; -import {Button} from 'sentry/components/core/button'; import {ButtonBar} from 'sentry/components/core/button/buttonBar'; import {LinkButton} from 'sentry/components/core/button/linkButton'; import {Flex} from 'sentry/components/core/layout'; @@ -13,11 +12,13 @@ import {Tooltip} from 'sentry/components/core/tooltip'; import Count from 'sentry/components/count'; import ErrorBoundary from 'sentry/components/errorBoundary'; import EventMessage from 'sentry/components/events/eventMessage'; +import FeedbackButton from 'sentry/components/feedbackButton/feedbackButton'; +import {useFeedbackSDKIntegration} from 'sentry/components/feedbackButton/useFeedbackSDKIntegration'; import {getBadgeProperties} from 'sentry/components/group/inboxBadges/statusBadge'; import UnhandledTag from 'sentry/components/group/inboxBadges/unhandledTag'; import {TourElement} from 'sentry/components/tours/components'; import {MAX_PICKABLE_DAYS} from 'sentry/constants'; -import {IconInfo, IconMegaphone} from 'sentry/icons'; +import {IconInfo} from 'sentry/icons'; import {t, tct} from 'sentry/locale'; import HookStore from 'sentry/stores/hookStore'; import {space} from 'sentry/styles/space'; @@ -28,7 +29,6 @@ import type {Project} from 'sentry/types/project'; import {defined} from 'sentry/utils'; import {getMessage, getTitle} from 'sentry/utils/events'; import {getConfigForIssueType} from 'sentry/utils/issueTypeConfig'; -import {useFeedbackForm} from 'sentry/utils/useFeedbackForm'; import {useLocalStorageState} from 'sentry/utils/useLocalStorageState'; import {useLocation} from 'sentry/utils/useLocation'; import useOrganization from 'sentry/utils/useOrganization'; @@ -94,7 +94,8 @@ export default function StreamlinedGroupHeader({ group.issueType === IssueType.QUERY_INJECTION_VULNERABILITY ? 'issue_details_query_injection' : 'issue_details_n_plus_one_api_calls'; - const openForm = useFeedbackForm(); + const {feedback} = useFeedbackSDKIntegration(); + const statusProps = getBadgeProperties(group.status, group.substatus); const issueTypeConfig = getConfigForIssueType(group, project); @@ -150,24 +151,19 @@ export default function StreamlinedGroupHeader({ {showLearnMore ? t("See What's New") : null} )} - {hasFeedbackForm && openForm ? ( - + feedbackOptions={{ + messagePlaceholder: t( + 'Please provide feedback on the issue Sentry detected.' + ), + tags: { + ['feedback.source']: feedbackSource, + }, + }} + /> ) : ( )} diff --git a/static/app/views/issueList/issueViews/issueViewsList/issueViewsList.tsx b/static/app/views/issueList/issueViews/issueViewsList/issueViewsList.tsx index 73d96d3a09a702..3f53e5b781a972 100644 --- a/static/app/views/issueList/issueViews/issueViewsList/issueViewsList.tsx +++ b/static/app/views/issueList/issueViews/issueViewsList/issueViewsList.tsx @@ -6,12 +6,13 @@ import FeatureDisabled from 'sentry/components/acl/featureDisabled'; import {Button} from 'sentry/components/core/button'; import {ButtonBar} from 'sentry/components/core/button/buttonBar'; import {CompactSelect} from 'sentry/components/core/compactSelect'; +import FeedbackButton from 'sentry/components/feedbackButton/feedbackButton'; import {Hovercard} from 'sentry/components/hovercard'; import * as Layout from 'sentry/components/layouts/thirds'; import Pagination from 'sentry/components/pagination'; import SearchBar from 'sentry/components/searchBar'; import SentryDocumentTitle from 'sentry/components/sentryDocumentTitle'; -import {IconAdd, IconMegaphone, IconSort} from 'sentry/icons'; +import {IconAdd, IconSort} from 'sentry/icons'; import {t} from 'sentry/locale'; import {space} from 'sentry/styles/space'; import {trackAnalytics} from 'sentry/utils/analytics'; @@ -19,7 +20,6 @@ import {setApiQueryData, useQueryClient} from 'sentry/utils/queryClient'; import useRouteAnalyticsParams from 'sentry/utils/routeAnalytics/useRouteAnalyticsParams'; import {unreachable} from 'sentry/utils/unreachable'; import normalizeUrl from 'sentry/utils/url/normalizeUrl'; -import {useFeedbackForm} from 'sentry/utils/useFeedbackForm'; import {useLocation} from 'sentry/utils/useLocation'; import {useNavigate} from 'sentry/utils/useNavigate'; import useOrganization from 'sentry/utils/useOrganization'; @@ -326,7 +326,6 @@ export default function IssueViewsList() { const navigate = useNavigate(); const location = useLocation(); const query = typeof location.query.query === 'string' ? location.query.query : ''; - const openFeedbackForm = useFeedbackForm(); const {mutate: createGroupSearchView, isPending: isCreatingView} = useCreateGroupSearchView(); @@ -366,27 +365,17 @@ export default function IssueViewsList() { - {openFeedbackForm ? ( - - ) : null} - + - + diff --git a/static/app/views/performance/newTraceDetails/traceHeader/placeholder.tsx b/static/app/views/performance/newTraceDetails/traceHeader/placeholder.tsx index ad062e19ac6b0e..45e1e8e51ec813 100644 --- a/static/app/views/performance/newTraceDetails/traceHeader/placeholder.tsx +++ b/static/app/views/performance/newTraceDetails/traceHeader/placeholder.tsx @@ -2,6 +2,8 @@ import styled from '@emotion/styled'; import {Breadcrumbs} from 'sentry/components/breadcrumbs'; import {ButtonBar} from 'sentry/components/core/button/buttonBar'; +import FeedbackButton from 'sentry/components/feedbackButton/feedbackButton'; +import {t} from 'sentry/locale'; import {space} from 'sentry/styles/space'; import type {Organization} from 'sentry/types/organization'; import type {Project} from 'sentry/types/project'; @@ -40,7 +42,16 @@ export function PlaceHolder({ })} /> - + diff --git a/static/app/views/performance/newTraceDetails/traceHeader/styles.tsx b/static/app/views/performance/newTraceDetails/traceHeader/styles.tsx index 4ac4d6d5f6442d..1effa2e2868ab5 100644 --- a/static/app/views/performance/newTraceDetails/traceHeader/styles.tsx +++ b/static/app/views/performance/newTraceDetails/traceHeader/styles.tsx @@ -1,34 +1,7 @@ import styled from '@emotion/styled'; -import {Button} from 'sentry/components/core/button'; import Placeholder from 'sentry/components/placeholder'; -import {IconMegaphone} from 'sentry/icons'; -import {t} from 'sentry/locale'; import {space} from 'sentry/styles/space'; -import {useFeedbackForm} from 'sentry/utils/useFeedbackForm'; - -function FeedbackButton() { - const openForm = useFeedbackForm(); - - return openForm ? ( - - ) : null; -} const HeaderLayout = styled('div')` background-color: ${p => p.theme.background}; @@ -70,7 +43,6 @@ const TraceHeaderComponents = { HeaderRow, HeaderContent, StyledBreak, - FeedbackButton, StyledPlaceholder, }; diff --git a/static/app/views/performance/newTraceDetails/traceSummary.tsx b/static/app/views/performance/newTraceDetails/traceSummary.tsx index 24a3910497b53c..3d50b4319fddd8 100644 --- a/static/app/views/performance/newTraceDetails/traceSummary.tsx +++ b/static/app/views/performance/newTraceDetails/traceSummary.tsx @@ -1,9 +1,9 @@ import styled from '@emotion/styled'; -import {Button} from 'sentry/components/core/button'; import {Link} from 'sentry/components/core/link'; +import FeedbackButton from 'sentry/components/feedbackButton/feedbackButton'; +import {useFeedbackSDKIntegration} from 'sentry/components/feedbackButton/useFeedbackSDKIntegration'; import LoadingIndicator from 'sentry/components/loadingIndicator'; -import {IconMegaphone} from 'sentry/icons'; import {IconInfo} from 'sentry/icons/iconInfo'; import {IconLightning} from 'sentry/icons/iconLightning'; import {IconStats} from 'sentry/icons/iconStats'; @@ -13,7 +13,6 @@ import {space} from 'sentry/styles/space'; import {MarkedText} from 'sentry/utils/marked/markedText'; import type {ApiQueryKey} from 'sentry/utils/queryClient'; import {useApiQuery, useQueryClient} from 'sentry/utils/queryClient'; -import {useFeedbackForm} from 'sentry/utils/useFeedbackForm'; import {useLocation} from 'sentry/utils/useLocation'; import useOrganization from 'sentry/utils/useOrganization'; import {getTraceDetailsUrl} from 'sentry/views/performance/traceDetails/utils'; @@ -72,7 +71,7 @@ function useTraceSummary(traceSlug: string) { export function TraceSummarySection({traceSlug}: {traceSlug: string}) { const traceContent = useTraceSummary(traceSlug); - const openFeedbackForm = useFeedbackForm(); + const {feedback} = useFeedbackSDKIntegration(); const organization = useOrganization(); const location = useLocation(); @@ -84,25 +83,16 @@ export function TraceSummarySection({traceSlug}: {traceSlug: string}) { return (
{t('Error loading Trace Summary')}
- {openFeedbackForm && ( - - )} +
); } @@ -165,25 +155,18 @@ export function TraceSummarySection({traceSlug}: {traceSlug: string}) { )} - {openFeedbackForm && ( + {feedback && ( - + feedbackOptions={{ + messagePlaceholder: t('How can we make the trace summary better for you?'), + tags: { + ['feedback.source']: 'trace-summary', + ['feedback.owner']: 'ml-ai', + }, + }} + /> )} diff --git a/static/app/views/releases/components/header.tsx b/static/app/views/releases/components/header.tsx index c9332f41b47d72..e2493ef74a8be5 100644 --- a/static/app/views/releases/components/header.tsx +++ b/static/app/views/releases/components/header.tsx @@ -1,14 +1,9 @@ -import {Button} from '@sentry/scraps/button'; - +import FeedbackButton from 'sentry/components/feedbackButton/feedbackButton'; import * as Layout from 'sentry/components/layouts/thirds'; import {PageHeadingQuestionTooltip} from 'sentry/components/pageHeadingQuestionTooltip'; -import {IconMegaphone} from 'sentry/icons'; import {t} from 'sentry/locale'; -import {useFeedbackForm} from 'sentry/utils/useFeedbackForm'; - -function Header() { - const openFeedbackForm = useFeedbackForm(); +export default function Header() { return ( @@ -22,26 +17,16 @@ function Header() { /> - {openFeedbackForm ? ( - - - - ) : null} + + + ); } - -export default Header; diff --git a/static/app/views/replays/detail/ai/ai.tsx b/static/app/views/replays/detail/ai/ai.tsx index b851706126a335..1a5e42ecc2d445 100644 --- a/static/app/views/replays/detail/ai/ai.tsx +++ b/static/app/views/replays/detail/ai/ai.tsx @@ -10,13 +10,13 @@ import {LinkButton} from 'sentry/components/core/button/linkButton'; import {Flex} from 'sentry/components/core/layout'; import {Text} from 'sentry/components/core/text'; import {useOrganizationSeerSetup} from 'sentry/components/events/autofix/useOrganizationSeerSetup'; +import FeedbackButton from 'sentry/components/feedbackButton/feedbackButton'; import {IconSync, IconThumb} from 'sentry/icons'; import {t} from 'sentry/locale'; import {space} from 'sentry/styles/space'; import type {Organization} from 'sentry/types/organization'; import {trackAnalytics} from 'sentry/utils/analytics'; import {useReplayReader} from 'sentry/utils/replays/playback/providers/replayReaderProvider'; -import {useFeedbackForm} from 'sentry/utils/useFeedbackForm'; import useOrganization from 'sentry/utils/useOrganization'; import useProjectFromId from 'sentry/utils/useProjectFromId'; import {ChapterList} from 'sentry/views/replays/detail/ai/chapterList'; @@ -205,8 +205,8 @@ export default function Ai() { - - + + - ) : null} + diff --git a/static/gsApp/views/amCheckout/components/checkoutSuccess.tsx b/static/gsApp/views/amCheckout/components/checkoutSuccess.tsx index e07be5b5d983a5..e1e3a03aee92f7 100644 --- a/static/gsApp/views/amCheckout/components/checkoutSuccess.tsx +++ b/static/gsApp/views/amCheckout/components/checkoutSuccess.tsx @@ -7,14 +7,12 @@ import moment from 'moment-timezone'; import Barcode from 'sentry-images/checkout/barcode.png'; import SentryLogo from 'sentry-images/checkout/sentry-receipt-logo.png'; -import {Button} from 'sentry/components/core/button'; import {LinkButton} from 'sentry/components/core/button/linkButton'; import {Container, Flex, Grid} from 'sentry/components/core/layout'; import {Heading, Text} from 'sentry/components/core/text'; -import {IconMegaphone} from 'sentry/icons'; +import FeedbackButton from 'sentry/components/feedbackButton/feedbackButton'; import {t, tct} from 'sentry/locale'; import {defined} from 'sentry/utils'; -import {useFeedbackForm} from 'sentry/utils/useFeedbackForm'; import {GIGABYTE} from 'getsentry/constants'; import type { @@ -574,8 +572,6 @@ function CheckoutSuccess({ date: effectiveDate, }); - const openFeedbackForm = useFeedbackForm(); - return ( {t('Edit plan')} - {openFeedbackForm ? ( - - ) : null} +