import 'dart:math'; import 'package:didvan/models/enums.dart'; import 'package:didvan/models/radar_details_data.dart'; import 'package:didvan/models/requests/radar.dart'; import 'package:didvan/providers/core_provider.dart'; import 'package:didvan/services/network/request.dart'; import 'package:didvan/services/network/request_helper.dart'; class RadarDetailsState extends CoreProvier { final List radars = []; late final int initialIndex; late final RadarRequestArgs args; int _currentIndex = 0; int get currentIndex => _currentIndex; RadarDetailsData get currentRadar { try { return radars[_currentIndex]!; } catch (e) { return radars[_currentIndex + 1]!; } } Future getRadarDetails(int id, {bool? isForward}) async { if (isForward == null) { appState = AppState.busy; } final service = RequestService(RequestHelper.radarDetails(id, args)); await service.httpGet(); if (service.isSuccess) { final result = service.result; RadarDetailsData? prevRadar; final radar = RadarDetailsData.fromJson(result['radar']); if (args.page == 0) { radars.add(radar); initialIndex = 0; appState = AppState.idle; return; } if (result['prevRadar'].isNotEmpty) { prevRadar = RadarDetailsData.fromJson(result['prevRadar']); } RadarDetailsData? nextRadar; if (result['nextRadar'].isNotEmpty) { nextRadar = RadarDetailsData.fromJson(result['nextRadar']); } if (isForward == null) { radars.addAll(List.generate(max(radar.order - 2, 0), (index) => null)); if (prevRadar != null) { radars.add(prevRadar); } radars.add(radar); if (nextRadar != null) { radars.add(nextRadar); } _currentIndex = initialIndex = radar.order - 1; } else if (isForward) { if (!exists(nextRadar) && nextRadar != null) { radars.add(nextRadar); } _currentIndex++; } else if (!isForward) { if (!exists(prevRadar) && prevRadar != null) { radars[_currentIndex - 2] = prevRadar; } _currentIndex--; } appState = AppState.idle; return; } if (isForward == null) { appState = AppState.failed; } } bool exists(RadarDetailsData? radar) => radars.any((r) => radar != null && r != null && r.id == radar.id); void onCommentsChanged(int count) { radars.firstWhere((radar) => radar!.id == currentRadar.id)!.comments = count; notifyListeners(); } }