fluffychat/lib/pangea/analytics_practice/analytics_practice_view.dart
ggurdin 117a03089e
5720 vocab practice should have feedback flag (#5761)
* chore: split up analytics activity page widgets into separate files

* started analytics practice refactor

* refactor how UI updates are triggered in analytics practice page

* some fixes
2026-02-20 13:25:21 -05:00

85 lines
3.1 KiB
Dart

import 'package:flutter/material.dart';
import 'package:fluffychat/pangea/analytics_practice/analytics_practice_page.dart';
import 'package:fluffychat/pangea/analytics_practice/completed_activity_session_view.dart';
import 'package:fluffychat/pangea/analytics_practice/ongoing_activity_session_view.dart';
import 'package:fluffychat/pangea/analytics_practice/practice_timer_widget.dart';
import 'package:fluffychat/pangea/analytics_practice/unsubscribed_practice_page.dart';
import 'package:fluffychat/pangea/analytics_summary/animated_progress_bar.dart';
import 'package:fluffychat/pangea/common/network/requests.dart';
import 'package:fluffychat/pangea/common/widgets/error_indicator.dart';
import 'package:fluffychat/utils/localized_exception_extension.dart';
import 'package:fluffychat/widgets/layouts/max_width_body.dart';
class AnalyticsPracticeView extends StatelessWidget {
final AnalyticsPracticeState controller;
const AnalyticsPracticeView(this.controller, {super.key});
@override
Widget build(BuildContext context) {
final session = controller.session.session;
const loading = Center(
child: SizedBox(
width: 24,
height: 24,
child: CircularProgressIndicator.adaptive(),
),
);
return Scaffold(
appBar: AppBar(
title: Row(
spacing: 8.0,
children: [
Expanded(
child: ValueListenableBuilder(
valueListenable: controller.progress,
builder: (context, progress, _) => AnimatedProgressBar(
height: 20.0,
widthPercent: progress,
barColor: Theme.of(context).colorScheme.primary,
),
),
),
PracticeTimerWidget(
key: ValueKey(session?.startedAt ?? DateTime(0)),
initialSeconds: session?.state.elapsedSeconds ?? 0,
onTimeUpdate: controller.session.updateElapsedTime,
isRunning: session?.isComplete != true,
),
],
),
),
body: Padding(
padding: const EdgeInsets.symmetric(horizontal: 8.0),
child: MaxWidthBody(
withScrolling: false,
showBorder: false,
child: Builder(
builder: (context) {
final error = controller.session.sessionError;
if (error != null) {
return error is UnsubscribedException
? const UnsubscribedPracticePage()
: ErrorIndicator(message: error.toLocalizedString(context));
}
final session = controller.session.session;
if (session != null) {
return session.isComplete
? CompletedActivitySessionView(
session: session,
launchSession: controller.startSession,
levelProgress: controller.levelProgress,
)
: OngoingActivitySessionView(controller);
}
return loading;
},
),
),
),
);
}
}