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 createState() => _LeaderboardState(); } class _LeaderboardState extends State { late TeamService groupService; List groups = []; bool isLoading = true; @override void initState() { groupService = Provider.of(context, listen: false); super.initState(); _loadGroups(); // Uppdatera var 10:e sekund Timer.periodic(Duration(seconds: 10), (_) { _loadGroups(); }); } Future _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 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), ), ), ), ); } }