Skip to content

Commit 4699add

Browse files
committed
fix(projectUsers): show all of a users' roles, fix invite link + text
1 parent 21eaa29 commit 4699add

File tree

3 files changed

+68
-45
lines changed

3 files changed

+68
-45
lines changed

src/versionedClient.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {useClient} from 'sanity'
22

33
export function useVersionedClient() {
4-
return useClient({apiVersion: '1'})
4+
return useClient({apiVersion: '2024-06-03'})
55
}
+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import React from 'react'
2+
import {Box, Flex, rem, Stack, Text} from '@sanity/ui'
3+
import {styled} from 'styled-components'
4+
import {useListFormat, type User, UserAvatar} from 'sanity'
5+
import {RobotIcon} from '@sanity/icons'
6+
7+
const Root = styled(Flex)`
8+
height: ${rem(33)}; // 33 = PREVIEW_SIZES.default.media.height
9+
box-sizing: content-box;
10+
`
11+
12+
export interface ProjectUserProps {
13+
user: User
14+
isRobot: boolean
15+
roles: string[]
16+
}
17+
18+
export function ProjectUser({user, isRobot, roles}: ProjectUserProps) {
19+
const listFormat = useListFormat({style: 'narrow'})
20+
return (
21+
<Root align="center">
22+
<Flex align="center" flex={1} gap={2}>
23+
<Box flex="none">
24+
{isRobot ? (
25+
<Text size={2}>
26+
<RobotIcon />
27+
</Text>
28+
) : (
29+
<UserAvatar user={user} />
30+
)}
31+
</Box>
32+
33+
<Stack flex={1} space={2}>
34+
<Text size={1} style={{color: 'inherit'}} textOverflow="ellipsis" weight="medium">
35+
{user.displayName}
36+
</Text>
37+
38+
<Text muted size={1} textOverflow="ellipsis">
39+
{listFormat.format(roles)}
40+
</Text>
41+
</Stack>
42+
</Flex>
43+
</Root>
44+
)
45+
}

src/widgets/projectUsers/ProjectUsers.tsx

+22-44
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,23 @@
11
import React, {useCallback, useEffect, useState} from 'react'
22
import {from} from 'rxjs'
33
import {map, switchMap} from 'rxjs/operators'
4-
import {Stack, Spinner, Card, Box, Text, Button} from '@sanity/ui'
5-
import {RobotIcon} from '@sanity/icons'
6-
import {styled} from 'styled-components'
7-
import {DefaultPreview, useUserStore} from 'sanity'
4+
import {Stack, Spinner, Box, Text, Button} from '@sanity/ui'
5+
import {Role, useUserStore} from 'sanity'
86
import {useVersionedClient} from '../../versionedClient'
97
import {User} from 'sanity'
108
import {DashboardWidgetContainer} from '../../components/DashboardWidgetContainer'
11-
12-
const AvatarWrapper = styled(Card)`
13-
box-sizing: border-box;
14-
border-radius: 50%;
15-
border-color: transparent;
16-
overflow: hidden;
17-
width: 100%;
18-
height: 100%;
19-
20-
& > img {
21-
width: 100%;
22-
height: auto;
23-
}
24-
`
9+
import {ProjectUser} from './ProjectUser'
2510

2611
function getInviteUrl(projectId: string) {
27-
return `https://manage.sanity.io/projects/${projectId}/team/invite`
12+
return `https://manage.sanity.io/projects/${projectId}/members`
2813
}
2914

3015
interface Member {
3116
id: string
32-
role: string
17+
roles: Role[]
3318
isRobot: boolean
19+
isCurrentUser: boolean
20+
createdAt: string
3421
}
3522

3623
interface Project {
@@ -106,7 +93,7 @@ export function ProjectUsers() {
10693
paddingY={4}
10794
mode="bleed"
10895
tone="primary"
109-
text="Invite members"
96+
text="Manage members"
11097
as="a"
11198
loading={isLoading}
11299
href={isLoading ? undefined : getInviteUrl(project.id)}
@@ -120,7 +107,7 @@ export function ProjectUsers() {
120107
<Spinner />
121108
</Text>
122109
<Text align="center" size={1} muted>
123-
Loading items...
110+
Loading items
124111
</Text>
125112
</Stack>
126113
</Box>
@@ -130,23 +117,13 @@ export function ProjectUsers() {
130117
<Stack space={3} padding={3}>
131118
{users?.map((user) => {
132119
const membership = project.members.find((member) => member.id === user.id)
133-
const media = membership?.isRobot ? (
134-
<Text size={3}>
135-
<RobotIcon />
136-
</Text>
137-
) : (
138-
<AvatarWrapper tone="transparent">
139-
{user?.imageUrl && <img src={user.imageUrl} alt={user?.displayName} />}
140-
</AvatarWrapper>
141-
)
142120
return (
143-
<Box key={user.id}>
144-
<DefaultPreview
145-
title={user.displayName}
146-
subtitle={membership?.role}
147-
media={media}
148-
/>
149-
</Box>
121+
<ProjectUser
122+
key={user.id}
123+
user={user}
124+
isRobot={membership?.isRobot ?? false}
125+
roles={membership?.roles.map((role) => role.title) || []}
126+
/>
150127
)
151128
})}
152129
</Stack>
@@ -159,11 +136,12 @@ function sortUsersByRobotStatus(userA: User, userB: User, project: Project) {
159136
const {members} = project
160137
const membershipA = members.find((member) => member.id === userA?.id)
161138
const membershipB = members.find((member) => member.id === userB?.id)
162-
if (membershipA?.isRobot) {
163-
return 1
164-
}
165-
if (membershipB?.isRobot) {
166-
return -1
139+
140+
// On ties, sort by when the user was added
141+
if (membershipA?.isRobot === membershipB?.isRobot) {
142+
return (membershipA?.createdAt || '') > (membershipB?.createdAt || '') ? 1 : -1
167143
}
168-
return 0
144+
145+
// Robots go to the bottom
146+
return membershipA?.isRobot ? 1 : -1
169147
}

0 commit comments

Comments
 (0)