opt: system message
This commit is contained in:
@ -1,7 +1,10 @@
|
||||
import 'package:flutter/gestures.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:pilipala/common/widgets/http_error.dart';
|
||||
import 'package:pilipala/models/msg/system.dart';
|
||||
import 'package:pilipala/pages/message/utils/index.dart';
|
||||
import 'package:pilipala/utils/app_scheme.dart';
|
||||
import 'controller.dart';
|
||||
|
||||
class MessageSystemPage extends StatefulWidget {
|
||||
@ -97,6 +100,13 @@ class SystemItem extends StatelessWidget {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
// if (item.content is Map) {
|
||||
// var res = MessageUtils().extractLinks(item.content['web']);
|
||||
// print('res: $res');
|
||||
// } else {
|
||||
// var res = MessageUtils().extractLinks(item.content);
|
||||
// print('res: $res');
|
||||
// }
|
||||
return Padding(
|
||||
padding: const EdgeInsets.fromLTRB(14, 14, 14, 12),
|
||||
child: Column(
|
||||
@ -111,9 +121,73 @@ class SystemItem extends StatelessWidget {
|
||||
style: TextStyle(color: Theme.of(context).colorScheme.outline),
|
||||
),
|
||||
const SizedBox(height: 6),
|
||||
Text(item.content is String ? item.content : item.content!['web']),
|
||||
Text.rich(
|
||||
TextSpan(
|
||||
children: [
|
||||
buildContent(
|
||||
context,
|
||||
item.content is String ? item.content : item.content!['web']!,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
// if (item.content is String)
|
||||
// Text(item.content)
|
||||
// else ...[
|
||||
// Text(item.content!['web']!),
|
||||
// ]
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
InlineSpan buildContent(
|
||||
BuildContext context,
|
||||
String content,
|
||||
) {
|
||||
final ColorScheme colorScheme = Theme.of(context).colorScheme;
|
||||
final List<InlineSpan> spanChilds = <InlineSpan>[];
|
||||
Map<String, dynamic> contentMap = MessageUtils().extractLinks(content);
|
||||
List<String> keys = contentMap.keys.toList();
|
||||
keys.removeWhere((element) => element == 'message');
|
||||
String patternStr = keys.join('|');
|
||||
RegExp regExp = RegExp(patternStr, caseSensitive: false);
|
||||
|
||||
contentMap['message'].splitMapJoin(
|
||||
regExp,
|
||||
onMatch: (Match match) {
|
||||
if (!match.group(0)!.startsWith('BV')) {
|
||||
spanChilds.add(
|
||||
WidgetSpan(
|
||||
child: Icon(Icons.link, color: colorScheme.primary, size: 16),
|
||||
),
|
||||
);
|
||||
}
|
||||
spanChilds.add(
|
||||
TextSpan(
|
||||
text: match.group(0),
|
||||
style: TextStyle(
|
||||
color: colorScheme.primary,
|
||||
),
|
||||
recognizer: TapGestureRecognizer()
|
||||
..onTap = () {
|
||||
PiliSchame.routePush(Uri.parse(contentMap[match.group(0)]));
|
||||
},
|
||||
),
|
||||
);
|
||||
return '';
|
||||
},
|
||||
onNonMatch: (String text) {
|
||||
spanChilds.add(
|
||||
TextSpan(
|
||||
text: text,
|
||||
),
|
||||
);
|
||||
return '';
|
||||
},
|
||||
);
|
||||
return TextSpan(
|
||||
children: spanChilds,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user