relatica/lib/controls/html_text_viewer_control.dart

62 lines
1.7 KiB
Dart
Raw Normal View History

import 'dart:async';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:flutter_widget_from_html_core/flutter_widget_from_html_core.dart';
import 'package:html/dom.dart' as dom;
import '../globals.dart';
const _emojiSize = {'width': '20px', 'height': '20px', 'margin-left': '-3px'};
class HtmlTextViewerControl extends StatelessWidget {
final String content;
final FutureOr<bool> Function(String)? onTapUrl;
const HtmlTextViewerControl(
{super.key, required this.content, this.onTapUrl});
@override
Widget build(BuildContext context) {
return HtmlWidget(
content,
factoryBuilder: () => MyWidgetFactory(),
customStylesBuilder: _defaultStylesBuilder,
onTapUrl: onTapUrl,
);
}
Map<String, String>? _defaultStylesBuilder(dom.Element element) {
if (element.classes.contains('emoji')) {
return _emojiSize;
}
return null;
}
}
class MyWidgetFactory extends WidgetFactory {
@override
Widget? buildImageWidget(BuildMetadata meta, ImageSource src) {
final url = src.url;
if (!url.startsWith(RegExp('https?://'))) {
return super.buildImageWidget(meta, src);
}
Map<String, String> headers = {'user-agent': userAgent};
return CachedNetworkImage(
httpHeaders: headers,
errorWidget: (context, _, error) =>
onErrorBuilder(context, meta, error, src) ?? widget0,
fit: BoxFit.fill,
imageUrl: url,
progressIndicatorBuilder: (context, _, progress) {
final t = progress.totalSize;
final v = t != null && t > 0 ? progress.downloaded / t : null;
return onLoadingBuilder(context, meta, v, src) ?? widget0;
},
);
}
}