migrated Marianum Message module to the Marianum-Connect API and implemented push notification deep linking

This commit is contained in:
2026-07-11 17:37:50 +02:00
parent ff23199345
commit c444ed54a5
13 changed files with 237 additions and 78 deletions
@@ -47,14 +47,21 @@ class MarianumMessageListView extends StatelessWidget {
children: [Icon(Icons.newspaper)],
),
title: Text(message.name, overflow: TextOverflow.ellipsis),
subtitle: Text('vom ${message.date}'),
subtitle: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (message.description.isNotEmpty)
Text(
message.description,
maxLines: 2,
overflow: TextOverflow.ellipsis,
),
Text('vom ${message.date}'),
],
),
trailing: const Icon(Icons.arrow_right),
onTap: () {
AppRoutes.openMarianumMessage(
context,
state.messageList.base,
message,
);
AppRoutes.openMarianumMessage(context, message);
},
);
},
@@ -1,47 +1,57 @@
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:syncfusion_flutter_pdfviewer/pdfviewer.dart';
import 'package:url_launcher/url_launcher.dart';
import '../../../state/app/modules/marianum_message/bloc/marianum_message_state.dart';
import '../../../api/marianumconnect/queries/get_newsletter_file/get_newsletter_file.dart';
import '../../../widget/confirm_dialog.dart';
import '../../../widget/info_dialog.dart';
import '../../../widget/placeholder_view.dart';
class MessageView extends StatefulWidget {
final String basePath;
final MarianumMessage message;
const MessageView({super.key, required this.basePath, required this.message});
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.message.name)),
body: SfPdfViewer.network(
widget.basePath + widget.message.url,
enableHyperlinkNavigation: true,
onDocumentLoadFailed: (PdfDocumentLoadFailedDetails e) {
Navigator.of(context).pop();
InfoDialog.show(
context,
"Dokument '${widget.message.name}' konnte nicht geladen werden:\n${e.description}",
title: 'Fehler beim öffnen',
);
},
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,
),
),
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: CircularProgressIndicator());
}
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,
),
),
);
},
);
},
),
@@ -54,7 +54,7 @@ class SearchMarianumMessages extends SearchDelegate<MarianumMessage?> {
trailing: const Icon(Icons.arrow_right),
onTap: () {
close(context, message);
AppRoutes.openMarianumMessage(context, base, message);
AppRoutes.openMarianumMessage(context, message);
},
);
},