2024-09-20 14:24:25 +00:00
|
|
|
import 'package:cake_wallet/bitcoin/bitcoin.dart';
|
2023-03-24 17:26:42 +02:00
|
|
|
import 'package:cake_wallet/src/screens/dashboard/widgets/anonpay_transaction_row.dart';
|
2021-03-12 21:04:37 +02:00
|
|
|
import 'package:cake_wallet/src/screens/dashboard/widgets/order_row.dart';
|
2024-11-07 15:46:08 +01:00
|
|
|
import 'package:cake_wallet/src/screens/dashboard/widgets/trade_row.dart';
|
2023-08-17 12:28:31 -03:00
|
|
|
import 'package:cake_wallet/themes/extensions/placeholder_theme.dart';
|
2023-07-07 14:47:55 +03:00
|
|
|
import 'package:cake_wallet/src/widgets/dashboard_card_widget.dart';
|
2023-04-17 21:09:26 +02:00
|
|
|
import 'package:cake_wallet/utils/responsive_layout_util.dart';
|
2023-03-24 17:26:42 +02:00
|
|
|
import 'package:cake_wallet/view_model/dashboard/anonpay_transaction_list_item.dart';
|
2021-03-12 21:04:37 +02:00
|
|
|
import 'package:cake_wallet/view_model/dashboard/order_list_item.dart';
|
2024-11-07 15:46:08 +01:00
|
|
|
import 'package:cake_wallet/view_model/dashboard/trade_list_item.dart';
|
2023-03-24 17:26:42 +02:00
|
|
|
import 'package:cw_core/crypto_currency.dart';
|
2023-07-07 14:47:55 +03:00
|
|
|
import 'package:cw_core/sync_status.dart';
|
2024-06-20 23:13:12 +00:00
|
|
|
import 'package:cw_core/wallet_type.dart';
|
2020-07-23 15:20:52 +03:00
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart';
|
|
|
|
import 'package:flutter_mobx/flutter_mobx.dart';
|
|
|
|
import 'package:cake_wallet/src/screens/dashboard/widgets/header_row.dart';
|
|
|
|
import 'package:cake_wallet/src/screens/dashboard/widgets/date_section_raw.dart';
|
|
|
|
import 'package:cake_wallet/src/screens/dashboard/widgets/transaction_raw.dart';
|
|
|
|
import 'package:cake_wallet/view_model/dashboard/transaction_list_item.dart';
|
|
|
|
import 'package:cake_wallet/view_model/dashboard/date_section_item.dart';
|
|
|
|
import 'package:intl/intl.dart';
|
|
|
|
import 'package:cake_wallet/routes.dart';
|
|
|
|
import 'package:cake_wallet/generated/i18n.dart';
|
2024-04-16 01:49:49 +02:00
|
|
|
import 'package:url_launcher/url_launcher.dart';
|
2020-07-23 15:20:52 +03:00
|
|
|
|
|
|
|
class TransactionsPage extends StatelessWidget {
|
2022-10-12 13:09:57 -04:00
|
|
|
TransactionsPage({required this.dashboardViewModel});
|
2020-07-23 15:20:52 +03:00
|
|
|
|
|
|
|
final DashboardViewModel dashboardViewModel;
|
|
|
|
|
|
|
|
@override
|
|
|
|
Widget build(BuildContext context) {
|
2023-06-09 19:29:34 -03:00
|
|
|
return GestureDetector(
|
|
|
|
onLongPress: () => dashboardViewModel.balanceViewModel.isReversing =
|
|
|
|
!dashboardViewModel.balanceViewModel.isReversing,
|
|
|
|
onLongPressUp: () => dashboardViewModel.balanceViewModel.isReversing =
|
|
|
|
!dashboardViewModel.balanceViewModel.isReversing,
|
|
|
|
child: Container(
|
2023-11-03 07:42:18 +02:00
|
|
|
color: responsiveLayoutUtil.shouldRenderMobileUI
|
2023-06-09 19:29:34 -03:00
|
|
|
? null
|
|
|
|
: Theme.of(context).colorScheme.background,
|
|
|
|
child: Column(
|
|
|
|
children: <Widget>[
|
2023-07-07 14:47:55 +03:00
|
|
|
Observer(builder: (_) {
|
|
|
|
final status = dashboardViewModel.status;
|
|
|
|
if (status is SyncingSyncStatus) {
|
2025-04-04 00:49:44 +02:00
|
|
|
return DashBoardRoundedCardWidget(
|
|
|
|
key: ValueKey('transactions_page_syncing_alert_card_key'),
|
|
|
|
onTap: () {
|
|
|
|
try {
|
|
|
|
final uri = Uri.parse(
|
|
|
|
"https://docs.cakewallet.com/faq/funds-not-appearing");
|
|
|
|
launchUrl(uri, mode: LaunchMode.externalApplication);
|
|
|
|
} catch (_) {}
|
|
|
|
},
|
|
|
|
title: S.of(context).syncing_wallet_alert_title,
|
|
|
|
subTitle: S.of(context).syncing_wallet_alert_content,
|
2023-07-07 14:47:55 +03:00
|
|
|
);
|
|
|
|
} else {
|
|
|
|
return Container();
|
|
|
|
}
|
|
|
|
}),
|
2024-11-07 15:46:08 +01:00
|
|
|
HeaderRow(
|
|
|
|
dashboardViewModel: dashboardViewModel,
|
|
|
|
key: ValueKey('transactions_page_header_row_key'),
|
|
|
|
),
|
|
|
|
Expanded(
|
|
|
|
child: Observer(
|
|
|
|
builder: (_) {
|
|
|
|
final items = dashboardViewModel.items;
|
|
|
|
return items.isNotEmpty
|
|
|
|
? ListView.builder(
|
|
|
|
key: ValueKey('transactions_page_list_view_builder_key'),
|
2025-02-17 17:35:58 -05:00
|
|
|
itemCount: items.length + 1,
|
2024-11-07 15:46:08 +01:00
|
|
|
itemBuilder: (context, index) {
|
2025-02-17 17:35:58 -05:00
|
|
|
|
|
|
|
if(index == items.length) return SizedBox(height: 150);
|
|
|
|
|
2024-11-07 15:46:08 +01:00
|
|
|
final item = items[index];
|
|
|
|
|
|
|
|
if (item is DateSectionItem) {
|
|
|
|
return DateSectionRaw(date: item.date, key: item.key);
|
litecoin mweb support (#1455)
* Fix stub creation
* Generate MWEB addresses
* Fix mweb address derivation
* Use camel-case
* Show utxos in tx list
* A few fixes
* Add spent processing
* Update balance
* Balance fixes
* Update address records
* Get rid of debounce hack
* Get sending up to the confirmation box
* Fee estimation
* Stop the daemon if plugin is unloaded
* Normal fee for non-mweb txns
* Fix fee estimation for send all
* Don't hash mweb addresses
* More fee fixes
* Broadcast mweb
* Remove test files
* One more
* Confirm sent txns
* Couple of fixes
* Resign inputs after mweb create
* Some more fixes
* Update balance after sending
* Correctly update address records
* Update confs
* [skip ci] updates
* [skip ci] add dep overrides
* working
* small fix
* merge fixes [skip ci]
* merge fixes [skip ci]
* [skip ci] minor fixes
* silent payment fixes [skip ci]
* updates [skip ci]
* save [skip ci]
* use mwebutxos box
* [skip ci] lots of fixes, still testing
* add rescan from height feature and test workflow build
* install go
* use sudo
* correct package name
* move building mweb higher for faster testing
* install fixes
* install later version of go
* go fixes
* testing
* testing
* testing
* testing
* testing
* should workgit add .github/workflows/pr_test_build.yml
* ???
* ??? pt.2
* should work, for real this time
* fix tx history not persisting + update build_mwebd script
* updates
* fix some rescan and address gen issues
* save [skip ci]
* fix unconfirmed balance not updating when receiving
* unspent coins / coin control fixes
* coin control fixes
* address balance and txCount fixes, try/catch electrum call
* fix txCount for addresses
* save [skip ci]
* potential fixes
* minor fix
* minor fix - 2
* sync status fixes, potential fix for background state issue
* workflow and script updates
* updates
* expirimental optimization
* [skip ci] minor enhancements
* workflow and script fixes
* workflow minor cleanup [skip ci]
* minor code cleanup & friendlier error message on failed tx's
* balance when sending fix
* experimental
* more experiments
* save
* updates
* coin control edge cases
* remove neutrino.db if no litecoin wallets left after deleting
* update translations
* updates
* minor fix
* [skip ci] update translations + minor fixes
* state fixes
* configure fix
* ui updates
* translation fixes
* [skip ci] addressbook updates
* fix popup
* fix popup2
* fix litecoin address book
* fix ios mwebd build script
* fix for building monero.com
* minor fix
* uncomment fix for state issues
* potential mweb sync fix (ios)
* remove print [skip ci]
* electrum stream potential fix
* fix ios build issues [skip ci]
* connection reliability updates, update kotlin code to match swift code, minor electrum error handling
* dep fixes
* minor fix
* more merge fixes
* bitcoin_flutter removal fixes
* [skip ci] fix always scan setting, swift updates
* updates
* fixes
* small fix
* small fix
* fix
* dart:convert != package:convert
* change address fixes
* update bitcoin_base to fix mweb address program checking
* fix ios xcode project [skip ci]
* updates
* more fixes
* more fixes
* ensure we don't initialize mweb until we really have to
* fix regression
* improve mweb reliability
* [skip ci] wip adress generation
* wip
* wip
* [skip ci] wip
* updates [skip ci]
* ios fixes
* fix workflows + ios fix
* test old mweb version
* update go version and mwebd hash
* review updates pt.1
* Update cw_bitcoin/lib/litecoin_wallet.dart
Co-authored-by: Omar Hatem <omarh.ismail1@gmail.com>
* remove non-litecoin address types regex [skip ci]
* more minor fixes
* remove duplicate [skip ci]
* Update lib/store/settings_store.dart
Co-authored-by: Omar Hatem <omarh.ismail1@gmail.com>
* script updates, swap params on createLitecoinWalletService
* topup fix
* [skip ci] wip
* [skip ci] testing
* [skip ci] file didn't get saved
* more address generation reliability fixes
* [skip ci] minor
* minor code cleanup
* hopefully prevents send issue
* [skip ci] wip address changes
* [skip ci] save
* save mweb addresses, auto-restart sync process if it gets stuck [skip ci]
* address generation issues mostly resolved
* more performance fixes
* [skip ci]
* this should maybe be refactored, pt.1
* separate mweb balances, pt.2
* [skip ci] save
* add translations [skip ci]
* fix sending with mweb amounts
* works for simple mweb-mweb case, further testing needed
* found an edge case
* [skip ci] make failed broadcast error message less serious
* minor
* capture all grpc errors and much better error handling overall
* [skip ci] minor
* prevent transactions with < 6 confirmations from being used + hide mweb balances if mweb is off
* fix
* merge fixes pt.1 [skip ci]
* fix mweb tags
* fix
* [skip ci] fix tag spacing
* fix transaction history not showing up
* fix mweb crash on non-fully deleted mweb cache, sync status ETA, other connection fixes
* [skip ci] minor code cleanup
* [skip ci] minor code cleanup
* additional cleanup
* silent payments eta fixes and updates
* revert sync eta changes into separate pr
* [skip ci] minor
* [skip ci] minor
* revert sync status title
* review fixes, additional cleanup
* [skip ci] minor
* [skip ci] minor
* [skip ci] minor
* trigger build
* review fixes, pt.2
* check if still processing utxos before updating sync status [skip ci]
* [skip ci] minor
* balance fix
* minor
* minor
* [skip ci] minor
* [skip ci] fix test net btc
* don't use mwebd for non-mweb tx's
* [skip ci] minor cleanup
* don't show all 1000+ mweb addresses on receive page
* minor cleanup + additional logging
---------
Co-authored-by: Hector Chu <hectorchu@gmail.com>
Co-authored-by: Omar Hatem <omarh.ismail1@gmail.com>
Co-authored-by: Czarek Nakamoto <cyjan@mrcyjanek.net>
2024-09-27 19:22:25 -07:00
|
|
|
}
|
2024-11-07 15:46:08 +01:00
|
|
|
|
|
|
|
if (item is TransactionListItem) {
|
|
|
|
if (item.hasTokens && item.assetOfTransaction == null) {
|
|
|
|
return Container();
|
|
|
|
}
|
|
|
|
|
|
|
|
final transaction = item.transaction;
|
|
|
|
final transactionType =
|
|
|
|
dashboardViewModel.getTransactionType(transaction);
|
|
|
|
|
|
|
|
List<String> tags = [];
|
|
|
|
if (dashboardViewModel.type == WalletType.bitcoin) {
|
|
|
|
if (bitcoin!.txIsReceivedSilentPayment(transaction)) {
|
|
|
|
tags.add(S.of(context).silent_payment);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (dashboardViewModel.type == WalletType.litecoin) {
|
|
|
|
if (bitcoin!.txIsMweb(transaction)) {
|
|
|
|
tags.add("MWEB");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return Observer(
|
|
|
|
builder: (_) => TransactionRow(
|
|
|
|
key: item.key,
|
|
|
|
onTap: () => Navigator.of(context)
|
|
|
|
.pushNamed(Routes.transactionDetails, arguments: transaction),
|
|
|
|
direction: transaction.direction,
|
|
|
|
formattedDate: DateFormat('HH:mm').format(transaction.date),
|
|
|
|
formattedAmount: item.formattedCryptoAmount,
|
|
|
|
formattedFiatAmount:
|
|
|
|
dashboardViewModel.balanceViewModel.isFiatDisabled
|
|
|
|
? ''
|
|
|
|
: item.formattedFiatAmount,
|
|
|
|
title:
|
|
|
|
item.formattedTitle + item.formattedStatus + transactionType,
|
|
|
|
tags: tags,
|
|
|
|
),
|
|
|
|
);
|
litecoin mweb support (#1455)
* Fix stub creation
* Generate MWEB addresses
* Fix mweb address derivation
* Use camel-case
* Show utxos in tx list
* A few fixes
* Add spent processing
* Update balance
* Balance fixes
* Update address records
* Get rid of debounce hack
* Get sending up to the confirmation box
* Fee estimation
* Stop the daemon if plugin is unloaded
* Normal fee for non-mweb txns
* Fix fee estimation for send all
* Don't hash mweb addresses
* More fee fixes
* Broadcast mweb
* Remove test files
* One more
* Confirm sent txns
* Couple of fixes
* Resign inputs after mweb create
* Some more fixes
* Update balance after sending
* Correctly update address records
* Update confs
* [skip ci] updates
* [skip ci] add dep overrides
* working
* small fix
* merge fixes [skip ci]
* merge fixes [skip ci]
* [skip ci] minor fixes
* silent payment fixes [skip ci]
* updates [skip ci]
* save [skip ci]
* use mwebutxos box
* [skip ci] lots of fixes, still testing
* add rescan from height feature and test workflow build
* install go
* use sudo
* correct package name
* move building mweb higher for faster testing
* install fixes
* install later version of go
* go fixes
* testing
* testing
* testing
* testing
* testing
* should workgit add .github/workflows/pr_test_build.yml
* ???
* ??? pt.2
* should work, for real this time
* fix tx history not persisting + update build_mwebd script
* updates
* fix some rescan and address gen issues
* save [skip ci]
* fix unconfirmed balance not updating when receiving
* unspent coins / coin control fixes
* coin control fixes
* address balance and txCount fixes, try/catch electrum call
* fix txCount for addresses
* save [skip ci]
* potential fixes
* minor fix
* minor fix - 2
* sync status fixes, potential fix for background state issue
* workflow and script updates
* updates
* expirimental optimization
* [skip ci] minor enhancements
* workflow and script fixes
* workflow minor cleanup [skip ci]
* minor code cleanup & friendlier error message on failed tx's
* balance when sending fix
* experimental
* more experiments
* save
* updates
* coin control edge cases
* remove neutrino.db if no litecoin wallets left after deleting
* update translations
* updates
* minor fix
* [skip ci] update translations + minor fixes
* state fixes
* configure fix
* ui updates
* translation fixes
* [skip ci] addressbook updates
* fix popup
* fix popup2
* fix litecoin address book
* fix ios mwebd build script
* fix for building monero.com
* minor fix
* uncomment fix for state issues
* potential mweb sync fix (ios)
* remove print [skip ci]
* electrum stream potential fix
* fix ios build issues [skip ci]
* connection reliability updates, update kotlin code to match swift code, minor electrum error handling
* dep fixes
* minor fix
* more merge fixes
* bitcoin_flutter removal fixes
* [skip ci] fix always scan setting, swift updates
* updates
* fixes
* small fix
* small fix
* fix
* dart:convert != package:convert
* change address fixes
* update bitcoin_base to fix mweb address program checking
* fix ios xcode project [skip ci]
* updates
* more fixes
* more fixes
* ensure we don't initialize mweb until we really have to
* fix regression
* improve mweb reliability
* [skip ci] wip adress generation
* wip
* wip
* [skip ci] wip
* updates [skip ci]
* ios fixes
* fix workflows + ios fix
* test old mweb version
* update go version and mwebd hash
* review updates pt.1
* Update cw_bitcoin/lib/litecoin_wallet.dart
Co-authored-by: Omar Hatem <omarh.ismail1@gmail.com>
* remove non-litecoin address types regex [skip ci]
* more minor fixes
* remove duplicate [skip ci]
* Update lib/store/settings_store.dart
Co-authored-by: Omar Hatem <omarh.ismail1@gmail.com>
* script updates, swap params on createLitecoinWalletService
* topup fix
* [skip ci] wip
* [skip ci] testing
* [skip ci] file didn't get saved
* more address generation reliability fixes
* [skip ci] minor
* minor code cleanup
* hopefully prevents send issue
* [skip ci] wip address changes
* [skip ci] save
* save mweb addresses, auto-restart sync process if it gets stuck [skip ci]
* address generation issues mostly resolved
* more performance fixes
* [skip ci]
* this should maybe be refactored, pt.1
* separate mweb balances, pt.2
* [skip ci] save
* add translations [skip ci]
* fix sending with mweb amounts
* works for simple mweb-mweb case, further testing needed
* found an edge case
* [skip ci] make failed broadcast error message less serious
* minor
* capture all grpc errors and much better error handling overall
* [skip ci] minor
* prevent transactions with < 6 confirmations from being used + hide mweb balances if mweb is off
* fix
* merge fixes pt.1 [skip ci]
* fix mweb tags
* fix
* [skip ci] fix tag spacing
* fix transaction history not showing up
* fix mweb crash on non-fully deleted mweb cache, sync status ETA, other connection fixes
* [skip ci] minor code cleanup
* [skip ci] minor code cleanup
* additional cleanup
* silent payments eta fixes and updates
* revert sync eta changes into separate pr
* [skip ci] minor
* [skip ci] minor
* revert sync status title
* review fixes, additional cleanup
* [skip ci] minor
* [skip ci] minor
* [skip ci] minor
* trigger build
* review fixes, pt.2
* check if still processing utxos before updating sync status [skip ci]
* [skip ci] minor
* balance fix
* minor
* minor
* [skip ci] minor
* [skip ci] fix test net btc
* don't use mwebd for non-mweb tx's
* [skip ci] minor cleanup
* don't show all 1000+ mweb addresses on receive page
* minor cleanup + additional logging
---------
Co-authored-by: Hector Chu <hectorchu@gmail.com>
Co-authored-by: Omar Hatem <omarh.ismail1@gmail.com>
Co-authored-by: Czarek Nakamoto <cyjan@mrcyjanek.net>
2024-09-27 19:22:25 -07:00
|
|
|
}
|
2024-11-07 15:46:08 +01:00
|
|
|
|
|
|
|
if (item is AnonpayTransactionListItem) {
|
|
|
|
final transactionInfo = item.transaction;
|
|
|
|
|
|
|
|
return AnonpayTransactionRow(
|
|
|
|
key: item.key,
|
|
|
|
onTap: () => Navigator.of(context).pushNamed(
|
|
|
|
Routes.anonPayDetailsPage,
|
|
|
|
arguments: transactionInfo),
|
|
|
|
currency: transactionInfo.fiatAmount != null
|
|
|
|
? transactionInfo.fiatEquiv ?? ''
|
|
|
|
: CryptoCurrency.fromFullName(transactionInfo.coinTo)
|
|
|
|
.name
|
|
|
|
.toUpperCase(),
|
|
|
|
provider: transactionInfo.provider,
|
|
|
|
amount: transactionInfo.fiatAmount?.toString() ??
|
|
|
|
(transactionInfo.amountTo?.toString() ?? ''),
|
|
|
|
createdAt: DateFormat('HH:mm').format(transactionInfo.createdAt),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (item is TradeListItem) {
|
|
|
|
final trade = item.trade;
|
|
|
|
|
|
|
|
return Observer(
|
|
|
|
builder: (_) => TradeRow(
|
|
|
|
key: item.key,
|
2023-11-22 18:43:26 +01:00
|
|
|
onTap: () => Navigator.of(context)
|
|
|
|
.pushNamed(Routes.tradeDetails, arguments: trade),
|
2023-06-09 19:29:34 -03:00
|
|
|
provider: trade.provider,
|
|
|
|
from: trade.from,
|
|
|
|
to: trade.to,
|
2023-11-22 18:43:26 +01:00
|
|
|
createdAtFormattedDate: trade.createdAt != null
|
|
|
|
? DateFormat('HH:mm').format(trade.createdAt!)
|
|
|
|
: null,
|
2025-01-24 20:17:37 +02:00
|
|
|
formattedAmount: item.tradeFormattedAmount,
|
|
|
|
formattedReceiveAmount: item.tradeFormattedReceiveAmount
|
2024-11-07 15:46:08 +01:00
|
|
|
),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
if (item is OrderListItem) {
|
|
|
|
final order = item.order;
|
|
|
|
|
|
|
|
return Observer(
|
|
|
|
builder: (_) => OrderRow(
|
|
|
|
key: item.key,
|
|
|
|
onTap: () => Navigator.of(context)
|
|
|
|
.pushNamed(Routes.orderDetails, arguments: order),
|
|
|
|
provider: order.provider,
|
|
|
|
from: order.from!,
|
|
|
|
to: order.to!,
|
|
|
|
createdAtFormattedDate:
|
|
|
|
DateFormat('HH:mm').format(order.createdAt),
|
|
|
|
formattedAmount: item.orderFormattedAmount,
|
|
|
|
),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
return Container(color: Colors.transparent, height: 1);
|
|
|
|
})
|
|
|
|
: Center(
|
|
|
|
child: Text(
|
|
|
|
key: ValueKey('transactions_page_placeholder_transactions_text_key'),
|
|
|
|
S.of(context).placeholder_transactions,
|
|
|
|
style: TextStyle(
|
|
|
|
fontSize: 14,
|
|
|
|
color: Theme.of(context).extension<PlaceholderTheme>()!.color,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
);
|
|
|
|
},
|
|
|
|
),
|
2025-02-17 17:35:58 -05:00
|
|
|
),
|
2023-06-09 19:29:34 -03:00
|
|
|
],
|
|
|
|
),
|
2020-07-23 15:20:52 +03:00
|
|
|
),
|
|
|
|
);
|
|
|
|
}
|
2023-03-24 17:26:42 +02:00
|
|
|
}
|