Add DOCX viewer support in public file viewer

This commit is contained in:
Leon Bösche
2026-01-25 15:44:32 +01:00
parent 532848ebdf
commit 7582f27899

View File

@@ -27,6 +27,7 @@ class _PublicFileViewerState extends State<PublicFileViewer> {
Map<String, dynamic>? _fileData; Map<String, dynamic>? _fileData;
VideoPlayerController? _videoController; VideoPlayerController? _videoController;
String? _videoViewType; String? _videoViewType;
String? _docxViewType;
@override @override
void initState() { void initState() {
@@ -54,6 +55,15 @@ class _PublicFileViewerState extends State<PublicFileViewer> {
if (_isVideoFile()) { if (_isVideoFile()) {
await _initializeVideoPlayer(); await _initializeVideoPlayer();
} }
// Register DOCX viewer if it's a document file
if (_isDocumentFile()) {
final url = _fileData?['viewUrl'] ?? _fileData?['downloadUrl'];
if (url != null) {
_docxViewType = 'public-docx-viewer-${widget.token.hashCode}';
_registerDocxViewFactory(url);
}
}
} catch (e) { } catch (e) {
setState(() { setState(() {
_error = 'This link is invalid or has expired.'; _error = 'This link is invalid or has expired.';
@@ -108,6 +118,29 @@ class _PublicFileViewerState extends State<PublicFileViewer> {
}); });
} }
void _registerDocxViewFactory(String docxUrl) {
ui_web.platformViewRegistry.registerViewFactory(_docxViewType!, (
int viewId,
) {
final iframeElement = web.HTMLIFrameElement()
..src =
'https://docs.google.com/viewer?url=${Uri.encodeComponent(docxUrl)}&embedded=true'
..style.width = '100%'
..style.height = '100%'
..style.border = 'none';
iframeElement.onError.listen((event) {
if (mounted) {
setState(() {
_error = 'Document could not be loaded. Please download the file.';
});
}
});
return iframeElement;
});
}
String? _getViewUrl() { String? _getViewUrl() {
return _fileData?['viewUrl'] ?? _fileData?['downloadUrl']; return _fileData?['viewUrl'] ?? _fileData?['downloadUrl'];
} }
@@ -229,6 +262,15 @@ class _PublicFileViewerState extends State<PublicFileViewer> {
), ),
); );
} else if (_isDocumentFile()) { } else if (_isDocumentFile()) {
if (kIsWeb && _docxViewType != null) {
// Use Google Docs viewer for web
return Expanded(
child: Container(
color: Colors.white,
child: HtmlElementView(viewType: _docxViewType!),
),
);
} else {
return Expanded( return Expanded(
child: Center( child: Center(
child: Column( child: Column(
@@ -258,6 +300,7 @@ class _PublicFileViewerState extends State<PublicFileViewer> {
), ),
), ),
); );
}
} else { } else {
return Expanded( return Expanded(
child: Center( child: Center(