import 'package:cryptocurrency_app/constants/exceptions.dart'; import 'package:cryptocurrency_app/models/exchanges/exchange/exchange.dart'; import 'package:cryptocurrency_app/models/exchanges/exchanges_response/exchanges_response.dart'; import 'package:cryptocurrency_app/models/graph/graph/graph.dart'; import 'package:cryptocurrency_app/models/graph/graph_response/graph_response.dart'; import 'package:cryptocurrency_app/models/markets/market_response/market_response.dart'; import 'package:cryptocurrency_app/models/markets/pair/pair.dart'; import 'package:cryptocurrency_app/models/orderbook/orderbook/orderbook.dart'; import 'package:cryptocurrency_app/models/orderbook/orderbook_response/orderbook_response.dart'; import 'package:cryptocurrency_app/models/pair/pair_response/pair_response.dart'; import 'package:cryptocurrency_app/models/pair/pair_summary/pair_summary.dart'; import 'package:cryptocurrency_app/models/trades/trade/trade.dart'; import 'package:cryptocurrency_app/models/trades/trades_response.dart/trades_response.dart'; import 'package:dio/dio.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; final clientProvider = Provider((ref) => Dio(BaseOptions(headers: { "X-CW-API-Key": env['API_KEY'], }, baseUrl: 'https://api.cryptowat.ch'))); final cryptoRepository = Provider((ref) => CryptoRepositoryAPI(ref.read)); abstract class CryptoRepository { Future> getPairs(String market); Future getPairSummary(String makeret, String pair); Future getPairGraph(String market, String pair, {String periods, String after, String before}); Future> getExchanges(); Future getOrderBook(String market, String pair); Future> getTrades(String market, String pair); } class CryptoRepositoryAPI implements CryptoRepository { final Reader read; CryptoRepositoryAPI(this.read); @override Future> getPairs(String market, {CancelToken? cancelToken}) async { try { final response = await read(clientProvider) .get('/markets/$market', cancelToken: cancelToken); return MarketResponse.fromJson(response.data).result; } on DioError catch (error) { throw DataException.fromDioError(error); } } @override Future getPairSummary(String market, String pair, {CancelToken? cancelToken}) async { try { final response = await read(clientProvider) .get('/markets/$market/$pair/summary', cancelToken: cancelToken); return PairResponse.fromJson(response.data).result; } on DioError catch (error) { throw DataException.fromDioError(error); } } @override Future getOrderBook(String market, String pair, {CancelToken? cancelToken}) async { try { final response = await read(clientProvider) .get('/markets/$market/$pair/orderbook', cancelToken: cancelToken); return OrderBookResponse.fromJson(response.data).result; } on DioError catch (error) { throw DataException.fromDioError(error); } } @override Future> getTrades(String market, String pair, {CancelToken? cancelToken}) async { try { final response = await read(clientProvider) .get('/markets/$market/$pair/trades', cancelToken: cancelToken); return TradesResponse.fromJson(response.data).result!; } on DioError catch (error) { throw DataException.fromDioError(error); } } @override Future getPairGraph(String market, String pair, {String periods = "", String after = "", String before = "", CancelToken? cancelToken}) async { try { final response = await read(clientProvider).get( '/markets/$market/$pair/ohlc', queryParameters: { "periods": periods, "after": after, "before": before }, cancelToken: cancelToken); return GraphResponse.fromJson(response.data).result; } on DioError catch (error) { throw DataException.fromDioError(error); } } @override Future> getExchanges({CancelToken? cancelToken}) async { try { final response = await read(clientProvider) .get('/exchanges', cancelToken: cancelToken); return ExchangesResponse.fromJson(response.data).result; } on DioError catch (error) { throw DataException.fromDioError(error); } } }