index.tsx 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import {Fragment, MouseEvent} from 'react';
  2. import styled from '@emotion/styled';
  3. import {Button} from 'sentry/components/button';
  4. import Stacked from 'sentry/components/replays/breadcrumbs/stacked';
  5. import {IconClose} from 'sentry/icons';
  6. import {t} from 'sentry/locale';
  7. import {space} from 'sentry/styles/space';
  8. import type {HydratedA11yFrame} from 'sentry/utils/replays/hydrateA11yFrame';
  9. import {useResizableDrawer} from 'sentry/utils/useResizableDrawer';
  10. import AccessibilityDetailsContent from 'sentry/views/replays/detail/accessibility/details/content';
  11. import SplitDivider from 'sentry/views/replays/detail/layout/splitDivider';
  12. type Props = {
  13. item: null | HydratedA11yFrame;
  14. onClose: () => void;
  15. } & Omit<ReturnType<typeof useResizableDrawer>, 'size'>;
  16. function AccessibilityDetails({
  17. isHeld,
  18. item,
  19. onClose,
  20. onDoubleClick,
  21. onMouseDown,
  22. }: Props) {
  23. if (!item) {
  24. return null;
  25. }
  26. return (
  27. <Fragment>
  28. <StyledStacked>
  29. <StyledSplitDivider
  30. data-is-held={isHeld}
  31. data-slide-direction="updown"
  32. onDoubleClick={onDoubleClick}
  33. onMouseDown={onMouseDown}
  34. />
  35. <CloseButtonWrapper>
  36. <Button
  37. aria-label={t('Hide accessibility details')}
  38. borderless
  39. icon={<IconClose isCircled size="sm" color="subText" />}
  40. onClick={(e: MouseEvent) => {
  41. e.preventDefault();
  42. onClose();
  43. }}
  44. size="zero"
  45. />
  46. </CloseButtonWrapper>
  47. </StyledStacked>
  48. <AccessibilityDetailsContent item={item} />
  49. </Fragment>
  50. );
  51. }
  52. const StyledStacked = styled(Stacked)`
  53. position: relative;
  54. border-top: 1px solid ${p => p.theme.border};
  55. border-bottom: 1px solid ${p => p.theme.border};
  56. `;
  57. const CloseButtonWrapper = styled('div')`
  58. position: absolute;
  59. right: 0;
  60. height: 100%;
  61. padding: ${space(1)};
  62. z-index: ${p => p.theme.zIndex.initial};
  63. display: flex;
  64. align-items: center;
  65. `;
  66. const StyledSplitDivider = styled(SplitDivider)`
  67. padding: ${space(0.75)};
  68. :hover,
  69. &[data-is-held='true'] {
  70. z-index: ${p => p.theme.zIndex.initial};
  71. }
  72. `;
  73. export default AccessibilityDetails;