challenge_location_requests.dart 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import 'package:flutter/material.dart';
  2. import 'package:physigo/friends/models/challenge_location_request.dart';
  3. import 'package:physigo/friends/services/challenge_location_service.dart';
  4. class ChallengeLocationRequests extends StatefulWidget {
  5. const ChallengeLocationRequests({Key? key}) : super(key: key);
  6. @override
  7. State<ChallengeLocationRequests> createState() => _ChallengeLocationRequestsState();
  8. }
  9. class _ChallengeLocationRequestsState extends State<ChallengeLocationRequests> {
  10. List<ChallengeLocationRequest> _requests = [];
  11. late Future<List<ChallengeLocationRequest>> _requestsQuery;
  12. @override
  13. void initState() {
  14. _requestsQuery = ChallengeLocationService.getShareChallengeLocationRequests();
  15. _requestsQuery.then((requests) => setState(() => _requests = requests));
  16. super.initState();
  17. }
  18. @override
  19. Widget build(BuildContext context) {
  20. return Column(
  21. children: [
  22. const Text(
  23. "Challenge Location's Requests",
  24. style: TextStyle(fontSize: 24),
  25. textAlign: TextAlign.center,
  26. ),
  27. FutureBuilder<List<ChallengeLocationRequest>>(
  28. future: _requestsQuery,
  29. builder: (context, snapshot) {
  30. if (!snapshot.hasData) {
  31. return const CircularProgressIndicator();
  32. }
  33. if (_requests.isEmpty) {
  34. return const Text("You don't have any share location's requests");
  35. }
  36. return ListView.builder(
  37. shrinkWrap: true,
  38. itemBuilder: ((context, index) => _requestTile(_requests[index])),
  39. itemCount: _requests.length,
  40. );
  41. },
  42. ),
  43. ],
  44. );
  45. }
  46. void _acceptRequest(ChallengeLocationRequest request) async {
  47. await ChallengeLocationService.acceptChallengeLocationRequest(request);
  48. setState(() {
  49. _requests = _requests.where((r) => r.id != request.id).toList();
  50. });
  51. }
  52. void _refuseRequest(ChallengeLocationRequest request) async {
  53. await ChallengeLocationService.refuseChallengeLocationRequest(request);
  54. setState(() {
  55. _requests = _requests.where((r) => r.id != request.id).toList();
  56. });
  57. }
  58. Widget _requestTile(ChallengeLocationRequest request) {
  59. return Card(
  60. child: ListTile(
  61. title: Text(request.locationName, maxLines: 2, overflow: TextOverflow.ellipsis,),
  62. subtitle: Text("From ${request.name} ${request.surname}"),
  63. trailing: Row(
  64. mainAxisSize: MainAxisSize.min,
  65. children: [
  66. TextButton(
  67. child: const Text("Refuse"),
  68. onPressed: () => _refuseRequest(request),
  69. ),
  70. TextButton(
  71. child: const Text("Accept"),
  72. onPressed: () => _acceptRequest(request),
  73. ),
  74. ],
  75. ),
  76. ),
  77. );
  78. }
  79. }