Skip to content

Commit

Permalink
upd
Browse files Browse the repository at this point in the history
  • Loading branch information
justinenerio committed Jun 2, 2024
1 parent a890952 commit 02439ea
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 37 deletions.
14 changes: 13 additions & 1 deletion packages/espressocash_app/lib/data/db/db.dart
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ class OutgoingTransferRows extends Table {
Set<Column<Object>> get primaryKey => {id};
}

const int latestVersion = 51;
const int latestVersion = 52;

const _tables = [
OutgoingTransferRows,
Expand All @@ -37,6 +37,7 @@ const _tables = [
OffRampOrderRows,
OutgoingDlnPaymentRows,
TransactionRequestRows,
TokenBalanceRows,
];

@lazySingleton
Expand Down Expand Up @@ -114,6 +115,10 @@ class MyDatabase extends _$MyDatabase {
if (from < 51) {
await m.addColumn(transactionRows, transactionRows.amount);
}

if (from < 52) {
await m.createTable(tokenBalanceRows);
}
},
);
}
Expand Down Expand Up @@ -233,3 +238,10 @@ enum TRStatusDto {
success,
failure,
}

class TokenBalanceRows extends Table with AmountMixin {
const TokenBalanceRows();

@override
Set<Column> get primaryKey => {token};
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
import 'dart:convert';

import 'package:collection/collection.dart';
import 'package:drift/drift.dart';
import 'package:fast_immutable_collections/fast_immutable_collections.dart';
import 'package:injectable/injectable.dart';
import 'package:rxdart/rxdart.dart';
import 'package:shared_preferences/shared_preferences.dart';

import '../../../data/db/db.dart';
import '../../accounts/auth_scope.dart';
import '../../currency/models/amount.dart';
import '../../currency/models/currency.dart';
Expand All @@ -15,9 +14,9 @@ import '../models/token_balance.dart';

@Singleton(scope: authScope)
class TokenBalancesRepository {
TokenBalancesRepository(this._storage, this._tokens);
TokenBalancesRepository(this._db, this._tokens);

final SharedPreferences _storage;
final MyDatabase _db;
final TokenList _tokens;

final BehaviorSubject<IMap<Token, CryptoAmount>> _data =
Expand Down Expand Up @@ -47,25 +46,19 @@ class TokenBalancesRepository {
read(token),
);

@PostConstruct()
void init() {
final tokenBalances = _storage.getString(_tokensBalanceKey);

if (tokenBalances == null) return;

final List<dynamic> tokensJson =
json.decode(tokenBalances) as List<dynamic>;

final tokens = tokensJson.map((json) {
final tokenBalance = TokenBalance.fromJson(json as Map<String, dynamic>);
@PostConstruct(preResolve: true)
Future<void> init() async {
final tokenBalances = await _db.select(_db.tokenBalanceRows).get().then(
(rows) => rows.map((row) => row.toModel()).toList(),
);

final token = _tokens.findTokenByMint(tokenBalance.id);
final tokens = tokenBalances.map((balance) {
final token = _tokens.findTokenByMint(balance.address);
if (token == null) return null;

return MapEntry(
token,
Amount.fromToken(value: tokenBalance.balance, token: token)
as CryptoAmount,
Amount.fromToken(value: balance.balance, token: token) as CryptoAmount,
);
}).whereNotNull();

Expand All @@ -77,32 +70,47 @@ class TokenBalancesRepository {
tokens.clean();
_data.add(tokens.lock);

_storage.setString(_tokensBalanceKey, tokens.toJson());
_db.transaction(() async {
await _db.delete(_db.tokenBalanceRows).go();
await _db.batch(
(batch) => batch.insertAll(
_db.tokenBalanceRows,
tokens.toList(),
mode: InsertMode.insertOrReplace,
),
);
});
}

@disposeMethod
void dispose() {
_storage.remove(_tokensBalanceKey);
_db.delete(_db.tokenBalanceRows).go();
}
}

const _tokensBalanceKey = 'tokensBalance';

extension on Map<Token, CryptoAmount> {
void clean() => removeWhere(
(token, amount) => token == Token.usdc,
);

String toJson() {
final List<TokenBalance> tokensJson = entries
.map(
(entry) => TokenBalance(
id: entry.key.address,
balance: entry.value.value,
),
)
.toList();

return json.encode(tokensJson.map((e) => e.toJson()).toList());
}
Iterable<TokenBalanceRow> toList() => entries.map(
(entry) => TokenBalance(
address: entry.key.address,
balance: entry.value.value,
).toDto(),
);
}

extension on TokenBalanceRow {
TokenBalance toModel() => TokenBalance(
address: token,
balance: amount,
);
}

extension on TokenBalance {
TokenBalanceRow toDto() => TokenBalanceRow(
token: address,
amount: balance,
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ part 'token_balance.g.dart';
@freezed
class TokenBalance with _$TokenBalance {
const factory TokenBalance({
required String id,
required String address,
required int balance,
}) = _TokenBalance;

Expand Down

0 comments on commit 02439ea

Please sign in to comment.