61 lines
1.9 KiB
Dart
61 lines
1.9 KiB
Dart
import 'dart:typed_data';
|
|
|
|
import 'package:flutter/material.dart';
|
|
import 'package:syncfusion_flutter_pdfviewer/pdfviewer.dart';
|
|
import 'package:url_launcher/url_launcher.dart';
|
|
|
|
import '../../../api/marianumconnect/queries/get_newsletter_file/get_newsletter_file.dart';
|
|
import '../../../widget/app_progress_indicator.dart';
|
|
import '../../../widget/confirm_dialog.dart';
|
|
import '../../../widget/placeholder_view.dart';
|
|
|
|
class MessageView extends StatefulWidget {
|
|
final String id;
|
|
final String title;
|
|
const MessageView({super.key, required this.id, required this.title});
|
|
|
|
@override
|
|
State<MessageView> createState() => _MessageViewState();
|
|
}
|
|
|
|
class _MessageViewState extends State<MessageView> {
|
|
late final Future<Uint8List> _pdf = GetNewsletterFile(widget.id).run();
|
|
|
|
@override
|
|
Widget build(BuildContext context) => Scaffold(
|
|
appBar: AppBar(title: Text(widget.title)),
|
|
body: FutureBuilder<Uint8List>(
|
|
future: _pdf,
|
|
builder: (context, snapshot) {
|
|
if (snapshot.hasError) {
|
|
return const PlaceholderView(
|
|
icon: Icons.error_outline,
|
|
text: 'Das Dokument konnte nicht geladen werden.',
|
|
);
|
|
}
|
|
if (!snapshot.hasData) {
|
|
return const Center(child: AppProgressIndicator.large());
|
|
}
|
|
return SfPdfViewer.memory(
|
|
snapshot.data!,
|
|
enableHyperlinkNavigation: true,
|
|
onHyperlinkClicked: (PdfHyperlinkClickedDetails e) {
|
|
showDialog(
|
|
context: context,
|
|
builder: (context) => ConfirmDialog(
|
|
title: 'Link öffnen',
|
|
content: 'Möchtest du den folgenden Link öffnen?\n${e.uri}',
|
|
confirmButton: 'Öffnen',
|
|
onConfirm: () => launchUrl(
|
|
Uri.parse(e.uri),
|
|
mode: LaunchMode.externalApplication,
|
|
),
|
|
),
|
|
);
|
|
},
|
|
);
|
|
},
|
|
),
|
|
);
|
|
}
|