diff --git a/lib/models/queries_indexer.dart b/lib/models/queries_indexer.dart index a361750225b4261aac953bd6437d67e9631a1c01..6e467525b8757223051c2efe5de02143bdf124b3 100644 --- a/lib/models/queries_indexer.dart +++ b/lib/models/queries_indexer.dart @@ -54,6 +54,10 @@ query ($address: String!, $first: Int!, $after: String) { name } } + comment { + remark + type + } } } pageInfo { diff --git a/lib/models/transaction.dart b/lib/models/transaction.dart new file mode 100644 index 0000000000000000000000000000000000000000..a74649bc1c5affbd114e6e217106449765883aab --- /dev/null +++ b/lib/models/transaction.dart @@ -0,0 +1,17 @@ +class Transaction { + final DateTime timestamp; + final String address; + final String username; + final double amount; + final String comment; + final bool isReceived; + + Transaction({ + required this.timestamp, + required this.address, + required this.username, + required this.amount, + required this.comment, + required this.isReceived, + }); +} diff --git a/lib/providers/duniter_indexer.dart b/lib/providers/duniter_indexer.dart index a2cb30dfc3ce04ef8a844b2f95f110065c9d392b..d4d5c6fd1c09b8a656d83fc81e1aa64bb345d7cc 100644 --- a/lib/providers/duniter_indexer.dart +++ b/lib/providers/duniter_indexer.dart @@ -11,12 +11,13 @@ import 'package:gecko/providers/substrate_sdk.dart'; import 'package:gecko/utils.dart'; import 'package:graphql_flutter/graphql_flutter.dart'; import 'package:provider/provider.dart'; +import 'package:gecko/models/transaction.dart'; class DuniterIndexer with ChangeNotifier { Map<String, String?> walletNameIndexer = {}; String? fetchMoreCursor; Map? pageInfo; - List? transBC; + List<Transaction>? transBC; List listIndexerEndpoints = []; bool isLoadingIndexer = false; Future<QueryResult<Object?>?> Function()? refetch; @@ -207,32 +208,44 @@ class DuniterIndexer with ChangeNotifier { } } - List parseHistory(List blockchainTX, String address) { - List transBC = []; - int i = 0; + List<Transaction> parseHistory(List blockchainTX, String address) { + // Create a list to store Transaction objects + List<Transaction> transactions = []; for (final transactionNode in blockchainTX) { final transaction = transactionNode['node']; - final direction = transaction['fromId'] != address ? 'RECEIVED' : 'SENT'; + final isReceived = transaction['fromId'] != address; - transBC.add(i); - transBC[i] = []; - transBC[i].add(DateTime.parse(transaction['timestamp'])); + // Calculate amount final amountBrut = transaction['amount']; final amount = removeDecimalZero(amountBrut / 100); - if (direction == "RECEIVED") { - transBC[i].add(transaction['fromId']); - transBC[i].add(transaction['from']['identity']?['name'] ?? ''); - } else if (direction == "SENT") { - transBC[i].add(transaction['toId']); - transBC[i].add(transaction['to']['identity']?['name'] ?? ''); + final comment = transaction['comment']?['remark'] ?? ''; + final commentType = transaction['comment']?['type'] ?? ''; + + // Determine counterparty based on direction + final String counterPartyId; + final String counterPartyName; + if (isReceived) { + counterPartyId = transaction['fromId']; + counterPartyName = transaction['from']['identity']?['name'] ?? ''; + } else { + counterPartyId = transaction['toId']; + counterPartyName = transaction['to']['identity']?['name'] ?? ''; } - transBC[i].add(amount); - transBC[i].add(direction); - i++; + // Create and add new Transaction object + transactions.add( + Transaction( + timestamp: DateTime.parse(transaction['timestamp']), + address: counterPartyId, + username: counterPartyName, + amount: amount, + comment: commentType == 'ASCII' ? comment : '', + isReceived: isReceived, + ), + ); } - return transBC; + return transactions; } FetchMoreOptions? mergeQueryResult(QueryResult result, FetchMoreOptions? opts, String address, int nRepositories) { @@ -313,11 +326,11 @@ class DuniterIndexer with ChangeNotifier { return indexerClient.subscribe(options); } - Map computeHistoryView(repository, String address) { + Map computeHistoryView(Transaction transaction, String address) { final bool isUdUnit = configBox.get('isUdUnit') ?? false; late double amount; late String finalAmount; - final DateTime date = repository[0]; + final DateTime date = transaction.timestamp; final dateForm = "${date.day} ${monthsInYear[date.month]!.substring(0, {1, 2, 7, 9}.contains(date.month) ? 4 : 3)}"; @@ -352,7 +365,7 @@ class DuniterIndexer with ChangeNotifier { final dateDelimiter = getDateDelimiter(); - amount = repository[4] == 'RECEIVED' ? repository[3] : repository[3] * -1; + amount = transaction.isReceived ? transaction.amount : transaction.amount * -1; if (isUdUnit) { amount = round(amount / balanceRatio); diff --git a/lib/widgets/history_view.dart b/lib/widgets/history_view.dart index fc11437323be7bf38858d3b9491abe6e149b0767..50af7b41f4c74e6ee8c5d94afc724d4d9f79c3e1 100644 --- a/lib/widgets/history_view.dart +++ b/lib/widgets/history_view.dart @@ -41,8 +41,8 @@ class HistoryView extends StatelessWidget { ]) : Column(children: <Widget>[ Column( - children: duniterIndexer.transBC!.map((repository) { - final answer = duniterIndexer.computeHistoryView(repository, address); + children: duniterIndexer.transBC!.map((transaction) { + final answer = duniterIndexer.computeHistoryView(transaction, address); pastDelimiters.add(answer['dateDelimiter']); bool isMigrationTime = false; @@ -78,7 +78,7 @@ class HistoryView extends StatelessWidget { TransactionTile( keyID: keyID, avatarSize: avatarSize, - repository: repository, + transaction: transaction, dateForm: answer['dateForm'], finalAmount: answer['finalAmount'], duniterIndexer: duniterIndexer, diff --git a/lib/widgets/transaction_tile.dart b/lib/widgets/transaction_tile.dart index a1fc3bff014ad6387bf1ceb8d9aea2e3830489a2..3d48015e550f6f73111f7f8dbd98d47d0b32f336 100644 --- a/lib/widgets/transaction_tile.dart +++ b/lib/widgets/transaction_tile.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:gecko/models/scale_functions.dart'; +import 'package:gecko/models/transaction.dart'; import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/providers/duniter_indexer.dart'; import 'package:gecko/screens/wallet_view.dart'; @@ -12,7 +13,7 @@ class TransactionTile extends StatelessWidget { super.key, required this.keyID, required this.avatarSize, - required this.repository, + required this.transaction, required this.dateForm, required this.finalAmount, required this.duniterIndexer, @@ -21,7 +22,7 @@ class TransactionTile extends StatelessWidget { final int keyID; final double avatarSize; - final List repository; + final Transaction transaction; final String dateForm; final String finalAmount; final DuniterIndexer duniterIndexer; @@ -30,7 +31,7 @@ class TransactionTile extends StatelessWidget { @override Widget build(BuildContext context) { final newKey = keyID + 1; - final String? username = repository[2] == '' ? null : repository[2]; + final String? username = transaction.username == '' ? null : transaction.username; return Container( margin: EdgeInsets.symmetric( @@ -63,7 +64,7 @@ class TransactionTile extends StatelessWidget { ), ), child: DatapodAvatar( - address: repository[1], + address: transaction.address, size: avatarSize, ), ), @@ -71,7 +72,7 @@ class TransactionTile extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - getShortPubkey(repository[1]), + getShortPubkey(transaction.address), style: scaledTextStyle( fontSize: 15, fontFamily: 'Monospace', @@ -106,6 +107,19 @@ class TransactionTile extends StatelessWidget { ], ), ), + if (transaction.comment.isNotEmpty) ...[ + ScaledSizedBox(height: 4), + Text( + transaction.comment, + style: scaledTextStyle( + fontSize: 12, + color: Colors.grey[600], + fontStyle: FontStyle.italic, + ), + maxLines: 2, + overflow: TextOverflow.ellipsis, + ), + ], ], ), trailing: Text( @@ -113,7 +127,7 @@ class TransactionTile extends StatelessWidget { style: scaledTextStyle( fontSize: 15, fontWeight: FontWeight.w600, - color: repository[4] == 'RECEIVED' ? const Color(0xFF4CAF50) : const Color(0xFF2196F3), + color: transaction.isReceived ? const Color(0xFF4CAF50) : const Color(0xFF2196F3), ), ), onTap: () { @@ -121,7 +135,7 @@ class TransactionTile extends StatelessWidget { context, PageNoTransit( builder: (context) => WalletViewScreen( - address: repository[1], + address: transaction.address, username: username, ), ),