* chore: remove delegation analytics page * feat: vocab construct analytics level bar * chore: analytics mobile navigation * feat: cap construct XP
146 lines
5.1 KiB
Dart
146 lines
5.1 KiB
Dart
import 'package:flutter/material.dart';
|
|
|
|
import 'package:collection/collection.dart';
|
|
import 'package:go_router/go_router.dart';
|
|
import 'package:matrix/matrix.dart';
|
|
|
|
import 'package:fluffychat/config/app_config.dart';
|
|
import 'package:fluffychat/pangea/activity_sessions/activity_room_extension.dart';
|
|
import 'package:fluffychat/pangea/analytics_misc/analytics_navigation_util.dart';
|
|
import 'package:fluffychat/pangea/analytics_misc/client_analytics_extension.dart';
|
|
import 'package:fluffychat/pangea/analytics_misc/saved_analytics_extension.dart';
|
|
import 'package:fluffychat/pangea/analytics_summary/learning_progress_indicators.dart';
|
|
import 'package:fluffychat/pangea/analytics_summary/progress_indicators_enum.dart';
|
|
import 'package:fluffychat/pangea/instructions/instructions_enum.dart';
|
|
import 'package:fluffychat/pangea/instructions/instructions_inline_tooltip.dart';
|
|
import 'package:fluffychat/widgets/hover_builder.dart';
|
|
import 'package:fluffychat/widgets/layouts/max_width_body.dart';
|
|
import 'package:fluffychat/widgets/matrix.dart';
|
|
import '../../config/themes.dart';
|
|
import '../../widgets/avatar.dart';
|
|
|
|
class ActivityArchive extends StatelessWidget {
|
|
const ActivityArchive({
|
|
super.key,
|
|
});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final Room? analyticsRoom = Matrix.of(context).client.analyticsRoomLocal();
|
|
final archive = analyticsRoom?.archivedActivities ?? [];
|
|
final selectedRoomId = GoRouterState.of(context).pathParameters['roomid'];
|
|
return Scaffold(
|
|
body: SafeArea(
|
|
child: Padding(
|
|
padding: const EdgeInsetsGeometry.all(16.0),
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
const LearningProgressIndicators(
|
|
selected: ProgressIndicatorEnum.activities,
|
|
),
|
|
Expanded(
|
|
child: MaxWidthBody(
|
|
withScrolling: false,
|
|
child: ListView.builder(
|
|
physics: const ClampingScrollPhysics(),
|
|
itemCount: archive.length + 1,
|
|
itemBuilder: (BuildContext context, int i) {
|
|
if (i == 0) {
|
|
return InstructionsInlineTooltip(
|
|
instructionsEnum: archive.isEmpty
|
|
? InstructionsEnum.noSavedActivitiesYet
|
|
: InstructionsEnum.activityAnalyticsList,
|
|
padding: const EdgeInsets.all(8.0),
|
|
);
|
|
}
|
|
i--;
|
|
return AnalyticsActivityItem(
|
|
room: archive[i],
|
|
selected: archive[i].id == selectedRoomId,
|
|
);
|
|
},
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
class AnalyticsActivityItem extends StatelessWidget {
|
|
final Room room;
|
|
final bool selected;
|
|
const AnalyticsActivityItem({
|
|
super.key,
|
|
required this.room,
|
|
this.selected = false,
|
|
});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final objective = room.activityPlan?.learningObjective ?? '';
|
|
final cefrLevel = room.activitySummary?.summary?.participants
|
|
.firstWhereOrNull(
|
|
(p) => p.participantId == room.client.userID,
|
|
)
|
|
?.cefrLevel;
|
|
|
|
final theme = Theme.of(context);
|
|
return Padding(
|
|
padding: const EdgeInsets.symmetric(
|
|
horizontal: 8,
|
|
vertical: 1,
|
|
),
|
|
child: Material(
|
|
color: selected ? theme.colorScheme.secondaryContainer : null,
|
|
borderRadius: BorderRadius.circular(AppConfig.borderRadius),
|
|
clipBehavior: Clip.hardEdge,
|
|
child: ListTile(
|
|
visualDensity: const VisualDensity(vertical: -0.5),
|
|
contentPadding: const EdgeInsets.symmetric(horizontal: 8),
|
|
leading: HoverBuilder(
|
|
builder: (context, hovered) => AnimatedScale(
|
|
duration: FluffyThemes.animationDuration,
|
|
curve: FluffyThemes.animationCurve,
|
|
scale: hovered ? 1.1 : 1.0,
|
|
child: Avatar(
|
|
borderRadius: BorderRadius.circular(4.0),
|
|
mxContent: room.avatar,
|
|
name: room.getLocalizedDisplayname(),
|
|
),
|
|
),
|
|
),
|
|
title: Text(
|
|
objective,
|
|
maxLines: 3,
|
|
overflow: TextOverflow.ellipsis,
|
|
style: const TextStyle(fontSize: 12.0),
|
|
),
|
|
trailing: cefrLevel != null
|
|
? Padding(
|
|
padding: const EdgeInsets.symmetric(
|
|
horizontal: 8,
|
|
vertical: 4,
|
|
),
|
|
child: Text(
|
|
cefrLevel.toUpperCase(),
|
|
style: const TextStyle(fontSize: 14.0),
|
|
),
|
|
)
|
|
: null,
|
|
onTap: () {
|
|
AnalyticsNavigationUtil.navigateToAnalytics(
|
|
context: context,
|
|
view: ProgressIndicatorEnum.activities,
|
|
activityRoomId: room.id,
|
|
);
|
|
},
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|