import { computed, observable } from 'mobx'; import { attribute, component, formField, observer, WebCellProps, WebField } from 'web-cell'; import { FilePreview } from '../Media/FilePreview'; import { CloseButton } from './Button'; export interface FilePickerProps extends WebCellProps { onChange?: (event: CustomEvent<{ value: string; file?: File }>) => any; } export interface FilePicker extends WebField {} @component({ tagName: 'file-picker', mode: 'open' }) @formField @observer export class FilePicker extends HTMLElement implements WebField { @attribute @observable accessor accept: HTMLInputElement['accept'] = '*/*'; @attribute @observable accessor multiple = false; @observable accessor file: File | undefined; @computed get fileType() { const { accept, file } = this; return file?.type || file?.name.match(/\.\w+$/)?.[0] || accept; } connectedCallback() { this.classList.add('d-block'); this.style.width = '10rem'; this.style.height = '10rem'; } handleAdd = ({ currentTarget }: Event) => { const file = (currentTarget as HTMLInputElement).files?.[0]; this.value = (this.file = file) ? URL.createObjectURL(file) : ''; this.emit('change', { value: this.value, file }); }; handleClear = (event: MouseEvent) => { event.preventDefault(); if (this.value) { URL.revokeObjectURL(this.value + ''); this.value = ''; } this.emit('change', { value: this.value }); }; renderInput() { const { name, value, required, disabled, accept, multiple } = this; return ( <> {value && } ); } renderContent() { const { value, fileType } = this; return (
{value ? ( ) : (
+
)} {this.renderInput()} {value && ( )}
); } render() { return ( <> {this.renderContent()} ); } }