transaction_page.dart 13.84 KiB
import 'dart:async';
import 'package:backdrop/backdrop.dart';
import 'package:cron/cron.dart';
import 'package:easy_debounce/easy_throttle.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart';
import '../../../data/models/app_cubit.dart';
import '../../../data/models/node_list_cubit.dart';
import '../../../data/models/transaction.dart';
import '../../../data/models/transaction_cubit.dart';
import '../../../data/models/transaction_state.dart';
import '../../../data/models/transactions_bloc.dart';
import '../../../g1/currency.dart';
import '../../../shared_prefs.dart';
import '../../logger.dart';
import '../../tutorial_keys.dart';
import '../../ui_helpers.dart';
import 'transaction_item.dart';
class TransactionsAndBalanceWidget extends StatefulWidget {
const TransactionsAndBalanceWidget({super.key});
@override
State<TransactionsAndBalanceWidget> createState() =>
_TransactionsAndBalanceWidgetState();
}
class _TransactionsAndBalanceWidgetState
extends State<TransactionsAndBalanceWidget>
with SingleTickerProviderStateMixin {
final ScrollController _transScrollController = ScrollController();
final TransactionsBloc _bloc = TransactionsBloc();
late StreamSubscription<TransactionsState> _blocListingStateSubscription;
late AppCubit appCubit;
late NodeListCubit nodeListCubit;
late TransactionCubit transCubit;
final PagingController<String?, Transaction> _pagingController =
PagingController<String?, Transaction>(firstPageKey: null);
final PagingController<int, Transaction> _pendingController =
PagingController<int, Transaction>(firstPageKey: 0);
final int _pendingPageSize = 30;
final Cron cron = Cron();
static const double balanceFontSize = 36.0;
@override
void initState() {
// Remove in the future
appCubit = context.read<AppCubit>();
transCubit = context.read<TransactionCubit>();
nodeListCubit = context.read<NodeListCubit>();
_bloc.init(transCubit, nodeListCubit, appCubit);
_pagingController.addPageRequestListener((String? cursor) {
_bloc.onPageRequestSink.add(cursor);
});
// We could've used StreamBuilder, but that would unnecessarily recreate
// the entire [PagedSliverGrid] every time the state changes.
// Instead, handling the subscription ourselves and updating only the
// _pagingController is more efficient.
_blocListingStateSubscription =
_bloc.onNewListingState.listen((TransactionsState listingState) {
_pagingController.value = PagingState<String?, Transaction>(
nextPageKey: listingState.nextPageKey,