import BaseService from './BaseService'; type Nullable = T | null; export interface UxTSearchFilters { query: Nullable; page: Nullable; limit: Nullable; sortBy: Nullable; sortOrder: Nullable<'asc' | 'desc'>; isActive: Nullable; userId: Nullable; } export interface UxTask { title: string; description: Nullable; allowTyping: boolean; taskId?: number; } export interface UxTest { title: string; startingPath: string; requireMic: boolean; requireCamera: boolean; description: Nullable; guidelines: Nullable; conclusionMessage: Nullable; visibility: boolean; tasks: UxTask[]; status: string; } export interface UxTListEntry { createdAt: string; status: 'preview' | 'in-progress' | 'paused' | 'closed'; createdBy: { userId: number; name: string; }; description: string; testId: number; title: string; updatedAt: string; } export default class UxtestingService extends BaseService { private readonly prefix = '/usability-tests'; async fetchTestsList( filters: Partial, ): Promise<{ list: UxTListEntry[]; total: number }> { const r = await this.client.post(`${this.prefix}/search`, filters); const j = await r.json(); return j.data || []; } async createTest(test: UxTest) { const r = await this.client.post(this.prefix, test); const j = await r.json(); return j.data || []; } async deleteTest(id: number) { const r = await this.client.delete(`${this.prefix}/${id}`); return await r.json(); } updateTest(id: number, test: UxTest) { return this.client .put(`${this.prefix}/${id}`, test) .then((r) => r.json()) .then((j) => j.data || []); } async fetchTest(id: string) { const r = await this.client.get(`${this.prefix}/${id}`); const j = await r.json(); return j.data || []; } async fetchTestSessions( id: string, page: number, limit: number, isLive?: boolean, userId?: string, ) { const r = await this.client.get(`${this.prefix}/${id}/sessions`, { page, limit, live: isLive, userId, }); return await r.json(); } async fetchTaskResponses( id: number, task: number, page: number, limit: number, query?: string, ) { const r = await this.client.get(`${this.prefix}/${id}/responses/${task}`, { page, limit, query, }); const j = await r.json(); return j.data || []; } async fetchTestStats(id: string) { const r = await this.client.get(`${this.prefix}/${id}/statistics`); const j = await r.json(); return j.data || []; } async fetchTestTaskStats(id: string) { const r = await this.client.get(`${this.prefix}/${id}/task-statistics`); const j = await r.json(); return j.data || []; } }