Add DOCX viewer support in public file viewer
This commit is contained in:
@@ -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(
|
||||||
|
|||||||
Reference in New Issue
Block a user