import 'dart:html' as html; import 'package:manager_api_new/api.dart'; import 'resource_formatting.dart'; /// Téléchargement d'une ressource sous son vrai nom. /// /// L'ancienne modale forçait `'${label}.json'` quel que soit le type : un PNG /// arrivait en `mon-image.json` et ne s'ouvrait nulle part sans renommage. /// /// Le fichier est d'abord récupéré en blob : l'attribut `download` d'un lien est /// ignoré quand la cible est sur une autre origine (Firebase Storage ici), et le /// navigateur se contentait d'ouvrir la ressource dans un onglet. Si la requête /// échoue (CORS, réseau), on retombe sur l'ouverture dans un nouvel onglet. Future downloadResource(ResourceDTO resource) async { final url = resource.url; if (url == null) return; final fileName = downloadFileNameFor(resource); try { final request = await html.HttpRequest.request(url, responseType: 'blob'); final blob = request.response as html.Blob; final objectUrl = html.Url.createObjectUrlFromBlob(blob); html.AnchorElement(href: objectUrl) ..download = fileName ..click(); html.Url.revokeObjectUrl(objectUrl); } catch (_) { html.AnchorElement(href: url) ..download = fileName ..target = '_blank' ..click(); } }