123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- import {Fragment} from 'react';
- import styled from '@emotion/styled';
- import emptyStateImg from 'sentry-images/spot/replays-empty-state.svg';
- import Feature from 'sentry/components/acl/feature';
- import {Button} from 'sentry/components/button';
- import ButtonBar from 'sentry/components/buttonBar';
- import HookOrDefault from 'sentry/components/hookOrDefault';
- import OnboardingPanel from 'sentry/components/onboardingPanel';
- import {t} from 'sentry/locale';
- import PreferencesStore from 'sentry/stores/preferencesStore';
- import {useLegacyStore} from 'sentry/stores/useLegacyStore';
- import {useReplayOnboardingSidebarPanel} from 'sentry/utils/replays/hooks/useReplayOnboarding';
- import useOrganization from 'sentry/utils/useOrganization';
- type Breakpoints = {
- large: string;
- medium: string;
- small: string;
- xlarge: string;
- };
- const OnboardingCTAHook = HookOrDefault({
- hookName: 'component:replay-onboarding-cta',
- defaultComponent: ({children}) => <Fragment>{children}</Fragment>,
- });
- export default function ReplayOnboardingPanel() {
- const preferences = useLegacyStore(PreferencesStore);
- const breakpoints = preferences.collapsed
- ? {
- small: '800px',
- medium: '992px',
- large: '1210px',
- xlarge: '1450px',
- }
- : {
- small: '800px',
- medium: '1175px',
- large: '1375px',
- xlarge: '1450px',
- };
- const organization = useOrganization();
- return (
- <OnboardingPanel image={<HeroImage src={emptyStateImg} breakpoints={breakpoints} />}>
- <Feature
- features={['session-replay-ga']}
- organization={organization}
- renderDisabled={() => <SetupReplaysCTA />}
- >
- <OnboardingCTAHook organization={organization}>
- <SetupReplaysCTA />
- </OnboardingCTAHook>
- </Feature>
- </OnboardingPanel>
- );
- }
- function SetupReplaysCTA() {
- const {activateSidebar} = useReplayOnboardingSidebarPanel();
- return (
- <Fragment>
- <h3>{t('Get to the root cause faster')}</h3>
- <p>
- {t(
- 'See a video-like reproduction of your user sessions so you can see what happened before, during, and after an error or latency issue occurred.'
- )}
- </p>
- <ButtonList gap={1}>
- <Button onClick={activateSidebar} priority="primary">
- {t('Set Up Replays')}
- </Button>
- <Button
- href="https://docs.sentry.io/platforms/javascript/session-replay/"
- external
- >
- {t('Read Docs')}
- </Button>
- </ButtonList>
- </Fragment>
- );
- }
- const HeroImage = styled('img')<{breakpoints: Breakpoints}>`
- @media (min-width: ${p => p.breakpoints.small}) {
- user-select: none;
- position: absolute;
- top: 0;
- bottom: 0;
- width: 220px;
- margin-top: auto;
- margin-bottom: auto;
- transform: translateX(-50%);
- left: 50%;
- }
- @media (min-width: ${p => p.breakpoints.medium}) {
- transform: translateX(-55%);
- width: 300px;
- min-width: 300px;
- }
- @media (min-width: ${p => p.breakpoints.large}) {
- transform: translateX(-60%);
- width: 380px;
- min-width: 380px;
- }
- @media (min-width: ${p => p.breakpoints.xlarge}) {
- transform: translateX(-65%);
- width: 420px;
- min-width: 420px;
- }
- `;
- const ButtonList = styled(ButtonBar)`
- grid-template-columns: repeat(auto-fit, minmax(130px, max-content));
- `;
|