var _a;
import { input } from "../../core/dom";
import { Widget, WidgetView } from "./widget";
import inputs_css from "../../styles/widgets/inputs.css";
export class FileInputView extends WidgetView {
    connect_signals() {
        super.connect_signals();
        this.connect(this.model.change, () => this.render());
    }
    styles() {
        return [...super.styles(), inputs_css];
    }
    render() {
        const { multiple, accept, disabled, width } = this.model;
        if (this.dialog_el == null) {
            this.dialog_el = input({ type: "file", multiple });
            this.dialog_el.onchange = () => {
                const files = this.dialog_el?.files;
                if (files != null) {
                    this.load_files(files);
                }
            };
            this.shadow_el.appendChild(this.dialog_el);
        }
        if (accept != "") {
            this.dialog_el.accept = accept;
        }
        this.dialog_el.style.width = `${width}px`;
        this.dialog_el.disabled = disabled;
    }
    async load_files(files) {
        const values = [];
        const filenames = [];
        const mime_types = [];
        for (const file of files) {
            const data_url = await this._read_file(file);
            const [, mime_type = "", , value = ""] = data_url.split(/[:;,]/, 4);
            values.push(value);
            filenames.push(file.name);
            mime_types.push(mime_type);
        }
        if (this.model.multiple)
            this.model.setv({ value: values, filename: filenames, mime_type: mime_types });
        else
            this.model.setv({ value: values[0], filename: filenames[0], mime_type: mime_types[0] });
    }
    _read_file(file) {
        return new Promise((resolve, reject) => {
            const reader = new FileReader();
            reader.onload = () => {
                const { result } = reader;
                if (result != null) {
                    resolve(result);
                }
                else {
                    reject(reader.error ?? new Error(`unable to read '${file.name}'`));
                }
            };
            reader.readAsDataURL(file);
        });
    }
}
FileInputView.__name__ = "FileInputView";
export class FileInput extends Widget {
    constructor(attrs) {
        super(attrs);
    }
}
_a = FileInput;
FileInput.__name__ = "FileInput";
(() => {
    _a.prototype.default_view = FileInputView;
    _a.define(({ Boolean, String, Array, Or }) => ({
        value: [Or(String, Array(String)), ""],
        mime_type: [Or(String, Array(String)), ""],
        filename: [Or(String, Array(String)), ""],
        accept: [String, ""],
        multiple: [Boolean, false],
    }));
})();
//# sourceMappingURL=file_input.js.map