blob: 1c3442f8dab516f497f17aa493ce226a08284790 [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:async';
import 'dart:html';
import 'package:file_selector_platform_interface/file_selector_platform_interface.dart';
import 'package:flutter/foundation.dart' show visibleForTesting;
import 'package:flutter/services.dart';
/// Class to manipulate the DOM with the intention of reading files from it.
class DomHelper {
/// Default constructor, initializes the container DOM element.
DomHelper() {
final Element body = querySelector('body')!;
body.children.add(_container);
}
final Element _container = Element.tag('file-selector');
/// Sets the <input /> attributes and waits for a file to be selected.
Future<List<XFile>> getFiles({
String accept = '',
bool multiple = false,
@visibleForTesting FileUploadInputElement? input,
}) {
final Completer<List<XFile>> completer = Completer<List<XFile>>();
final FileUploadInputElement inputElement =
input ?? FileUploadInputElement();
_container.children.add(
inputElement
..accept = accept
..multiple = multiple,
);
inputElement.onChange.first.then((_) {
final List<XFile> files =
inputElement.files!.map(_convertFileToXFile).toList();
inputElement.remove();
completer.complete(files);
});
inputElement.onError.first.then((Event event) {
final ErrorEvent error = event as ErrorEvent;
final PlatformException platformException = PlatformException(
code: error.type,
message: error.message,
);
inputElement.remove();
completer.completeError(platformException);
});
inputElement.click();
return completer.future;
}
XFile _convertFileToXFile(File file) => XFile(
Url.createObjectUrl(file),
name: file.name,
length: file.size,
lastModified: DateTime.fromMillisecondsSinceEpoch(
file.lastModified ?? DateTime.now().millisecondsSinceEpoch),
);
}