Skip to content

Commit 021b901

Browse files
authored
add safe transfer memo parse (#1462)
1 parent 21894a0 commit 021b901

File tree

2 files changed

+26
-4
lines changed

2 files changed

+26
-4
lines changed

lib/widgets/message/item/transfer/safe_transfer_dialog.dart

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import '../../../../ui/provider/transfer_provider.dart';
1111
import '../../../../utils/extension/extension.dart';
1212
import '../../../buttons.dart';
1313
import '../../../dialog.dart';
14+
import '../../../high_light_text.dart';
15+
import 'safe_transfer_message.dart';
1416
import 'transfer_page.dart';
1517

1618
Future<void> showSafeTransferDialog(BuildContext context, String snapshotId) =>
@@ -151,6 +153,7 @@ class _SafeTransactionDetailInfo extends ConsumerWidget {
151153
@override
152154
Widget build(BuildContext context, WidgetRef ref) {
153155
final createdAt = DateTime.parse(snapshot.createdAt).toLocal();
156+
final memo = parseSafeSnapshotMemo(snapshot.memo);
154157
return Padding(
155158
padding: const EdgeInsets.only(left: 24, right: 24, top: 20),
156159
child: Column(
@@ -196,10 +199,10 @@ class _SafeTransactionDetailInfo extends ConsumerWidget {
196199
''),
197200
),
198201
),
199-
if (!snapshot.memo.isNullOrBlank())
202+
if (!memo.isNullOrBlank())
200203
TransactionInfoTile(
201204
title: Text(context.l10n.memo),
202-
subtitle: SelectableText(snapshot.memo),
205+
subtitle: SelectionArea(child: CustomText(memo)),
203206
),
204207
] else if (type == SnapshotType.deposit &&
205208
snapshot.deposit != null) ...[

lib/widgets/message/item/transfer/safe_transfer_message.dart

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import 'dart:async';
22
import 'dart:convert';
33

44
import 'package:auto_size_text/auto_size_text.dart';
5+
import 'package:convert/convert.dart';
56
import 'package:flutter/material.dart';
67
import 'package:flutter_hooks/flutter_hooks.dart';
78
import 'package:flutter_svg/flutter_svg.dart';
@@ -14,13 +15,27 @@ import '../../../../db/mixin_database.dart';
1415
import '../../../../ui/provider/transfer_provider.dart';
1516
import '../../../../utils/extension/extension.dart';
1617
import '../../../cache_image.dart';
18+
import '../../../high_light_text.dart';
1719
import '../../../interactive_decorated_box.dart';
1820
import '../../message.dart';
1921
import '../../message_bubble.dart';
2022
import '../../message_datetime_and_status.dart';
2123
import '../unknown_message.dart';
2224
import 'safe_transfer_dialog.dart';
2325

26+
String parseSafeSnapshotMemo(String? raw) {
27+
if (raw == null || raw.isEmpty) {
28+
return '';
29+
}
30+
try {
31+
final bytes = hex.decode(raw);
32+
return utf8.decode(bytes, allowMalformed: false);
33+
} catch (error, stacktrace) {
34+
e('decode memo failed', error, stacktrace);
35+
return raw;
36+
}
37+
}
38+
2439
class SafeTransferMessage extends HookConsumerWidget {
2540
const SafeTransferMessage({super.key});
2641

@@ -90,6 +105,10 @@ class SafeTransferMessage extends HookConsumerWidget {
90105
},
91106
[snapshotId],
92107
);
108+
final memo = useMemoized(
109+
() => parseSafeSnapshotMemo(snapshotMemo),
110+
[snapshotMemo],
111+
);
93112
if (snapshotId == null) {
94113
return const UnknownMessage();
95114
}
@@ -113,7 +132,7 @@ class SafeTransferMessage extends HookConsumerWidget {
113132
assetSymbol: assetSymbol ?? '',
114133
assetIcon: assetIcon,
115134
snapshotAmount: snapshotAmount,
116-
memo: snapshotMemo ?? '',
135+
memo: memo,
117136
),
118137
),
119138
),
@@ -184,7 +203,7 @@ class _SnapshotLayout extends StatelessWidget {
184203
),
185204
if (memo.isNotEmpty) ...[
186205
const SizedBox(height: 10),
187-
Text(
206+
CustomText(
188207
memo,
189208
style: TextStyle(
190209
color: context.theme.secondaryText,

0 commit comments

Comments
 (0)