2023-05-14 03:24:42 +00:00
|
|
|
import 'dart:io';
|
|
|
|
|
2022-08-26 08:11:35 +00:00
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
import 'package:flutter/services.dart';
|
|
|
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
|
|
import 'package:flutter_svg/svg.dart';
|
|
|
|
import 'package:stackwallet/models/send_view_auto_fill_data.dart';
|
|
|
|
import 'package:stackwallet/notifications/show_flush_bar.dart';
|
|
|
|
import 'package:stackwallet/pages/address_book_views/subviews/contact_details_view.dart';
|
2022-09-30 16:34:25 +00:00
|
|
|
import 'package:stackwallet/pages/exchange_view/exchange_step_views/step_2_view.dart';
|
2022-08-26 08:11:35 +00:00
|
|
|
import 'package:stackwallet/pages/send_view/send_view.dart';
|
|
|
|
import 'package:stackwallet/providers/global/address_book_service_provider.dart';
|
|
|
|
import 'package:stackwallet/providers/providers.dart';
|
2023-05-09 15:21:04 +00:00
|
|
|
import 'package:stackwallet/themes/coin_icon_provider.dart';
|
2023-05-14 03:24:42 +00:00
|
|
|
import 'package:stackwallet/themes/stack_colors.dart';
|
2023-04-25 22:07:28 +00:00
|
|
|
import 'package:stackwallet/themes/theme_providers.dart';
|
2022-08-26 08:11:35 +00:00
|
|
|
import 'package:stackwallet/utilities/assets.dart';
|
|
|
|
import 'package:stackwallet/utilities/clipboard_interface.dart';
|
|
|
|
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
|
|
|
import 'package:stackwallet/utilities/text_styles.dart';
|
|
|
|
import 'package:stackwallet/widgets/rounded_container.dart';
|
|
|
|
import 'package:stackwallet/widgets/rounded_white_container.dart';
|
|
|
|
import 'package:tuple/tuple.dart';
|
|
|
|
|
2022-09-30 16:34:25 +00:00
|
|
|
final exchangeFromAddressBookAddressStateProvider =
|
|
|
|
StateProvider<String>((ref) => "");
|
|
|
|
|
2022-08-26 08:11:35 +00:00
|
|
|
class ContactPopUp extends ConsumerWidget {
|
|
|
|
const ContactPopUp({
|
|
|
|
Key? key,
|
|
|
|
required this.contactId,
|
|
|
|
this.clipboard = const ClipboardWrapper(),
|
|
|
|
}) : super(key: key);
|
|
|
|
|
|
|
|
final String contactId;
|
|
|
|
final ClipboardInterface clipboard;
|
|
|
|
|
|
|
|
@override
|
|
|
|
Widget build(BuildContext context, WidgetRef ref) {
|
|
|
|
final maxHeight = MediaQuery.of(context).size.height * 0.6;
|
|
|
|
final contact = ref.watch(addressBookServiceProvider
|
|
|
|
.select((value) => value.getContactById(contactId)));
|
|
|
|
|
|
|
|
final active = ref
|
|
|
|
.read(walletsChangeNotifierProvider)
|
|
|
|
.managers
|
|
|
|
.where((e) => e.isActiveWallet)
|
|
|
|
.toList(growable: false);
|
|
|
|
|
|
|
|
assert(active.isEmpty || active.length == 1);
|
|
|
|
|
|
|
|
bool hasActiveWallet = active.length == 1;
|
|
|
|
bool isExchangeFlow =
|
|
|
|
ref.watch(exchangeFlowIsActiveStateProvider.state).state;
|
|
|
|
|
|
|
|
final addresses = contact.addresses.where((e) {
|
|
|
|
if (hasActiveWallet && !isExchangeFlow) {
|
|
|
|
return e.coin == active[0].coin;
|
|
|
|
} else {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}).toList(growable: false);
|
|
|
|
|
|
|
|
return Column(
|
|
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
|
|
children: [
|
|
|
|
Padding(
|
|
|
|
padding: const EdgeInsets.symmetric(horizontal: 16),
|
|
|
|
child: LimitedBox(
|
|
|
|
maxHeight: maxHeight,
|
|
|
|
child: Column(
|
|
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
|
|
children: [
|
|
|
|
Material(
|
|
|
|
borderRadius: BorderRadius.circular(
|
|
|
|
20,
|
|
|
|
),
|
|
|
|
child: Container(
|
|
|
|
decoration: BoxDecoration(
|
2022-09-22 23:48:50 +00:00
|
|
|
color:
|
|
|
|
Theme.of(context).extension<StackColors>()!.popupBG,
|
2022-08-26 08:11:35 +00:00
|
|
|
borderRadius: BorderRadius.circular(
|
|
|
|
20,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
child: LimitedBox(
|
|
|
|
maxHeight: maxHeight,
|
|
|
|
child: ClipRRect(
|
|
|
|
borderRadius: BorderRadius.circular(
|
|
|
|
20,
|
|
|
|
),
|
|
|
|
child: SingleChildScrollView(
|
|
|
|
child: Column(
|
|
|
|
// spacing: 10,
|
|
|
|
children: [
|
|
|
|
const SizedBox(
|
|
|
|
height: 24,
|
|
|
|
),
|
|
|
|
Padding(
|
|
|
|
padding:
|
|
|
|
const EdgeInsets.symmetric(horizontal: 24),
|
|
|
|
child: Row(
|
|
|
|
children: [
|
|
|
|
Container(
|
|
|
|
width: 32,
|
|
|
|
height: 32,
|
|
|
|
decoration: BoxDecoration(
|
2022-09-22 23:48:50 +00:00
|
|
|
color: Theme.of(context)
|
|
|
|
.extension<StackColors>()!
|
|
|
|
.textFieldDefaultBG,
|
2022-08-26 08:11:35 +00:00
|
|
|
borderRadius: BorderRadius.circular(32),
|
|
|
|
),
|
|
|
|
child: contact.id == "default"
|
|
|
|
? Center(
|
2023-05-14 03:24:42 +00:00
|
|
|
child: SvgPicture.file(
|
|
|
|
File(
|
|
|
|
ref.watch(
|
|
|
|
themeProvider.select(
|
|
|
|
(value) => value
|
|
|
|
.assets.stackIcon,
|
|
|
|
),
|
2023-04-25 22:07:28 +00:00
|
|
|
),
|
|
|
|
),
|
2022-08-26 08:11:35 +00:00
|
|
|
width: 20,
|
|
|
|
),
|
|
|
|
)
|
|
|
|
: contact.emojiChar != null
|
|
|
|
? Center(
|
|
|
|
child:
|
|
|
|
Text(contact.emojiChar!),
|
|
|
|
)
|
|
|
|
: Center(
|
|
|
|
child: SvgPicture.asset(
|
|
|
|
Assets.svg.user,
|
|
|
|
width: 18,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
const SizedBox(
|
|
|
|
width: 12,
|
|
|
|
),
|
|
|
|
Expanded(
|
|
|
|
child: Text(
|
|
|
|
contact.name,
|
2022-09-22 22:17:21 +00:00
|
|
|
style:
|
|
|
|
STextStyles.itemSubtitle12(context),
|
2022-08-26 08:11:35 +00:00
|
|
|
),
|
|
|
|
),
|
|
|
|
if (contact.id != "default")
|
|
|
|
TextButton(
|
|
|
|
onPressed: () {
|
|
|
|
Navigator.pop(context);
|
|
|
|
Navigator.of(context).pushNamed(
|
|
|
|
ContactDetailsView.routeName,
|
|
|
|
arguments: contact.id,
|
|
|
|
);
|
|
|
|
},
|
2022-09-22 23:48:50 +00:00
|
|
|
style: Theme.of(context)
|
|
|
|
.extension<StackColors>()!
|
2023-01-24 19:29:12 +00:00
|
|
|
.getSecondaryEnabledButtonStyle(
|
2022-09-21 00:46:07 +00:00
|
|
|
context)!
|
|
|
|
.copyWith(
|
|
|
|
minimumSize:
|
|
|
|
MaterialStateProperty.all<
|
|
|
|
Size>(const Size(46, 32)),
|
|
|
|
),
|
2022-08-26 08:11:35 +00:00
|
|
|
child: Padding(
|
|
|
|
padding: const EdgeInsets.symmetric(
|
|
|
|
horizontal: 18),
|
|
|
|
child: Text("Details",
|
2022-09-22 22:17:21 +00:00
|
|
|
style: STextStyles.buttonSmall(
|
|
|
|
context)),
|
2022-08-26 08:11:35 +00:00
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
SizedBox(
|
|
|
|
height: contact.id == "default" ? 16 : 8,
|
|
|
|
),
|
|
|
|
Container(
|
|
|
|
height: 1,
|
2022-09-22 23:48:50 +00:00
|
|
|
color: Theme.of(context)
|
|
|
|
.extension<StackColors>()!
|
|
|
|
.background,
|
2022-08-26 08:11:35 +00:00
|
|
|
),
|
|
|
|
if (addresses.isEmpty)
|
|
|
|
Padding(
|
|
|
|
padding: const EdgeInsets.symmetric(
|
|
|
|
horizontal: 20),
|
|
|
|
child: RoundedWhiteContainer(
|
|
|
|
child: Center(
|
|
|
|
child: Text(
|
|
|
|
"No ${active[0].coin.prettyName} addresses found",
|
2022-09-22 22:17:21 +00:00
|
|
|
style:
|
|
|
|
STextStyles.itemSubtitle(context),
|
2022-08-26 08:11:35 +00:00
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
...addresses.map(
|
|
|
|
(e) => Padding(
|
|
|
|
padding: const EdgeInsets.only(
|
|
|
|
top: 12,
|
|
|
|
bottom: 12,
|
|
|
|
left: 28,
|
|
|
|
right: 24,
|
|
|
|
),
|
|
|
|
child: Row(
|
|
|
|
crossAxisAlignment:
|
|
|
|
CrossAxisAlignment.start,
|
|
|
|
children: [
|
|
|
|
Column(
|
|
|
|
children: [
|
|
|
|
const SizedBox(
|
|
|
|
height: 2,
|
|
|
|
),
|
2023-05-14 03:24:42 +00:00
|
|
|
SvgPicture.file(
|
|
|
|
File(
|
|
|
|
ref.watch(
|
|
|
|
coinIconProvider(e.coin),
|
|
|
|
),
|
2023-05-09 15:21:04 +00:00
|
|
|
),
|
2022-08-26 08:11:35 +00:00
|
|
|
height: 24,
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
const SizedBox(
|
|
|
|
width: 12,
|
|
|
|
),
|
|
|
|
Expanded(
|
|
|
|
child: Column(
|
|
|
|
crossAxisAlignment:
|
|
|
|
CrossAxisAlignment.start,
|
|
|
|
children: [
|
2022-09-14 16:38:49 +00:00
|
|
|
if (contact.id == "default")
|
|
|
|
Text(
|
|
|
|
e.other!,
|
|
|
|
style:
|
2022-09-22 22:17:21 +00:00
|
|
|
STextStyles.itemSubtitle12(
|
|
|
|
context),
|
2022-09-14 16:38:49 +00:00
|
|
|
),
|
2022-09-18 14:33:49 +00:00
|
|
|
if (contact.id != "default")
|
|
|
|
Text(
|
|
|
|
"${e.label} (${e.coin.ticker})",
|
|
|
|
style:
|
2022-09-22 22:17:21 +00:00
|
|
|
STextStyles.itemSubtitle12(
|
|
|
|
context),
|
2022-09-14 16:38:49 +00:00
|
|
|
),
|
2022-08-26 08:11:35 +00:00
|
|
|
const SizedBox(
|
|
|
|
height: 2,
|
|
|
|
),
|
|
|
|
Text(
|
|
|
|
e.address,
|
2022-09-22 22:17:21 +00:00
|
|
|
style: STextStyles.itemSubtitle(
|
|
|
|
context)
|
2022-08-26 08:11:35 +00:00
|
|
|
.copyWith(
|
|
|
|
fontSize: 8,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
const SizedBox(
|
|
|
|
width: 10,
|
|
|
|
),
|
|
|
|
Column(
|
|
|
|
children: [
|
|
|
|
const SizedBox(
|
|
|
|
height: 2,
|
|
|
|
),
|
|
|
|
GestureDetector(
|
|
|
|
onTap: () {
|
|
|
|
clipboard.setData(
|
|
|
|
ClipboardData(text: e.address),
|
|
|
|
);
|
|
|
|
showFloatingFlushBar(
|
|
|
|
type: FlushBarType.info,
|
|
|
|
message: "Copied to clipboard",
|
|
|
|
iconAsset: Assets.svg.copy,
|
|
|
|
context: context,
|
|
|
|
);
|
|
|
|
},
|
|
|
|
child: RoundedContainer(
|
2022-09-22 23:48:50 +00:00
|
|
|
color: Theme.of(context)
|
|
|
|
.extension<StackColors>()!
|
2022-09-21 00:46:07 +00:00
|
|
|
.textFieldDefaultBG,
|
2022-09-29 18:15:09 +00:00
|
|
|
padding: const EdgeInsets.all(6),
|
2022-08-26 08:11:35 +00:00
|
|
|
child: SvgPicture.asset(
|
2022-09-21 21:59:52 +00:00
|
|
|
Assets.svg.copy,
|
2022-09-29 18:15:09 +00:00
|
|
|
width: 16,
|
|
|
|
height: 16,
|
2022-09-22 23:48:50 +00:00
|
|
|
color: Theme.of(context)
|
|
|
|
.extension<StackColors>()!
|
|
|
|
.accentColorDark),
|
2022-08-26 08:11:35 +00:00
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
2022-09-30 16:34:25 +00:00
|
|
|
if (isExchangeFlow)
|
|
|
|
const SizedBox(
|
|
|
|
width: 6,
|
|
|
|
),
|
|
|
|
if (isExchangeFlow)
|
|
|
|
Column(
|
|
|
|
children: [
|
|
|
|
const SizedBox(
|
|
|
|
height: 2,
|
|
|
|
),
|
|
|
|
GestureDetector(
|
|
|
|
onTap: () {
|
|
|
|
ref
|
|
|
|
.read(
|
|
|
|
exchangeFromAddressBookAddressStateProvider
|
|
|
|
.state)
|
|
|
|
.state = e.address;
|
|
|
|
Navigator.of(context).popUntil(
|
|
|
|
ModalRoute.withName(
|
|
|
|
Step2View.routeName));
|
|
|
|
},
|
|
|
|
child: RoundedContainer(
|
|
|
|
color: Theme.of(context)
|
|
|
|
.extension<StackColors>()!
|
|
|
|
.textFieldDefaultBG,
|
|
|
|
padding:
|
|
|
|
const EdgeInsets.all(6),
|
|
|
|
child: SvgPicture.asset(
|
|
|
|
Assets.svg.chevronRight,
|
|
|
|
width: 16,
|
|
|
|
height: 16,
|
|
|
|
color: Theme.of(context)
|
|
|
|
.extension<
|
|
|
|
StackColors>()!
|
|
|
|
.accentColorDark),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
2022-08-26 08:11:35 +00:00
|
|
|
if (contact.id != "default" &&
|
|
|
|
hasActiveWallet &&
|
|
|
|
!isExchangeFlow)
|
|
|
|
const SizedBox(
|
|
|
|
width: 4,
|
|
|
|
),
|
|
|
|
if (contact.id != "default" &&
|
|
|
|
hasActiveWallet &&
|
|
|
|
!isExchangeFlow)
|
|
|
|
Column(
|
|
|
|
children: [
|
|
|
|
const SizedBox(
|
|
|
|
height: 2,
|
|
|
|
),
|
|
|
|
GestureDetector(
|
|
|
|
onTap: () {
|
|
|
|
final String contactLabel =
|
|
|
|
"${contact.name} (${e.label})";
|
|
|
|
final String address =
|
|
|
|
e.address;
|
|
|
|
|
|
|
|
if (hasActiveWallet) {
|
|
|
|
Navigator.of(context)
|
|
|
|
.pushNamed(
|
|
|
|
SendView.routeName,
|
|
|
|
arguments: Tuple3(
|
|
|
|
active[0].walletId,
|
|
|
|
active[0].coin,
|
|
|
|
SendViewAutoFillData(
|
|
|
|
address: address,
|
|
|
|
contactLabel:
|
|
|
|
contactLabel,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
child: RoundedContainer(
|
2022-09-22 23:48:50 +00:00
|
|
|
color: Theme.of(context)
|
|
|
|
.extension<StackColors>()!
|
2022-09-21 00:46:07 +00:00
|
|
|
.textFieldDefaultBG,
|
2022-08-26 08:11:35 +00:00
|
|
|
padding:
|
|
|
|
const EdgeInsets.all(4),
|
|
|
|
child: SvgPicture.asset(
|
2022-09-21 21:59:52 +00:00
|
|
|
Assets
|
|
|
|
.svg.circleArrowUpRight,
|
|
|
|
width: 12,
|
|
|
|
height: 12,
|
2022-09-22 23:48:50 +00:00
|
|
|
color: Theme.of(context)
|
|
|
|
.extension<
|
|
|
|
StackColors>()!
|
|
|
|
.accentColorDark),
|
2022-08-26 08:11:35 +00:00
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
const SizedBox(
|
|
|
|
height: 12,
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|