fluffychat/lib/pangea/analytics_summary/level_analytics_details_content.dart
2025-12-23 14:35:41 -05:00

156 lines
6.4 KiB
Dart

import 'package:flutter/material.dart';
import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/config/themes.dart';
import 'package:fluffychat/l10n/l10n.dart';
import 'package:fluffychat/pangea/analytics_misc/construct_type_enum.dart';
import 'package:fluffychat/pangea/analytics_misc/construct_use_type_enum.dart';
import 'package:fluffychat/pangea/instructions/instructions_enum.dart';
import 'package:fluffychat/pangea/instructions/instructions_inline_tooltip.dart';
import 'package:fluffychat/pangea/morphs/get_grammar_copy.dart';
import 'package:fluffychat/widgets/matrix.dart';
class LevelAnalyticsDetailsContent extends StatelessWidget {
const LevelAnalyticsDetailsContent({
super.key,
});
@override
Widget build(BuildContext context) {
final isColumnMode = FluffyThemes.isColumnMode(context);
final analyticsService = Matrix.of(context).analyticsDataService;
return StreamBuilder(
stream: analyticsService.updateDispatcher.constructUpdateStream.stream,
builder: (context, _) {
return Scaffold(
appBar: AppBar(
titleSpacing: 0,
automaticallyImplyLeading: false,
title: FutureBuilder(
future: analyticsService.derivedData,
builder: (context, snapshot) {
final totalXP = snapshot.data?.totalXP ?? 0;
final maxLevelXP = snapshot.data?.minXPForNextLevel ?? 0;
final level = snapshot.data?.level ?? 0;
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 20),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
"${L10n.of(context).levelShort(level)}",
style: TextStyle(
fontSize: isColumnMode ? 24 : 16,
fontWeight: FontWeight.w900,
color: AppConfig.gold,
),
),
Text(
L10n.of(context).xpIntoLevel(totalXP, maxLevelXP),
style: TextStyle(
fontSize: isColumnMode ? 24 : 16,
fontWeight: FontWeight.w900,
color: AppConfig.gold,
),
),
],
),
);
},
),
),
body: FutureBuilder(
future: analyticsService.getUses(count: 100),
builder: (context, snapshot) {
if (!snapshot.hasData) {
return const Center(
child: CircularProgressIndicator.adaptive(),
);
}
final uses = snapshot.data!;
return Column(
children: [
Expanded(
child: ListView.builder(
itemCount: uses.length + 1,
itemBuilder: (context, index) {
if (index == 0) {
return const InstructionsInlineTooltip(
instructionsEnum: InstructionsEnum.levelAnalytics,
padding: EdgeInsets.symmetric(vertical: 16.0),
);
}
index--;
final use = uses[index];
String lemmaCopy = use.lemma;
if (use.constructType == ConstructTypeEnum.morph) {
lemmaCopy = getGrammarCopy(
category: use.category,
lemma: use.lemma,
context: context,
) ??
use.lemma;
}
return Padding(
padding: const EdgeInsets.symmetric(
vertical: 12,
horizontal: 16,
),
child: IntrinsicHeight(
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Align(
alignment: Alignment.centerLeft,
child: Container(
width: 40,
alignment: Alignment.centerLeft,
child: Icon(use.useType.icon),
),
),
const SizedBox(width: 10),
Expanded(
child: Text(
"\"$lemmaCopy\" - ${use.useType.description(context)}",
style: const TextStyle(fontSize: 14),
),
),
Container(
alignment: Alignment.topRight,
width: 60,
child: Row(
crossAxisAlignment:
CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
Text(
"${use.xp > 0 ? '+' : ''}${use.xp}",
style: TextStyle(
fontWeight: FontWeight.w900,
fontSize: 14,
height: 1,
color: use.pointValueColor(context),
),
),
],
),
),
],
),
),
);
},
),
),
],
);
},
),
);
},
);
}
}