legacyBrowsers.tsx 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import {Fragment} from 'react';
  2. import styled from '@emotion/styled';
  3. import BulkController from 'sentry/components/bulkController';
  4. import Switch from 'sentry/components/switchButton';
  5. import {t} from 'sentry/locale';
  6. import space from 'sentry/styles/space';
  7. import {LegacyBrowser} from 'sentry/types/sampling';
  8. import {LEGACY_BROWSER_LIST} from '../utils';
  9. const legacyBrowsers = Object.values(LegacyBrowser) as Array<LegacyBrowser>;
  10. type Props = {
  11. onChange: (selectedLegacyBrowsers: Array<LegacyBrowser>) => void;
  12. selectedLegacyBrowsers?: Array<LegacyBrowser>;
  13. };
  14. function LegacyBrowsers({onChange, selectedLegacyBrowsers = []}: Props) {
  15. function handleChange({
  16. selectedIds,
  17. }: Parameters<NonNullable<BulkController['props']['onChange']>>[0]) {
  18. onChange(selectedIds as Array<LegacyBrowser>);
  19. }
  20. return (
  21. <BulkController
  22. pageIds={legacyBrowsers}
  23. defaultSelectedIds={selectedLegacyBrowsers}
  24. allRowsCount={legacyBrowsers.length}
  25. onChange={handleChange}
  26. columnsCount={0}
  27. >
  28. {({selectedIds, onRowToggle, onPageRowsToggle, isPageSelected}) => (
  29. <Wrapper>
  30. {t('All browsers')}
  31. <Switch
  32. key="switch"
  33. size="lg"
  34. isActive={isPageSelected}
  35. toggle={() => {
  36. onPageRowsToggle(!isPageSelected);
  37. }}
  38. />
  39. {legacyBrowsers.map(legacyBrowser => {
  40. const {icon, title} = LEGACY_BROWSER_LIST[legacyBrowser];
  41. return (
  42. <Fragment key={legacyBrowser}>
  43. <BrowserWrapper>
  44. <Icon className={`icon-${icon}`} data-test-id={`icon-${icon}`} />
  45. {title}
  46. </BrowserWrapper>
  47. <Switch
  48. size="lg"
  49. isActive={selectedIds.includes(legacyBrowser)}
  50. toggle={() => onRowToggle(legacyBrowser)}
  51. />
  52. </Fragment>
  53. );
  54. })}
  55. </Wrapper>
  56. )}
  57. </BulkController>
  58. );
  59. }
  60. export default LegacyBrowsers;
  61. const Wrapper = styled('div')`
  62. grid-column: 1/-1;
  63. display: grid;
  64. grid-template-columns: 1fr max-content;
  65. gap: ${space(2)};
  66. font-size: ${p => p.theme.fontSizeLarge};
  67. color: ${p => p.theme.gray400};
  68. padding-top: ${space(2)};
  69. padding-bottom: ${space(1)};
  70. `;
  71. const BrowserWrapper = styled('div')`
  72. display: grid;
  73. grid-template-columns: max-content 1fr;
  74. grid-column-gap: ${space(1)};
  75. color: ${p => p.theme.gray500};
  76. `;
  77. const Icon = styled('div')`
  78. width: 24px;
  79. height: 24px;
  80. background-repeat: no-repeat;
  81. background-position: center;
  82. background-size: 24px 24px;
  83. flex-shrink: 0;
  84. `;