Skip to content

Commit

Permalink
fix: update token transactions handling and improve loading state man…
Browse files Browse the repository at this point in the history
…agement (#793)

Co-authored-by: Egor Komarov <e.komarov.bf@gmail.com>
  • Loading branch information
Odrin and Egor Komarov authored Feb 27, 2025
1 parent 5033a66 commit 2221e6a
Show file tree
Hide file tree
Showing 5 changed files with 32 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@ class _Body extends StatelessWidget {
final theme = context.themeStyleV2;

return CustomScrollView(
controller: controller,
slivers: [
SliverToBoxAdapter(
child: Stack(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ class TokenWalletTransactionsCubit extends Cubit<TokenWalletTransactionsState>
___,
____,
) =>
_lastLt(transactions),
_lastLt(_transactions),
);
final (isLoading, canLoadMore) = state.maybeWhen(
transactions: (_, __, isLoading, canLoadMore, ___) =>
Expand All @@ -100,7 +100,9 @@ class TokenWalletTransactionsCubit extends Cubit<TokenWalletTransactionsState>
/// List of ordinary transactions and flag that sign that transactions was
/// loaded and mapped.
bool _ordinaryLoaded = false;
bool _isPreloading = false;
List<TokenWalletOrdinaryTransaction> _ordinary = [];
List<TransactionWithData<TokenWalletTransaction?>> _transactions = [];

StreamSubscription<dynamic>? _ordinaryTransactionsSub;
late StreamSubscription<dynamic> _walletSubscription;
Expand Down Expand Up @@ -141,6 +143,7 @@ class TokenWalletTransactionsCubit extends Cubit<TokenWalletTransactionsState>
(_, b) => b ?? [],
).listen(
(transactions) {
_transactions = transactions;
_ordinary = nekotonRepository.mapOrdinaryTokenTransactions(
rootTokenContract: rootTokenContract,
transactions: transactions,
Expand Down Expand Up @@ -169,14 +172,13 @@ class TokenWalletTransactionsCubit extends Cubit<TokenWalletTransactionsState>
if (_ordinary.isEmpty) {
emitSafe(const TokenWalletTransactionsState.empty());
} else {
final transactions = [..._ordinary]
..sort((a, b) => b.date.compareTo(a.date));
final transactions = _ordinary;

var canLoadMore = state.maybeWhen(
transactions: (_, __, ___, canLoadMore, ____) => canLoadMore,
orElse: () => true,
);
final lastLt = _lastLt(transactions);
final lastLt = _lastLt(_transactions);
if (_lastLtWhenPreloaded != null && !isLoading && fromStream) {
// we must check this state every time, because we may have multiple
// inputs for this method (different transactions streams, but not now,
Expand All @@ -199,13 +201,18 @@ class TokenWalletTransactionsCubit extends Cubit<TokenWalletTransactionsState>

/// Get last available prevTransactionLt
String? _lastLt(
List<TokenWalletOrdinaryTransaction> transactions,
List<TransactionWithData<TokenWalletTransaction?>> transactions,
) =>
transactions
.lastWhereOrNull((t) => t.prevTransactionLt != null)
?.prevTransactionLt;
.lastWhereOrNull((t) => t.transaction.prevTransactionId != null)
?.transaction
.prevTransactionId
?.lt;

Future<void> _preloadTransactions(String lastPrevLt) async {
if (_isPreloading) return;
_isPreloading = true;

_transactionsState(isLoading: true);
_lastLtWhenPreloaded = lastPrevLt;

Expand All @@ -218,6 +225,7 @@ class TokenWalletTransactionsCubit extends Cubit<TokenWalletTransactionsState>
} catch (e, t) {
_logger.severe('_preloadTransactions', e, t);
} finally {
_isPreloading = false;
_transactionsState();
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ class _Body extends StatelessWidget {
final theme = context.themeStyleV2;

return CustomScrollView(
controller: controller,
slivers: [
SliverToBoxAdapter(
child: Stack(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,9 +65,11 @@ class AccountTransactionsTabCubit extends Cubit<AccountTransactionsTabState>
/// List of multisig transactions and flag that sign that multisig
/// transactions was loaded and mapped.
bool _multisigLoaded = false;
bool _isPreloading = false;
List<TonWalletMultisigOrdinaryTransaction> _multisigOrdinary = [];
List<TonWalletMultisigPendingTransaction> _multisigPending = [];
List<TonWalletMultisigExpiredTransaction> _multisigExpired = [];
List<TransactionWithData<TransactionAdditionalInfo?>> _transactions = [];

bool _ordinaryLoaded = false;
List<TonWalletOrdinaryTransaction> _ordinary = [];
Expand All @@ -88,7 +90,7 @@ class AccountTransactionsTabCubit extends Cubit<AccountTransactionsTabState>
/// NOTE: this method may be called multiple times
void tryPreloadTransactions() {
final lastPrevLt = state.whenOrNull(
transactions: (transactions, _, __, ___) => _lastLt(transactions),
transactions: (transactions, _, __, ___) => _lastLt(_transactions),
);
final (isLoading, canLoadMore) = state.maybeWhen(
transactions: (_, isLoading, canLoadMore, ___) =>
Expand Down Expand Up @@ -140,6 +142,7 @@ class AccountTransactionsTabCubit extends Cubit<AccountTransactionsTabState>
).listen(
(transactions) async {
final multisigTransactions = wallet.unconfirmedTransactions;
_transactions = transactions;

try {
_multisigExpired =
Expand Down Expand Up @@ -307,7 +310,7 @@ class AccountTransactionsTabCubit extends Cubit<AccountTransactionsTabState>
transactions: (_, __, canLoadMore, ___) => canLoadMore,
orElse: () => true,
);
final lastLt = _lastLt(transactions);
final lastLt = _lastLt(_transactions);

if (_lastLtWhenPreloaded != null && !isLoading && fromStream) {
// we must check this state every time, because we have multiple
Expand All @@ -329,13 +332,18 @@ class AccountTransactionsTabCubit extends Cubit<AccountTransactionsTabState>

/// Get last available prevTransactionLt
String? _lastLt(
List<AccountTransactionItem<dynamic>> transactions,
List<TransactionWithData<TransactionAdditionalInfo?>> transactions,
) =>
transactions
.lastWhereOrNull((t) => t.prevTransactionLt != null)
?.prevTransactionLt;
.lastWhereOrNull((t) => t.transaction.prevTransactionId != null)
?.transaction
.prevTransactionId
?.lt;

Future<void> _preloadTransactions(String lastPrevLt) async {
if (_isPreloading) return;
_isPreloading = true;

_transactionsState(isLoading: true);
_lastLtWhenPreloaded = lastPrevLt;

Expand All @@ -347,6 +355,7 @@ class AccountTransactionsTabCubit extends Cubit<AccountTransactionsTabState>
} catch (e, t) {
_logger.severe('_preloadTransactions', e, t);
} finally {
_isPreloading = false;
_transactionsState();
}
}
Expand Down
2 changes: 1 addition & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ dependencies:
mobile_scanner: 5.2.3
money2: 5.3.0 # do not update to 5.4.0 due to json serialization issues
money2_fixer: 2.0.0
nekoton_repository: 0.51.0-dev.4
nekoton_repository: 0.51.0-dev.5
nekoton_webview: 0.1.8
ntp: 2.0.0
package_info_plus: 8.1.3
Expand Down

0 comments on commit 2221e6a

Please sign in to comment.