utils.tsx 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import {defined} from 'sentry/utils';
  2. export type NetworkSpan = {
  3. data: Record<string, any>;
  4. endTimestamp: number;
  5. op: string;
  6. startTimestamp: number;
  7. description?: string;
  8. };
  9. export interface ISortConfig {
  10. asc: boolean;
  11. by: keyof NetworkSpan | string;
  12. getValue: (row: NetworkSpan) => any;
  13. }
  14. export const UNKNOWN_STATUS = 'unknown';
  15. export function sortNetwork(
  16. network: NetworkSpan[],
  17. sortConfig: ISortConfig
  18. ): NetworkSpan[] {
  19. return [...network].sort((a, b) => {
  20. let valueA = sortConfig.getValue(a);
  21. let valueB = sortConfig.getValue(b);
  22. valueA = typeof valueA === 'string' ? valueA.toUpperCase() : valueA;
  23. valueB = typeof valueB === 'string' ? valueB.toUpperCase() : valueB;
  24. // if the values are not defined, we want to push them to the bottom of the list
  25. if (!defined(valueA)) {
  26. return 1;
  27. }
  28. if (!defined(valueB)) {
  29. return -1;
  30. }
  31. if (valueA === valueB) {
  32. return 0;
  33. }
  34. if (sortConfig.asc) {
  35. return valueA > valueB ? 1 : -1;
  36. }
  37. return valueB > valueA ? 1 : -1;
  38. });
  39. }
  40. export const getResourceTypes = (networkSpans: NetworkSpan[]) =>
  41. Array.from(
  42. new Set(networkSpans.map(networkSpan => networkSpan.op.replace('resource.', '')))
  43. ).sort();
  44. export const getStatusTypes = (networkSpans: NetworkSpan[]) =>
  45. Array.from(
  46. new Set(
  47. networkSpans
  48. .map(networkSpan => networkSpan.data.statusCode ?? UNKNOWN_STATUS)
  49. .map(String)
  50. )
  51. ).sort();