1
1
import React , { useCallback , useEffect , useState } from 'react'
2
2
import { from } from 'rxjs'
3
3
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'
8
6
import { useVersionedClient } from '../../versionedClient'
9
7
import { User } from 'sanity'
10
8
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'
25
10
26
11
function getInviteUrl ( projectId : string ) {
27
- return `https://manage.sanity.io/projects/${ projectId } /team/invite `
12
+ return `https://manage.sanity.io/projects/${ projectId } /members `
28
13
}
29
14
30
15
interface Member {
31
16
id : string
32
- role : string
17
+ roles : Role [ ]
33
18
isRobot : boolean
19
+ isCurrentUser : boolean
20
+ createdAt : string
34
21
}
35
22
36
23
interface Project {
@@ -106,7 +93,7 @@ export function ProjectUsers() {
106
93
paddingY = { 4 }
107
94
mode = "bleed"
108
95
tone = "primary"
109
- text = "Invite members"
96
+ text = "Manage members"
110
97
as = "a"
111
98
loading = { isLoading }
112
99
href = { isLoading ? undefined : getInviteUrl ( project . id ) }
@@ -120,7 +107,7 @@ export function ProjectUsers() {
120
107
< Spinner />
121
108
</ Text >
122
109
< Text align = "center" size = { 1 } muted >
123
- Loading items...
110
+ Loading items…
124
111
</ Text >
125
112
</ Stack >
126
113
</ Box >
@@ -130,23 +117,13 @@ export function ProjectUsers() {
130
117
< Stack space = { 3 } padding = { 3 } >
131
118
{ users ?. map ( ( user ) => {
132
119
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
- )
142
120
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
+ />
150
127
)
151
128
} ) }
152
129
</ Stack >
@@ -159,11 +136,12 @@ function sortUsersByRobotStatus(userA: User, userB: User, project: Project) {
159
136
const { members} = project
160
137
const membershipA = members . find ( ( member ) => member . id === userA ?. id )
161
138
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
167
143
}
168
- return 0
144
+
145
+ // Robots go to the bottom
146
+ return membershipA ?. isRobot ? 1 : - 1
169
147
}
0 commit comments