2025-05-07 13:54:52 +02:00

172 lines
4.0 KiB
Dart

import 'dart:async';
import 'package:provider/provider.dart';
import 'package:flutter/material.dart';
import 'package:insparkspokalen_ui/models/teamModel.dart';
import 'package:insparkspokalen_ui/services/teamService.dart';
class Leaderboard extends StatefulWidget {
const Leaderboard({Key? key}) : super(key: key);
@override
State<Leaderboard> createState() => _LeaderboardState();
}
class _LeaderboardState extends State<Leaderboard> {
late TeamService groupService;
List<TeamModel> groups = [];
bool isLoading = true;
@override
void initState() {
groupService = Provider.of<TeamService>(context, listen: false);
super.initState();
_loadGroups();
// Uppdatera var 10:e sekund
Timer.periodic(Duration(seconds: 10), (_) {
_loadGroups();
});
}
Future<void> _loadGroups() async {
final result = await groupService.showTeams();
result.sort((a, b) => b.score.compareTo(a.score)); //Sorterar listan fallande
setState(() {
groups = result;
isLoading = false;
});
}
@override
Widget build(BuildContext context) {
return SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const _Heading(),
_GreyBackground(
child: isLoading
? const Center(child: CircularProgressIndicator())
: _TopplistaBody(groups: groups),
),
],
),
);
}
}
class _Heading extends StatelessWidget {
const _Heading();
@override
Widget build(BuildContext context) {
return Center(
child: Padding(
padding: const EdgeInsets.only(top: 16.0),
child: Text(
'Poängställning',
style: TextStyle(
color: Color(0xFFDAA520),
fontSize: 32,
fontFamily: 'Nunito',
fontWeight: FontWeight.w700,
),
),
),
);
}
}
class _GreyBackground extends StatelessWidget {
final Widget child;
const _GreyBackground({required this.child});
@override
Widget build(BuildContext context) {
return Container(
margin: const EdgeInsets.all(16.0),
padding: const EdgeInsets.all(16.0),
decoration: BoxDecoration(
color: const Color(0xFF6D6D6D),
borderRadius: BorderRadius.circular(40),
),
child: child,
);
}
}
class _TopplistaBody extends StatelessWidget {
final List<TeamModel> groups;
const _TopplistaBody({required this.groups});
@override
Widget build(BuildContext context) {
return Column(
children: [
...groups
.asMap()
.entries
.map((entry) => GruppKort.GroupCard(
group: entry.value,
place: entry.key + 1,
))
.toList(),
const SizedBox(height: 16),
],
);
}
}
class GruppKort extends StatelessWidget {
final TeamModel group;
final int place;
const GruppKort.GroupCard({required this.group, required this.place});
@override
Widget build(BuildContext context) {
return Card(
elevation: 3,
margin: const EdgeInsets.symmetric(vertical: 8.0),
color: const Color(0xFF2E2E2E),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
child: ListTile(
contentPadding: const EdgeInsets.symmetric(
horizontal: 16.0,
vertical: 8.0,
),
leading: CircleAvatar(
backgroundColor: Colors.black,
child: Text(
'$place',
style: const TextStyle(
color: Color(0xFFD6D6D6),
fontWeight: FontWeight.bold,
),
),
),
title: Text(
group.name,
style: const TextStyle(
fontSize: 18,
color: Color(0xFFD6D6D6),
),
),
trailing: Text(
'${group.score} poäng',
style: const TextStyle(
fontWeight: FontWeight.bold,
color: Color(0xFFD6D6D6),
),
),
),
);
}
}