didvan-app/lib/views/home/studio/studio_state.dart

163 lines
4.4 KiB
Dart

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<OverviewData> studios = [];
final List<SliderData> sliders = [];
final List<int> downloadedFileIds = [];
final List<String> downloadQueue = [];
AppState downloadState = AppState.idle;
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<void> 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<void> _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<void> 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<void> 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<void> download(String url, String fileName) async {
downloadState = AppState.busy;
downloadQueue.add(url);
notifyListeners();
final service = RequestService(url);
await service.download(fileName, videosSelected ? 'videos' : 'podcasts');
downloadState = AppState.idle;
downloadQueue.remove(url);
notifyListeners();
}
}