63 lines
1.3 KiB
TypeScript
63 lines
1.3 KiB
TypeScript
import { useApi } from '@/composables/useApi'
|
|
|
|
export type UserListItem =
|
|
| {
|
|
kind: 'user'
|
|
id: number
|
|
username: string
|
|
display_name: string
|
|
email: string
|
|
role: 'owner' | 'admin'
|
|
status: 'accepted'
|
|
created_at: string
|
|
}
|
|
| {
|
|
kind: 'invite'
|
|
id: number
|
|
email: string
|
|
display_name?: string
|
|
status: 'pending' | 'expired'
|
|
created_at: string
|
|
}
|
|
|
|
export const USER_SKELETON_ROWS = 5
|
|
|
|
export function userRowKey(kind: UserListItem['kind'], id: number) {
|
|
return `${kind}-${id}`
|
|
}
|
|
|
|
export function userDisplayName(item: UserListItem) {
|
|
return item.display_name ?? ''
|
|
}
|
|
|
|
export function userRole(item: UserListItem): 'owner' | 'admin' {
|
|
return item.kind === 'user' ? item.role : 'admin'
|
|
}
|
|
|
|
export interface CreatedInvite {
|
|
id: number
|
|
kind: 'invite'
|
|
email: string
|
|
status: 'pending'
|
|
created_at: string
|
|
expires_at: string
|
|
}
|
|
|
|
export function useUsers() {
|
|
const { request } = useApi()
|
|
|
|
function listUsers(): Promise<UserListItem[]> {
|
|
return request<UserListItem[]>('/v1/user/')
|
|
}
|
|
|
|
function inviteUser(email: string): Promise<CreatedInvite> {
|
|
return request<CreatedInvite>('/v1/user/invite', {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify({ email }),
|
|
})
|
|
}
|
|
|
|
return { listUsers, inviteUser }
|
|
}
|