fluffychat/lib/pangea/toolbar/message_practice/practice_match_card.dart
2026-01-15 13:13:56 -05:00

104 lines
3.5 KiB
Dart

import 'package:flutter/material.dart';
import 'package:collection/collection.dart';
import 'package:fluffychat/config/themes.dart';
import 'package:fluffychat/pangea/common/widgets/choice_animation.dart';
import 'package:fluffychat/pangea/practice_activities/practice_activity_model.dart';
import 'package:fluffychat/pangea/practice_activities/practice_choice.dart';
import 'package:fluffychat/pangea/toolbar/message_practice/message_audio_card.dart';
import 'package:fluffychat/pangea/toolbar/message_practice/message_practice_mode_enum.dart';
import 'package:fluffychat/pangea/toolbar/message_practice/practice_controller.dart';
import 'package:fluffychat/pangea/toolbar/message_practice/practice_match_item.dart';
class MatchActivityCard extends StatelessWidget {
final MatchPracticeActivityModel currentActivity;
final PracticeController controller;
const MatchActivityCard({
super.key,
required this.currentActivity,
required this.controller,
});
Widget choiceDisplayContent(
BuildContext context,
String choice,
double? fontSize,
) {
switch (currentActivity) {
case EmojiPracticeActivityModel():
case LemmaMeaningPracticeActivityModel():
return Padding(
padding: const EdgeInsets.all(8),
child: Text(
choice,
style: TextStyle(fontSize: fontSize),
textAlign: TextAlign.center,
),
);
case WordListeningPracticeActivityModel():
return Padding(
padding: const EdgeInsets.all(8),
child: Icon(
Icons.volume_up,
size: fontSize,
),
);
}
}
@override
Widget build(BuildContext context) {
double fontSize = (FluffyThemes.isColumnMode(context)
? Theme.of(context).textTheme.titleLarge?.fontSize
: Theme.of(context).textTheme.titleMedium?.fontSize) ??
26;
final mode = controller.practiceMode;
if (mode == MessagePracticeMode.listening ||
mode == MessagePracticeMode.wordEmoji) {
fontSize = fontSize * 1.5;
}
return Column(
mainAxisAlignment: MainAxisAlignment.center,
mainAxisSize: MainAxisSize.max,
spacing: 4.0,
children: [
if (mode == MessagePracticeMode.listening)
MessageAudioCard(messageEvent: controller.pangeaMessageEvent),
Wrap(
alignment: WrapAlignment.center,
spacing: 4.0,
runSpacing: 4.0,
children: currentActivity.matchContent.choices.map(
(PracticeChoice cf) {
final bool? wasCorrect = controller.wasCorrectMatch(cf);
return ChoiceAnimationWidget(
isSelected: controller.selectedChoice == cf,
isCorrect: wasCorrect,
child: PracticeMatchItem(
token: currentActivity.tokens.firstWhereOrNull(
(t) => t.vocabConstructID == cf.form.cId,
),
isSelected: controller.selectedChoice == cf,
isCorrect: wasCorrect,
constructForm: cf,
content:
choiceDisplayContent(context, cf.choiceContent, fontSize),
audioContent:
currentActivity is WordListeningPracticeActivityModel
? cf.choiceContent
: null,
controller: controller,
shimmer: controller.showChoiceShimmer,
),
);
},
).toList(),
),
],
);
}
}