@@ -2,6 +2,7 @@ import 'dart:async';
2
2
import 'dart:convert' ;
3
3
4
4
import 'package:auto_size_text/auto_size_text.dart' ;
5
+ import 'package:convert/convert.dart' ;
5
6
import 'package:flutter/material.dart' ;
6
7
import 'package:flutter_hooks/flutter_hooks.dart' ;
7
8
import 'package:flutter_svg/flutter_svg.dart' ;
@@ -14,13 +15,27 @@ import '../../../../db/mixin_database.dart';
14
15
import '../../../../ui/provider/transfer_provider.dart' ;
15
16
import '../../../../utils/extension/extension.dart' ;
16
17
import '../../../cache_image.dart' ;
18
+ import '../../../high_light_text.dart' ;
17
19
import '../../../interactive_decorated_box.dart' ;
18
20
import '../../message.dart' ;
19
21
import '../../message_bubble.dart' ;
20
22
import '../../message_datetime_and_status.dart' ;
21
23
import '../unknown_message.dart' ;
22
24
import 'safe_transfer_dialog.dart' ;
23
25
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
+
24
39
class SafeTransferMessage extends HookConsumerWidget {
25
40
const SafeTransferMessage ({super .key});
26
41
@@ -90,6 +105,10 @@ class SafeTransferMessage extends HookConsumerWidget {
90
105
},
91
106
[snapshotId],
92
107
);
108
+ final memo = useMemoized (
109
+ () => parseSafeSnapshotMemo (snapshotMemo),
110
+ [snapshotMemo],
111
+ );
93
112
if (snapshotId == null ) {
94
113
return const UnknownMessage ();
95
114
}
@@ -113,7 +132,7 @@ class SafeTransferMessage extends HookConsumerWidget {
113
132
assetSymbol: assetSymbol ?? '' ,
114
133
assetIcon: assetIcon,
115
134
snapshotAmount: snapshotAmount,
116
- memo: snapshotMemo ?? '' ,
135
+ memo: memo ,
117
136
),
118
137
),
119
138
),
@@ -184,7 +203,7 @@ class _SnapshotLayout extends StatelessWidget {
184
203
),
185
204
if (memo.isNotEmpty) ...[
186
205
const SizedBox (height: 10 ),
187
- Text (
206
+ CustomText (
188
207
memo,
189
208
style: TextStyle (
190
209
color: context.theme.secondaryText,
0 commit comments