import 'package:flutter/material.dart';
import '../../core/localization/app_localizations.dart';
import '../../core/theme/app_colors.dart';
import '../../repositories/learning_repository.dart';
import '../../services/learning_progress_service.dart';
import '../../services/analytics_service.dart';
import 'learning_unit_page.dart';
class LearningCoursePage extends StatefulWidget {
const LearningCoursePage({super.key, required this.courseId});
final String courseId;
@override
State<LearningCoursePage> createState() => _LearningCoursePageState();
}
class _LearningCoursePageState extends State<LearningCoursePage> {
@override
void initState() {
super.initState();
AnalyticsService.instance.track('learning_course_view',
properties: {'course_id': widget.courseId});
}
final _repo = LearningRepository();
final _progress = LearningProgressService();
late Future<LearningCourseDetail> _future;
@override
void didChangeDependencies() {
super.didChangeDependencies();
_future = _repo.fetchCourse(widget.courseId,
languageCode: Localizations.localeOf(context).languageCode);
}
@override
void dispose() {
_repo.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
final l10n = AppLocalizations.of(context);
return Scaffold(
appBar: AppBar(title: Text(l10n.t('learnGerman'))),
body: FutureBuilder<LearningCourseDetail>(
future: _future,
builder: (context, s) {
if (!s.hasData) {
if (s.hasError) {
return Center(child: Text(l10n.t('learningLoadError')));
}
return const Center(child: CircularProgressIndicator());
}
final d = s.data!;
return FutureBuilder<Set<String>>(
future: _progress.completedUnits(),
builder: (context, doneSnap) {
final done = doneSnap.data ?? <String>{};
final pct = d.units.isEmpty
? 0.0
: done
.where((id) => d.units.any((u) => u.id == id))
.length /
d.units.length;
return ListView(
padding: const EdgeInsets.all(20),
children: [
Text(d.course.title,
style: Theme.of(context)
.textTheme
.headlineSmall
?.copyWith(fontWeight: FontWeight.w900)),
const SizedBox(height: 8),
Text(d.course.description),
const SizedBox(height: 14),
LinearProgressIndicator(value: pct),
const SizedBox(height: 6),
Text(
l10n.tf('learningProgress',
{'n': '${(pct * 100).round()}'}),
style:
const TextStyle(color: AppColors.mutedInk)),
const SizedBox(height: 20),
for (final u in d.units)
Card(
child: ListTile(
leading: CircleAvatar(
child: done.contains(u.id)
? const Icon(Icons.check)
: Text('${u.order}')),
title: Text(u.title,
style: const TextStyle(
fontWeight: FontWeight.w800)),
subtitle: Text(u.phraseDe,
maxLines: 1,
overflow: TextOverflow.ellipsis),
trailing: const Icon(Icons.chevron_right),
onTap: () async {
await AnalyticsService.instance.track(
'learning_unit_open',
properties: {
'course_id': widget.courseId,
'unit_id': u.id
});
if (!context.mounted) return;
await Navigator.of(context).push(
MaterialPageRoute(
builder: (_) =>
LearningUnitPage(unit: u)));
if (mounted) setState(() {});
}))
]);
});
}));
}
}

