openreplay/frontend/app/services/AssistStatsService.ts
Delirium a2fce7e291
Assist stats UI (#1489)
* feat(ui): start assist stats

* feat(ui): design mock up for stats

* feat(ui): naming...

* feat(ui): types, api service, some changes for recs and loaders

* feat(ui): csv export button/request

* feat(ui): csv export button/request

* feat(ui): format dates

* feat(ui): some fixes for stats requests

* fix(tracker): fix test

* fix(tracker): fix ci build

* fix(tracker): fix assist tests

* fix(tracker): bump test coverage, fix minor bug

* fix(ui): more cypress fixes

* fix(ui): add proj id to socket connection

* fix(ui): remove console log

* fix(ui): update filters

* feat(ui):fix some api keys for stats

* feat(ui): fix type

* feat(ui): remove unused

* feat(ui): some fixes

* feat(ui): some fixes 2

* fix(ui): some search fixes

* fix(ui): change api keys

* fix(ui): change api keys

* fix(ui): pdf button fix

* fix(ui): pdf button fix

* fix(ui): some ui fixes after review

* fix(ui): fix csv export

* fix(ui): change header for pds export for stats

* fix(ui): change header width for exports
2023-10-16 13:54:37 +02:00

145 lines
3 KiB
TypeScript

import APIClient from 'App/api_client';
export interface Member {
name: string;
count: number;
assistDuration: number;
callDuration: number;
controlDuration: number;
assistCount: number;
}
export interface AssistStatsSession {
callDuration: number;
assistDuration: number;
controlDuration: number;
sessionId: string;
teamMembers: { name: string; id: string }[];
timestamp: number;
recordings: {
recordId: number;
name: string;
duration: number;
}[];
}
export type PeriodKeys =
| 'assistTotal'
| 'assistAvg'
| 'callTotal'
| 'callAvg'
| 'controlTotal'
| 'controlAvg';
export interface Graphs {
currentPeriod: {
assistTotal: number;
assistAvg: number;
callTotal: number;
callAvg: number;
controlTotal: number;
controlAvg: number;
};
previousPeriod: {
assistTotal: number;
assistAvg: number;
callTotal: number;
callAvg: number;
controlTotal: number;
controlAvg: number;
};
list: {
time: number;
assistAvg: number;
callAvg: number;
controlAvg: number;
assistTotal: number;
callTotal: number;
controlTotal: number;
}[];
}
export const generateListData = (list: any[], key: PeriodKeys) => {
return list.map((item) => {
return {
timestamp: item.timestamp,
value: item[key],
};
});
};
export const defaultGraphs = {
currentPeriod: {
assistTotal: 0,
assistAvg: 0,
callTotal: 0,
callAvg: 0,
controlTotal: 0,
controlAvg: 0,
},
previousPeriod: {
assistTotal: 0,
assistAvg: 0,
callTotal: 0,
callAvg: 0,
controlTotal: 0,
controlAvg: 0,
},
list: [],
};
export interface SessionsResponse {
total: number;
page: number;
list: AssistStatsSession[];
}
export default class AssistStatsService {
private client: APIClient;
constructor(client?: APIClient) {
this.client = client ? client : new APIClient();
}
initClient(client?: APIClient) {
this.client = client || new APIClient();
}
fetch(path: string, body: Record<string, any>, method: 'get' | 'post') {
return this.client[method]('/assist-stats/' + path, body).then((r) => r.json());
}
getGraphs(range: { start: number; end: number }, userId?: number): Promise<Graphs> {
return this.fetch(
'avg',
{ startTimestamp: range.start, endTimestamp: range.end, userId },
'get'
);
}
getTopMembers(filters: {
startTimestamp: number;
endTimestamp: number;
sort: string;
order: 'asc' | 'desc';
userId?: number;
}): Promise<{ list: Member[]; total: number }> {
return this.fetch('top-members', filters, 'get');
}
getSessions(filters: {
startTimestamp: number;
endTimestamp: number;
sort: string;
userId?: number;
order: 'asc' | 'desc';
page: number;
limit: number;
}): Promise<SessionsResponse> {
return this.fetch('sessions', filters, 'post');
}
exportCSV(filters: { start: number; end: number; sort: string; order: 'asc' | 'desc' }) {
return this.fetch('export-csv', filters, 'get');
}
}