import { useApi } from '@/composables/useApi' import type { LinkableUser } from '@/lib/directoryTypes' import type { RoleRef } from '@/lib/permissions' import type { AcceptedUser, CreatedInvite, OwnershipTransfer, UserListItem } from '@/lib/users' export type { AcceptedUser, CreatedInvite, OwnershipTransfer, UserListItem } export const USER_SKELETON_ROWS = 5 export function userRowKey(kind: UserListItem['kind'], id: number) { return `${kind}-${id}` } export function userDisplayName(item: UserListItem) { return item.kind === 'user' ? item.display_name : '' } export function userRole(item: UserListItem): RoleRef | null { return item.role ?? null } const JSON_HEADERS = { 'Content-Type': 'application/json' } export function useUsers() { const { request } = useApi() function listUsers(): Promise { return request('/v1/user/') } async function listLinkableUsers( takenUserIds: ReadonlySet, ): Promise { const users = await listUsers() return users.flatMap((user) => user.kind === 'user' && !takenUserIds.has(user.id) ? [ { id: user.id, label: user.display_name || user.username, email: user.email, }, ] : [], ) } function inviteUser(email: string, roleId?: number): Promise { return request('/v1/user/invite', { method: 'POST', headers: JSON_HEADERS, body: JSON.stringify(roleId === undefined ? { email } : { email, role_id: roleId }), }) } function changeUserRole(id: number, roleId: number): Promise { return request(`/v1/user/${id}/role`, { method: 'PUT', headers: JSON_HEADERS, body: JSON.stringify({ role_id: roleId }), }) } function transferOwnership(userId: number, confirmEmail: string): Promise { return request('/v1/site/transfer-ownership', { method: 'POST', headers: JSON_HEADERS, body: JSON.stringify({ user_id: userId, confirm_email: confirmEmail }), }) } function removeUser(id: number, expectedRoleId: number): Promise { return request(`/v1/user/${id}?expected_role_id=${expectedRoleId}`, { method: 'DELETE', }) } function cancelInvite(id: number): Promise { return request(`/v1/user/invite/${id}`, { method: 'DELETE' }) } function renewInvite(id: number): Promise { return request(`/v1/user/invite/${id}/renew`, { method: 'POST', }) } return { listUsers, listLinkableUsers, inviteUser, changeUserRole, transferOwnership, removeUser, cancelInvite, renewInvite, } }