import 'dart:html' as html;
import 'dart:ui_web' as ui_web;
import 'package:flutter/material.dart';
/// Aperçu PDF sur le web : un `iframe` vers l'URL du fichier, donc le lecteur PDF
/// natif du navigateur — pagination, zoom et recherche compris. Aucune dépendance
/// ajoutée, là où un rendu Dart demanderait `pdfx` ou `syncfusion` et le portage
/// de leur worker WASM.
///
/// Le fichier doit être servi en `application/pdf` : c'est ce que pose l'upload
/// (`resources_screen.create`). Un PDF téléversé avant cette règle peut donc se
/// télécharger au lieu de s'afficher.
class PdfWebViewer extends StatefulWidget {
final String url;
const PdfWebViewer({Key? key, required this.url}) : super(key: key);
@override
State createState() => _PdfWebViewerState();
}
class _PdfWebViewerState extends State {
/// Une fabrique de vue ne peut être enregistrée qu'une fois par identifiant,
/// et l'écran réaffiche le même PDF à chaque clic sur sa vignette.
static final Set _registered = {};
late String _viewType;
@override
void initState() {
super.initState();
_register();
}
@override
void didUpdateWidget(covariant PdfWebViewer oldWidget) {
super.didUpdateWidget(oldWidget);
if (oldWidget.url != widget.url) _register();
}
void _register() {
_viewType = 'pdf-preview-${widget.url.hashCode}';
if (_registered.add(_viewType)) {
ui_web.platformViewRegistry.registerViewFactory(
_viewType,
(int _) => html.IFrameElement()
..src = widget.url
..style.border = 'none'
..style.width = '100%'
..style.height = '100%',
);
}
}
@override
Widget build(BuildContext context) => HtmlElementView(viewType: _viewType);
}