/* eslint-disable @typescript-eslint/no-explicit-any */ import type { RequestFn } from './utils'; import type { NotificationAppKind, NotificationDeliverySettings, NotificationDestination, } from '../notifications/installations'; export type UnreadNotificationsSummary = { total: number; verbs: Array<{ verb: string; unread: number; }>; procurement_requests?: Array<{ request_id: number; unread: number; }>; procurement_item_comments?: Array<{ item_id: number; unread: number; }>; task_boards?: Array<{ board_id: number; unread: number; }>; regulation_departments?: Array<{ department_id: number; unread: number; }>; regulation_company_unread?: number; regulation_personal_unread?: number; }; export function createNotificationsApi(request: RequestFn) { return { getNotifications: (params?: { page?: number; page_size?: number; unread_only?: boolean }) => { const qp = new URLSearchParams(); if (params?.page) qp.append('page', String(params.page)); if (params?.page_size) qp.append('page_size', String(params.page_size)); if (params?.unread_only) qp.append('unread_only', 'true'); const qs = qp.toString(); return request(qs ? `/api/v1/notifications/?${qs}` : '/api/v1/notifications/'); }, getUnreadNotificationsCount: (): Promise<{ count: number }> => request('/api/v1/notifications/count/'), getUnreadNotificationsSummary: (): Promise => request('/api/v1/notifications/summary/'), markNotificationAsRead: (id: number): Promise => request(`/api/v1/notifications/${id}/read/`, { method: 'POST' }), markAllNotificationsAsRead: (): Promise => request('/api/v1/notifications/read-all/', { method: 'POST' }), markCategoryAsRead: async (category: string): Promise<{ status: string; count: number }> => { const { getVerbsByCategory } = await import('../verbTranslations'); const verbs = getVerbsByCategory(category); return request('/api/v1/notifications/category/read/', { method: 'POST', body: JSON.stringify({ verbs, category }) }); }, // Push getVapidPublicKey: (): Promise<{ vapid_public_key: string }> => request('/api/v1/notifications/push/vapid-key/'), subscribePush: (data: { endpoint: string; keys: { p256dh: string; auth: string }; device_name?: string; installation_id?: string; device_group_id?: string; app_kind?: NotificationAppKind; installed?: boolean; }): Promise<{ status: string; message: string; created: boolean }> => request('/api/v1/notifications/push/subscribe/', { method: 'POST', body: JSON.stringify(data) }), unsubscribePush: (endpoint?: string): Promise<{ status: string; message: string }> => request('/api/v1/notifications/push/unsubscribe/', { method: 'DELETE', body: JSON.stringify({ endpoint }) }), getPushSubscriptions: (): Promise<{ subscriptions: any[] }> => request('/api/v1/notifications/push/subscriptions/'), heartbeatNotificationInstallation: (data: { installation_id: string; device_group_id: string; app_kind: NotificationAppKind; device_name?: string; installed?: boolean; }) => request('/api/v1/notifications/push/installations/heartbeat/', { method: 'POST', body: JSON.stringify(data), }), getNotificationDeliverySettings: (deviceGroupId: string): Promise => request(`/api/v1/notifications/push/delivery-routing/?device_group_id=${encodeURIComponent(deviceGroupId)}`), updateNotificationDeliverySettings: (data: { device_group_id: string; routes: Record; }): Promise => request('/api/v1/notifications/push/delivery-routing/', { method: 'PUT', body: JSON.stringify(data), }), disconnectNotificationInstallation: (data: { device_group_id: string; app_kind: NotificationAppKind; }): Promise<{ status: string; routes: Record }> => request('/api/v1/notifications/push/installations/disconnect/', { method: 'DELETE', body: JSON.stringify(data), }), // CRUD deleteNotification: (id: number): Promise => request(`/api/v1/notifications/${id}/`, { method: 'DELETE' }), deleteAllReadNotifications: (): Promise<{ status: string; count: number }> => request('/api/v1/notifications/delete-all-read/', { method: 'DELETE' }), // Preferences getNotificationPreferences: () => request('/api/v1/notifications/preferences/'), updateNotificationPreferences: (data: Record) => request('/api/v1/notifications/preferences/', { method: 'PUT', body: JSON.stringify(data) }), getVerbTypes: (): Promise<{ verb_types: any[] }> => request('/api/v1/notifications/verb-types/'), }; }