olshab a676d454ca implemented mock crypto repository
changed Cupertino search bar to Material UI 3
changed baseline color and card colors
implemented fetching crypto data from public API (untested)
2024-12-15 23:23:00 +04:00

85 lines
2.5 KiB
Dart

import 'package:dio/dio.dart';
import 'package:flutter_android_app/components/locale/l10n/app_localizations.dart';
import 'package:flutter_android_app/components/utils/error_callback.dart';
import 'package:flutter_android_app/data/dtos/coins_dto.dart';
import 'package:flutter_android_app/data/dtos/search_coins_dto.dart';
import 'package:flutter_android_app/data/mappers/crypto_mapper.dart';
import 'package:flutter_android_app/repositories/api_interface.dart';
import 'package:pretty_dio_logger/pretty_dio_logger.dart';
import '../domain/models/home.dart';
class CryptoRepository extends ApiInterface {
static const String _baseUrl = 'https://api.coingecko.com/api/v3';
static const String _searchUrl = '/search';
static const String _coinsDataUrl = '/coins/markets';
static const String _apiKey = 'CG-oer6F3AAhVpNxGDxc7mjzZCo';
static final Dio _dio = Dio()
..interceptors.add(PrettyDioLogger(
requestBody: true,
requestHeader: true,
));
@override
Future<HomeData?> loadData({
OnErrorCallback? onError,
String? search,
int page = 1,
int pageSize = 20,
AppLocale? locale,
}) async {
try {
Map<String, dynamic> queryParams = {
'vs_currency': _getCurrencyName(locale?.localeName),
'per_page': pageSize,
'page': page,
};
if (search != null) {
final Response<dynamic> searchResponse = await _dio.get<Map<dynamic, dynamic>>(
'$_baseUrl$_searchUrl',
queryParameters: {
'x_cg_demo_api_key': _apiKey,
'query': search,
}
);
final SearchCoinsDto searchCoinsDto = SearchCoinsDto.fromJson(searchResponse.data as Map<String, dynamic>);
if (searchCoinsDto.coins != null) {
String ids = '';
for (var coinData in searchCoinsDto.coins!) {
ids += coinData.id != null ? '${coinData.id},' : '';
}
queryParams['ids'] = ids;
}
}
final Response<dynamic> response = await _dio.get<Map<dynamic, dynamic>>(
'$_baseUrl$_coinsDataUrl',
queryParameters: queryParams,
);
final CoinsDto dto = CoinsDto.fromJson(response.data as Map<String, dynamic>);
final HomeData data = dto.toDomain(locale);
return data;
} on DioException catch (e) {
onError?.call(e.error?.toString());
return null;
}
}
String _getCurrencyName(String? localeName) {
if (localeName == null) {
return 'usd';
}
return switch (localeName) {
'ru' => 'rub',
_ => 'usd',
};
}
}