import 'dart:async'; import 'dart:io'; import 'package:didvan/models/enums.dart'; import 'package:didvan/models/overview_data.dart'; import 'package:didvan/models/requests/studio.dart'; import 'package:didvan/models/slider_data.dart'; import 'package:didvan/providers/core_provider.dart'; import 'package:didvan/providers/user_provider.dart'; import 'package:didvan/services/network/request.dart'; import 'package:didvan/services/network/request_helper.dart'; import 'package:didvan/services/storage/storage.dart'; class StudioState extends CoreProvier { final List studios = []; final List sliders = []; final List downloadedFileIds = []; String search = ''; String lastSearch = ''; int page = 1; int lastPage = 1; int selectedSortTypeIndex = 0; bool _videosSelected = true; bool get videosSelected => _videosSelected; bool get searching => search.isNotEmpty; set videosSelected(bool value) { if (_videosSelected == value) return; _videosSelected = value; selectedSortTypeIndex = 0; _getSliders(); getDownloadsList(); getStudios(page: page); } Future getDownloadsList() async { downloadedFileIds.clear(); final dir = Directory( StorageService.appDocsDir + (videosSelected ? '/videos' : '/podcasts'), ); if (!await dir.exists()) { await dir.create(); } dir.list(recursive: false).listen( (event) { downloadedFileIds.add( int.parse( event.path.split('/').last.split('-').last.split('.').first, ), ); }, ); } String get order { if (selectedSortTypeIndex == 0 || selectedSortTypeIndex == 1) return 'date'; if (selectedSortTypeIndex == 2) return 'view'; return 'comment'; } String get orderString { if (selectedSortTypeIndex == 0) return 'تازه‌ترین‌ها'; if (selectedSortTypeIndex == 1) return 'قدیمی‌ترین‌ها'; if (selectedSortTypeIndex == 2) return 'پربازدیدترین‌ها'; return 'پربحث‌نرین‌ها'; } String get type { if (videosSelected) return 'video'; return 'podcast'; } void init() { search = ''; lastSearch = ''; _videosSelected = true; selectedSortTypeIndex = 0; getDownloadsList(); Future.delayed(Duration.zero, () { _getSliders(); getStudios(page: 1); }); } Future _getSliders() async { final service = RequestService( RequestHelper.sudioSlider(type), ); await service.httpGet(); if (service.isSuccess) { sliders.clear(); final sliderItems = service.result['studios']; for (var i = 0; i < sliderItems.length; i++) { sliders.add(SliderData.fromJson(sliderItems[i])); } } notifyListeners(); } Future getStudios({required int page}) async { this.page = page; lastSearch = search; if (page == 1) { appState = AppState.busy; } final service = RequestService( RequestHelper.studioOverviews( args: StudioRequestArgs( page: page, type: type, search: search, order: order, asc: selectedSortTypeIndex == 1, ), ), ); await service.httpGet(); if (service.isSuccess) { if (page == 1) { studios.clear(); } lastPage = service.result['lastPage']; final studioItems = service.result['studios']; for (var i = 0; i < studioItems.length; i++) { studios.add(OverviewData.fromJson(studioItems[i])); } appState = AppState.idle; return; } appState = AppState.failed; } Future changeMark(int id, bool value) async { studios.firstWhere((element) => element.id == id).marked = value; notifyListeners(); UserProvider.changeStudioMark(id, value); } void onCommentsChanged(int id, int count) { studios.firstWhere((radar) => radar.id == id).comments = count; notifyListeners(); } Future download(String url, String fileName) async { final service = RequestService(url); await service.download(fileName, videosSelected ? 'videos' : 'podcasts'); notifyListeners(); } }