mirror of
https://github.com/cypherstack/stack_wallet.git
synced 2025-01-30 14:15:52 +00:00
extract exchange form from view
This commit is contained in:
parent
6d93991460
commit
6b21078cc8
5 changed files with 1551 additions and 1391 deletions
1210
lib/pages/exchange_view/exchange_form.dart
Normal file
1210
lib/pages/exchange_view/exchange_form.dart
Normal file
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -0,0 +1,203 @@
|
||||||
|
import 'package:decimal/decimal.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||||
|
import 'package:flutter_svg/svg.dart';
|
||||||
|
import 'package:stackwallet/services/exchange/change_now/change_now_exchange.dart';
|
||||||
|
import 'package:stackwallet/services/exchange/exchange.dart';
|
||||||
|
import 'package:stackwallet/services/exchange/simpleswap/simpleswap_exchange.dart';
|
||||||
|
import 'package:stackwallet/utilities/assets.dart';
|
||||||
|
import 'package:stackwallet/utilities/logger.dart';
|
||||||
|
import 'package:stackwallet/utilities/text_styles.dart';
|
||||||
|
import 'package:stackwallet/utilities/theme/stack_colors.dart';
|
||||||
|
import 'package:stackwallet/widgets/rounded_white_container.dart';
|
||||||
|
|
||||||
|
final currentExchangeNameStateProvider =
|
||||||
|
StateProvider<String>((ref) => ChangeNowExchange.exchangeName);
|
||||||
|
|
||||||
|
final exchangeProvider = Provider<Exchange>((ref) {
|
||||||
|
switch (ref.watch(currentExchangeNameStateProvider.state).state) {
|
||||||
|
case ChangeNowExchange.exchangeName:
|
||||||
|
return ChangeNowExchange();
|
||||||
|
case SimpleSwapExchange.exchangeName:
|
||||||
|
return SimpleSwapExchange();
|
||||||
|
default:
|
||||||
|
const errorMessage =
|
||||||
|
"Attempted to access exchangeProvider with invalid exchange name!";
|
||||||
|
Logging.instance.log(errorMessage, level: LogLevel.Fatal);
|
||||||
|
throw Exception(errorMessage);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
class ExchangeProviderOptions extends ConsumerWidget {
|
||||||
|
const ExchangeProviderOptions({
|
||||||
|
Key? key,
|
||||||
|
required this.fromAmount,
|
||||||
|
required this.toAmount,
|
||||||
|
required this.fixedRate,
|
||||||
|
required this.reversed,
|
||||||
|
}) : super(key: key);
|
||||||
|
|
||||||
|
final Decimal? fromAmount;
|
||||||
|
final Decimal? toAmount;
|
||||||
|
final bool fixedRate;
|
||||||
|
final bool reversed;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context, WidgetRef ref) {
|
||||||
|
return RoundedWhiteContainer(
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
GestureDetector(
|
||||||
|
onTap: () {
|
||||||
|
if (ref.read(currentExchangeNameStateProvider.state).state !=
|
||||||
|
ChangeNowExchange.exchangeName) {
|
||||||
|
ref.read(currentExchangeNameStateProvider.state).state =
|
||||||
|
ChangeNowExchange.exchangeName;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
child: Container(
|
||||||
|
color: Colors.transparent,
|
||||||
|
child: Row(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
SizedBox(
|
||||||
|
width: 20,
|
||||||
|
height: 20,
|
||||||
|
child: Radio(
|
||||||
|
activeColor: Theme.of(context)
|
||||||
|
.extension<StackColors>()!
|
||||||
|
.radioButtonIconEnabled,
|
||||||
|
value: ChangeNowExchange.exchangeName,
|
||||||
|
groupValue: ref
|
||||||
|
.watch(currentExchangeNameStateProvider.state)
|
||||||
|
.state,
|
||||||
|
onChanged: (value) {
|
||||||
|
if (value is String) {
|
||||||
|
ref
|
||||||
|
.read(currentExchangeNameStateProvider.state)
|
||||||
|
.state = value;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
width: 14,
|
||||||
|
),
|
||||||
|
SvgPicture.asset(
|
||||||
|
Assets.exchange.changeNow,
|
||||||
|
width: 24,
|
||||||
|
height: 24,
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
width: 10,
|
||||||
|
),
|
||||||
|
Expanded(
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.start,
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
ChangeNowExchange.exchangeName,
|
||||||
|
style: STextStyles.titleBold12(context).copyWith(
|
||||||
|
color: Theme.of(context)
|
||||||
|
.extension<StackColors>()!
|
||||||
|
.textDark2,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
ChangeNowExchange.exchangeName,
|
||||||
|
style: STextStyles.itemSubtitle12(context).copyWith(
|
||||||
|
color: Theme.of(context)
|
||||||
|
.extension<StackColors>()!
|
||||||
|
.textSubtitle1,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
height: 16,
|
||||||
|
),
|
||||||
|
GestureDetector(
|
||||||
|
onTap: () {
|
||||||
|
if (ref.read(currentExchangeNameStateProvider.state).state !=
|
||||||
|
SimpleSwapExchange.exchangeName) {
|
||||||
|
ref.read(currentExchangeNameStateProvider.state).state =
|
||||||
|
SimpleSwapExchange.exchangeName;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
child: Container(
|
||||||
|
color: Colors.transparent,
|
||||||
|
child: Row(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
SizedBox(
|
||||||
|
width: 20,
|
||||||
|
height: 20,
|
||||||
|
child: Radio(
|
||||||
|
activeColor: Theme.of(context)
|
||||||
|
.extension<StackColors>()!
|
||||||
|
.radioButtonIconEnabled,
|
||||||
|
value: SimpleSwapExchange.exchangeName,
|
||||||
|
groupValue: ref
|
||||||
|
.watch(currentExchangeNameStateProvider.state)
|
||||||
|
.state,
|
||||||
|
onChanged: (value) {
|
||||||
|
if (value is String) {
|
||||||
|
ref
|
||||||
|
.read(currentExchangeNameStateProvider.state)
|
||||||
|
.state = value;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
width: 14,
|
||||||
|
),
|
||||||
|
SvgPicture.asset(
|
||||||
|
Assets.exchange.simpleSwap,
|
||||||
|
width: 24,
|
||||||
|
height: 24,
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
width: 10,
|
||||||
|
),
|
||||||
|
Expanded(
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.start,
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
SimpleSwapExchange.exchangeName,
|
||||||
|
style: STextStyles.titleBold12(context).copyWith(
|
||||||
|
color: Theme.of(context)
|
||||||
|
.extension<StackColors>()!
|
||||||
|
.textDark2,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
SimpleSwapExchange.exchangeName,
|
||||||
|
style: STextStyles.itemSubtitle12(context).copyWith(
|
||||||
|
color: Theme.of(context)
|
||||||
|
.extension<StackColors>()!
|
||||||
|
.textSubtitle1,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
132
lib/pages/exchange_view/sub_widgets/rate_type_toggle.dart
Normal file
132
lib/pages/exchange_view/sub_widgets/rate_type_toggle.dart
Normal file
|
@ -0,0 +1,132 @@
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||||
|
import 'package:flutter_svg/flutter_svg.dart';
|
||||||
|
import 'package:flutter_svg/svg.dart';
|
||||||
|
import 'package:stackwallet/pages/exchange_view/sub_widgets/exchange_rate_sheet.dart';
|
||||||
|
import 'package:stackwallet/providers/providers.dart';
|
||||||
|
import 'package:stackwallet/utilities/assets.dart';
|
||||||
|
import 'package:stackwallet/utilities/text_styles.dart';
|
||||||
|
import 'package:stackwallet/utilities/theme/stack_colors.dart';
|
||||||
|
import 'package:stackwallet/widgets/rounded_container.dart';
|
||||||
|
import 'package:stackwallet/widgets/rounded_white_container.dart';
|
||||||
|
|
||||||
|
class RateTypeToggle extends ConsumerWidget {
|
||||||
|
const RateTypeToggle({
|
||||||
|
Key? key,
|
||||||
|
this.onChanged,
|
||||||
|
}) : super(key: key);
|
||||||
|
|
||||||
|
final void Function(ExchangeRateType)? onChanged;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context, WidgetRef ref) {
|
||||||
|
debugPrint("BUILD: $runtimeType");
|
||||||
|
final estimated = ref.watch(prefsChangeNotifierProvider
|
||||||
|
.select((value) => value.exchangeRateType)) ==
|
||||||
|
ExchangeRateType.estimated;
|
||||||
|
|
||||||
|
return RoundedWhiteContainer(
|
||||||
|
padding: const EdgeInsets.all(0),
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: GestureDetector(
|
||||||
|
onTap: () {
|
||||||
|
if (!estimated) {
|
||||||
|
ref.read(prefsChangeNotifierProvider).exchangeRateType =
|
||||||
|
ExchangeRateType.estimated;
|
||||||
|
onChanged?.call(ExchangeRateType.estimated);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
child: RoundedContainer(
|
||||||
|
color: estimated
|
||||||
|
? Theme.of(context)
|
||||||
|
.extension<StackColors>()!
|
||||||
|
.textFieldDefaultBG
|
||||||
|
: Colors.transparent,
|
||||||
|
child: Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
SvgPicture.asset(
|
||||||
|
Assets.svg.lock,
|
||||||
|
width: 12,
|
||||||
|
height: 14,
|
||||||
|
color: estimated
|
||||||
|
? Theme.of(context).extension<StackColors>()!.textDark
|
||||||
|
: Theme.of(context)
|
||||||
|
.extension<StackColors>()!
|
||||||
|
.textSubtitle1,
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
width: 5,
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
"Estimate rate",
|
||||||
|
style: STextStyles.smallMed12(context).copyWith(
|
||||||
|
color: estimated
|
||||||
|
? Theme.of(context)
|
||||||
|
.extension<StackColors>()!
|
||||||
|
.textDark
|
||||||
|
: Theme.of(context)
|
||||||
|
.extension<StackColors>()!
|
||||||
|
.textSubtitle1,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Expanded(
|
||||||
|
child: GestureDetector(
|
||||||
|
onTap: () {
|
||||||
|
if (estimated) {
|
||||||
|
ref.read(prefsChangeNotifierProvider).exchangeRateType =
|
||||||
|
ExchangeRateType.fixed;
|
||||||
|
onChanged?.call(ExchangeRateType.fixed);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
child: RoundedContainer(
|
||||||
|
color: !estimated
|
||||||
|
? Theme.of(context)
|
||||||
|
.extension<StackColors>()!
|
||||||
|
.textFieldDefaultBG
|
||||||
|
: Colors.transparent,
|
||||||
|
child: Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
SvgPicture.asset(
|
||||||
|
Assets.svg.lock,
|
||||||
|
width: 12,
|
||||||
|
height: 14,
|
||||||
|
color: !estimated
|
||||||
|
? Theme.of(context).extension<StackColors>()!.textDark
|
||||||
|
: Theme.of(context)
|
||||||
|
.extension<StackColors>()!
|
||||||
|
.textSubtitle1,
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
width: 5,
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
"Fixed rate",
|
||||||
|
style: STextStyles.smallMed12(context).copyWith(
|
||||||
|
color: !estimated
|
||||||
|
? Theme.of(context)
|
||||||
|
.extension<StackColors>()!
|
||||||
|
.textDark
|
||||||
|
: Theme.of(context)
|
||||||
|
.extension<StackColors>()!
|
||||||
|
.textSubtitle1,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -60,9 +60,6 @@ class _WalletInitiatedExchangeViewState
|
||||||
late final TextEditingController _sendController;
|
late final TextEditingController _sendController;
|
||||||
late final TextEditingController _receiveController;
|
late final TextEditingController _receiveController;
|
||||||
|
|
||||||
String calcSend = "";
|
|
||||||
String calcReceive = "";
|
|
||||||
|
|
||||||
final FocusNode _sendFocusNode = FocusNode();
|
final FocusNode _sendFocusNode = FocusNode();
|
||||||
final FocusNode _receiveFocusNode = FocusNode();
|
final FocusNode _receiveFocusNode = FocusNode();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue