mirror of
https://github.com/lucasrcsantana/story-generator.git
synced 2025-12-16 21:37:51 +00:00
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:
parent
8b45fe72e7
commit
8c6e6aedd3
@ -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
57
src/types/metrics.ts
Normal 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[];
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user