import 'dart:async'; import 'dart:io'; import 'package:flutter_archive/flutter_archive.dart'; import 'package:hadi_hoda_flutter/core/constants/my_api.dart'; import 'package:hadi_hoda_flutter/core/constants/my_constants.dart'; import 'package:hadi_hoda_flutter/core/error_handler/my_exception.dart'; import 'package:hadi_hoda_flutter/core/network/http_request.dart'; import 'package:hadi_hoda_flutter/core/response/base_response.dart'; import 'package:hadi_hoda_flutter/core/utils/local_storage.dart'; import 'package:hadi_hoda_flutter/core/utils/storage_path.dart'; import 'package:hadi_hoda_flutter/features/download/domain/entities/download_entity.dart'; import 'package:hadi_hoda_flutter/features/level/data/model/level_model.dart'; import 'package:hadi_hoda_flutter/features/level/domain/entity/level_entity.dart'; import 'package:hadi_hoda_flutter/features/level/domain/entity/total_data_entity.dart'; import 'package:hive/hive.dart'; abstract class IDownloadDatasource { Future getAudios(); Future saveLevels(); Stream loadingStream(); } class DownloadDatasourceImpl implements IDownloadDatasource { final IHttpRequest httpRequest; final StreamController streamController = StreamController.broadcast(); DownloadDatasourceImpl(this.httpRequest); @override Future getAudios() async { final String filePath = '${StoragePath.documentDir.path}/audios.zip'; final String selectedLanguage = LocalStorage.readData(key: MyConstants.selectLanguage) ?? 'fa'; if(LocalStorage.readData(key: MyConstants.downloadedAudio) != 'true'){ await httpRequest.download( urlPath: MyApi.audios, savePath: filePath, queryParameters: { 'lang': selectedLanguage, }, onReceive: (count, total) { streamController.add(DownloadEntity( count: count / 1, total: total / 1, percent: (count / total) * 100, )); }, ).then((value) async { await LocalStorage.saveData( key: MyConstants.downloadedAudio, value: 'true', ); },); } try{ if (LocalStorage.readData(key: MyConstants.extractedAudio) != 'true') { final File file = File(filePath); final Directory directory = Directory( '${StoragePath.documentDir.path}/$selectedLanguage/', ); await ZipFile.extractToDirectory( zipFile: file, destinationDir: directory, onExtracting: (zipEntry, progress) { return ZipFileOperation.includeItem; }, ).then((value) async { await Future.wait([ LocalStorage.saveData( key: MyConstants.extractedAudio, value: 'true', ), file.delete(recursive: true), ]); }); } else { streamController.add(DownloadEntity(percent: 50)); await Future.delayed(Duration(milliseconds: 150)); streamController.add(DownloadEntity(percent: 100)); } } catch (e){ throw MyException(errorMessage: '$e'); } } @override Future saveLevels() async { final String selectedLanguage = LocalStorage.readData(key: MyConstants.selectLanguage) ?? 'fa'; final Box data = Hive.box(MyConstants.levelBox); final TotalDataEntity findData = data.values.singleWhere( (e) => e.code == selectedLanguage, orElse: () => TotalDataEntity(), ); if (findData.code != selectedLanguage) { final response = await httpRequest.get( path: MyApi.levels, queryParameters: {'lang': selectedLanguage}, ); final List levels = BaseResponse.getDataList( response?['result'], (json) => LevelModel.fromJson(json), ); await Future.wait([ data.add(TotalDataEntity(code: selectedLanguage, levels: levels)), ]); } } @override Stream loadingStream() => streamController.stream; }