Skip to content

Commit e5e9e93

Browse files
feat(ui): Add ActorBadge (#69029)
Co-authored-by: getsantry[bot] <66042841+getsantry[bot]@users.noreply.github.com>
1 parent b50875c commit e5e9e93

File tree

4 files changed

+65
-3
lines changed

4 files changed

+65
-3
lines changed
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import type {Actor} from 'sentry/types';
2+
3+
import BadgeDisplayName from './badgeDisplayName';
4+
import {BaseBadge, type BaseBadgeProps} from './baseBadge';
5+
6+
export interface ActorBadgeProps extends BaseBadgeProps {
7+
actor: Actor;
8+
}
9+
10+
function ActorBadge({actor, ...props}: ActorBadgeProps) {
11+
const title = actor.type === 'team' ? `#${actor.name}` : actor.name || actor.email;
12+
13+
return (
14+
<BaseBadge
15+
displayName={<BadgeDisplayName>{title}</BadgeDisplayName>}
16+
actor={actor}
17+
{...props}
18+
/>
19+
);
20+
}
21+
22+
export default ActorBadge;

static/app/components/idBadge/baseBadge.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import styled from '@emotion/styled';
33

44
import Avatar from 'sentry/components/avatar';
55
import {space} from 'sentry/styles/space';
6-
import type {AvatarProject, AvatarUser, Organization, Team} from 'sentry/types';
6+
import type {Actor, AvatarProject, AvatarUser, Organization, Team} from 'sentry/types';
77

88
export interface BaseBadgeProps {
99
avatarProps?: Record<string, any>;
@@ -17,6 +17,7 @@ export interface BaseBadgeProps {
1717

1818
interface AllBaseBadgeProps extends BaseBadgeProps {
1919
displayName: React.ReactNode;
20+
actor?: Actor;
2021
organization?: Organization;
2122
project?: AvatarProject;
2223
team?: Team;
@@ -35,6 +36,7 @@ export const BaseBadge = memo(
3536
user,
3637
organization,
3738
project,
39+
actor,
3840
className,
3941
}: AllBaseBadgeProps) => (
4042
<Wrapper className={className}>
@@ -46,6 +48,7 @@ export const BaseBadge = memo(
4648
user={user}
4749
organization={organization}
4850
project={project}
51+
actor={actor}
4952
/>
5053
)}
5154

static/app/components/idBadge/getBadge.tsx

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import ActorBadge, {type ActorBadgeProps} from './actorBadge';
12
import type {BaseBadgeProps} from './baseBadge';
23
import MemberBadge, {type MemberBadgeProps} from './memberBadge';
34
import OrganizationBadge, {type OrganizationBadgeProps} from './organizationBadge';
@@ -34,12 +35,18 @@ interface GetProjectBadgeProps
3435
ProjectBadgeProps,
3536
AddedBaseBadgeProps {}
3637

38+
interface GetActorBadgeProps
39+
extends Omit<BaseBadgeProps, 'displayName' | 'actor'>,
40+
ActorBadgeProps,
41+
AddedBaseBadgeProps {}
42+
3743
export type GetBadgeProps =
3844
| GetOrganizationBadgeProps
3945
| GetTeamBadgeProps
4046
| GetProjectBadgeProps
4147
| GetUserBadgeProps
42-
| GetMemberBadgeProps;
48+
| GetMemberBadgeProps
49+
| GetActorBadgeProps;
4350

4451
function getBadge(props): React.ReactElement | null {
4552
if (props.organization) {
@@ -54,6 +61,9 @@ function getBadge(props): React.ReactElement | null {
5461
if (props.user) {
5562
return <UserBadge {...props} />;
5663
}
64+
if (props.actor) {
65+
return <ActorBadge {...props} />;
66+
}
5767
if (props.member) {
5868
return <MemberBadge {...props} />;
5969
}

static/app/components/idBadge/index.stories.tsx

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import LoadingIndicator from 'sentry/components/loadingIndicator';
22
import storyBook from 'sentry/stories/storyBook';
3-
import type {Member} from 'sentry/types';
3+
import type {Actor, Member} from 'sentry/types';
44
import useOrganization from 'sentry/utils/useOrganization';
55
import useProjects from 'sentry/utils/useProjects';
66
import {useTeams} from 'sentry/utils/useTeams';
77
import {useUser} from 'sentry/utils/useUser';
88

9+
import SideBySide from '../stories/sideBySide';
10+
911
import IdBadge from '.';
1012

1113
export default storyBook(IdBadge, story => {
@@ -81,4 +83,29 @@ export default storyBook(IdBadge, story => {
8183

8284
return <IdBadge member={member} />;
8385
});
86+
87+
story('Actor', () => {
88+
const user = useUser();
89+
const {teams} = useTeams();
90+
91+
const userActor: Actor = {
92+
type: 'user',
93+
id: user.id,
94+
name: user.name,
95+
email: user.email,
96+
};
97+
98+
const teamActor: Actor = {
99+
type: 'team',
100+
id: teams[0].id,
101+
name: teams[0].name,
102+
};
103+
104+
return (
105+
<SideBySide>
106+
<IdBadge actor={userActor} />
107+
<IdBadge actor={teamActor} />
108+
</SideBySide>
109+
);
110+
});
84111
});

0 commit comments

Comments
 (0)