mirror of
https://github.com/cake-tech/cake_wallet.git
synced 2025-04-27 11:04:45 +00:00
fix multi recipient address formatting
This commit is contained in:
parent
3c9234a041
commit
0cdc90c2ad
2 changed files with 95 additions and 54 deletions
lib
|
@ -13,6 +13,7 @@ import 'package:cake_wallet/themes/extensions/cake_text_theme.dart';
|
|||
import 'package:cake_wallet/utils/address_formatter.dart';
|
||||
import 'package:cake_wallet/utils/show_bar.dart';
|
||||
import 'package:cake_wallet/view_model/transaction_details_view_model.dart';
|
||||
import 'package:cw_core/wallet_type.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_mobx/flutter_mobx.dart';
|
||||
|
@ -45,61 +46,25 @@ class TransactionDetailsPage extends BasePage {
|
|||
|
||||
if (item.title.toLowerCase() == 'recipient addresses' ||
|
||||
item.title.toLowerCase() == 'source address') {
|
||||
if (item.value.contains('\n')) {
|
||||
final parts = item.value.split('\n');
|
||||
|
||||
final nonFormattedPart = parts.sublist(0, parts.length - 1).join('\n').trim();
|
||||
|
||||
final extractedAddress = parts.last.trim();
|
||||
|
||||
addressTextWidget = Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
nonFormattedPart,
|
||||
style: TextStyle(
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.w500,
|
||||
color: Theme.of(context).extension<CakeTextTheme>()!.titleColor,
|
||||
),
|
||||
),
|
||||
// Display the formatted segmented address.
|
||||
AddressFormatter.buildSegmentedAddress(
|
||||
address: extractedAddress,
|
||||
walletType: transactionDetailsViewModel.sendViewModel.walletType,
|
||||
evenTextStyle: TextStyle(
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.w500,
|
||||
color: Theme.of(context).extension<CakeTextTheme>()!.titleColor,
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
} else {
|
||||
addressTextWidget = AddressFormatter.buildSegmentedAddress(
|
||||
address: item.value,
|
||||
walletType: transactionDetailsViewModel.sendViewModel.walletType,
|
||||
evenTextStyle: TextStyle(
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.w500,
|
||||
color: Theme.of(context).extension<CakeTextTheme>()!.titleColor,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
return GestureDetector(
|
||||
key: item.key,
|
||||
onTap: () {
|
||||
Clipboard.setData(ClipboardData(text: item.value));
|
||||
showBar<void>(context, S.of(context).transaction_details_copied(item.title));
|
||||
},
|
||||
child: ListRow(
|
||||
title: '${item.title}:',
|
||||
value: item.value,
|
||||
textWidget: addressTextWidget,
|
||||
),
|
||||
addressTextWidget = getFormattedAddress(
|
||||
context: context,
|
||||
value: item.value,
|
||||
walletType: transactionDetailsViewModel.sendViewModel.walletType,
|
||||
);
|
||||
}
|
||||
|
||||
return GestureDetector(
|
||||
key: item.key,
|
||||
onTap: () {
|
||||
Clipboard.setData(ClipboardData(text: item.value));
|
||||
showBar<void>(context, S.of(context).transaction_details_copied(item.title));
|
||||
},
|
||||
child: ListRow(
|
||||
title: '${item.title}:',
|
||||
value: item.value,
|
||||
textWidget: addressTextWidget,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
if (item is BlockExplorerListItem) {
|
||||
|
@ -144,4 +109,80 @@ class TransactionDetailsPage extends BasePage {
|
|||
],
|
||||
);
|
||||
}
|
||||
|
||||
Widget getFormattedAddress({
|
||||
required BuildContext context,
|
||||
required String value,
|
||||
required WalletType walletType,
|
||||
}) {
|
||||
final textStyle = TextStyle(
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.w500,
|
||||
color: Theme.of(context).extension<CakeTextTheme>()!.titleColor,
|
||||
);
|
||||
final List<Widget> children = [];
|
||||
final bool hasDoubleNewline = value.contains('\n\n');
|
||||
|
||||
if (hasDoubleNewline) {
|
||||
final blocks = value
|
||||
.split('\n\n')
|
||||
.map((b) => b.trim())
|
||||
.where((b) => b.isNotEmpty)
|
||||
.toList();
|
||||
for (final block in blocks) {
|
||||
final lines = block
|
||||
.split('\n')
|
||||
.map((l) => l.trim())
|
||||
.where((l) => l.isNotEmpty)
|
||||
.toList();
|
||||
if (lines.length > 1) {
|
||||
children.add(Text(lines.first, style: textStyle));
|
||||
for (int i = 1; i < lines.length; i++) {
|
||||
children.add(
|
||||
AddressFormatter.buildSegmentedAddress(
|
||||
address: lines[i],
|
||||
walletType: walletType,
|
||||
evenTextStyle: textStyle,
|
||||
),
|
||||
);
|
||||
}
|
||||
} else {
|
||||
children.add(
|
||||
AddressFormatter.buildSegmentedAddress(
|
||||
address: lines.first,
|
||||
walletType: walletType,
|
||||
evenTextStyle: textStyle,
|
||||
),
|
||||
);
|
||||
}
|
||||
children.add(SizedBox(height: 8));
|
||||
}
|
||||
} else {
|
||||
final lines = value
|
||||
.split('\n')
|
||||
.map((l) => l.trim())
|
||||
.where((l) => l.isNotEmpty)
|
||||
.toList();
|
||||
bool firstLineIsContactName = (lines.length > 1 && lines.first.length < 20);
|
||||
int startIndex = 0;
|
||||
if (firstLineIsContactName) {
|
||||
children.add(Text(lines.first, style: textStyle));
|
||||
startIndex = 1;
|
||||
}
|
||||
for (int i = startIndex; i < lines.length; i++) {
|
||||
children.add(
|
||||
AddressFormatter.buildSegmentedAddress(
|
||||
address: lines[i],
|
||||
walletType: walletType,
|
||||
evenTextStyle: textStyle,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: children,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -24,7 +24,7 @@ class AddressFormatter {
|
|||
address: address,
|
||||
walletType: walletType,
|
||||
evenTextStyle: evenTextStyle,
|
||||
oddTextStyle: oddTextStyle ?? evenTextStyle.copyWith(color: evenTextStyle.color!.withAlpha(150)),
|
||||
oddTextStyle: oddTextStyle ?? evenTextStyle.copyWith(color: evenTextStyle.color!.withAlpha(128)),
|
||||
textAlign: textAlign,
|
||||
);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue