You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

82 lines
2.7 KiB

import 'package:flutter/foundation.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/params/level_params.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/features/level/data/model/node_model.dart';
import 'package:hadi_hoda_flutter/features/level/domain/entity/node_entity.dart';
import 'package:hadi_hoda_flutter/features/level/domain/entity/total_data_entity.dart';
import 'package:hive/hive.dart';
abstract class ILevelDatasource {
Future<List<NodeEntity>> getLevels({required LevelParams params});
}
/// Local
class LocalLevelDatasourceImpl implements ILevelDatasource {
final IHttpRequest httpRequest;
LocalLevelDatasourceImpl(this.httpRequest);
String get _selectedLanguage =>
LocalStorage.readData(key: MyConstants.selectLanguage) ??
MyConstants.defaultLanguage;
Future<void> _syncRemoteLevelsToLocal() async {
final response = await httpRequest.get(
path: MyApi.levels,
queryParameters: {'lang': _selectedLanguage},
);
final List<NodeEntity> levels = BaseResponse.getDataList<NodeEntity>(
response?['path'],
(json) => NodeModel.fromJson(json),
);
await LocalStorage.saveData(
key: MyConstants.maxLevelCount,
value: '${levels.length}',
);
final Box<TotalDataEntity> levelBox = Hive.box(MyConstants.levelBox);
dynamic existingKey;
for (final key in levelBox.keys) {
final item = levelBox.get(key);
if (item?.code == _selectedLanguage) {
existingKey = key;
break;
}
}
if (existingKey != null) {
await levelBox.put(
existingKey,
TotalDataEntity(code: _selectedLanguage, nodes: levels),
);
return;
}
await levelBox.add(TotalDataEntity(code: _selectedLanguage, nodes: levels));
}
@override
Future<List<NodeEntity>> getLevels({required LevelParams params}) async {
try {
if (params.forceRemote) {
await _syncRemoteLevelsToLocal();
}
final Box<TotalDataEntity> levelBox = Hive.box(MyConstants.levelBox);
final TotalDataEntity findData = levelBox.values.firstWhere(
(e) => e.code == _selectedLanguage,
orElse: () => TotalDataEntity(),
);
return findData.nodes ?? [];
} catch (e, s) {
debugPrint(e.toString());
debugPrint(s.toString());
throw const MyException(errorMessage: 'Operation Failed');
}
}
}