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> 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 _syncRemoteLevelsToLocal() async { final response = await httpRequest.get( path: MyApi.levels, queryParameters: {'lang': _selectedLanguage}, ); final List levels = BaseResponse.getDataList( response?['path'], (json) => NodeModel.fromJson(json), ); await LocalStorage.saveData( key: MyConstants.maxLevelCount, value: '${levels.length}', ); final Box 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> getLevels({required LevelParams params}) async { try { if (params.forceRemote) { await _syncRemoteLevelsToLocal(); } final Box 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'); } } }