@@ -10,10 +10,10 @@ import { User } from "@opencode-ai/console-core/user.js"
1010const listMembers = query ( async ( workspaceID : string ) => {
1111 "use server"
1212 return withActor ( async ( ) => {
13- const actor = Actor . assert ( "user" )
1413 return {
1514 members : await User . list ( ) ,
16- currentUserID : actor . properties . userID ,
15+ actorID : Actor . userID ( ) ,
16+ actorRole : Actor . userRole ( ) ,
1717 }
1818 } , workspaceID )
1919} , "member.list" )
@@ -158,10 +158,11 @@ export function MemberCreateForm() {
158158 )
159159}
160160
161- function MemberRow ( props : { member : any ; workspaceID : string ; currentUserID : string | null } ) {
161+ function MemberRow ( props : { member : any ; workspaceID : string ; actorID : string ; actorRole : string } ) {
162162 const [ editing , setEditing ] = createSignal ( false )
163163 const submission = useSubmission ( updateMember )
164- const isCurrentUser = ( ) => props . currentUserID === props . member . id
164+ const isCurrentUser = ( ) => props . actorID === props . member . id
165+ const isAdmin = ( ) => props . actorRole === "admin"
165166
166167 createEffect ( ( ) => {
167168 if ( ! submission . pending && submission . result && ! submission . result . error ) {
@@ -200,19 +201,19 @@ function MemberRow(props: { member: any; workspaceID: string; currentUserID: str
200201 < td data-slot = "member-email" > { props . member . accountEmail ?? props . member . email } </ td >
201202 < td data-slot = "member-role" > { props . member . role } </ td >
202203 < td data-slot = "member-usage" > { getUsageDisplay ( ) } </ td >
203- < Show when = { ! props . member . timeSeen } fallback = { < td data-slot = "member-joined" > </ td > } >
204- < td data-slot = "member-joined" > invited</ td >
205- </ Show >
204+ < td data-slot = "member-joined" > { props . member . timeSeen ? "" : "invited" } </ td >
206205 < td data-slot = "member-actions" >
207- < button data-color = "ghost" onClick = { ( ) => setEditing ( true ) } >
208- Edit
209- </ button >
210- < Show when = { ! isCurrentUser ( ) } >
211- < form action = { removeMember } method = "post" >
212- < input type = "hidden" name = "id" value = { props . member . id } />
213- < input type = "hidden" name = "workspaceID" value = { props . workspaceID } />
214- < button data-color = "ghost" > Delete</ button >
215- </ form >
206+ < Show when = { isAdmin ( ) } >
207+ < button data-color = "ghost" onClick = { ( ) => setEditing ( true ) } >
208+ Edit
209+ </ button >
210+ < Show when = { ! isCurrentUser ( ) } >
211+ < form action = { removeMember } method = "post" >
212+ < input type = "hidden" name = "id" value = { props . member . id } />
213+ < input type = "hidden" name = "workspaceID" value = { props . workspaceID } />
214+ < button data-color = "ghost" > Delete</ button >
215+ </ form >
216+ </ Show >
216217 </ Show >
217218 </ td >
218219 </ tr >
@@ -293,37 +294,34 @@ export function MemberSection() {
293294 < section class = { styles . root } >
294295 < div data-slot = "section-title" >
295296 < h2 > Members</ h2 >
296- < p > Manage your members for accessing opencode services.</ p >
297297 </ div >
298- < MemberCreateForm />
298+ < Show when = { data ( ) ?. actorRole === "admin" } >
299+ < MemberCreateForm />
300+ </ Show >
299301 < div data-slot = "members-table" >
300- < Show
301- when = { data ( ) ?. members . length }
302- fallback = {
303- < div data-component = "empty-state" >
304- < p > Invite a member to your workspace</ p >
305- </ div >
306- }
307- >
308- < table data-slot = "members-table-element" >
309- < thead >
310- < tr >
311- < th > Email</ th >
312- < th > Role</ th >
313- < th > Usage</ th >
314- < th > </ th >
315- < th > </ th >
316- </ tr >
317- </ thead >
318- < tbody >
319- < For each = { data ( ) ! . members } >
320- { ( member ) => (
321- < MemberRow member = { member } workspaceID = { params . id } currentUserID = { data ( ) ! . currentUserID } />
322- ) }
323- </ For >
324- </ tbody >
325- </ table >
326- </ Show >
302+ < table data-slot = "members-table-element" >
303+ < thead >
304+ < tr >
305+ < th > Email</ th >
306+ < th > Role</ th >
307+ < th > Usage</ th >
308+ < th > </ th >
309+ < th > </ th >
310+ </ tr >
311+ </ thead >
312+ < tbody >
313+ < For each = { data ( ) ?. members || [ ] } >
314+ { ( member ) => (
315+ < MemberRow
316+ member = { member }
317+ workspaceID = { params . id }
318+ actorID = { data ( ) ! . actorID }
319+ actorRole = { data ( ) ! . actorRole }
320+ />
321+ ) }
322+ </ For >
323+ </ tbody >
324+ </ table >
327325 </ div >
328326 </ section >
329327 )
0 commit comments