mirror of
https://github.com/lucasrcsantana/story-generator.git
synced 2025-12-18 14:27: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 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,19 +50,35 @@ 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>({
|
||||||
totalStories: 0,
|
reading: {
|
||||||
averageReadingFluency: 0,
|
totalStories: 0,
|
||||||
totalReadingTime: 0,
|
averageReadingFluency: 0,
|
||||||
currentLevel: 1,
|
totalReadingTime: 0,
|
||||||
averagePronunciation: 0,
|
currentLevel: 1,
|
||||||
averageAccuracy: 0,
|
averagePronunciation: 0,
|
||||||
averageComprehension: 0,
|
averageAccuracy: 0,
|
||||||
averageWordsPerMinute: 0,
|
averageComprehension: 0,
|
||||||
averagePauses: 0,
|
averageWordsPerMinute: 0,
|
||||||
averageErrors: 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 [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,16 +237,29 @@ export function StudentDashboardPage() {
|
|||||||
|
|
||||||
// Calcular médias
|
// Calcular médias
|
||||||
setMetrics({
|
setMetrics({
|
||||||
totalStories: allStoriesData.length,
|
reading: {
|
||||||
averageReadingFluency: Math.round(metricsSum.fluency / totalRecordings),
|
totalStories: allStoriesData.length,
|
||||||
totalReadingTime: recordings.length * 2,
|
averageReadingFluency: Math.round(metricsSum.fluency / totalRecordings),
|
||||||
currentLevel: Math.ceil(metricsSum.fluency / (totalRecordings * 20)),
|
totalReadingTime: recordings.length * 2,
|
||||||
averagePronunciation: Math.round(metricsSum.pronunciation / totalRecordings),
|
currentLevel: Math.ceil(metricsSum.fluency / (totalRecordings * 20)),
|
||||||
averageAccuracy: Math.round(metricsSum.accuracy / totalRecordings),
|
averagePronunciation: Math.round(metricsSum.pronunciation / totalRecordings),
|
||||||
averageComprehension: Math.round(metricsSum.comprehension / totalRecordings),
|
averageAccuracy: Math.round(metricsSum.accuracy / totalRecordings),
|
||||||
averageWordsPerMinute: Math.round(metricsSum.wordsPerMinute / totalRecordings),
|
averageComprehension: Math.round(metricsSum.comprehension / totalRecordings),
|
||||||
averagePauses: Math.round(metricsSum.pauses / totalRecordings),
|
averageWordsPerMinute: Math.round(metricsSum.wordsPerMinute / totalRecordings),
|
||||||
averageErrors: Math.round(metricsSum.errors / 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>
|
</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
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