Untitled

 avatar
unknown
plain_text
2 years ago
5.1 kB
4
Indexable
import 'dart:convert';

import 'package:collection/collection.dart';
import 'package:get/get.dart';

import '../models/player_fixtures.dart';
import '/models/fixtures.dart';
import '/models/player_latest.dart';
import '/services/api_services.dart';
import '/utils/helpers.dart';
import '../consts/consts.dart';
import '../models/player_details.dart';
import '../models/player_teams.dart';
import '../models/player_trophies.dart';

class PlayerDetailsController extends GetxController {
  // Initialize loading values
  RxBool isLoading = true.obs;
  RxBool isLoadingMatches = true.obs;
  RxBool isLoadingTeams = true.obs;
  RxBool isLoadingTrophies = true.obs;
  RxInt playerId = 0.obs;

  // Initialize all the needed variable to handle player details
  Rx<PlayerDetails> playerDetails = PlayerDetails().obs;
  RxList<Transfers> playerTransfers = <Transfers>[].obs;
  RxList<Statistics> playerStatistics = <Statistics>[].obs;
  RxList<Trophies> playerTrophies = <Trophies>[].obs;
  RxList<TeamsPlayer> playerTeams = <TeamsPlayer>[].obs;
  RxList<Latest> playerLatest = <Latest>[].obs;
  RxList<FixturesData> playerFixtures = <FixturesData>[].obs;
  RxList<int> latestIds = <int>[].obs;
  Map<int?, List<Trophies>> sortedTrophies = <int?, List<Trophies>>{}.obs;
  Map<int?, Map<String, List<Trophies>>> finalTrophies =
      <int?, Map<String, List<Trophies>>>{}.obs;

  // Load player Details for a specified player Id
  loadPlayerDetails(int id) async {
    try {
      var response = await ApiService.get(
        "${settingController.sportapiBaseUrl.value}${AppConsts.player}$id${settingController.sportapiApiKey.value}&include=position;detailedPosition;country;statistics.details.type;statistics.season.league;transfers.fromTeam;transfers.toTeam;transfers.type",
      );

      // Save initial values
      playerDetails.value = PlayerDetails.fromJson(jsonDecode(response.body));
      playerTransfers.value = playerDetails.value.data?.transfers ?? [];
      playerStatistics.value = playerDetails.value.data?.statistics ?? [];
    } catch (e, s) {
      dd(e);
      dd(s);
    } finally {
      isLoading.value = false;
      // Call the functions at the beginning
      loadPlayerTeams(id);
      loadPlayerLatest(id);
    }
  }

  // Load player teams for the player
  loadPlayerTeams(int id) async {
    isLoadingTeams.value = true;

    try {
      var response = await ApiService.get(
        "${settingController.sportapiBaseUrl.value}${AppConsts.player}$id${settingController.sportapiApiKey.value}&include=teams.team.country;teams.team.activeSeasons",
      );

      // Save the team the player played in
      playerTeams.value =
          PlayerTeams.fromJson(jsonDecode(response.body)).data?.teams ?? [];
    } catch (e, s) {
      dd(e);
      dd(s);
    } finally {
      isLoadingTeams.value = false;
    }
  }

  // Load player Trophies
  loadPlayerTrophies(int id) async {
    try {
      var response = await ApiService.get(
        "${settingController.sportapiBaseUrl.value}${AppConsts.player}$id${settingController.sportapiApiKey.value}&include=trophies.league;trophies.season;trophies.trophy",
      );

      playerTrophies.value =
          PlayerTrophies.fromJson(jsonDecode(response.body)).data?.trophies ??
              [];

      // Group the Trophy by Legue Id
      sortedTrophies = groupBy(
        playerTrophies,
        (Trophies trophies) => trophies.leagueId,
      );

      // Group it again by trophy type
      for (var type in sortedTrophies.keys) {
        Map<String, List<Trophies>> groupedByAttribute = groupBy(
          sortedTrophies[type]!,
          (Trophies trophies) => trophies.trophy?.name ?? 'Unknown',
        );
        finalTrophies[type] = groupedByAttribute;
      }
    } catch (e, s) {
      dd(e);
      dd(s);
    } finally {
      isLoadingTrophies.value = false;
    }
  }

  // Load the latest matches the player has played in
  loadPlayerLatest(int id) async {
    try {
      var response = await ApiService.get(
        "${settingController.sportapiBaseUrl.value}${AppConsts.player}$id${settingController.sportapiApiKey.value}&include=latest",
      );
      playerLatest.value =
          PlayerLatest.fromJson(jsonDecode(response.body)).data?.latest ?? [];

      // Save the latest fixture IDs
      latestIds.clear();
      for (var item in playerLatest) {
        latestIds.add(item.fixtureId!);
      }
      // Load Fixtures for the saved fixture Ids
      await loadFixture(latestIds);
    } catch (e, s) {
      dd(e);
      dd(s);
    } finally {
      isLoadingMatches.value = false;
    }
  }

  // Load fixture details of the matches a player took part in
  loadFixture([ids = '']) async {
    // playerFixtures.value.clear();
    String idlist = ids.join(',');

    var response = await ApiService.get(
      '${settingController.sportapiBaseUrl.value + AppConsts.multiFixtures}$idlist${settingController.sportapiApiKey.value}&include=league;participants;state;scores;events.type;lineups.details.type',
    );

    // Save player Fixture details
    playerFixtures.value =
        PlayerFixtures.fromJson(jsonDecode(response.body)).data ?? [];
  }
}
Editor is loading...
Leave a Comment