stack_wallet/lib/wallets/isar/providers/eth/token_balance_provider.dart

59 lines
1.7 KiB
Dart

import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:isar/isar.dart';
import '../../../../models/balance.dart';
import '../../../../models/isar/models/isar_models.dart';
import '../../../../providers/db/main_db_provider.dart';
import '../../models/token_wallet_info.dart';
import '../util/watcher.dart';
final _twiProvider = ChangeNotifierProvider.family<Watcher,
({String walletId, String contractAddress})>(
(ref, data) {
final isar = ref.watch(mainDBProvider).isar;
final collection = isar.tokenWalletInfo;
TokenWalletInfo? initial = collection
.where()
.walletIdTokenAddressEqualTo(data.walletId, data.contractAddress)
.findFirstSync();
if (initial == null) {
initial = TokenWalletInfo(
walletId: data.walletId,
tokenAddress: data.contractAddress,
tokenFractionDigits: isar.ethContracts
.getByAddressSync(data.contractAddress)
?.decimals ??
2,
);
isar.writeTxnSync(() => isar.tokenWalletInfo.putSync(initial!));
}
final watcher = Watcher(
initial,
collection: collection,
);
ref.onDispose(() => watcher.dispose());
return watcher;
},
);
final pTokenWalletInfo = Provider.family<TokenWalletInfo,
({String walletId, String contractAddress})>(
(ref, data) {
return ref.watch(_twiProvider(data).select((value) => value.value))
as TokenWalletInfo;
},
);
final pTokenBalance =
Provider.family<Balance, ({String walletId, String contractAddress})>(
(ref, data) {
return ref.watch(_twiProvider(data).select(
(value) => (value.value as TokenWalletInfo).getCachedBalance()));
},
);