From 8c6e6aedd3e50e1f95139055701ff21ab3bd63dd Mon Sep 17 00:00:00 2001 From: Lucas Santana Date: Fri, 7 Feb 2025 10:50:10 -0300 Subject: [PATCH] =?UTF-8?q?feat:=20separa=20estrutura=20de=20dados=20para?= =?UTF-8?q?=20m=C3=A9tricas=20de=20leitura=20e=20escrita?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 --- .../StudentDashboardPage.tsx | 101 +++++++++++------- src/types/metrics.ts | 57 ++++++++++ 2 files changed, 120 insertions(+), 38 deletions(-) create mode 100644 src/types/metrics.ts diff --git a/src/pages/student-dashboard/StudentDashboardPage.tsx b/src/pages/student-dashboard/StudentDashboardPage.tsx index 3155076..fd76f3c 100644 --- a/src/pages/student-dashboard/StudentDashboardPage.tsx +++ b/src/pages/student-dashboard/StudentDashboardPage.tsx @@ -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(null); - const [metrics, setMetrics] = React.useState({ - 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({ + 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({ + reading: [], + writing: [] }); - const [weeklyMetrics, setWeeklyMetrics] = React.useState([]); const [loading, setLoading] = React.useState(true); const [error, setError] = React.useState(null); const [recentStories, setRecentStories] = React.useState([]); @@ -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() { {/* Métricas */} - + {/* Gráfico de Evolução */} - + {/* Histórias Recentes */}
diff --git a/src/types/metrics.ts b/src/types/metrics.ts new file mode 100644 index 0000000..aa7effa --- /dev/null +++ b/src/types/metrics.ts @@ -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[]; +} \ No newline at end of file