Insparkspokalen-ui/lib/teams/teamPageAdmin.dart
2025-05-30 13:35:42 +02:00

302 lines
11 KiB
Dart

import 'package:flutter/material.dart';
import 'package:insparkspokalen_ui/models/teamModel.dart';
import 'package:insparkspokalen_ui/models/userModel.dart';
import 'package:insparkspokalen_ui/services/teamUserSyncService.dart';
import 'createTeamsButton.dart';
import 'package:insparkspokalen_ui/services/backend/teamService.dart';
import 'package:provider/provider.dart';
import 'package:insparkspokalen_ui/teams/teamImage.dart';
import 'package:flutter_svg/flutter_svg.dart';
/// Sida för administratörer att hantera lag
class TeamPageAdmin extends StatefulWidget {
const TeamPageAdmin({super.key});
@override
State<TeamPageAdmin> createState() => _TeamPageAdminState();
}
class _TeamPageAdminState extends State<TeamPageAdmin> {
late TeamService teamService;
late TeamUserSyncService syncService;
List<TeamModel> groups = [];
final TextEditingController _controller = TextEditingController();
@override
void initState() {
teamService = Provider.of<TeamService>(context, listen: false);
syncService = Provider.of<TeamUserSyncService>(context, listen: false);
super.initState();
_loadGroups();
}
Future<void> _loadGroups() async {
final result = await teamService.showTeams();
setState(() {
groups = result;
});
}
void _removeTeamCard(int teamId, String teamName) async {
setState(() {
groups.removeWhere((g) => g.teamId == teamId);
});
ScaffoldMessenger.of(
context,
).showSnackBar(SnackBar(content: Text('Lag "$teamName" borttaget.')));
}
/// Visar dialogruta för att skapa nytt lag
void _openDialog() {
showDialog(
context: context,
builder:
(_) => CreateTeamsButton(
controller: _controller,
onTeamCreated: (newTeam) {
setState(() {
groups.add(newTeam);
});
},
),
);
}
/// Visar dialogruta för att bekräfta radering
void _showDeleteDialog(int teamId, String teamName) {
showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: const Text('Bekräfta radering'),
content: Text('Är du säker på att du vill radera "$teamName"?'),
actions: [
TextButton(
onPressed: () => Navigator.of(context).pop(),
child: const Text('Nej'),
),
TextButton(
onPressed: () async {
Navigator.of(context).pop();
if (await syncService.handleTeamRemoved(teamId)) {
_removeTeamCard(teamId, teamName);
}
},
child: const Text('Ja'),
),
],
);
},
);
}
//info om lagets medlemmar
void _showMemberDialog(String groupName, int teamId) {
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text("Medlemmar i $groupName"),
content: FutureBuilder<List<UserModel>>(
future: TeamService().getTeamMembers(teamId),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const Center(child: CircularProgressIndicator());
} else if (snapshot.hasError) {
return const Text("Fel vid hämtning av medlemmar.");
} else if (!snapshot.hasData || snapshot.data!.isEmpty) {
return const Text("Inga medlemmar hittades.");
}
final members = snapshot.data!;
return SizedBox(
width: 300,
child: ListView.builder(
shrinkWrap: true,
itemCount: members.length,
itemBuilder: (context, index) {
final user = members[index];
return ListTile(
leading:
//kontroll om det är en svg
user.profilePicture != null &&
user.profilePicture!.contains('.svg')
? ClipOval(
child: SvgPicture.network(
user.profilePicture!,
width: 40,
height: 40,
fit: BoxFit.cover,
placeholderBuilder:
(context) =>
const CircularProgressIndicator(),
),
)
//ifall det inte är svg
: CircleAvatar(
backgroundImage:
user.profilePicture != null
? NetworkImage(user.profilePicture!)
: null,
child:
user.profilePicture == null
? const Icon(Icons.person)
: null,
),
title: Text(user.name),
subtitle: Text(user.email),
trailing: IconButton(
icon: const Icon(
Icons.remove_circle,
color: Colors.red,
),
onPressed: () {
showDialog(
context: context,
builder:
(context) => AlertDialog(
title: const Text("Bekräfta borttagning"),
content: Text(
"Vill du verkligen ta bort ${user.name} från laget?",
),
actions: [
TextButton(
onPressed:
() => Navigator.of(context).pop(),
child: const Text("Nej"),
),
TextButton(
onPressed: () async {
Navigator.of(
context,
).pop(); // Stäng dialog
// final success = await groupService
// .removeUserFromTeam(
// user.email,
// teamId,
// );
print("DEBUG: Syncing");
final successSync = await syncService
.handleUserKicked(user.email);
if (successSync) {
Navigator.of(
context,
).pop(); // Stäng medlemsdialog
_showMemberDialog(
groupName,
teamId,
); // Öppna på nytt
}
},
child: const Text("Ja"),
),
],
),
);
},
),
);
},
),
);
},
),
actions: [
TextButton(
onPressed: () => Navigator.of(context).pop(),
child: const Text("Stäng"),
),
],
);
},
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: const Color(0xFF2E2E2E),
body: Column(
children: [
Expanded(
child: ListView.builder(
itemCount: groups.length,
itemBuilder: (context, index) {
final team = groups[index];
return Card(
color: Colors.white,
margin: const EdgeInsets.symmetric(
vertical: 6,
horizontal: 12,
),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
child: ListTile(
leading: CircleAvatar(
radius: 30,
backgroundColor: Colors.white,
child: TeamImage(imageUrl: team.imageUrl, size: 55),
),
title: Text(team.name),
subtitle: Align(
alignment: Alignment.centerLeft,
child: IntrinsicWidth(
child: OutlinedButton(
onPressed:
() => _showMemberDialog(team.name, team.teamId),
style: OutlinedButton.styleFrom(
padding: const EdgeInsets.symmetric(
horizontal: 12,
vertical: 6,
),
side: const BorderSide(color: Color(0xFF2E2E2E)),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8),
),
),
child: const Text(
'Hantera medlemmar',
style: TextStyle(
fontSize: 10,
color: Color(0xFF2E2E2E),
),
),
),
),
),
trailing: IconButton(
icon: const Icon(Icons.delete, color: Colors.red),
onPressed:
() => _showDeleteDialog(team.teamId, team.name),
),
),
);
},
),
),
ElevatedButton(
onPressed: _openDialog,
style: ElevatedButton.styleFrom(
backgroundColor: Colors.white,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(40),
),
),
child: const Text(
'Skapa nytt lag',
style: TextStyle(color: Colors.black),
),
),
const SizedBox(height: 16),
],
),
);
}
}