replayFullscreenButton.tsx 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. import {useCallback} from 'react';
  2. import screenfull from 'screenfull';
  3. import {Button} from 'sentry/components/button';
  4. import {useReplayContext} from 'sentry/components/replays/replayContext';
  5. import {IconContract, IconExpand} from 'sentry/icons';
  6. import {t} from 'sentry/locale';
  7. import {trackAnalytics} from 'sentry/utils/analytics';
  8. import useOrganization from 'sentry/utils/useOrganization';
  9. import {useUser} from 'sentry/utils/useUser';
  10. import useIsFullscreen from 'sentry/utils/window/useIsFullscreen';
  11. type Props = {
  12. toggleFullscreen: () => void;
  13. };
  14. export function ReplayFullscreenButton({toggleFullscreen}: Props) {
  15. const organization = useOrganization();
  16. const user = useUser();
  17. const isFullscreen = useIsFullscreen();
  18. const {analyticsContext} = useReplayContext();
  19. const handleFullscreenToggle = useCallback(() => {
  20. trackAnalytics('replay.toggle-fullscreen', {
  21. organization,
  22. context: analyticsContext,
  23. user_email: user.email,
  24. fullscreen: !isFullscreen,
  25. });
  26. toggleFullscreen();
  27. }, [analyticsContext, isFullscreen, organization, toggleFullscreen, user.email]);
  28. // If the browser supports going fullscreen or not. iPhone Safari won't do
  29. // it. https://caniuse.com/fullscreen
  30. const fullscreenSupported = screenfull.isEnabled;
  31. if (!fullscreenSupported) {
  32. return null;
  33. }
  34. return (
  35. <Button
  36. size="sm"
  37. title={isFullscreen ? t('Exit full screen') : t('Enter full screen')}
  38. aria-label={isFullscreen ? t('Exit full screen') : t('Enter full screen')}
  39. icon={isFullscreen ? <IconContract size="sm" /> : <IconExpand size="sm" />}
  40. onClick={handleFullscreenToggle}
  41. />
  42. );
  43. }