analytica-frontend-lib
Version:
Repositório público dos componentes utilizados nas plataformas da Analytica Ensino
142 lines • 3.76 kB
TypeScript
import type { BaseApiClient } from '../types/api';
import { StudentAnswerStatus, type ExamDetailsData, type ExamStudentResult, type ExamDetailsPagination, type ExamDetailsFilters } from '../types/examDetails';
/**
* Student activity status from backend
*/
declare enum StudentActivityStatus {
AGUARDANDO_RESPOSTA = "AGUARDANDO_RESPOSTA",
NAO_ENTREGUE = "NAO_ENTREGUE",
CONCLUIDO = "CONCLUIDO",
AGUARDANDO_CORRECAO = "AGUARDANDO_CORRECAO"
}
/**
* API student type
*/
interface ApiExamStudent {
studentId: string;
studentName: string;
answeredAt: string | null;
timeSpent: number;
score: number | null;
status: StudentActivityStatus;
}
/**
* API breakdown item type
*/
interface ApiBreakdownItem {
school: {
id: string;
name: string;
} | null;
schoolYear: {
id: string;
name: string;
} | null;
class: {
id: string;
name: string;
} | null;
totalStudents: number;
answeredStudents: number;
completionPercentage: number;
}
/**
* Exam details API response type
*/
export interface ExamDetailsApiResponse {
message: string;
data: {
students: ApiExamStudent[];
pagination: {
total: number;
page: number;
limit: number;
totalPages: number;
};
generalStats: {
averageScore: number;
completionPercentage: number;
};
questionStats: {
mostCorrect: number[];
mostIncorrect: number[];
notAnswered: number[];
};
breakdown: ApiBreakdownItem[];
};
}
/**
* Exam info API response type
*/
export interface ExamInfoApiResponse {
message: string;
data: {
id: string;
title: string;
startDate: string | null;
createdAt: string;
[key: string]: unknown;
};
}
/**
* Hook state interface
*/
export interface UseExamDetailsState {
examData: ExamDetailsData | null;
loading: boolean;
error: string | null;
pagination: ExamDetailsPagination;
}
/**
* Hook return type
*/
export interface UseExamDetailsReturn extends UseExamDetailsState {
fetchExamDetails: (examId: string, filters?: ExamDetailsFilters) => Promise<void>;
}
/**
* Default pagination values
*/
export declare const DEFAULT_EXAM_DETAILS_PAGINATION: ExamDetailsPagination;
/**
* Map backend status to frontend status
*/
export declare const mapBackendStatusToFrontend: (status: StudentActivityStatus) => StudentAnswerStatus;
/**
* Transform API student to frontend format
*/
export declare const transformStudent: (student: ApiExamStudent) => ExamStudentResult;
/**
* Handle errors during exam fetch
*/
export declare const handleExamDetailsFetchError: (error: unknown) => string;
/**
* Factory function to create useExamDetails hook
*
* @param apiClient - API client instance (axios, fetch wrapper, etc.)
* @returns Hook for managing exam details
*
* @example
* ```tsx
* // In your app setup
* import { createUseExamDetails } from 'analytica-frontend-lib';
* import api from '@/services/apiService';
*
* export const useExamDetails = createUseExamDetails(api);
*
* // In your component
* const { examData, loading, error, pagination, fetchExamDetails } = useExamDetails();
*
* useEffect(() => {
* if (examId) {
* fetchExamDetails(examId, { page: 1, limit: 10 });
* }
* }, [examId]);
* ```
*/
export declare const createUseExamDetails: (apiClient: BaseApiClient) => () => UseExamDetailsReturn;
/**
* Alias for createUseExamDetails
*/
export declare const createExamDetailsHook: (apiClient: BaseApiClient) => () => UseExamDetailsReturn;
export {};
//# sourceMappingURL=useExamDetails.d.ts.map