Skip to content
Snippets Groups Projects
transaction_cubit.dart 2.43 KiB
import 'package:hydrated_bloc/hydrated_bloc.dart';

import '../../../g1/api.dart';
import '../../../g1/transaction_parser.dart';
import '../../notification_controller.dart';
import '../../shared_prefs.dart';
import '../../ui/logger.dart';
import 'node_list_cubit.dart';
import 'transaction.dart';

class TransactionsCubit extends HydratedCubit<TransactionsAndBalanceState> {
  TransactionsCubit()
      : super(TransactionsAndBalanceState(
            transactions: const <Transaction>[],
            balance: 0,
            lastChecked: DateTime.now()));

  void addTransaction(Transaction transaction) {
    final TransactionsAndBalanceState currentState = state;
    final List<Transaction> newTransactions =
        List<Transaction>.of(currentState.transactions)..add(transaction);
    final double newBalance = currentState.balance + transaction.amount;
    emit(currentState.copyWith(
        transactions: newTransactions, balance: newBalance));
  }

  void updateTransactions(
      List<Transaction> newTransactions, double newBalance) {
    emit(state.copyWith(transactions: newTransactions, balance: newBalance));
  }

  Future<void> fetchTransactions(NodeListCubit cubit) async {
    logger('Loading transactions');
    final Map<String, dynamic>? txData =
        await gvaHistoryAndBalance(SharedPreferencesHelper().getPubKey());
    if (txData == null) {
      logger('Failed to get transactions');
      return;
    }
    final TransactionsAndBalanceState state = transactionsGvaParser(txData);
    emit(state.copyWith(
        transactions: state.transactions,
        balance: state.balance,
        lastChecked: state.lastChecked));
    final DateTime? lastReceived = state.lastReceived;
    final DateTime lastReceivedNotification =
        state.lastReceivedNotif ?? DateTime(1970);
    // final DateTime? lastSent = transBalanceState.lastSent;
    if (lastReceived != null &&
        lastReceivedNotification.compareTo(lastReceived) == 1) {
      // Notify
      NotificationController.createNewNotification(
          lastReceived.millisecondsSinceEpoch.toString());
    }
  }

  @override
  TransactionsAndBalanceState fromJson(Map<String, dynamic> json) =>
      TransactionsAndBalanceState.fromJson(json);

  @override
  Map<String, dynamic> toJson(TransactionsAndBalanceState state) =>
      state.toJson();

  List<Transaction> get transactions => state.transactions;

  double get balance => state.balance;

  DateTime get lastChecked => state.lastChecked;
}