You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
109 lines
3.3 KiB
Dart
109 lines
3.3 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/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});
|
|
|
|
List<Room> get archive =>
|
|
MatrixState.pangeaController.getAnalytics.archivedActivities;
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return MaxWidthBody(
|
|
withScrolling: false,
|
|
child: Builder(
|
|
builder: (BuildContext context) {
|
|
if (archive.isEmpty) {
|
|
return const Center(
|
|
child: Icon(Icons.archive_outlined, size: 80),
|
|
);
|
|
}
|
|
return ListView.builder(
|
|
itemCount: archive.length,
|
|
itemBuilder: (BuildContext context, int i) => AnalyticsActivityItem(
|
|
room: archive[i],
|
|
),
|
|
);
|
|
},
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
class AnalyticsActivityItem extends StatelessWidget {
|
|
final Room room;
|
|
const AnalyticsActivityItem({
|
|
super.key,
|
|
required this.room,
|
|
});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final objective = room.activityPlan?.learningObjective ?? '';
|
|
final cefrLevel = room.activitySummary?.summary?.participants
|
|
.firstWhereOrNull(
|
|
(p) => p.participantId == room.client.userID,
|
|
)
|
|
?.cefrLevel;
|
|
|
|
return Padding(
|
|
padding: const EdgeInsets.symmetric(
|
|
horizontal: 8,
|
|
vertical: 1,
|
|
),
|
|
child: Material(
|
|
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: () => context.go(
|
|
'/rooms/analytics/activities/${room.id}',
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|