groupActivityIcons.tsx 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. import styled from '@emotion/styled';
  2. import UserAvatar from 'sentry/components/avatar/userAvatar';
  3. import {IconCellSignal} from 'sentry/components/badge/iconCellSignal';
  4. import {
  5. IconAdd,
  6. IconAsana,
  7. IconBitbucket,
  8. IconChat,
  9. IconCheckmark,
  10. IconClose,
  11. IconCommit,
  12. IconDelete,
  13. IconFire,
  14. IconFlag,
  15. IconGithub,
  16. IconGitlab,
  17. IconGlobe,
  18. IconGraph,
  19. IconJira,
  20. IconLock,
  21. IconMute,
  22. IconNext,
  23. IconPlay,
  24. IconPrevious,
  25. IconRefresh,
  26. IconUnsubscribed,
  27. IconUser,
  28. } from 'sentry/icons';
  29. import {space} from 'sentry/styles/space';
  30. import {
  31. type Group,
  32. type GroupActivityCreateIssue,
  33. type GroupActivitySetPriority,
  34. GroupActivityType,
  35. } from 'sentry/types/group';
  36. import type {User} from 'sentry/types/user';
  37. interface IconWithDefaultProps {
  38. Component: React.ComponentType<any> | null;
  39. defaultProps: {locked?: boolean; type?: string};
  40. componentFunction?: (
  41. props: Group['activity'][number]['data'],
  42. user?: User | null
  43. ) => React.ComponentType<any>;
  44. propsFunction?: (props: any) => any;
  45. }
  46. export const groupActivityTypeIconMapping: Record<
  47. GroupActivityType,
  48. IconWithDefaultProps
  49. > = {
  50. [GroupActivityType.NOTE]: {
  51. Component: IconChat,
  52. defaultProps: {},
  53. componentFunction: (_data, user) => {
  54. return user ? () => <StyledUserAvatar user={user} /> : IconChat;
  55. },
  56. },
  57. [GroupActivityType.SET_RESOLVED]: {Component: IconCheckmark, defaultProps: {}},
  58. [GroupActivityType.SET_RESOLVED_BY_AGE]: {Component: IconCheckmark, defaultProps: {}},
  59. [GroupActivityType.SET_RESOLVED_IN_RELEASE]: {
  60. Component: IconCheckmark,
  61. defaultProps: {},
  62. },
  63. [GroupActivityType.SET_RESOLVED_IN_COMMIT]: {
  64. Component: IconCheckmark,
  65. defaultProps: {},
  66. },
  67. [GroupActivityType.SET_RESOLVED_IN_PULL_REQUEST]: {
  68. Component: IconCommit,
  69. defaultProps: {},
  70. },
  71. [GroupActivityType.SET_UNRESOLVED]: {Component: IconClose, defaultProps: {}},
  72. [GroupActivityType.SET_IGNORED]: {Component: IconMute, defaultProps: {}},
  73. [GroupActivityType.SET_PUBLIC]: {Component: IconGlobe, defaultProps: {}},
  74. [GroupActivityType.SET_PRIVATE]: {Component: IconLock, defaultProps: {locked: true}},
  75. [GroupActivityType.SET_REGRESSION]: {Component: IconFire, defaultProps: {}},
  76. [GroupActivityType.CREATE_ISSUE]: {
  77. Component: IconAdd,
  78. componentFunction: data => {
  79. const provider = (data as GroupActivityCreateIssue['data']).provider;
  80. switch (provider) {
  81. case 'GitHub':
  82. return IconGithub;
  83. case 'GitLab':
  84. return IconGitlab;
  85. case 'Bitbucket':
  86. return IconBitbucket;
  87. case 'Jira':
  88. return IconJira;
  89. case 'Asana':
  90. return IconAsana;
  91. default:
  92. return IconAdd;
  93. }
  94. },
  95. defaultProps: {},
  96. },
  97. [GroupActivityType.UNMERGE_SOURCE]: {Component: IconPrevious, defaultProps: {}},
  98. [GroupActivityType.UNMERGE_DESTINATION]: {Component: IconPrevious, defaultProps: {}},
  99. [GroupActivityType.FIRST_SEEN]: {Component: IconFlag, defaultProps: {}},
  100. [GroupActivityType.ASSIGNED]: {Component: IconUser, defaultProps: {}},
  101. [GroupActivityType.UNASSIGNED]: {Component: IconUnsubscribed, defaultProps: {}},
  102. [GroupActivityType.MERGE]: {Component: IconNext, defaultProps: {}},
  103. [GroupActivityType.REPROCESS]: {Component: IconRefresh, defaultProps: {}},
  104. [GroupActivityType.MARK_REVIEWED]: {Component: IconCheckmark, defaultProps: {}},
  105. [GroupActivityType.AUTO_SET_ONGOING]: {Component: IconPlay, defaultProps: {}},
  106. [GroupActivityType.SET_ESCALATING]: {
  107. Component: IconGraph,
  108. defaultProps: {type: 'area'},
  109. },
  110. [GroupActivityType.SET_PRIORITY]: {
  111. Component: IconCellSignal,
  112. defaultProps: {},
  113. propsFunction: data => {
  114. const {priority} = data as GroupActivitySetPriority['data'];
  115. switch (priority) {
  116. case 'high':
  117. return {bars: 3};
  118. case 'medium':
  119. return {bars: 2};
  120. case 'low':
  121. return {bars: 1};
  122. default:
  123. return {bars: 0};
  124. }
  125. },
  126. },
  127. [GroupActivityType.DELETED_ATTACHMENT]: {Component: IconDelete, defaultProps: {}},
  128. };
  129. const StyledUserAvatar = styled(UserAvatar)`
  130. svg {
  131. margin: ${space(0.25)};
  132. }
  133. `;