import { useApi } from '@/composables/useApi' import { exportQuery, listQuery, summaryQuery, type ActivityFilters, type ActivityPage, type ActivitySummary, } from '@/lib/activity' import type { UserListItem } from '@/composables/useUsers' import type { ApiKey } from '@/composables/useApiKeys' export interface PersonOptions { users: { id: number; name: string }[] keys: { id: number; name: string }[] } export const ACTIVITY_SKELETON_ROWS = 9 export const ACTIVITY_SKELETON_CARDS = 5 export const EXPORT_FILE_NAME = 'activity.csv' export function useActivity() { const { request, requestBlob } = useApi() function listActivity( filters: ActivityFilters, page: number, size: number, withActor = true, ): Promise { return request(`/v1/activity?${listQuery(filters, page, size, withActor)}`) } function listRecentActivity(size: number): Promise { return request(`/v1/activity?size=${size}`) } function getSummary(filters: ActivityFilters): Promise { return request(`/v1/activity/summary?${summaryQuery(filters)}`) } function exportActivity(filters: ActivityFilters): Promise { return requestBlob(`/v1/activity/export?${exportQuery(filters)}`) } async function listPeople(): Promise { const [users, keys] = await Promise.all([ request('/v1/user/'), request('/v1/api-key/'), ]) return { users: users.flatMap((item) => item.kind === 'user' ? [{ id: item.id, name: item.display_name || item.username }] : [], ), keys: keys.map((key) => ({ id: key.id, name: key.name })), } } return { listActivity, listRecentActivity, getSummary, exportActivity, listPeople } } export function downloadBlob(blob: Blob, fileName: string) { const url = URL.createObjectURL(blob) const anchor = document.createElement('a') anchor.href = url anchor.download = fileName document.body.appendChild(anchor) anchor.click() anchor.remove() URL.revokeObjectURL(url) }