mirror of
https://github.com/cypherstack/stack_wallet.git
synced 2024-11-17 17:57:40 +00:00
64 lines
1.4 KiB
Dart
64 lines
1.4 KiB
Dart
|
import 'dart:async';
|
||
|
|
||
|
import 'package:decimal/decimal.dart';
|
||
|
import 'package:flutter/foundation.dart';
|
||
|
import 'package:http/http.dart';
|
||
|
import 'package:stackwallet/services/price.dart';
|
||
|
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||
|
import 'package:tuple/tuple.dart';
|
||
|
|
||
|
class PriceService extends ChangeNotifier {
|
||
|
late final String baseTicker;
|
||
|
final Duration updateInterval = const Duration(seconds: 60);
|
||
|
|
||
|
Timer? _timer;
|
||
|
final Map<Coin, Tuple2<Decimal, double>> _cachedPrices = {
|
||
|
for (final coin in Coin.values) coin: Tuple2(Decimal.zero, 0.0)
|
||
|
};
|
||
|
final _priceAPI = PriceAPI(Client());
|
||
|
|
||
|
Tuple2<Decimal, double> getPrice(Coin coin) => _cachedPrices[coin]!;
|
||
|
|
||
|
PriceService(this.baseTicker) {
|
||
|
start(true);
|
||
|
}
|
||
|
|
||
|
Future<void> updatePrice() async {
|
||
|
final priceMap =
|
||
|
await _priceAPI.getPricesAnd24hChange(baseCurrency: baseTicker);
|
||
|
|
||
|
bool shouldNotify = false;
|
||
|
for (final map in priceMap.entries) {
|
||
|
if (_cachedPrices[map.key] != map.value) {
|
||
|
_cachedPrices[map.key] = map.value;
|
||
|
shouldNotify = true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (shouldNotify) {
|
||
|
notifyListeners();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void cancel() {
|
||
|
_timer?.cancel();
|
||
|
_timer = null;
|
||
|
}
|
||
|
|
||
|
void start(bool rightAway) {
|
||
|
if (rightAway) {
|
||
|
updatePrice();
|
||
|
}
|
||
|
_timer?.cancel();
|
||
|
_timer = Timer.periodic(updateInterval, (_) {
|
||
|
updatePrice();
|
||
|
});
|
||
|
}
|
||
|
|
||
|
@override
|
||
|
void dispose() {
|
||
|
cancel();
|
||
|
super.dispose();
|
||
|
}
|
||
|
}
|