mirror of
https://github.com/cypherstack/stack_wallet.git
synced 2024-12-22 19:39:22 +00:00
add lottie animations for sending as well as some clean up
This commit is contained in:
parent
0a90f32f5f
commit
87c15c2c39
36 changed files with 428 additions and 176 deletions
1
assets/lottie/coins/bitcoin/kiss.lottie.json
Normal file
1
assets/lottie/coins/bitcoin/kiss.lottie.json
Normal file
File diff suppressed because one or more lines are too long
1
assets/lottie/coins/bitcoin/plain.lottie.json
Normal file
1
assets/lottie/coins/bitcoin/plain.lottie.json
Normal file
File diff suppressed because one or more lines are too long
1
assets/lottie/coins/bitcoincash/kiss.lottie.json
Normal file
1
assets/lottie/coins/bitcoincash/kiss.lottie.json
Normal file
File diff suppressed because one or more lines are too long
1
assets/lottie/coins/bitcoincash/plain.lottie.json
Normal file
1
assets/lottie/coins/bitcoincash/plain.lottie.json
Normal file
File diff suppressed because one or more lines are too long
1
assets/lottie/coins/dogecoin/kiss.lottie.json
Normal file
1
assets/lottie/coins/dogecoin/kiss.lottie.json
Normal file
File diff suppressed because one or more lines are too long
1
assets/lottie/coins/dogecoin/plain.lottie.json
Normal file
1
assets/lottie/coins/dogecoin/plain.lottie.json
Normal file
File diff suppressed because one or more lines are too long
1
assets/lottie/coins/epiccash/kiss.lottie.json
Normal file
1
assets/lottie/coins/epiccash/kiss.lottie.json
Normal file
File diff suppressed because one or more lines are too long
1
assets/lottie/coins/epiccash/plain.lottie.json
Normal file
1
assets/lottie/coins/epiccash/plain.lottie.json
Normal file
File diff suppressed because one or more lines are too long
1
assets/lottie/coins/ethereum/kiss.lottie.json
Normal file
1
assets/lottie/coins/ethereum/kiss.lottie.json
Normal file
File diff suppressed because one or more lines are too long
1
assets/lottie/coins/ethereum/plain.lottie.json
Normal file
1
assets/lottie/coins/ethereum/plain.lottie.json
Normal file
File diff suppressed because one or more lines are too long
1
assets/lottie/coins/firo/kiss.lottie.json
Normal file
1
assets/lottie/coins/firo/kiss.lottie.json
Normal file
File diff suppressed because one or more lines are too long
1
assets/lottie/coins/firo/plain.lottie.json
Normal file
1
assets/lottie/coins/firo/plain.lottie.json
Normal file
File diff suppressed because one or more lines are too long
1
assets/lottie/coins/litecoin/kiss.lottie.json
Normal file
1
assets/lottie/coins/litecoin/kiss.lottie.json
Normal file
File diff suppressed because one or more lines are too long
1
assets/lottie/coins/litecoin/plain.lottie.json
Normal file
1
assets/lottie/coins/litecoin/plain.lottie.json
Normal file
File diff suppressed because one or more lines are too long
1
assets/lottie/coins/monero/kiss.lottie.json
Normal file
1
assets/lottie/coins/monero/kiss.lottie.json
Normal file
File diff suppressed because one or more lines are too long
1
assets/lottie/coins/monero/plain.lottie.json
Normal file
1
assets/lottie/coins/monero/plain.lottie.json
Normal file
File diff suppressed because one or more lines are too long
1
assets/lottie/coins/namecoin/kiss.lottie.json
Normal file
1
assets/lottie/coins/namecoin/kiss.lottie.json
Normal file
File diff suppressed because one or more lines are too long
1
assets/lottie/coins/namecoin/plain.lottie.json
Normal file
1
assets/lottie/coins/namecoin/plain.lottie.json
Normal file
File diff suppressed because one or more lines are too long
1
assets/lottie/coins/particl/kiss.lottie.json
Normal file
1
assets/lottie/coins/particl/kiss.lottie.json
Normal file
File diff suppressed because one or more lines are too long
1
assets/lottie/coins/particl/plain.lottie.json
Normal file
1
assets/lottie/coins/particl/plain.lottie.json
Normal file
File diff suppressed because one or more lines are too long
1
assets/lottie/coins/wownero/kiss.lottie.json
Normal file
1
assets/lottie/coins/wownero/kiss.lottie.json
Normal file
File diff suppressed because one or more lines are too long
1
assets/lottie/coins/wownero/plain.lottie.json
Normal file
1
assets/lottie/coins/wownero/plain.lottie.json
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -64,33 +64,49 @@ class _ConfirmChangeNowSendViewState
|
|||
final isDesktop = Util.isDesktop;
|
||||
|
||||
Future<void> _attemptSend(BuildContext context) async {
|
||||
final manager =
|
||||
ref.read(walletsChangeNotifierProvider).getManager(walletId);
|
||||
unawaited(
|
||||
showDialog<void>(
|
||||
context: context,
|
||||
useSafeArea: false,
|
||||
barrierDismissible: false,
|
||||
builder: (context) {
|
||||
return const SendingTransactionDialog();
|
||||
return SendingTransactionDialog(
|
||||
coin: manager.coin,
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
|
||||
final time = Future<dynamic>.delayed(
|
||||
const Duration(
|
||||
seconds: 3,
|
||||
),
|
||||
);
|
||||
|
||||
late String txid;
|
||||
Future<String> txidFuture;
|
||||
|
||||
final String note = transactionInfo["note"] as String? ?? "";
|
||||
final manager =
|
||||
ref.read(walletsChangeNotifierProvider).getManager(walletId);
|
||||
|
||||
try {
|
||||
late final String txid;
|
||||
|
||||
if (widget.shouldSendPublicFiroFunds == true) {
|
||||
txid = await (manager.wallet as FiroWallet)
|
||||
txidFuture = (manager.wallet as FiroWallet)
|
||||
.confirmSendPublic(txData: transactionInfo);
|
||||
} else {
|
||||
txid = await manager.confirmSend(txData: transactionInfo);
|
||||
txidFuture = manager.confirmSend(txData: transactionInfo);
|
||||
}
|
||||
|
||||
unawaited(manager.refresh());
|
||||
|
||||
final results = await Future.wait([
|
||||
txidFuture,
|
||||
time,
|
||||
]);
|
||||
|
||||
txid = results.first as String;
|
||||
|
||||
// save note
|
||||
await ref
|
||||
.read(notesServiceChangeNotifierProvider(walletId))
|
||||
|
|
|
@ -536,24 +536,34 @@ class _Step4ViewState extends ConsumerState<Step4View> {
|
|||
try {
|
||||
bool wasCancelled = false;
|
||||
|
||||
unawaited(showDialog<dynamic>(
|
||||
context: context,
|
||||
useSafeArea: false,
|
||||
barrierDismissible: false,
|
||||
builder: (context) {
|
||||
return BuildingTransactionDialog(
|
||||
onCancel: () {
|
||||
wasCancelled = true;
|
||||
unawaited(
|
||||
showDialog<dynamic>(
|
||||
context: context,
|
||||
useSafeArea: false,
|
||||
barrierDismissible: false,
|
||||
builder: (context) {
|
||||
return BuildingTransactionDialog(
|
||||
coin: manager.coin,
|
||||
onCancel: () {
|
||||
wasCancelled = true;
|
||||
|
||||
Navigator.of(context)
|
||||
.pop();
|
||||
},
|
||||
);
|
||||
},
|
||||
));
|
||||
Navigator.of(context)
|
||||
.pop();
|
||||
},
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
|
||||
final txData =
|
||||
await manager.prepareSend(
|
||||
final time =
|
||||
Future<dynamic>.delayed(
|
||||
const Duration(
|
||||
seconds: 3,
|
||||
),
|
||||
);
|
||||
|
||||
final txDataFuture =
|
||||
manager.prepareSend(
|
||||
address: address,
|
||||
satoshiAmount: amount,
|
||||
args: {
|
||||
|
@ -563,6 +573,15 @@ class _Step4ViewState extends ConsumerState<Step4View> {
|
|||
},
|
||||
);
|
||||
|
||||
final results =
|
||||
await Future.wait([
|
||||
txDataFuture,
|
||||
time,
|
||||
]);
|
||||
|
||||
final txData = results.last
|
||||
as Map<String, dynamic>;
|
||||
|
||||
if (!wasCancelled) {
|
||||
// pop building dialog
|
||||
|
||||
|
|
|
@ -240,6 +240,7 @@ class _SendFromCardState extends ConsumerState<SendFromCard> {
|
|||
),
|
||||
),
|
||||
child: BuildingTransactionDialog(
|
||||
coin: manager.coin,
|
||||
onCancel: () {
|
||||
wasCancelled = true;
|
||||
|
||||
|
@ -251,11 +252,18 @@ class _SendFromCardState extends ConsumerState<SendFromCard> {
|
|||
),
|
||||
);
|
||||
|
||||
late Map<String, dynamic> txData;
|
||||
final time = Future<dynamic>.delayed(
|
||||
const Duration(
|
||||
seconds: 3,
|
||||
),
|
||||
);
|
||||
|
||||
Map<String, dynamic> txData;
|
||||
Future<Map<String, dynamic>> txDataFuture;
|
||||
|
||||
// if not firo then do normal send
|
||||
if (shouldSendPublicFiroFunds == null) {
|
||||
txData = await manager.prepareSend(
|
||||
txDataFuture = manager.prepareSend(
|
||||
address: address,
|
||||
satoshiAmount: _amount,
|
||||
args: {
|
||||
|
@ -267,7 +275,7 @@ class _SendFromCardState extends ConsumerState<SendFromCard> {
|
|||
final firoWallet = manager.wallet as FiroWallet;
|
||||
// otherwise do firo send based on balance selected
|
||||
if (shouldSendPublicFiroFunds) {
|
||||
txData = await firoWallet.prepareSendPublic(
|
||||
txDataFuture = firoWallet.prepareSendPublic(
|
||||
address: address,
|
||||
satoshiAmount: _amount,
|
||||
args: {
|
||||
|
@ -276,7 +284,7 @@ class _SendFromCardState extends ConsumerState<SendFromCard> {
|
|||
},
|
||||
);
|
||||
} else {
|
||||
txData = await firoWallet.prepareSend(
|
||||
txDataFuture = firoWallet.prepareSend(
|
||||
address: address,
|
||||
satoshiAmount: _amount,
|
||||
args: {
|
||||
|
@ -287,6 +295,13 @@ class _SendFromCardState extends ConsumerState<SendFromCard> {
|
|||
}
|
||||
}
|
||||
|
||||
final results = await Future.wait([
|
||||
txDataFuture,
|
||||
time,
|
||||
]);
|
||||
|
||||
txData = results.first as Map<String, dynamic>;
|
||||
|
||||
if (!wasCancelled) {
|
||||
// pop building dialog
|
||||
|
||||
|
|
|
@ -74,40 +74,57 @@ class _ConfirmTransactionViewState
|
|||
late final TextEditingController noteController;
|
||||
|
||||
Future<void> _attemptSend(BuildContext context) async {
|
||||
final manager =
|
||||
ref.read(walletsChangeNotifierProvider).getManager(walletId);
|
||||
unawaited(
|
||||
showDialog<dynamic>(
|
||||
context: context,
|
||||
useSafeArea: false,
|
||||
barrierDismissible: false,
|
||||
builder: (context) {
|
||||
return const SendingTransactionDialog();
|
||||
return SendingTransactionDialog(
|
||||
coin: manager.coin,
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
|
||||
final time = Future<dynamic>.delayed(
|
||||
const Duration(
|
||||
seconds: 3,
|
||||
),
|
||||
);
|
||||
|
||||
late String txid;
|
||||
Future<String> txidFuture;
|
||||
|
||||
final note = noteController.text;
|
||||
final manager =
|
||||
ref.read(walletsChangeNotifierProvider).getManager(walletId);
|
||||
|
||||
try {
|
||||
String txid;
|
||||
if (widget.isPaynymNotificationTransaction) {
|
||||
txid = await (manager.wallet as PaynymWalletInterface)
|
||||
txidFuture = (manager.wallet as PaynymWalletInterface)
|
||||
.broadcastNotificationTx(preparedTx: transactionInfo);
|
||||
} else if (widget.isPaynymTransaction) {
|
||||
txid = await manager.confirmSend(txData: transactionInfo);
|
||||
txidFuture = manager.confirmSend(txData: transactionInfo);
|
||||
} else {
|
||||
final coin = manager.coin;
|
||||
if ((coin == Coin.firo || coin == Coin.firoTestNet) &&
|
||||
ref.read(publicPrivateBalanceStateProvider.state).state !=
|
||||
"Private") {
|
||||
txid = await (manager.wallet as FiroWallet)
|
||||
txidFuture = (manager.wallet as FiroWallet)
|
||||
.confirmSendPublic(txData: transactionInfo);
|
||||
} else {
|
||||
txid = await manager.confirmSend(txData: transactionInfo);
|
||||
txidFuture = manager.confirmSend(txData: transactionInfo);
|
||||
}
|
||||
}
|
||||
|
||||
final results = await Future.wait([
|
||||
txidFuture,
|
||||
time,
|
||||
]);
|
||||
|
||||
txid = results.first as String;
|
||||
|
||||
// save note
|
||||
await ref
|
||||
.read(notesServiceChangeNotifierProvider(walletId))
|
||||
|
|
|
@ -431,6 +431,7 @@ class _SendViewState extends ConsumerState<SendView> {
|
|||
barrierDismissible: false,
|
||||
builder: (context) {
|
||||
return BuildingTransactionDialog(
|
||||
coin: manager.coin,
|
||||
onCancel: () {
|
||||
wasCancelled = true;
|
||||
|
||||
|
@ -442,7 +443,14 @@ class _SendViewState extends ConsumerState<SendView> {
|
|||
);
|
||||
}
|
||||
|
||||
final time = Future<dynamic>.delayed(
|
||||
const Duration(
|
||||
seconds: 3,
|
||||
),
|
||||
);
|
||||
|
||||
Map<String, dynamic> txData;
|
||||
Future<Map<String, dynamic>> txDataFuture;
|
||||
|
||||
if (isPaynymSend) {
|
||||
final wallet = manager.wallet as PaynymWalletInterface;
|
||||
|
@ -451,7 +459,7 @@ class _SendViewState extends ConsumerState<SendView> {
|
|||
wallet.networkType,
|
||||
);
|
||||
final feeRate = ref.read(feeRateTypeStateProvider);
|
||||
txData = await wallet.preparePaymentCodeSend(
|
||||
txDataFuture = wallet.preparePaymentCodeSend(
|
||||
paymentCode: paymentCode,
|
||||
satoshiAmount: amount,
|
||||
args: {
|
||||
|
@ -466,13 +474,13 @@ class _SendViewState extends ConsumerState<SendView> {
|
|||
} else if ((coin == Coin.firo || coin == Coin.firoTestNet) &&
|
||||
ref.read(publicPrivateBalanceStateProvider.state).state !=
|
||||
"Private") {
|
||||
txData = await (manager.wallet as FiroWallet).prepareSendPublic(
|
||||
txDataFuture = (manager.wallet as FiroWallet).prepareSendPublic(
|
||||
address: _address!,
|
||||
satoshiAmount: amount,
|
||||
args: {"feeRate": ref.read(feeRateTypeStateProvider)},
|
||||
);
|
||||
} else {
|
||||
txData = await manager.prepareSend(
|
||||
txDataFuture = manager.prepareSend(
|
||||
address: _address!,
|
||||
satoshiAmount: amount,
|
||||
args: {
|
||||
|
@ -486,6 +494,13 @@ class _SendViewState extends ConsumerState<SendView> {
|
|||
);
|
||||
}
|
||||
|
||||
final results = await Future.wait([
|
||||
txDataFuture,
|
||||
time,
|
||||
]);
|
||||
|
||||
txData = results.first as Map<String, dynamic>;
|
||||
|
||||
if (!wasCancelled && mounted) {
|
||||
// pop building dialog
|
||||
Navigator.of(context).pop();
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
import 'package:lottie/lottie.dart';
|
||||
import 'package:stackwallet/utilities/assets.dart';
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||||
import 'package:stackwallet/utilities/text_styles.dart';
|
||||
import 'package:stackwallet/utilities/theme/stack_colors.dart';
|
||||
import 'package:stackwallet/utilities/util.dart';
|
||||
|
@ -11,41 +12,44 @@ class BuildingTransactionDialog extends StatefulWidget {
|
|||
const BuildingTransactionDialog({
|
||||
Key? key,
|
||||
required this.onCancel,
|
||||
required this.coin,
|
||||
}) : super(key: key);
|
||||
|
||||
final VoidCallback onCancel;
|
||||
final Coin coin;
|
||||
|
||||
@override
|
||||
State<BuildingTransactionDialog> createState() => _RestoringDialogState();
|
||||
}
|
||||
|
||||
class _RestoringDialogState extends State<BuildingTransactionDialog>
|
||||
with TickerProviderStateMixin {
|
||||
late AnimationController? _spinController;
|
||||
late Animation<double> _spinAnimation;
|
||||
class _RestoringDialogState extends State<BuildingTransactionDialog> {
|
||||
// with TickerProviderStateMixin {
|
||||
// late AnimationController? _spinController;
|
||||
// late Animation<double> _spinAnimation;
|
||||
|
||||
late final VoidCallback onCancel;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
onCancel = widget.onCancel;
|
||||
|
||||
_spinController = AnimationController(
|
||||
duration: const Duration(seconds: 2),
|
||||
vsync: this,
|
||||
)..repeat();
|
||||
|
||||
_spinAnimation = CurvedAnimation(
|
||||
parent: _spinController!,
|
||||
curve: Curves.linear,
|
||||
);
|
||||
// _spinController = AnimationController(
|
||||
// duration: const Duration(seconds: 2),
|
||||
// vsync: this,
|
||||
// )..repeat();
|
||||
//
|
||||
// _spinAnimation = CurvedAnimation(
|
||||
// parent: _spinController!,
|
||||
// curve: Curves.linear,
|
||||
// );
|
||||
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_spinController?.dispose();
|
||||
_spinController = null;
|
||||
// _spinController?.dispose();
|
||||
// _spinController = null;
|
||||
|
||||
super.dispose();
|
||||
}
|
||||
|
@ -63,16 +67,20 @@ class _RestoringDialogState extends State<BuildingTransactionDialog>
|
|||
const SizedBox(
|
||||
height: 40,
|
||||
),
|
||||
RotationTransition(
|
||||
turns: _spinAnimation,
|
||||
child: SvgPicture.asset(
|
||||
Assets.svg.arrowRotate,
|
||||
color:
|
||||
Theme.of(context).extension<StackColors>()!.accentColorDark,
|
||||
width: 24,
|
||||
height: 24,
|
||||
),
|
||||
|
||||
Lottie.asset(
|
||||
Assets.lottie.kiss(widget.coin),
|
||||
),
|
||||
// RotationTransition(
|
||||
// turns: _spinAnimation,
|
||||
// child: SvgPicture.asset(
|
||||
// Assets.svg.arrowRotate,
|
||||
// color:
|
||||
// Theme.of(context).extension<StackColors>()!.accentColorDark,
|
||||
// width: 24,
|
||||
// height: 24,
|
||||
// ),
|
||||
// ),
|
||||
const SizedBox(
|
||||
height: 40,
|
||||
),
|
||||
|
@ -90,34 +98,73 @@ class _RestoringDialogState extends State<BuildingTransactionDialog>
|
|||
onWillPop: () async {
|
||||
return false;
|
||||
},
|
||||
child: StackDialog(
|
||||
title: "Generating transaction",
|
||||
// // TODO get message from design team
|
||||
// message: "<PLACEHOLDER>",
|
||||
icon: RotationTransition(
|
||||
turns: _spinAnimation,
|
||||
child: SvgPicture.asset(
|
||||
Assets.svg.arrowRotate,
|
||||
color:
|
||||
Theme.of(context).extension<StackColors>()!.accentColorDark,
|
||||
width: 24,
|
||||
height: 24,
|
||||
),
|
||||
),
|
||||
rightButton: TextButton(
|
||||
style: Theme.of(context)
|
||||
.extension<StackColors>()!
|
||||
.getSecondaryEnabledButtonStyle(context),
|
||||
child: Text(
|
||||
"Cancel",
|
||||
style: STextStyles.itemSubtitle12(context),
|
||||
),
|
||||
onPressed: () {
|
||||
Navigator.of(context).pop();
|
||||
onCancel.call();
|
||||
},
|
||||
child: StackDialogBase(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Lottie.asset(
|
||||
Assets.lottie.kiss(widget.coin),
|
||||
),
|
||||
Text(
|
||||
"Generating transaction",
|
||||
textAlign: TextAlign.center,
|
||||
style: STextStyles.pageTitleH2(context),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 32,
|
||||
),
|
||||
Row(
|
||||
children: [
|
||||
const Spacer(),
|
||||
Expanded(
|
||||
child: TextButton(
|
||||
style: Theme.of(context)
|
||||
.extension<StackColors>()!
|
||||
.getSecondaryEnabledButtonStyle(context),
|
||||
child: Text(
|
||||
"Cancel",
|
||||
style: STextStyles.itemSubtitle12(context),
|
||||
),
|
||||
onPressed: () {
|
||||
Navigator.of(context).pop();
|
||||
onCancel.call();
|
||||
},
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
// child: StackDialog(
|
||||
// title: "Generating transaction",
|
||||
// // // TODO get message from design team
|
||||
// // message: "<PLACEHOLDER>",
|
||||
// icon: RotationTransition(
|
||||
// turns: _spinAnimation,
|
||||
// child: SvgPicture.asset(
|
||||
// Assets.svg.arrowRotate,
|
||||
// color:
|
||||
// Theme.of(context).extension<StackColors>()!.accentColorDark,
|
||||
// width: 24,
|
||||
// height: 24,
|
||||
// ),
|
||||
// ),
|
||||
// rightButton: TextButton(
|
||||
// style: Theme.of(context)
|
||||
// .extension<StackColors>()!
|
||||
// .getSecondaryEnabledButtonStyle(context),
|
||||
// child: Text(
|
||||
// "Cancel",
|
||||
// style: STextStyles.itemSubtitle12(context),
|
||||
// ),
|
||||
// onPressed: () {
|
||||
// Navigator.of(context).pop();
|
||||
// onCancel.call();
|
||||
// },
|
||||
// ),
|
||||
// ),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
import 'package:lottie/lottie.dart';
|
||||
import 'package:stackwallet/utilities/assets.dart';
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||||
import 'package:stackwallet/utilities/text_styles.dart';
|
||||
import 'package:stackwallet/utilities/theme/stack_colors.dart';
|
||||
import 'package:stackwallet/utilities/util.dart';
|
||||
import 'package:stackwallet/widgets/desktop/desktop_dialog.dart';
|
||||
import 'package:stackwallet/widgets/stack_dialog.dart';
|
||||
|
@ -10,36 +10,39 @@ import 'package:stackwallet/widgets/stack_dialog.dart';
|
|||
class SendingTransactionDialog extends StatefulWidget {
|
||||
const SendingTransactionDialog({
|
||||
Key? key,
|
||||
required this.coin,
|
||||
}) : super(key: key);
|
||||
|
||||
final Coin coin;
|
||||
|
||||
@override
|
||||
State<SendingTransactionDialog> createState() => _RestoringDialogState();
|
||||
}
|
||||
|
||||
class _RestoringDialogState extends State<SendingTransactionDialog>
|
||||
with TickerProviderStateMixin {
|
||||
late AnimationController? _spinController;
|
||||
late Animation<double> _spinAnimation;
|
||||
class _RestoringDialogState extends State<SendingTransactionDialog> {
|
||||
// with TickerProviderStateMixin {
|
||||
// late AnimationController? _spinController;
|
||||
// late Animation<double> _spinAnimation;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
_spinController = AnimationController(
|
||||
duration: const Duration(seconds: 2),
|
||||
vsync: this,
|
||||
)..repeat();
|
||||
|
||||
_spinAnimation = CurvedAnimation(
|
||||
parent: _spinController!,
|
||||
curve: Curves.linear,
|
||||
);
|
||||
// _spinController = AnimationController(
|
||||
// duration: const Duration(seconds: 2),
|
||||
// vsync: this,
|
||||
// )..repeat();
|
||||
//
|
||||
// _spinAnimation = CurvedAnimation(
|
||||
// parent: _spinController!,
|
||||
// curve: Curves.linear,
|
||||
// );
|
||||
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_spinController?.dispose();
|
||||
_spinController = null;
|
||||
// _spinController?.dispose();
|
||||
// _spinController = null;
|
||||
|
||||
super.dispose();
|
||||
}
|
||||
|
@ -60,17 +63,20 @@ class _RestoringDialogState extends State<SendingTransactionDialog>
|
|||
const SizedBox(
|
||||
height: 40,
|
||||
),
|
||||
RotationTransition(
|
||||
turns: _spinAnimation,
|
||||
child: SvgPicture.asset(
|
||||
Assets.svg.arrowRotate,
|
||||
color: Theme.of(context)
|
||||
.extension<StackColors>()!
|
||||
.accentColorDark,
|
||||
width: 24,
|
||||
height: 24,
|
||||
),
|
||||
Lottie.asset(
|
||||
Assets.lottie.kiss(widget.coin),
|
||||
),
|
||||
// RotationTransition(
|
||||
// turns: _spinAnimation,
|
||||
// child: SvgPicture.asset(
|
||||
// Assets.svg.arrowRotate,
|
||||
// color: Theme.of(context)
|
||||
// .extension<StackColors>()!
|
||||
// .accentColorDark,
|
||||
// width: 24,
|
||||
// height: 24,
|
||||
// ),
|
||||
// ),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
@ -80,21 +86,40 @@ class _RestoringDialogState extends State<SendingTransactionDialog>
|
|||
onWillPop: () async {
|
||||
return false;
|
||||
},
|
||||
child: StackDialog(
|
||||
title: "Sending transaction",
|
||||
// // TODO get message from design team
|
||||
// message: "<PLACEHOLDER>",
|
||||
icon: RotationTransition(
|
||||
turns: _spinAnimation,
|
||||
child: SvgPicture.asset(
|
||||
Assets.svg.arrowRotate,
|
||||
color:
|
||||
Theme.of(context).extension<StackColors>()!.accentColorDark,
|
||||
width: 24,
|
||||
height: 24,
|
||||
),
|
||||
child: StackDialogBase(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Lottie.asset(
|
||||
Assets.lottie.kiss(widget.coin),
|
||||
),
|
||||
Text(
|
||||
"Sending transaction",
|
||||
textAlign: TextAlign.center,
|
||||
style: STextStyles.pageTitleH2(context),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 32,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
// child: StackDialog(
|
||||
// title: "Sending transaction",
|
||||
// // // TODO get message from design team
|
||||
// // message: "<PLACEHOLDER>",
|
||||
// icon: RotationTransition(
|
||||
// turns: _spinAnimation,
|
||||
// child: SvgPicture.asset(
|
||||
// Assets.svg.arrowRotate,
|
||||
// color:
|
||||
// Theme.of(context).extension<StackColors>()!.accentColorDark,
|
||||
// width: 24,
|
||||
// height: 24,
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -57,11 +57,15 @@ class HiddenSettings extends StatelessWidget {
|
|||
.read(notificationsProvider)
|
||||
.delete(notifs[0], true);
|
||||
|
||||
unawaited(showFloatingFlushBar(
|
||||
type: FlushBarType.success,
|
||||
message: "Notification history deleted",
|
||||
context: context,
|
||||
));
|
||||
if (context.mounted) {
|
||||
unawaited(
|
||||
showFloatingFlushBar(
|
||||
type: FlushBarType.success,
|
||||
message: "Notification history deleted",
|
||||
context: context,
|
||||
),
|
||||
);
|
||||
}
|
||||
},
|
||||
child: RoundedWhiteContainer(
|
||||
child: Text(
|
||||
|
@ -112,11 +116,15 @@ class HiddenSettings extends StatelessWidget {
|
|||
.read(debugServiceProvider)
|
||||
.deleteAllLogs();
|
||||
|
||||
unawaited(showFloatingFlushBar(
|
||||
type: FlushBarType.success,
|
||||
message: "Debug Logs deleted",
|
||||
context: context,
|
||||
));
|
||||
if (context.mounted) {
|
||||
unawaited(
|
||||
showFloatingFlushBar(
|
||||
type: FlushBarType.success,
|
||||
message: "Debug Logs deleted",
|
||||
context: context,
|
||||
),
|
||||
);
|
||||
}
|
||||
},
|
||||
child: RoundedWhiteContainer(
|
||||
child: Text(
|
||||
|
@ -217,9 +225,9 @@ class HiddenSettings extends StatelessWidget {
|
|||
// builder: (_) {
|
||||
// return StackDialogBase(
|
||||
// child: SizedBox(
|
||||
// width: 200,
|
||||
// width: 300,
|
||||
// child: Lottie.asset(
|
||||
// Assets.lottie.test2,
|
||||
// Assets.lottie.plain(Coin.bitcoincash),
|
||||
// ),
|
||||
// ),
|
||||
// );
|
||||
|
@ -230,8 +238,9 @@ class HiddenSettings extends StatelessWidget {
|
|||
// child: Text(
|
||||
// "Lottie test",
|
||||
// style: STextStyles.button(context).copyWith(
|
||||
// color: Theme.of(context).extension<StackColors>()!.accentColorDark
|
||||
// ),
|
||||
// color: Theme.of(context)
|
||||
// .extension<StackColors>()!
|
||||
// .accentColorDark),
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
|
|
|
@ -61,7 +61,7 @@ class DesktopBuyIcon extends ConsumerWidget {
|
|||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
return SvgPicture.asset(
|
||||
Assets.svg.buyDesktop,
|
||||
Assets.svg.buy(context),
|
||||
width: 20,
|
||||
height: 20,
|
||||
color: DesktopMenuItemId.buy ==
|
||||
|
|
|
@ -219,29 +219,41 @@ class _DesktopSendState extends ConsumerState<DesktopSend> {
|
|||
try {
|
||||
bool wasCancelled = false;
|
||||
|
||||
unawaited(showDialog<dynamic>(
|
||||
context: context,
|
||||
useSafeArea: false,
|
||||
barrierDismissible: false,
|
||||
builder: (context) {
|
||||
return DesktopDialog(
|
||||
maxWidth: 400,
|
||||
maxHeight: double.infinity,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(32),
|
||||
child: BuildingTransactionDialog(
|
||||
onCancel: () {
|
||||
wasCancelled = true;
|
||||
if (mounted) {
|
||||
unawaited(
|
||||
showDialog<dynamic>(
|
||||
context: context,
|
||||
useSafeArea: false,
|
||||
barrierDismissible: false,
|
||||
builder: (context) {
|
||||
return DesktopDialog(
|
||||
maxWidth: 400,
|
||||
maxHeight: double.infinity,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(32),
|
||||
child: BuildingTransactionDialog(
|
||||
coin: manager.coin,
|
||||
onCancel: () {
|
||||
wasCancelled = true;
|
||||
|
||||
Navigator.of(context).pop();
|
||||
},
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
));
|
||||
Navigator.of(context).pop();
|
||||
},
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
final time = Future<dynamic>.delayed(
|
||||
const Duration(
|
||||
seconds: 3,
|
||||
),
|
||||
);
|
||||
|
||||
Map<String, dynamic> txData;
|
||||
Future<Map<String, dynamic>> txDataFuture;
|
||||
|
||||
if (isPaynymSend) {
|
||||
final wallet = manager.wallet as PaynymWalletInterface;
|
||||
|
@ -250,7 +262,7 @@ class _DesktopSendState extends ConsumerState<DesktopSend> {
|
|||
wallet.networkType,
|
||||
);
|
||||
final feeRate = ref.read(feeRateTypeStateProvider);
|
||||
txData = await wallet.preparePaymentCodeSend(
|
||||
txDataFuture = wallet.preparePaymentCodeSend(
|
||||
paymentCode: paymentCode,
|
||||
satoshiAmount: amount,
|
||||
args: {"feeRate": feeRate},
|
||||
|
@ -258,19 +270,26 @@ class _DesktopSendState extends ConsumerState<DesktopSend> {
|
|||
} else if ((coin == Coin.firo || coin == Coin.firoTestNet) &&
|
||||
ref.read(publicPrivateBalanceStateProvider.state).state !=
|
||||
"Private") {
|
||||
txData = await (manager.wallet as FiroWallet).prepareSendPublic(
|
||||
txDataFuture = (manager.wallet as FiroWallet).prepareSendPublic(
|
||||
address: _address!,
|
||||
satoshiAmount: amount,
|
||||
args: {"feeRate": ref.read(feeRateTypeStateProvider)},
|
||||
);
|
||||
} else {
|
||||
txData = await manager.prepareSend(
|
||||
txDataFuture = manager.prepareSend(
|
||||
address: _address!,
|
||||
satoshiAmount: amount,
|
||||
args: {"feeRate": ref.read(feeRateTypeStateProvider)},
|
||||
);
|
||||
}
|
||||
|
||||
final results = await Future.wait([
|
||||
txDataFuture,
|
||||
time,
|
||||
]);
|
||||
|
||||
txData = results.first as Map<String, dynamic>;
|
||||
|
||||
if (!wasCancelled && mounted) {
|
||||
if (isPaynymSend) {
|
||||
txData["paynymAccountLite"] = widget.accountLite!;
|
||||
|
|
|
@ -39,9 +39,6 @@ class _EXCHANGE {
|
|||
class _BUY {
|
||||
const _BUY();
|
||||
|
||||
String buy(BuildContext context) =>
|
||||
"assets/svg/${Theme.of(context).extension<StackColors>()!.themeType.name}/buy-coins-icon.svg";
|
||||
|
||||
String simplexLogo(BuildContext context) {
|
||||
switch (Theme.of(context).extension<StackColors>()!.themeType) {
|
||||
case ThemeType.dark:
|
||||
|
@ -223,7 +220,6 @@ class _SVG {
|
|||
String get anonymizeFailed => "assets/svg/tx-icon-anonymize-failed.svg";
|
||||
String get addressBookDesktop => "assets/svg/address-book-desktop.svg";
|
||||
String get exchangeDesktop => "assets/svg/exchange-desktop.svg";
|
||||
String get buyDesktop => "assets/svg/light/buy-coins-icon.svg";
|
||||
String get aboutDesktop => "assets/svg/about-desktop.svg";
|
||||
String get walletDesktop => "assets/svg/wallet-desktop.svg";
|
||||
String get exitDesktop => "assets/svg/exit-desktop.svg";
|
||||
|
@ -371,6 +367,13 @@ class _PNG {
|
|||
class _ANIMATIONS {
|
||||
const _ANIMATIONS();
|
||||
|
||||
String get test => "assets/lottie/test.json";
|
||||
String get test2 => "assets/lottie/test2.json";
|
||||
|
||||
String plain(Coin coin) {
|
||||
return "assets/lottie/coins/${coin.mainNetVersion.name}/plain.lottie.json";
|
||||
}
|
||||
|
||||
String kiss(Coin coin) {
|
||||
return "assets/lottie/coins/${coin.mainNetVersion.name}/kiss.lottie.json";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -218,6 +218,37 @@ extension CoinExt on Coin {
|
|||
}
|
||||
}
|
||||
|
||||
Coin get mainNetVersion {
|
||||
switch (this) {
|
||||
case Coin.bitcoin:
|
||||
case Coin.litecoin:
|
||||
case Coin.bitcoincash:
|
||||
case Coin.dogecoin:
|
||||
case Coin.firo:
|
||||
case Coin.namecoin:
|
||||
case Coin.particl:
|
||||
case Coin.epicCash:
|
||||
case Coin.monero:
|
||||
case Coin.wownero:
|
||||
return this;
|
||||
|
||||
case Coin.dogecoinTestNet:
|
||||
return Coin.dogecoin;
|
||||
|
||||
case Coin.bitcoinTestNet:
|
||||
return Coin.bitcoin;
|
||||
|
||||
case Coin.litecoinTestNet:
|
||||
return Coin.litecoin;
|
||||
|
||||
case Coin.bitcoincashTestnet:
|
||||
return Coin.bitcoincash;
|
||||
|
||||
case Coin.firoTestNet:
|
||||
return Coin.firo;
|
||||
}
|
||||
}
|
||||
|
||||
int get requiredConfirmations {
|
||||
switch (this) {
|
||||
case Coin.bitcoin:
|
||||
|
|
21
pubspec.yaml
21
pubspec.yaml
|
@ -320,9 +320,6 @@ flutter:
|
|||
# coin control icons
|
||||
- assets/svg/coin_control/
|
||||
|
||||
# lottie animations
|
||||
- assets/lottie/test.json
|
||||
- assets/lottie/test2.json
|
||||
# socials
|
||||
- assets/svg/socials/
|
||||
|
||||
|
@ -358,6 +355,24 @@ flutter:
|
|||
# buy
|
||||
- assets/svg/buy/
|
||||
|
||||
|
||||
# lottie animations
|
||||
# basic
|
||||
- assets/lottie/test2.json
|
||||
|
||||
# coin animations
|
||||
- assets/lottie/coins/bitcoin/
|
||||
- assets/lottie/coins/bitcoincash/
|
||||
- assets/lottie/coins/dogecoin/
|
||||
- assets/lottie/coins/epiccash/
|
||||
- assets/lottie/coins/ethereum/
|
||||
- assets/lottie/coins/firo/
|
||||
- assets/lottie/coins/litecoin/
|
||||
- assets/lottie/coins/monero/
|
||||
- assets/lottie/coins/namecoin/
|
||||
- assets/lottie/coins/particl/
|
||||
- assets/lottie/coins/wownero/
|
||||
|
||||
# An image asset can refer to one or more resolution-specific "variants", see
|
||||
# https://flutter.dev/assets-and-images/#resolution-aware.
|
||||
# For details regarding adding assets from package dependencies, see
|
||||
|
|
Loading…
Reference in a new issue