feat: separa estrutura de dados para métricas de leitura e escrita

- Cria novo arquivo de tipos para métricas
- Refatora interfaces para separar métricas de leitura e escrita
- Atualiza StudentDashboardPage para usar novas interfaces
- Prepara estrutura para implementação das métricas de escrita

type: feat
scope: metrics
breaking: false
This commit is contained in:
Lucas Santana 2025-02-07 10:50:10 -03:00
parent 8b45fe72e7
commit 8c6e6aedd3
2 changed files with 120 additions and 38 deletions

View File

@ -5,19 +5,12 @@ import { supabase } from '../../lib/supabase';
import type { Story, Student } from '../../types/database'; import type { Story, Student } from '../../types/database';
import { MetricsChart } from '@/components/dashboard/MetricsChart'; import { MetricsChart } from '@/components/dashboard/MetricsChart';
import { DashboardMetrics } from '@/components/dashboard/DashboardMetrics'; import { DashboardMetrics } from '@/components/dashboard/DashboardMetrics';
import type {
interface DashboardMetrics { DashboardMetrics as DashboardMetricsType,
totalStories: number; DashboardWeeklyMetrics,
averageReadingFluency: number; WeeklyReadingMetrics,
totalReadingTime: number; WeeklyWritingMetrics
currentLevel: number; } from '@/types/metrics';
averagePronunciation: number;
averageAccuracy: number;
averageComprehension: number;
averageWordsPerMinute: number;
averagePauses: number;
averageErrors: number;
}
interface WeeklyMetrics { interface WeeklyMetrics {
week: string; week: string;
@ -57,7 +50,8 @@ interface WeeklyData {
export function StudentDashboardPage() { export function StudentDashboardPage() {
const navigate = useNavigate(); const navigate = useNavigate();
const [student, setStudent] = React.useState<Student | null>(null); const [student, setStudent] = React.useState<Student | null>(null);
const [metrics, setMetrics] = React.useState<DashboardMetrics>({ const [metrics, setMetrics] = React.useState<DashboardMetricsType>({
reading: {
totalStories: 0, totalStories: 0,
averageReadingFluency: 0, averageReadingFluency: 0,
totalReadingTime: 0, totalReadingTime: 0,
@ -68,8 +62,23 @@ export function StudentDashboardPage() {
averageWordsPerMinute: 0, averageWordsPerMinute: 0,
averagePauses: 0, averagePauses: 0,
averageErrors: 0 averageErrors: 0
},
writing: {
totalEssays: 0,
averageScore: 0,
totalEssaysTime: 0,
currentWritingLevel: 1,
averageAdequacy: 0,
averageCoherence: 0,
averageCohesion: 0,
averageVocabulary: 0,
averageGrammar: 0
}
});
const [weeklyMetrics, setWeeklyMetrics] = React.useState<DashboardWeeklyMetrics>({
reading: [],
writing: []
}); });
const [weeklyMetrics, setWeeklyMetrics] = React.useState<WeeklyMetrics[]>([]);
const [loading, setLoading] = React.useState(true); const [loading, setLoading] = React.useState(true);
const [error, setError] = React.useState<string | null>(null); const [error, setError] = React.useState<string | null>(null);
const [recentStories, setRecentStories] = React.useState<Story[]>([]); const [recentStories, setRecentStories] = React.useState<Story[]>([]);
@ -164,7 +173,10 @@ export function StudentDashboardPage() {
// Processar métricas semanais // Processar métricas semanais
const weeklyData = processWeeklyMetrics(recordings); const weeklyData = processWeeklyMetrics(recordings);
setWeeklyMetrics(weeklyData); setWeeklyMetrics({
reading: weeklyData,
writing: []
});
// Buscar histórias recentes com a capa definida // Buscar histórias recentes com a capa definida
const { data: stories, error: storiesError } = await supabase const { data: stories, error: storiesError } = await supabase
@ -225,6 +237,7 @@ export function StudentDashboardPage() {
// Calcular médias // Calcular médias
setMetrics({ setMetrics({
reading: {
totalStories: allStoriesData.length, totalStories: allStoriesData.length,
averageReadingFluency: Math.round(metricsSum.fluency / totalRecordings), averageReadingFluency: Math.round(metricsSum.fluency / totalRecordings),
totalReadingTime: recordings.length * 2, totalReadingTime: recordings.length * 2,
@ -235,6 +248,18 @@ export function StudentDashboardPage() {
averageWordsPerMinute: Math.round(metricsSum.wordsPerMinute / totalRecordings), averageWordsPerMinute: Math.round(metricsSum.wordsPerMinute / totalRecordings),
averagePauses: Math.round(metricsSum.pauses / totalRecordings), averagePauses: Math.round(metricsSum.pauses / totalRecordings),
averageErrors: Math.round(metricsSum.errors / totalRecordings) averageErrors: Math.round(metricsSum.errors / totalRecordings)
},
writing: {
totalEssays: 0,
averageScore: 0,
totalEssaysTime: 0,
currentWritingLevel: 1,
averageAdequacy: 0,
averageCoherence: 0,
averageCohesion: 0,
averageVocabulary: 0,
averageGrammar: 0
}
}); });
} }
@ -318,10 +343,10 @@ export function StudentDashboardPage() {
</div> </div>
{/* Métricas */} {/* Métricas */}
<DashboardMetrics data={metrics} /> <DashboardMetrics data={metrics.reading} />
{/* Gráfico de Evolução */} {/* Gráfico de Evolução */}
<MetricsChart data={weeklyMetrics} className="mb-8" /> <MetricsChart data={weeklyMetrics.reading} className="mb-8" />
{/* Histórias Recentes */} {/* Histórias Recentes */}
<div> <div>

57
src/types/metrics.ts Normal file
View File

@ -0,0 +1,57 @@
export interface ReadingMetrics {
totalStories: number;
averageReadingFluency: number;
totalReadingTime: number;
currentLevel: number;
averagePronunciation: number;
averageAccuracy: number;
averageComprehension: number;
averageWordsPerMinute: number;
averagePauses: number;
averageErrors: number;
}
export interface WritingMetrics {
totalEssays: number;
averageScore: number;
totalEssaysTime: number;
currentWritingLevel: number;
averageAdequacy: number;
averageCoherence: number;
averageCohesion: number;
averageVocabulary: number;
averageGrammar: number;
}
export interface WeeklyReadingMetrics {
week: string;
fluency: number;
pronunciation: number;
accuracy: number;
comprehension: number;
wordsPerMinute: number;
pauses: number;
errors: number;
minutesRead: number;
}
export interface WeeklyWritingMetrics {
week: string;
score: number;
adequacy: number;
coherence: number;
cohesion: number;
vocabulary: number;
grammar: number;
minutesWriting: number;
}
export interface DashboardMetrics {
reading: ReadingMetrics;
writing: WritingMetrics;
}
export interface DashboardWeeklyMetrics {
reading: WeeklyReadingMetrics[];
writing: WeeklyWritingMetrics[];
}