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 { MetricsChart } from '@/components/dashboard/MetricsChart';
import { DashboardMetrics } from '@/components/dashboard/DashboardMetrics';
interface DashboardMetrics {
totalStories: number;
averageReadingFluency: number;
totalReadingTime: number;
currentLevel: number;
averagePronunciation: number;
averageAccuracy: number;
averageComprehension: number;
averageWordsPerMinute: number;
averagePauses: number;
averageErrors: number;
}
import type {
DashboardMetrics as DashboardMetricsType,
DashboardWeeklyMetrics,
WeeklyReadingMetrics,
WeeklyWritingMetrics
} from '@/types/metrics';
interface WeeklyMetrics {
week: string;
@ -57,19 +50,35 @@ interface WeeklyData {
export function StudentDashboardPage() {
const navigate = useNavigate();
const [student, setStudent] = React.useState<Student | null>(null);
const [metrics, setMetrics] = React.useState<DashboardMetrics>({
totalStories: 0,
averageReadingFluency: 0,
totalReadingTime: 0,
currentLevel: 1,
averagePronunciation: 0,
averageAccuracy: 0,
averageComprehension: 0,
averageWordsPerMinute: 0,
averagePauses: 0,
averageErrors: 0
const [metrics, setMetrics] = React.useState<DashboardMetricsType>({
reading: {
totalStories: 0,
averageReadingFluency: 0,
totalReadingTime: 0,
currentLevel: 1,
averagePronunciation: 0,
averageAccuracy: 0,
averageComprehension: 0,
averageWordsPerMinute: 0,
averagePauses: 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 [error, setError] = React.useState<string | null>(null);
const [recentStories, setRecentStories] = React.useState<Story[]>([]);
@ -164,7 +173,10 @@ export function StudentDashboardPage() {
// Processar métricas semanais
const weeklyData = processWeeklyMetrics(recordings);
setWeeklyMetrics(weeklyData);
setWeeklyMetrics({
reading: weeklyData,
writing: []
});
// Buscar histórias recentes com a capa definida
const { data: stories, error: storiesError } = await supabase
@ -225,16 +237,29 @@ export function StudentDashboardPage() {
// Calcular médias
setMetrics({
totalStories: allStoriesData.length,
averageReadingFluency: Math.round(metricsSum.fluency / totalRecordings),
totalReadingTime: recordings.length * 2,
currentLevel: Math.ceil(metricsSum.fluency / (totalRecordings * 20)),
averagePronunciation: Math.round(metricsSum.pronunciation / totalRecordings),
averageAccuracy: Math.round(metricsSum.accuracy / totalRecordings),
averageComprehension: Math.round(metricsSum.comprehension / totalRecordings),
averageWordsPerMinute: Math.round(metricsSum.wordsPerMinute / totalRecordings),
averagePauses: Math.round(metricsSum.pauses / totalRecordings),
averageErrors: Math.round(metricsSum.errors / totalRecordings)
reading: {
totalStories: allStoriesData.length,
averageReadingFluency: Math.round(metricsSum.fluency / totalRecordings),
totalReadingTime: recordings.length * 2,
currentLevel: Math.ceil(metricsSum.fluency / (totalRecordings * 20)),
averagePronunciation: Math.round(metricsSum.pronunciation / totalRecordings),
averageAccuracy: Math.round(metricsSum.accuracy / totalRecordings),
averageComprehension: Math.round(metricsSum.comprehension / totalRecordings),
averageWordsPerMinute: Math.round(metricsSum.wordsPerMinute / totalRecordings),
averagePauses: Math.round(metricsSum.pauses / 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>
{/* Métricas */}
<DashboardMetrics data={metrics} />
<DashboardMetrics data={metrics.reading} />
{/* Gráfico de Evolução */}
<MetricsChart data={weeklyMetrics} className="mb-8" />
<MetricsChart data={weeklyMetrics.reading} className="mb-8" />
{/* Histórias Recentes */}
<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[];
}