networkHeaderCell.tsx 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import {CSSProperties, forwardRef} from 'react';
  2. import styled from '@emotion/styled';
  3. import {IconArrow} from 'sentry/icons';
  4. import {t} from 'sentry/locale';
  5. import {space} from 'sentry/styles/space';
  6. import useSortNetwork from 'sentry/views/replays/detail/network/useSortNetwork';
  7. type SortConfig = ReturnType<typeof useSortNetwork>['sortConfig'];
  8. type Props = {
  9. handleSort: ReturnType<typeof useSortNetwork>['handleSort'];
  10. index: number;
  11. sortConfig: SortConfig;
  12. style: CSSProperties;
  13. };
  14. const COLUMNS: {
  15. field: SortConfig['by'];
  16. label: string;
  17. }[] = [
  18. {field: 'status', label: t('Status')},
  19. {field: 'description', label: t('Path')},
  20. {field: 'op', label: t('Type')},
  21. {field: 'size', label: t('Size')},
  22. {field: 'duration', label: t('Duration')},
  23. {field: 'startTimestamp', label: t('Timestamp')},
  24. ];
  25. export const COLUMN_COUNT = COLUMNS.length;
  26. function NetworkHeaderCell({handleSort, index, sortConfig, style}: Props) {
  27. const {field, label} = COLUMNS[index];
  28. return (
  29. <HeaderButton style={style} onClick={() => handleSort(field)}>
  30. {label}
  31. <IconArrow
  32. color="gray300"
  33. size="xs"
  34. direction={sortConfig.by === field && !sortConfig.asc ? 'down' : 'up'}
  35. style={{visibility: sortConfig.by === field ? 'visible' : 'hidden'}}
  36. />
  37. </HeaderButton>
  38. );
  39. }
  40. const HeaderButton = styled('button')`
  41. border: 0;
  42. border-bottom: 1px solid ${p => p.theme.border};
  43. background: ${p => p.theme.backgroundSecondary};
  44. color: ${p => p.theme.subText};
  45. font-size: ${p => p.theme.fontSizeSmall};
  46. font-weight: 600;
  47. line-height: 16px;
  48. text-align: unset;
  49. text-transform: uppercase;
  50. width: 100%;
  51. display: flex;
  52. align-items: center;
  53. justify-content: space-between;
  54. padding: ${space(0.5)} ${space(1)} ${space(0.5)} ${space(1.5)};
  55. svg {
  56. margin-left: ${space(0.25)};
  57. }
  58. `;
  59. export default forwardRef<HTMLButtonElement, Props>(NetworkHeaderCell);