added leaderboards (without clickthrough to filtered by author - later)
This commit is contained in:
@@ -21,18 +21,9 @@ class AddPage extends StatelessWidget {
|
|||||||
padding: const EdgeInsets.all(Constants.edgeInset),
|
padding: const EdgeInsets.all(Constants.edgeInset),
|
||||||
child: Column(
|
child: Column(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
children: [
|
children: [
|
||||||
Text(
|
|
||||||
Strings.createQuote,
|
|
||||||
style: const TextStyle(
|
|
||||||
fontSize: 18,
|
|
||||||
fontWeight: FontWeight.bold,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
|
|
||||||
const SizedBox(height: 12),
|
|
||||||
|
|
||||||
TextField(
|
TextField(
|
||||||
autofocus: true,
|
autofocus: true,
|
||||||
controller: bodyController,
|
controller: bodyController,
|
||||||
|
|||||||
@@ -1,10 +1,48 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:frontend/provider/quote_provider.dart';
|
||||||
|
import 'package:frontend/values/constants.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
class LeaderboardPage extends StatelessWidget {
|
class LeaderboardPage extends StatelessWidget {
|
||||||
const LeaderboardPage({super.key});
|
const LeaderboardPage({super.key});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return const Center(child: Text('top 3!'));
|
final provider = context.watch<QuoteProvider>();
|
||||||
|
return Center(
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: ListView.builder(
|
||||||
|
padding: EdgeInsets.all(Constants.edgeInset),
|
||||||
|
itemCount: provider.filteredQuotes.length,
|
||||||
|
itemBuilder: (context, index) {
|
||||||
|
return
|
||||||
|
Card(
|
||||||
|
color: provider.getLeaderboardEntryBgColor(context, index),
|
||||||
|
child: ListTile(
|
||||||
|
contentPadding: EdgeInsets.symmetric(
|
||||||
|
vertical: 0,
|
||||||
|
horizontal: Constants.edgeInset,
|
||||||
|
),
|
||||||
|
title: Text(provider.sortedAuthorCounts[index].key,
|
||||||
|
style: TextStyle(
|
||||||
|
color: provider.getLeaderboardEntryFgColor(context, index)
|
||||||
|
),
|
||||||
|
),
|
||||||
|
trailing: Text(provider.sortedAuthorCounts[index].value.toString(),
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 16,
|
||||||
|
color: provider.getLeaderboardEntryFgColor(context, index),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -38,7 +38,7 @@ class QuoteProvider extends ChangeNotifier {
|
|||||||
return filtered;
|
return filtered;
|
||||||
}
|
}
|
||||||
|
|
||||||
Map<String, int> get authorCounts {
|
Map<String, int> get _authorCounts {
|
||||||
final counts = <String, int>{};
|
final counts = <String, int>{};
|
||||||
|
|
||||||
for (var quote in filteredQuotes) {
|
for (var quote in filteredQuotes) {
|
||||||
@@ -52,6 +52,23 @@ class QuoteProvider extends ChangeNotifier {
|
|||||||
return counts;
|
return counts;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
List<MapEntry<String, int>> get sortedAuthorCounts {
|
||||||
|
final counts = <String, int>{};
|
||||||
|
|
||||||
|
for (var quote in filteredQuotes) {
|
||||||
|
counts.update(
|
||||||
|
quote.author,
|
||||||
|
(value) => value + 1,
|
||||||
|
ifAbsent: () => 1,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
final list = counts.entries.toList()
|
||||||
|
..sort((a, b) => b.value.compareTo(a.value)); // descending
|
||||||
|
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
final QuoteRepository repo = QuoteRepository();
|
final QuoteRepository repo = QuoteRepository();
|
||||||
|
|
||||||
int filterBy = 0; // 0 = by author, 1 = by quote
|
int filterBy = 0; // 0 = by author, 1 = by quote
|
||||||
@@ -191,4 +208,30 @@ class QuoteProvider extends ChangeNotifier {
|
|||||||
final file = File('${dir.path}/hlasky_$datetime.txt');
|
final file = File('${dir.path}/hlasky_$datetime.txt');
|
||||||
await file.writeAsString("${filteredQuotes.join("\n")}\n");
|
await file.writeAsString("${filteredQuotes.join("\n")}\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Color getLeaderboardEntryBgColor(BuildContext context, int index) {
|
||||||
|
switch (index) {
|
||||||
|
case 0:
|
||||||
|
return Colors.yellow.shade300; // 1st place
|
||||||
|
case 1:
|
||||||
|
return Colors.grey.shade300; // 2nd place
|
||||||
|
case 2:
|
||||||
|
return Colors.brown.shade300; // 3rd place
|
||||||
|
default:
|
||||||
|
return Theme.of(context).cardColor; // default for all other entries
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Color getLeaderboardEntryFgColor(BuildContext context, int index) {
|
||||||
|
switch (index) {
|
||||||
|
case 0:
|
||||||
|
return Colors.black; // 1st place
|
||||||
|
case 1:
|
||||||
|
return Colors.black; // 2nd place
|
||||||
|
case 2:
|
||||||
|
return Colors.black; // 3rd place
|
||||||
|
default:
|
||||||
|
return Colors.white; // default for all other entries
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user